一. MVC 模式(传统 JSP+Servlet)
MVC 是Web 开发中常用的一种设计模式, MVC 指的是 Model(模型), View(视图) Controller( 控制器)。
在使用框架之前,也就是之前的 JSP+Servlet 时代时,
MVC 的常常使用是:
执行流程可以简单理解为:
- 用户发送请求,如 user/list 查询员工的所有列表
- 控制器进行接收, 控制器是Servlet 提供的, 通过在web.xml 中进行配置 servlet 器
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.yjl.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
来达到 根据 /user 可以 来找到对应的UserServlet 这个模型类。 可以通过传参如 method=list 来确定找的是list() 这个方法。
3 . 在模型 Model 层中, 通过持久化 查询数据库 dao 来找到集合,如List<User> 将数据结果封装到 JavaBean 里面。
4 . 在Model 中,通过request, 或者是response 进行相应的转发和重定向 来到达视图 list.jsp
request.setAttribute("userList",userList);
request.getRequestDispatcher("/user/list.jsp").forward(request,reponse);
5 . 在视图中, 将userList 进行遍历解析,展示在jsp 页面上。
6 . jsp 页面进行响应,返回给浏览器。 浏览器经过解析,展示在用户。
二. Struts2的 MVC模式
1 . 用户发送请求,如 user/list, 查询员工的所有列表
2 . 控制器进行接收 , 其中控制器是Struts2 提供的,需要在web.xml 中进行相应的配置
<!-- 配置struts2的过滤器 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
并且在struts.xml 配置文件中进行相应的配置,来确定到达的Model 是 UserAction 类,执行的是 list() 的方法。
3 . 在Model 中,查询数据库 dao,封装到JavaBean 里面。 存储到值栈里面。 返回的是 “list” 字符串。
4 . 控制器接收到list, 通过result 进行判断,来准确的知道 返回的是 user/list.jsp 的页面。
5 . 到list.jsp 页面,从值栈中,如通过OGNL 或者是EL 来取出结果,展示在jsp页面上。
6 . 在jsp页面进行响应,返回给浏览器,浏览器经过解析,展示给用户。
这就是Struts2 的基本过程。 具体可以看以前写的Struts2 系列。
三. SpringMVC 的MVC 模式
SpringMVC 是非常有趣的,也是本系列要讲的。
在图片中,有前端控制器, 控制器映射器,控制器适配器, 视图解析器等名词,会慢慢解释这些。
1 . 用户发送请求, 前端控制器 DispatcherServlet 进行接收。 如user/list.action
2 . 前端控制器DispatcherServlet 请求 处理器映射器 HandlerMapping, 根据请求的路径,查找对应的 Handler .
可以根据 xml 查找,也可以根据注解配置查找。
3 . 处理器映射器 查找出来以后,将结果 Handler (是一个处理链) 返回给 DispatcherServlet
4 . 前端控制器 调用 处理器适配器 HandlerAdapter 去执行相应的 Handler, 即第3步的返回结果。
5 . 处理器适配器执行相应的Handler, 如 UserAction , Action 中有相应的业务逻辑,持久化dao等。
6 . Handler 处理完成后,将结果 ModelAndView 返回给处理器适配器
7 . 处理器适配器 将结果ModelAndView 返回给前端控制器, 是第六步的接收结果。 包括Model 数据结果 和View 视图。
8 . 前端控制器 请求视图解析器进行视图解析, 根据逻辑视图名解析成真正的视图(.jsp的形式)
9 . 视图解析器 向前端控制器返回处理后的结果 view 视图。
10 . 前端控制器进行视图渲染,渲染第九步的.jsp页面, 将ModelAndView 中的Model 模型填充到request 域中。
11 . 前端控制器向用户响应结果 。
很多的操作都是由前端控制器来完成的。 幸运的是,SpringMVC 已经提供了这个前端控制器。
其中, 不仅仅是前端控制器, 处理器映射器(HandlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver) 均不需要程序员自己开发, 我们只需要写 Handler 和对应的View 视图即可。