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

 

posted on 2020-02-16 10:32  妄想症T  阅读(177)  评论(0编辑  收藏  举报

导航