一.MVC简介
- MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码. 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
- MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序
的模式:- 模型Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受的请求,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。javabean
- 视图View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。
- 控制器Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请 求转发和重定向;servlet
- Spring MVC是基于 Model 2实现的技术框架,Model 2是经典的MVC(model,view,control)模型在WEB应用中的变体。这个改变主要源于HTTP协议的无状态性,Model 2 的目的和MVC一样,也是利用处理器分离模型,视图和控制,达到不同技术层级间松散层耦合的效果,提高系统灵活性,复用性和可维护性.大多情况下,可以将Model 2 与 MVC等同起来.
- model2和model的区别
- Model1和Model2的最根本的区别是,Model是JSP+JavaBeans开发模式,Model2是JSP+Servlet+JavaBeans开发模式,两者都是MVC模式的应用,但是应用程度不同。在Model2模式的开发下,基于分层思想,JavaBeans的代码也进行了抽象,原来JavaBeans是既做业务逻辑,也做数据持久化,既然分层,那么业务逻辑和数据持久化就得分开,这也就有了Dao层,所以说Dao层的出现也是策略模式的体现,将数据持久化进行封装,业务层使用时,不需要知道数据持久化的操作过程。(model1没有dao层和servlet层)
- model2和model的区别
二.Spring MVC创建项目的流程(实现controller接口)
-
创建流程
- 引入依赖
- 配置web.xml
- 配置SpringMVC配置文件
- 创建controler包及控制类
- 测试
-
引入依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.6.RELEASE</version> </dependency> </dependencies>
-
配置web.xml文件
- 让所的/请求都交给了DispatcherServlet,而DispatcherServlet里面需要配置一个contextConfigLocation,上下文配置路径,也就是我们的SpringMVC的配置文件。如果没有配置该属性,SpringMVC会在默认WEB-INF下去找[servlet-name]-servlet.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>dispartcherservlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--DispatcherServlet的路径不能出错--> <init-param> <param-name>contextConfigLocation</param-name> <!--也可不写,但是要在WEB-INF下去找[servlet-name]-servlet.xml--> <param-value>classpath:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispartcherservlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
配置SpringMVC的视图解析器 可以分别指定前缀和后缀
- prefix: /WEB-INF/view/,那么控制器那边会在虚拟视图前拼接该字符串
- suffix:.jsp或者 .html,那么控制器那边会在虚拟视图后面拼接该字符串
- 配置缺省的servlet处理器,静态资源可以直接被访问
<mvc:default-servlet-handler />
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/page/" /> <!--拼接返回的ModelAndView的前部分--> <property name="suffix" value=".jsp" /> <!--拼接返回的ModelAndView的后缀--> </bean> <!--配置缺省的servlet处理器,静态资源可以直接访问--> <mvc:default-servlet-handler /> <!--bean标签可以用name进行标识,也可以使用id,但是id属性值不能包含特殊字符, name值可以,路径中需要使用name来标识一个控制器的路径,指定name对应路径交给哪个控制器来进行具体的处理--> <bean name="/toLoginController" class="com.mvc.controller.ToLoginController" /> <bean name="/toUserInfoController" class="com.mvc.controller.ToUserInfoController" /> </beans>
-
创建controler包及控制类
- ToLoginController.java
- SpringMVC配置文件中让/toLoginController请求会交给当前类来进行处理,自动执行Controller的回调方法
public class ToLoginController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { return new ModelAndView("loginController"); } }
- ToUserInfoController.java
- SpringMVC配置文件中让/toUserInfoController请求会交给当前类来进行处理,自动执行Controller的回调方法
public class ToUserInfoController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { UserBean userBean=new UserBean(); String uid= req.getParameter("uid"); String name=req.getParameter("name"); String age= req.getParameter("age"); String sex=req.getParameter("sex"); String img=req.getParameter("img"); userBean.setUid(uid); userBean.setName(name); userBean.setAge(age); userBean.setSex(sex); userBean.setImg(img); ModelAndView mav=new ModelAndView("userInfoController","user",userBean); return mav; }
-
页面及测试
- loginController.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>login</title> <!-- 新 Bootstrap 核心 CSS 文件 --> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <h3>欢迎你,大帅比</h3> <form action="/toUserInfoController" method="post" class="form-horizontal" role="form"> <div class="form-group"> <lable class="col-sm-2 control-label" >编号</lable> <div class="col-sm-8"> <input type="text" name="uid" class="form-control"> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >名称</lable> <div class="col-sm-8"> <input type="text" name="name" class="form-control"> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >年龄</lable> <div class="col-sm-8"> <input type="text" name="age" class="form-control"> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >性别</lable> <div class="col-sm-8"> <input type="text" name="sex" class="form-control"> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >图片</lable> <div class="col-sm-8"> <input type="text" name="img" class="form-control"> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" ></lable> <div class="col-sm-8"> <input type="submit" value="submit" class="form-control"> </div> </div> </form> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --> <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </body> </html>
- userInfoController.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户详情</title> <!-- 新 Bootstrap 核心 CSS 文件 --> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <h3>大帅比,你好</h3> <div class="form-horizontal" role="form"> <div class="form-group"> <lable class="col-sm-2 control-label" >名称</lable> <div class="col-sm-8"> <span class="form-control">${user.name}</span> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >年龄</lable> <div class="col-sm-8"> <span class="form-control">${user.age}</span> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >性别</lable> <div class="col-sm-8"> <span class="form-control">${user.sex}</span> </div> </div> <div class="form-group"> <lable class="col-sm-2 control-label" >图片</lable> <div class="col-sm-8"> <span class="form-control">${user.img}</span> </div> </div> </div> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --> <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </body> </html>
-
执行流程
- 项目启动时,先进入到web.xml文件中,根据DispatcherServlet跳转到配置文件spring-mvc.xml中,执行< bean name="/toLoginController" class="com.mvc.controller.ToLoginController" />,跳转到com.mvc.controller.ToLoginController.java中,自动执行ToLoginController.java中实现的Controller的回调方法,再到spring-mvc.xml中,去拼接地址,根据地址跳转页面
-
注意
- 也可以不在spring-mvc.xml中拼接地址的尾部扩展名,但是需要在控制器的回调函数中添加扩展名,不然地址拼接不正确
三.SpringMVC流程
-
流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射器找到具体的处理器handler(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
- DispatcherServlet调用HandlerAdapter处理器适配器
- HandlerAdapter经过适配调用具体的处理器handler(也就是我们编写的Controller,也叫后端控制器)
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
- DispatcherServlet响应用户
-
组件说明
以下组件通常使用框架提供实现:
-
DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
-
HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
-
HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。
-
handler:也就是我们编写的Controller,也叫后端控制器。
-
ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等
-
网友评论