一、首先我们知道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之间的简单关系如下图
三者之间的大概工作流程如下:
视图就是面向用户的窗口,当用户输入,或者鼠标点击事件发生后,比如向模型查询状态,则由路由寻找对应的模型,获取查询结果,模型则通知视图,视图则进行相应的改变,显示新的数据。而控制器则是从用户接受到请求,将视图和模型匹配在一起。从请求中,可以清楚该选择怎样的模型,选择怎样的视图,完成什么的用户请求。控制层不处理任何的业务逻辑和数据处理。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)首先我们来看一下文件的结构:
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大概的工作流程就是是这样。