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