图片 5

办事流程,SpringMVC专门的学问规律

By admin in 编程 on 2019年8月13日

springMVC 的工作原理和机制、配置,springmvc工作原理

图片 1

版权声明:本文为博主原创文章,未经博主允许不得转载。

工作原理

下面的是springMVC的工作原理图:
图片 2

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

工作机制是什么

上面的是springMVC的工作原理图:

SpringMVC 工作流程:

Control的调用(续)

接着对于(二)的补充:主要是小结下Control的处理逻辑的关键操作;

对于control的处理关键就是:DispatcherServlet的handlerMappings集合中根据请求的URL匹配每一个handlerMapping对象中的某个handler,匹配成功之后将会返回这个handler的处理连接handlerExecutionChain对象。而这个handlerExecutionChain对象中将会包含用户自定义的多个handlerInterceptor对象。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /**      * Return the HandlerExecutionChain for this request.      * <p>Tries all handler mappings in order.      * @param request current HTTP request      * @return the HandlerExecutionChain, or <code>null if no handler could be found      */     protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {         for (HandlerMapping hm : this.handlerMappings) {             if (logger.isTraceEnabled()) {                 logger.trace(                         "Testing handler map [" + hm + "] in DispatcherServlet with name ‘" + getServletName() + "’");             }             HandlerExecutionChain handler = hm.getHandler(request);             if (handler != null) {                 return handler;             }         }         return null;     }

而对于handlerInterceptor接口中定义的三个方法中,preHandler和postHandler分别在handler的执行前和执行后执行,afterCompletion在view渲染完成、在DispatcherServlet返回之前执行。

愿意了解更多的来源获取:mingli.com

朋友需要请加球球:二零四二八四九二三七

springmvc.xml的配置                                                   
                                                                       
                    

视图解析器的配置:

<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 使用前缀和后缀 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>

 

在Controller中设置视图名的时候会自动加上前缀和后缀。

Controller的配置

自动扫描方式,扫描包下面所有的Controller,可以使用注解来指定访问路径。

<!-- 使用组件扫描的方式可以一次扫描多个Controller --> <context:component-scan base-package="com.wxisme.ssm.controller">

也可以使用单个的配置方式,需要指定Controller的全限定名。

<bean name="/queryUser.action" class="com.wxisme.ssm.controller.Controller1"/>

配置注解的处理器适配器和处理器映射器:

<!-- 注解的处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 注解的处理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

也可以使用下面的简化配置:

<!-- 配置注解的处理器映射器和处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

配置拦截器,可以直接定义拦截所有请求,也可以自定义拦截路径。

<mvc:interceptors> <!-- 直接定义拦截所有请求 --> <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean> <!-- <mvc:interceptor>
            拦截所有路径的请求   包括子路径
            <mvc:mapping path="/**"/>
            <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean>
        </mvc:interceptor> --> </mvc:interceptors>

 配置全局异常处理器

<!-- 定义全局异常处理器 --> <!-- 只有一个全局异常处理器起作用 --> <bean id="exceptionResolver" class="com.wxisme.ssm.exception.OverallExceptionResolver"></bean>

配置文件上传数据解析器,在上传文件时需要配置。

<!--配置上传文件数据解析器  --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>9242880</value> </property> </bean>

 

还可以配置一些自定义的参数类型,以日期类型绑定为例。

<!-- 自定义参数类型绑定 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <!-- 日期类型绑定 --> <bean class="com.wxisme.ssm.controller.converter.DateConverter"/> </list> </property> </bean>

上面提到过如果在配置前端控制器时拦截了所有的请求,不做特殊处理就会导致部分静态资源无法使用。如果是这种情况就可以使用下面的配置来访问静态资源文件。

<mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/imgdata/**" location="/imgdata/" />

也可以使用默认,但是需要在web.xml中配置。

<!-- 访问静态资源文件 --> <!-- <mvc:default-servlet-handler/> 需要在web.xml中配置-->

完全可以不拦截所有路径,大可避免这个问题的发生。

完整的配置大概是这样的,需要注意xml文件的命名空间,有时候会有影响的。

<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 使用前缀和后缀 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <!-- 使用组件扫描的方式可以一次扫描多个Controller --> <context:component-scan base-package="com.wxisme.ssm.controller"> </context:component-scan> <!-- 配置注解的处理器映射器和处理器适配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 自定义参数类型绑定 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <!-- 日期类型绑定 --> <bean class="com.wxisme.ssm.controller.converter.DateConverter"/> </list> </property> </bean> <!-- 访问静态资源文件 --> <!-- <mvc:default-servlet-handler/> 需要在web.xml中配置--> <mvc:resources mapping="/images/**" location="/images/" /> <mvc:resources mapping="/css/**" location="/css/" /> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/imgdata/**" location="/imgdata/" /> <!-- 定义拦截器 --> <mvc:interceptors> <!-- 直接定义拦截所有请求 --> <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean> <!-- <mvc:interceptor>
            拦截所有路径的请求   包括子路径
            <mvc:mapping path="/**"/>
            <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean>
        </mvc:interceptor> --> </mvc:interceptors> <!--配置上传文件数据解析器  --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>9242880</value> </property> </bean> <!-- 定义全局异常处理器 --> <!-- 只有一个全局异常处理器起作用 --> <bean id="exceptionResolver" class="com.wxisme.ssm.exception.OverallExceptionResolver"></bean> </beans>

                                                                                 

的工作原理和机制、配置,springmvc工作原理 工作原理
下面的是springMVC的工作原理图:
1、客户端发出一个http请求给web服务器,web服…

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

流程图,截取与—-》(

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

图片 3

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

详细图:

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

图片 4

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

SpringMVC工作流程描述

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

1.用户向服务器发送请求时,请求被Spring
前端控制器DispatcherServlet获取,如详细图第一步


2.DispatcherServlet对请求URL进行解析(比如我们发送一个url如下的请求

在web.xml配置中

)。然后根据URI,调用处理器映射器(HandlerMapping)获得该Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。

**<url-pattern>/url-pattern>拦截的是客户端发送过来的请求,“/”表示拦截除了jsp中的所有的,“/*”表示“.jsp”请求也会被拦截。**

3.DispatcherServlet获取上面返回的Handler,并选择一个适合的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler方法)

请求拦截之后,控制权被DispatcherServlet获取,然后DispatcherServlet将拦截到到的请求交与@Controller注解下与@RequestMapping注解进行匹配,使得@RequestMapping注解下的方法对请求进行处理。**

4.选择好合适的HandlerAdapter后就会开始执行Handler。在填充Handler的入参过程中,根据配置,Spring将帮你做一些额外的工作:EG:

Controller下的方法处理完之后,return的返回值默认为视图对象

HttpMessageConveter:
将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

Controller下的方法处理完之后,return的返回值默认为视图对象

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

Controller下的方法处理完之后,return的返回值默认为视图对象

数据根式化:对请求消息进行数据格式化。
如将字符串转换成格式化数字或格式化日期等

,通过XXX-servlet.xml中配置的和添加上下文之后,在相应路径中寻找视图文件。

数据验证:
验证数据的有效性,验证结果存储到BindingResult或Error中

当然,也可以通过重定向return “redirect:/
XXX”;,使得另一个Controller对请求XXX继续进行处理。

5.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象(包含视图名或视图名和模型)

6.根据返回的ModelAndView对象,选择一个合适的ViewResolver返会给DispatcherServlet;

7.ViewResolver结合,Model和View来渲染视图

8.最后将视图渲染结果返回给客户端

组件名词解释:

1.DispatcherServlet:前端控制器

等同于以前的Controller,
是整个流程的中心, 负责调用其他组件

2.HandlerMapping
处理器映射器

负责根据请求找到Handler,springMVC中可以根据不同的映射器实现不同映射,比如
xml配置方式,注解方式,接口方式等

3.Handler后端控制器

在前端控制器的控制下对具体的用户请求进行处理,所以一般情况下都需要开发者进行根据需求进行开发

4.HandlerAdapter处理器适配器

处理Handler,可以对多种类型的处理器进行执行,这是对适配器模式的应用体现。

5.ViewResolver : 视图解析器

负责将处理结果生成view视图、开发者可以根据需要开发**view**

入门程序:
在理解了springMVC的工作流程后,下面我们根据流程步骤,来实现我们的入门程序,步骤如下:

1.导入我们的spring架包(一般去官网下载即可
4.2版本用的比较多)

2.在web.xml配置前端控制器

  1. <servlet>
  2. <servlet-name>springmvc</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. </servlet>
  5. <!– 让servlet随服务启动 –>
  6. <servlet-mapping>
  7. <servlet-name>springmvc</servlet-name>
  8. <url-pattern>*.action</url-pattern>
  9. </servlet-mapping>

这里说一下 我们的拦截方式

1.拦截固定后缀名的URL:如 *.action, *.do

2.拦截所有:设置为/,但是该方法会导致静态文件(css,js.jpg)被拦截下来不能正常显示,所以该方式需要特殊处理

注意:不能设置拦截所有为/*该方式是错误的,因为请求action时,当action跳转到jsp时会再次被拦截,出现异常:根据jsp路径找不到映射地址

3.设置springmvc的配置文件

  1. <servlet>
  2. <init-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>WEB-INF/springmvc.xml</param-value>
  5. </init-param>
  6. </servlet>

4.开发处理器

  1. public class Hello implements Controller{
  2. @Override
  3. public ModelAndView handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws Exception {
  4. List list = new ArrayList<>();
  5. list.add(“one”);
  6. list.add(“two”);
  7. ModelAndView mv = new ModelAndView();
  8. mv.addObject(“list”,list);
  9. return mv;
  10. }
  11. }

5.在springmvc.xml中配置

  1. <!– 配置适配器 –>
  2. <bean
    class=”org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter”></bean>
  3. <!– 处理器映射器 –>
  4. <!– 根据bean的 name 查找Handler , 将action的URL
    配置在bean的name中–>
  5. <bean
    class=”org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping”></bean>
    1. <!– 配置处理器 –>
  6. <bean name=”/hello.action”
    class=”com.mt.controller.Hello”></bean>
  7. <!– 配置视图解析器 –>
  8. <bean
    class=”org.springframework.web.servlet.view.InternalResourceViewResolver”></bean>

6.视图开发,jsp文件

  1. <%@ page language=”java” contentType=”text/html; charset=UTF-8″
  2. pageEncoding=”UTF-8″%>
  3. <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
    “;
  4. <html>
  5. <head>
  6. <meta http-equiv=”Content-Type” content=”text/html;
    charset=UTF-8″>
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. asdfadfadfa
  11. ${list }
  12. </body>
  13. </html>

测试结果: 开启服务器后, 发送

页面显示:

图片 5

对应理解springMVC 的流程即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有