day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语法 & 6-7 springMVC拦截器 & 6-8 设置请求编码过滤器Filter
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的更多相关文章
- springboot配置server相关配置&整合模板引擎Freemarker、thymeleaf&thymeleaf基本用法&thymeleaf 获取项目路径 contextPath 与取session中信息
		
1.Springboot配置server相关配置(包括默认tomcat的相关配置) 下面的配置也都是模板,需要的时候在application.properties配置即可 ############## ...
 - 三、thymeleaf模板引擎构建前台html,  后台使用 ModelAndView 和 Model  模型
		
项目源码:https://github.com/y369q369/springBoot.git -> thymeleaf 私聊QQ: 1486866853 1.pom.xml中 ...
 - UndertowServer+SpringMVC+Thymeleaf模板引擎构建轻量级的web项目
		
这两周需要写一个页面来请求另一个服务中的接口,服务器采用了超轻量级的undertow,模板引擎采用的是Thymeleaf,在寻找页面资源位置这个地方难住了我.下面分享一下,这方面的代码. Spring ...
 - SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆
		
在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...
 - laravel 配置双模板引擎
		
有时候我们可能有这种需求,pc 和 mobile 端显示的页面不一样,这个时候,我们就需要判断设备类型: ****我们用 composer require whichbrowser/parser ...
 - 初学springMVC的拦截器
		
springMvc拦截器的执行顺序! 拦截器的各个方法的作用: /** * 登录验证拦截器 */ public class Intercepter implements HandlerInt ...
 - struts2-权限拦截器、日志拦截器、execAndWait(进度条)拦截器配置
		
1.权限拦截器 package login; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.Serv ...
 - Java开发学习(二十八)----拦截器(Interceptor)详细解析
		
一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...
 - Spring Boot实战:拦截器与过滤器
		
一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...
 - Spring Boot之拦截器与过滤器(完整版)
		
作者:liuxiaopeng 链接:http://www.cnblogs.com/paddix 作者:蓝精灵lx原文:https://blog.csdn.net/liuxiao723846/artic ...
 
随机推荐
- Java SE 3、封装
			
封装 封装的好处 隐藏实现细节 可以对数据进行验证,保证安全合理 实现步骤 将属性进行私有化private 提供一个公共的(public)set方法,用于对属性判断并赋值 public void se ...
 - Python数据科学手册-Pandas:数值运算方法
			
Numpy 的基本能力之一是快速对每个元素进行运算 Pandas 继承了Numpy的功能,也实现了一些高效技巧. 对于1元运算,(函数,三角函数)保留索引和列标签 对于2元运算,(加法,乘法),Pan ...
 - Python使用tesserocr识别文字过程中遇到的一个问题
			
最近在使用Python识别PNG图像中包含的文字时遇到一个问题.解决过程记录如下. (Python使用tesserocr的安装过程不再描述.) 在使用tesserocr识别PNG图像中的文字时,如果P ...
 - 使用mtr来判断网络丢包和网络延迟
			
转载自:https://mp.weixin.qq.com/s/UsjzMS1_rdxenw0TPlqwyQ 常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Li ...
 - ceph安装Dashboard并开启Object Gateway管理功能
			
安装配置dashboard Ceph-Dashboard 是用 Python 开发的一个 Ceph 的监控面板,用来监控 Ceph 的运行状态.同时 提供 REST API 来访问状态数据. 低版本的 ...
 - shell分割字符串并赋值给变量
			
假如变量var的值为:num=12,也即var="num=12",现在想把 12赋值给变量id awk 的-F 后跟上要分割字符串时的指定分隔符 awk中$0是要分割的字符串,$1 ...
 - Docker镜像仓库Harbor之Swagger REST API整合配置
			
转载自:https://cloud.tencent.com/developer/article/1010618 1.Swagger 介绍 Swagger 是一个规范和完整的框架,用于生成.描述.调用和 ...
 - Java开发学习(三十六)----SpringBoot三种配置文件解析
			
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
 - 某云负载均衡获取客户端真实IP的问题
			
某云负载均衡真实IP的问题,我们这边已经遇到过两次了.而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会 ...
 - 一文讲清楚 JVM Safe Point
			
大家好,我是树哥. 关于 Safe Point 是 JVM 中很关键的一个概念,但我估计有不少同学不是很懂.于是今天跟大家来深入聊聊 Safe Point,希望通过这篇文章能解答这样几个问题: 什么是 ...