java web的mvc

一、首先我们知道web开发中的请求响应的模型

  1)web是基于http协议的,由浏览器(如ie浏览器)向服务器请求,比如访问一个网站,或者查询一些数据等。

  2)web服务器(如tomcat)接收到请求后,经过一定的处理(查询数据库,修改数据库的数据等等),然后将结果(修改数据后的反馈、查询结果等)返回给客户端。客户端即浏览器对接收的html内容进行渲染,渲染的内核有webkit、Trident、Gecko、Presto。

因此,这就是web开发中的请求/响应模型,而且一般情况下,服务器不会主动给客户端发送数据的。不过现在有一些新的技术,比如html5的websocket可以实现服务器主动发送给客户端。

       二、关于mvc的简单介绍

1、Model即模型,数据模型,提供要展示的数据,主要是处理数据逻辑部分,通常负责数据库的存储。

2、View即视图模型,一般是html/js/css文件构成,接受模型的数据,或由控制器控制,给用户显示数据的。

3、Controller即控制器,负责将从视图读取数据,然后根据需要想模型发送数据,也接收模型返回的数据,控制器就是控制整个流程的进行,使视图和模型分离。

三、在web开发中mvc之间的简单关系如下图


java web的mvc
  

三者之间的大概工作流程如下:

视图就是面向用户的窗口,当用户输入,或者鼠标点击事件发生后,比如向模型查询状态,则由路由寻找对应的模型,获取查询结果,模型则通知视图,视图则进行相应的改变,显示新的数据。而控制器则是从用户接受到请求,将视图和模型匹配在一起。从请求中,可以清楚该选择怎样的模型,选择怎样的视图,完成什么的用户请求。控制层不处理任何的业务逻辑和数据处理。Mvc的工作方式也就差不多这样子。

 

四、java web中的mvc

1)模型:则主要是与数据库的沟通,处理业务逻辑,由(JavaBean、DAO、DB、Action这些类构成)。

2)视图:由jsp负责,jsp可以嵌入到html文档中的脚本,决定数据在视图的哪些地方显示,数据改变时的及时响应等等。

3)控制器:用一个Servlet做控制器。

4)Java 的Jsp+Javabean+Servlet模型之间的主要分工:

Servlet做为控制器,负责处理请求和产生jsp页面要用到的Action或Javabean对象,根据用户的请求决定要定向到哪个页面,Action负责根据请求负责相关的业务逻辑,DAO/DB是Action用于访问数据库而用,Javabean为可重用的组件,可以减少开发人员的工作量,可进行独立开发,比如一个用户,有用户名、密码、性别、邮箱等等这些信息,我们可以把这些存入Javabean中。

五、下面是个简单的java web mvc模型

1)首先我们来看一下文件的结构:


java web的mvc
 

2)model层的实现:

A、Action接口类:

 

public interface Action {

	public String execute(HttpServletRequest request,HttpServletResponse response);
	
}

在控制器执行相关action时,我们不必知道是那个具体的类,就可以执行相关的action的方法了。

B、工厂模式的action:

 

public class ActionFactory {

	private ActionFactory(){}
	
	private static Action action;
	
	public static Action instance(String className){
		try {
			action = (Action) Class.forName(className).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return action;
	}
	
}

用于在控制器中使用,用于根据类名动态生成相应的对象给予控制器使用。

C、实际的action类,继承了action接口:

 

public class InfoAction implements Action {

	@Override
	public String execute(HttpServletRequest request,
			HttpServletResponse response) {
		//获取action参数
		String action = request.getParameter("action");
	        //根据action处理相应的业务逻辑
		return url;
	}
        //此处省略了相关代码
}

D、Dao类,负责与数据库相关的操作,一般一个类和一个表关联,负责数据库的增删查改。

 

public class InfoDao {
        //省略相关的代码,连接数据库,对数据库的增删查改
}

E、ResultInfo类,也就是javabean,这里的ResultInfo用了存放用户的信息。

 

public class ResultInfo {
	private String title;
	private String content
	//这里添加相关的方法,set/get方法
}

以上的几个就是一个model层的实现,负责与数据交互,赋值业务逻辑。

  3)控制器层的实现:

 

/*
 * 控制器Servlet
 */
public class ControlServlet extends HttpServlet {
	//是一个servlet类,所以要继承httpservlet
	private static final long serialVersionUID = 1L;

	/*
	 * 重写service方法,处理用户的请求。
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 获取到请求的路径:pathName
		String pathName = request.getServletPath();
		System.out.println(pathName);
		// 解析路径,获取请求的action的名字
		String actionName = pathName.substring(pathName.lastIndexOf("/") + 1,
				pathName.lastIndexOf("."));
		System.out.println(actionName);
		// 根据actionName获取Servlet的参数,即相应的Action的类名
		String className = this.getInitParameter(actionName);
		System.out.println(className);
		// 根据类名,动态加载对象(工厂模式)
		Action action = ActionFactory.instance(className);
		/*
		 * 执行获得的action对象的execute方法,处理相应的业务逻辑,并返回url,决定
		 * 处理之后要跳转的页面
		 */
		String url = action.execute(request, response);
		/*
		 * forward跳转相应的页面
		 */
		request.getRequestDispatcher(url).forward(request, response);

	}
}

4)view层的实现(一个简单的查询的实现):

index.html

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="InfoAction.do?action=Search" method="post">
		<table>
			<tr>
				<td>关键字:</td>
				<td><input type="text" name="title"></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="查询"></td>
			</tr>
		</table>
	</form>
</body>
</html>

      main.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Result页</title>
</head>
<body>
	<h3>查询结果如下</h3>
	<% List list=session.getAttribute("result");%>
	<table>
	<% for(int i=0;i<list.size();i++){%>
	 <tr>
                <td><%=i%></td>
	 	<td><% list.get(i).gettitle(); %></td>
	 	<td><% list.get(i).getinfo(); %></td>
	 </tr>	
	<% } %>
	</table>
</body>
</html>

5)当我们输出一个地址,比如是127.0.0.1/Mybbs时,会直接到webcontent的根目录下的index文件,提交了表单后,往这个链接提交InfoAction.do?action=Search了表单。之后,由于web.xml配置了值为”*.do”的模糊匹配的url相应的servlet,即控制器,所以请求直接送到了唯一的那个控制器上面。然后控制器解析url,解析出了InfoAction,然后动态加载该对象,执行execute,并返回了要跳转的下一url,执行跳转。这个简单的mvc大概的工作流程就是是这样。