SpringMvc初记

topb3222 / 2023-08-20 / 原文

SpringMvc的执行流程如下:

 首先,配置过滤器(SpringMVC有两个过滤器):SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效. 

  <!--配置springMVC的编码过滤器:get请求可以通过tomcat进行配置server.xml,这些名称?name名称并不是固定的,在上述代码示例中, <filter-name><param-name>是用于标识过滤器和参数的名称,可以根据具体的需求进行自定义命名。在示例中使用的名称是通用的命名约定,但实际上可以根据项目的需要自由选择名称。只需确保在整个配置文件中使用的名称是唯一的,并且与其他相关配置项相匹配即可。例如 ,可以将<filter-name> 设置为 "MyCharacterEncodingFilter",将 <param-name>设置为 "requestEncoding" 和 "responseEncoding",以更好地反映过滤器和参数的用途。-->

webapp/WEB-INF/WEb.XML

 1  <filter>
 2 
 3   <filter-name>CharacterEncodingFilter</filter-name>
 4   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 5   <!--请求的编码:在示例中,将其设置为 "UTF-8" 表示请求的数据会以 UTF-8 编码进行解析。这样可以确保正确处理请求中的特殊字符和非英文字符。-->
 6   <init-param>
 7     <param-name>encoding</param-name>
 8     <param-value>UTF-8</param-value>
 9   </init-param>
10   <!--响应的编码:配置项用于强制设置响应的编码。在示例中,将其设置为 "true" 表示使用设置的编码(即UTF-8)来对响应进行编码。这样可以确保响应的内容以正确的编码
11 (UTF-8)返回给客户端,避免乱码问题。-->
12   <init-param>
13     <param-name>forceEncoding</param-name>
14     <param-value>true</param-value>
15   </init-param>
16 </filter>
17 <filter-mapping>
18   <filter-name>CharacterEncodingFilter</filter-name>
19  <!--将CharacterEncodingFilter过滤器应用于所有URL( <url-pattern>/*</url-pattern> )。它会拦截所有请求,并将请求和响应的编码都设置为UTF-8-->
20   <url-pattern>/*</url-pattern>
21 </filter-mapping>

  1.客户端发送请求:客户端(如浏览器)发送HTTP请求到SpringMVC应用的前端控制器(DispatcherServlet)。

  2.前端控制器接收请求:前端控制器(DispatchcherServlet)是Spring MVC应用的入口,它接收所有的请求并将请求转发给响应的处理器。

 

 1   <servlet>
 2     <servlet-name>SpringMVC</servlet-name>
 3     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 4     <init-param>
 5       <!--配置上下文-->
 6       <param-name>contextConfigLocation</param-name>
 7       <!--类路径:Java路径-->
 8       <param-value>classpath:springmvc.xml</param-value>
 9     </init-param>
10     <!--将调度员DispatcherServlet的初始化时间提前到服务器启动时-->
11     <load-on-startup>1</load-on-startup>
12   </servlet>
13   <servlet-mapping>
14     <servlet-name>SpringMVC</servlet-name>
15     <!--拦截静态资源,可以设置多个,在本类中/不会拦截jsp路径,会被web:tomcat会进行处理jsp的请求,url-pattern中/和/*的区别:/匹配浏览器向服务端发送的所有请求(不包括JSP)进行处理--> 
16 <url-pattern>/</url-pattern> 17 </servlet-mapping>

  3. 处理器映射器(Handler Mapping):前端控制器将根据配置的处理器映射器(Handler Mapping)找到能够处理该请求的处理(Controller)。

         当前端控制器(DispatcherServlet)接收到请求后,会通过处理器映射器来确定具体的处理器。处理器映射器根据请求的URL、请求方法、请求参数等信息,将请求映射到配置中匹配的处理器。 处理器映射器可以根据不同的策略来进行请求的映射,常用的处理器映射器包括:

  1. - AnnotationMethodHandlerMapping:基于注解的处理器映射器,根据Controller类和方法上的注解来进行请求映射。
  2. - RequestMappingHandlerMapping:基于@RequestMapping注解的处理器映射器,根据@RequestMapping注解的配置来进行请求映射。
  3. - SimpleUrlHandlerMapping:基于URL和Bean的映射关系来进行请求映射。

 

  4. 处理器适配器(Handler Adapter):前端控制器将使用处理器适配器(Handler Adapter)来调用处理器执行相应的业务逻辑。

 

     处理器适配器(Handler Adapter)是Spring MVC中的一个组件,它的作用是将前端控制器(DispatcherServlet)接收到的请求交给处理器(Controller)执行相应的业务逻辑。

 

     前端控制器在确定了请求的处理器后,会使用处理器适配器来调用处理器的相应方法。处理器适配器负责将请求信息(如请求参数、路径变量等)传递给处理器,并调用处理器的方法来执行业务逻辑。处理器适配器根据处理器的类型和配置的适配规则来确定如何调用处理器。

 

          Spring MVC提供了多个处理器适配器,用于适配不同类型的处理器,常用的处理器适配器包括:

 

  1. - AnnotationMethodHandlerAdapter:用于适配基于注解的处理器,如使用@RequestMapping注解的处理器。
  2. - HttpRequestHandlerAdapter:用于适配实现了HttpRequestHandler接口的处理器,可以直接处理HTTP请求。
  3. - SimpleControllerHandlerAdapter:用于适配实现了Controller接口的处理器。

 

  5. 处理器执行业务逻辑:处理器(Controller)执行业务逻辑,处理请求并生成相应的模型数据。

 1 @RequestMapping("/response")
 2 public class ResponseScopeController {
 3     @RequestMapping("/mav")
 4     public ModelAndView testMAV(){
 5         //两个功能:Model和View功能  1.Model:向请求域中共享数据  2.View设置逻辑视图
 6         ModelAndView modelAndView=new ModelAndView();
 7         modelAndView.addObject("testRequestScope","hello,ModelAndView");
 8         //设置逻辑视图
 9         modelAndView.setViewName("success");
10         return modelAndView;
11     }
12 
13     @RequestMapping("/model")
14     public String Module(Model model){
15         model.addAttribute("testRequestScope","hello,Model");
16         return  "success";
17     }
18 
19     @RequestMapping("/modelMap")
20     public String ModuleMap(ModelMap map){
21         map.put("testRequestScope","hello,ModelMap");
22         return  "success";
23     }
24 
25     @RequestMapping("/session")
26     public String testSession(HttpSession session){
27         session.setAttribute("testSessionScope", "hello,session");
28         return "success";
29     }
30     @RequestMapping("/application")
31     public String testApplication(HttpSession session){
32         ServletContext application = session.getServletContext();
33         application.setAttribute("testApplicationScope","hello,ModelApplication");
34         return "success";
35     }
36 }

  6. 视图解析器(View Resolver):处理器将返回一个逻辑视图名,前端控制器将使用视图解析器(View Resolver)来解析逻辑视图名,找到对应的视图。

 

classpath:springmvc.xml

 

<!--扫描控制层组件 -->
<context:component-scan base-package="top.b3222.mvc.controller"/>
<!-- 配置Thymeleaf视图解析器,在tomcat进行热部署,添加war包,指定访问默认路径 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
     <!--order设置优先级,默认INTEGER.MAX--> <property name="order" value="1"/> <property name="characterEncoding" value="UTF-8"/> <property name="templateEngine"> <bean class="org.thymeleaf.spring5.SpringTemplateEngine"> <property name="templateResolver"> <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"> <!--直接通过index 逻辑视图,访问物理视图--> <!-- 视图前缀 --> <property name="prefix" value="/WEB-INF/templates/"/> <!-- 视图后缀 --> <property name="suffix" value=".html"/> <property name="templateMode" value="HTML5"/> <property name="characterEncoding" value="UTF-8" /> </bean> </property> </bean> </property> </bean>
    <mvc:default-servlet-handler/>
#path:设置处理的请求地址
#view-name:设置请求地址所对应的视图名称
<mvc:view-controller path="/" view-name='index'></mvc:view-controller>
<!--注:
当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需
要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
<mvc:annotation-driven />-->
<!-- 开启mvc注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 处理响应中文内容乱码 -->
<bean
class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="defaultCharset" value="UTF-8" />
<property name="supportedMediaTypes">
<list>
<value>text/html</value>
<value>application/json</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

  使用Restful风格(还有个Filter我还没看到明天补充)和(MoudelAndView进行重定向,转发操作,return "successs";forward:test/moudel ,rediect:/test/rediect,param的设置(略:总之这几个请求方式到最后都会合成一个模型(忘了)),几个域的获@{name},@{session.name},@{application.name})

package top.b3222.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/jumpView")
public class JumpViewController {

    @RequestMapping("/thymeleaf")
    public  String thymeleafView(){
        return "success";//页面跳转业务处理器
    }
    @RequestMapping("/forward1")
    public  String forwardView(){
        return "forward:/response/modelMap";//页面跳转业务处理器
    }
    @RequestMapping("/redirect")
    public  String redirectView(){
        return "redirect:/response/modelMap";//页面跳转业务处理器
    }
}

 

  7. 渲染视图:视图解析器将根据逻辑视图名找到对应的视图,并将模型数据传递给视图。视图将使用模型数据生成最终的响应内容。 

    <h1>向请求域共享数据</h1><br>
    <a th:href="@{/response/mav}">测试请求域中的数据</a><br>
    <a th:href="@{/response/model}">测试请求域model</a><br>
    <a th:href="@{/response/modelMap}">测试请求域model</a><br>
    <a th:href="@{/response/session}">向会话域共享数据</a><br>
    <a th:href="@{/response/application}">向应用域共享数据</a><br>
    <hr><!--设置MVC视图-->
    <a th:href="@{/jumpView/thymeleaf}">测试SpringMvc的视图ThymeleafView</a><br>
    <a th:href="@{/jumpView/forward1}">测试SpringMvc的视图InternalResourceView</a><br>
    <a th:href="@{/jumpView/redirect}">测试SpringMvc的视图的重定向</a>v

  8. 响应结果返回给客户端:前端控制器将最终的响应结果返回给客户端,完成请求-响应周期。

一次请求为什么三个数据都显示了,在一次请求中,Session域和Application域都在服务器中储存。

  总结:在整个执行流程中,前端控制器(DispatcherServlet)起到了核心的作用,它负责协调各个组件的工作,并处理请求的转发和响应的返回。通过配置不同的处理器映射器、处理器适配器、视图解析器等,可以灵活地定制Spring MVC应用的处理流程。