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

2023-02-12,,,,

springMVC调度器 - DispatcherServlet - SpringMVC框架的入口

定义

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调度器响应视图显示到客户端;

在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 id="rs" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<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 id="te" class="org.thymeleaf.spring5.SpringTemplateEngine">
<!-- ref属性,表示关联指定id的bean-->
<property name="templateResolver" ref="rs"/>
</bean> <!-- thymeleaf的视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<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}">

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>

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>

拦截器工作流程

解决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的相关教程结束。

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

下载本文的Word格式文档,以方便收藏与打印。