Spring MVC
使用Spring MVC的第一步是配置DispatcherServlet是第一步,DispatcherServlet是一个servlet,所以可以配置多个DispatcherServlet。DispatcherServlet是一个前置控制器,配置在web.xml文件中,拦截匹配的请求,servlet拦截匹配规则则要自定义,把拦截下的请求按照某种规则分发到目标Controler(我们写的Action)来处理
在MVC架构中,JSP页面就是视图,用户通过JSP页面发出请求后,Spring MVC会根据请求路径将请求发给与请求路径对应的Controller类,Controller类会调用Service类对请求进行处理,Service类会调用数据持久层Mybatis完成对实体类的存取和查询工作,并将结果返回到Controller类,Controller类会将处理结果转换为ModelAndView对象,JSP接收ModelAndView对象并进行渲染
Controller类是在普通Java类的头部加入@Controller注解,使其变为Controller类,在Controller类中使用@RequestMapping注解标记在Controller类方法的头部,使该方法可以响应一个WEB请求,当JSP页面向这个地址发送请求时,该方法会被调用,
Service类为业务逻辑处理类,在类的头部使用注解@Service标注,被注解@Service标注的类会被Spring框架自动注入到Controller类
Spring MVC的执行过程如下:
1、首先会被DispatcherServlet拦截并进一步将这些请求发送给Spring MVC
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <!-- 拦截所有的请求 --> <url-pattern>/</url-pattern> </servlet-mapping>
但是一般程序会有多个控制器,拦截之后会把请求递交给哪个控制器呢
2、DispatcherServlethi查询一个或多个处理器映射来确定请求的下一站,处理器映射会根据请求所携带的URL信息来进行决策,我们通过配置simpleHandlerMapping来将/hello地址交给helloController
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!-- /hello 路径的请求交给 id 为 helloController 的控制器处理--> <prop key="/hello">helloController</prop> </props> </property> </bean> <bean id="helloController" class="controller.HelloController"></bean>
3、一旦选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器,到了控制器请求会卸载下其负载(用户的请求)等待控制器处理完这些信息
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { // 处理逻辑 .... }
4、当控制器在完成逻辑处理后,通常会产生一些信息,这些信息就是需要返回给用户并在浏览器上显示信息,他们被称为模型,仅仅是返回原始信息是不够的,这些信息需要用一种比较有好的展现方式比如html形式展示,所以信息需要发送一个视图,通常是JSP。
控制器接下来会把模型数据打包,并且表示出用于渲染输出的视图名,接下来会将请求连同模型和视图名发送会DispatcherServlet
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { // 处理逻辑 .... // 返回给 DispatcherServlet return mav; }
5、这样控制器就不会和特定的视图相耦合,传递给DispatcherServlet的视图名并不直接表示某个特定的JSP(实际上,他甚至不能确定视图就是JSP)相反,它仅仅传递一个逻辑名,这个名称将会用来查找产生结果的真正视图。
DispatcherServlet将会使用视图解析器来将逻辑名称匹配为一个特定的视图,它也可能不是JSP,上面的例子就是绑定了index.jsp
6、最后就是使徒的实现,在这里它交付模型数据,请求的任务也就完成了,试图使用模型数据渲染出结果,这个输出结果会通过响应对象传递给客户端
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <h1>${message}</h1>
某种规则是根据你使用了哪个HandlerMaapping接口的实现类的不同而不同。
<web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>example</servlet-name> <url-pattern>*.form</url-pattern> </servlet-mapping> </web-app>
<load-on-startup>1</load-on-startup>是启动顺序,让这个servlet随servlet容器一起启动
<url-pattern>*.form</url-pattern>会拦截.form结尾的请求
<servlet-name>example</servlet-name>这个servlet的名字是example,可以有多个DispatcherServlet,是通过名字来区分的,每一个DispatcherServlet有自己的WebApplicationContext上下文对象,同时保存的ServletContext中和Request对象中,在DispatcherServlet的初始化中,框架会在web应用的WEB-INF文件夹下寻找[servlet-name]-servlet.xml的配置文件,生成文件中定义的bean
<servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
指明了配置文件的文件名,不使用默认配置文件名,而使用springMVC.xml配置文件
部分借鉴:https://www.iteye.com/blog/elf8848-875830
https://www.jianshu.com/p/91a2d0a1e45a