定义
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 >
<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}">
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>