day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter

时间:2022-11-30 21:14:34

定义

DispatcherServlet成为调度器,配置在web.xml文件中,用于拦截匹配的请求。并解析请求url,将请求分发给对应的控制器controller

Spring MVC 的工作流程:

1)客户端请求提交到调度器DispatcherServlet;
2)由DispatcherServlet调度器解析URL,调用URL相对应的映射处理器HandlerMapping
3)DispatcherServlet将请求提交到控制器Controller
4)Controller调用业务逻辑(service层和dao层)处理后,向DispatcherServlet返回ModelAndView;
5)DispatcherServlet根据ModelAndView获取相对应的视图解析器ViewResolve,找到ModelAndView指定的视图view;
6)ViewResolver将数据渲染到视图;
7)dispatcherServlet调度器响应视图显示到客户端;
day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter

在spring-mvc.xml内配置下列代码,可实现在controller类里直接返回文件名就可实现页面跳转
如:现有demo.html
controller可直接 return "demo";实现页面跳转

<!-- 对静态资源文件(html/js/css/img/png)的访问,交给defaultServletHandler处理,不加这个配置转发页面报404 -->
    <mvc:default-servlet-handler/>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <!--前缀 第一个斜杠表示webapp根目录-->
        <property name="prefix" value="/page/"/>
        <!--后缀-->
        <property name="suffix" value=".html"/>
    </bean>

配置thymeleaf模板引擎

1.在pom.xml的dependencies标签内配置以下代码

<!-- thymeleaf模板引擎 -->
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf</artifactId>
      <version>3.0.15.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf-spring5</artifactId>
      <version>3.0.15.RELEASE</version>
    </dependency>

2.在spring-mvc.xml配置以下代码,注意,之前配置的模板解析器可能回合视图解析器冲突删掉后只留
对静态资源文件(html/js/css/img/png)的访问:mvc:default-servlet-handler/

<!-- 模板解析器 -->
    <bean >
        <constructor-arg ref="servletContext"/>
        <property name="prefix" value="/page/"/><!-- 前缀 -->
        <property name="suffix" value=".html"/><!-- 后缀 -->
        <property name="templateMode" value="HTML5"/>
        <property name="cacheable" value="false"/><!-- 是否启用缓存 -->
        <property name="characterEncoding" value="UTF-8"/>
    </bean>

    <!-- 模板引擎 -->
    <bean >
        <!-- ref属性,表示关联指定id的bean-->
        <property name="templateResolver" ref="rs"/>
    </bean>

    <!-- thymeleaf的视图解析器 -->
    <bean >
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine" ref="te"/>
    </bean>

3.在html文件内的html标签内加入代码

<!--在html页面中引入thymeleaf命名空间,即此时在html模板文件中动态的属性使用th:命名空间修饰 。-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">

4.使用:直接在标签内加命名空间修饰

<p th:text="${name}"></p>
<input type="text" th:value="${age}">

day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter

thymeleaf命名空间的使用

<!-- 4 遍历集合
th:each="str,iterStat:${list}" strStat
    iterStat称为状态变量,如果不声明状态变量,th会默认生成一个名为“变量名Stat”的状态变量,如:strStat
    属性有:
    index: 当前迭代对象的index(从0开始)
    count: 当前迭代对象的index(从1开始)
    size:遍历的对象的大小(元素个数)
    current:当前迭代变量
    even/odd:布尔值,当前循环是否是偶数/奇数(从零开始)
    first:布尔值,当前循环是否是第一个
    last:布尔值,当前循环是否是最后一个
-->
<ul th:each="str:${list}">
    <li th:text="${strStat.count}+${str}"></li>
</ul>
<!--
6 比较运算
大   于  >  gt
小   于  <  lt
大于等于  >=  ge
小于等于  <=  le
等   于  ==  eq
不 等 于 !=  ne
-->
<span th:if="${no lt 11}">aaa</span>
<span th:if="${no gt 11}">bbb</span>
<span th:if="${no eq 11}">ccc</span>
<!-- 8 逻辑运算
&& and
|| or
! not
-->
<span th:if="${bool} and false">111</span>
<span th:if="${bool} or false">222</span>
<span th:if="not ${bool}">333</span>

day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter

ModelAndView

ModelAndView类作用:
1)存储向视图页面发送的参数,类似HttpServletRequest对象的setAttribute()方法
2)指定要请求的客户端页面名称,类似HttpServletRequest对象的请求转发

@RequestMapping("/toPage")
public ModelAndView toPage(){
    ModelAndView mv = new ModelAndView();
    //其他方法在下面列出
    //设置视图页面名字
    mv.setViewName("demo");
    return mv;
}

和加了视图解析器后的 效果一样

@RequestMapping("/toPage1")
public String toPage1(){
    return "demo";
}

//添加参数等价于req.setAttribute()
mv.addObject("name","张三");
mv.addObject("age",12);
使用此方法在前端页面展示的话
需要在pom.xml中加入thymeleaf模板引擎
其次在spring-mv.xml中加入模板解析器在SpringMVC配置文件示例有列出

<!-- thymeleaf模板引擎 -->
<dependency>
  <groupId>org.thymeleaf</groupId>
  <artifactId>thymeleaf</artifactId>
  <version>3.0.15.RELEASE</version>
</dependency>

<dependency>
  <groupId>org.thymeleaf</groupId>
  <artifactId>thymeleaf-spring5</artifactId>
  <version>3.0.15.RELEASE</version>
</dependency>

最后在前端页面的加入

<!-- 在html页面中引入thymeLeaf命名空间,即此时在htmlL模板文件中动态的属性使用th:命名空间修饰。-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">

配置拦截器

1.spring-mvc.xml配置如下

<!-- 配置拦截器 -->
    <mvc:interceptors>
        <!-- 配置一个全局拦截器,拦截所有请求 -->
        <!-- <bean class="interceptor.UserInterceptor" /> -->
        <mvc:interceptor>
            <!-- 配置拦截器作用的路径 -->
            <!-- /* 只能拦截一层的请求 /**可以拦截多层的请求-->
            <mvc:mapping path="/my/*" />
            <!-- 定义拦截器类的包路径 -->
            <bean class="com.st.interceptor.MyInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

2.路径:src=》main=》java=》com.situ=》interceptor=》MyInterceptor

package com.st.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /*
        preHandler()在请求进入controller之前执行,返回值是布尔类型
        true-放行请求
        false-拦截请求,请求不会进入后续的拦截器interceptor和控制器controller
         */
        System.out.println("preHandle-----before controller");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        /*
        postHandle()请求controller执行结束之后,dispatcherServlet加载视图之前执行
        用于对controller返回的ModelAndView对象进行后处理
         */
        System.out.println("postHandle-----after controller");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        /*
        在DispatcherServlet渲染完成对应的视图之后执行
        这个方法的主要作用是用于进行资源清理工作
         */
        System.out.println("afterCompletion-----");
    }
}

3.配置servlet相关包

<!--j2ee相关包servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
    </dependency>

拦截器工作流程

day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter
day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter

解决post请求中文乱码的问题

在web.xml里面配置如下代码,一般配置在servlet之前

<!--解决POST请求 中文乱码-->
  <filter>
    <filter-name>characterEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

spring-mvc.xml配置相关

day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter