今天想写一下关于SpringMVC的视图解释器
昨天我写了一下SpringMVC最爱金丹的项目的配置流程,这样搭建完项目之后呢我发现我每个请求都得加个.do什么的后缀,这让我开发得很不爽,于是呢今天就想配置一下这个试图解释器,这样做的目的有两个:第一、在页面跳转的时候按照Resful风格的规定去掉页面路径上的后缀。第二,页面的跳转必须通过配置的试图解释器进行跳转不可以直接访问子页面。
接下来应该怎么做呢?需要配置试图解释器首先得知道哪个是我们需要的视图解释器,之前讲过SpringMVC默认给我们配置了一个视图解释器。既然是SpringMVC默认给的视图解释器当我们需要配置的时候就要去SpringMVC的包下面去找相关的信息了。

接着我就在view下面找到了JSP的视图解释器。接着我们就可以对它进行配置了。在配置之前首先得了解一下我们需要什么参数,还有这个类到底有什么功能。
* Convenient subclass of {@link UrlBasedViewResolver} that supports
* {@link InternalResourceView} (i.e. Servlets and JSPs) and subclasses
* such as {@link JstlView}.
从作者的注释上面可以看到这个类支持对JSP文件路径的的解析
* <p>BTW, it's good practice to put JSP files that just serve as views under
* WEB-INF, to hide them from direct access (e.g. via a manually entered URL).
* Only controllers will be able to access them then.
这段说明了这个可以类的配置可以把jsp放到WEB-INF目录下,我们就只能通过它来访问页面了。这样做可以防止用户跳过登录或者主页直接通过url跳转到主页或者其他的子页面。大大地增加了网站的安全性。
* @see #setPrefix
* @see #setSuffix
这些参数作者告诉了我们可以用过设置前后缀来指定动态资源存放的位置,我们的路径必须通过它来补全路径才能访问。
接着就把全路径写在了Spring的配置文件中,可是问题接踵而至,辣么,bean的name又是什么呢?在这里我们首先要清楚我们这个对象到底要交给谁去处理。
我们请求分发依赖的是DispacherServlet,请求的映射关系也是不仅仅依赖注解的实现,同时也依赖于DispacherServlet。既然作者把这两样的实现都对它有依赖了。那么视图解释器呢?
接着就打开了这个DispacherServlet这个类。于是答案就出来了。
/**
* Well-known name for the ViewResolver object in the bean factory for this namespace.
* Only used when "detectAllViewResolvers" is turned off.
* @see #setDetectAllViewResolvers
*/
public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
我看到这个类里面有这么一个参数作者说这个参数的对象在beanfactory里面被创建之后呢是为了这个明明空间,但是使用它的时候detectAllViewResolvers必须是关闭的。
接着又有疑问了这个setDetectAllViewResolvers又是个啥玩意儿呢?接着我又开始寻找
/**
* Set whether to detect all ViewResolver beans in this servlet's context. Otherwise,
* just a single bean with name "viewResolver" will be expected.
* <p>Default is "true". Turn this off if you want this servlet to use a single
* ViewResolver, despite multiple ViewResolver beans being defined in the context.
*/
public void setDetectAllViewResolvers(boolean detectAllViewResolvers) {
this.detectAllViewResolvers = detectAllViewResolvers;
}
这里作者又说了这里是是否扫描整个上下文里面所有关于视图解释器的bean对象,默认它们的name 是“viewResolver”。这里意思就是说SpringMVC默认支持同时配置多个视图解释器。
如果你希望只使用一个视图解释器的话可以把它设置成false。这样就只有一个试图解释器会生效了。
接着开始着手配置首先在SpringMVC基本框架已经搭好的基础上打开我们的配置文件。bean一个视图解释器。
<bean name="viewResolvers" class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
包的路径就是这个类的路径。那对象名呢?那么问题又回到最初了,到底是谁需要这个视图解释器?之前说过SpringMVC它默认给我们配置了一个
jsp的试图解释器。那什么时候用到它呢?那是我们在做请求分发的时候。请求首先会进入web.xml然后经过DispacherServlet处理过之后就到了Controller层
然后Controller调用Service代码····之后又回到Controller。然后又回到web.xml再跳转到页面。那我们又在这个地方只配置了一个Servlet。首当其冲就是
怀疑它了。于是我就可以展开对它的调查。打开之后发现了:
/**
* Well-known name for the ViewResolver object in the bean factory for this namespace.
* Only used when "detectAllViewResolvers" is turned off.
* @see #setDetectAllViewResolvers
*/
public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
果不其然这个类里面有了我们需要的答案。这个DispacherServlet启动时被调用之后它就会到Context容器之中收集它需要的对象
这里作者也说了。它会在启动之后在容器里面寻找叫做"viewResolver"这个名字的试图解释器。我们既然想把自己配置的视图解释器
赋予给这个DispacherServlet,那么bean这个对象的时候name属性命名为"viewResolver"不就可以了么。
这样对象就配好了那么接着我们需要配置这个对象的属性。查看一个对象的属性最快的方法就是Ctrl+鼠标左键点进去这个类里面
* @see #setPrefix
* @see #setSuffix
我们看到这两个参数之后就可以得知我们可以通过配置前后缀来让这个视图解释器在处理请求的时候帮我们加上前后缀。
<bean name="viewResolvers" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
然后我们就需要去修改DispacherServlet的请求拦截规则修改一下
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这样我们就把视图解释器配置好了。在这里有个地方值得我们注意的是:拦截规则的“ / “”和“ /* ”之间的区别
/拦截的是除了动态资源以外的资源,/*拦截的是所有的请求包括了动态和静态的资源。
这样视图解释器就全部配置好了。最后贴一下代码
web.xml代码:
<display-name>Spring-lianxi</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
SpringMVC配置文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <mvc:annotation-driven></mvc:annotation-driven> <mvc:default-servlet-handler/> <bean name="viewResolvers" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
SpringContext容器配置代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:component-scan base-package="cn.devil"></context:component-scan> </beans>
主页
<html>
<head>
<title>老 子 是 主 页</title>
</head> <body>
<a href="${pageContext.request.contextPath }/say">点我跳转页面</a>
</body>
</html>
跳转页面
<html>
<head>
<title>页 面 跳 转 成 功</title>
</head> <body>
Hello World!<br/>
<a href="${pageContext.request.contextPath }/goindex">点我回到首页</a>
</body>
</html>
Controller代码
@Controller
public class UserController { @RequestMapping("/say")
public String say() {
System.out.println("Hello World!");
return "hello";
} @RequestMapping("/goindex")
public String backToIndex() {
return "redirect:index.jsp";
}
}
文件的位置

OK大功告成。明天我打算开始在这个基础上写SpringMVC整合SpringJDBC
今天想写一下关于SpringMVC的视图解释器的更多相关文章
- SpringMVC——说说视图解析器
学习SpringMVC——说说视图解析器 各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请 ...
- SpringMVC源码分析6:SpringMVC的视图解析原理
title: SpringMVC源码分析6:SpringMVC的视图解析原理 date: 2018-06-07 11:03:19 tags: - SpringMVC categories: - 后端 ...
- SpringMVC重定向视图RedirectView小分析
目录 前言 RedirectView介绍 实例讲解 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnbl ...
- SpringMvc:视图和视图解析器
请求处理方法执行完成后,最终返回一个ModelAndView对象,对于返回String,View或ModelMap等类型的处理方法,SpringMvc也会在内部将它们装配成一个ModelAndView ...
- 1.想写一些关于c++的东西了,就作为个开篇吧
又再一次重拾c++,想写一些东西,给自己看看,不想再看一些隐晦翻译的外国书籍了,就从一本好读的书开始写一写. 就这本吧, <我的第一本C++书>> 来写一写自己的东西.
- SpringMVC自定义视图Excel视图和PDF视图
SpringMVC自定义视图 Excel视图和PDF视图 SpringMVC杂记(十一) 使用Excel视图 Spring MVC 视图解析器(ViewResolver ) java实现导出excel ...
- SpringMVC 多视图解析器配置以及问题
在SpringMVC模式当中可以通过如下配置来支持多视图解析 <!-- jsp jstl --> <bean id="JSPViewResolver" class ...
- ToShowDoc拯救不想写文档的你
ToShowDoc拯救不想写文档的你 写注释已经够折磨开发者了,显然天天curd的我们再去写文档岂不是分分种要被逼疯. 我想每个人都有这种经历 加了一个参数文档忘了更新 参数名更改文档忘了更新 删掉一 ...
- 11.13的C++##不想写结构,更不爱指针
//2019.11.13 卑微的Loving-Q瞎写的程序 报错请更改VS中的SDL检查// 我要去嗨了,在线卑微 1 #include<iostream> #include<std ...
随机推荐
- GlusterFS分布式文件系统的使用
glusterfs是一款开源的分布式文件系统. 它具备高扩展.高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可轻松达到PB级别,支持数千客户端并发访问. ...
- 人生苦短,我用python(目录)
一.python基础篇 python中闭包及延时绑定问题 python中的装饰器.生成器 二.前端 bootstrap框架 BOM&DOM JavaScript中的词法分析 三.数据库 mys ...
- XFS文件系统的备份和恢复
1.工具 XFS文件系统提供了xfsdump和xfsrestore来协助备份.恢复XFS文件系统中的数据,xfsdump按inode顺序来备份XFS文件系统,备份时不需要卸载文件系统,备份和恢复的过程 ...
- gevent模块学习(三)
3. Group类,常用于不限制数量的管理异步任务的分组且可搜集运行结果 g = gevent.pool.Group(*args) -> Group 说明: 创建一个组对象,其实就是一个不限gr ...
- 刷题upupup【Java中HashMap、HashSet用法总结】
HashMap: 常用操作 1. containsKey() 判断HashMap是否包含key 2. containsValue() 判断HashMap是否包含“值为value”的元素 3. get( ...
- Java 开发笔记
共同学习,以下内容,随时更新. 前端 1.前端页面'是单引号的转义符,"是双引号. 问题(前端JS进行参数传递时,使用的是单引号扩住变量,但是变量形式为 2019-27 ...
- 前端经典面试题之CSS实现三栏布局,左右宽度固定,中间宽度自适应
前端常问的面试题,题目:假设高度一定,请写出三栏布局,左右宽度300px,中间自适应. 看到这里我希望你能停下来思考几分钟, 1分钟~2分钟~3分钟~4分钟~5分钟! 好了,那么你想出了几种答案呢? ...
- 信用卡欺诈数据的分析-excel篇
本篇文章为大家提供了数据集分析的思路和步骤,同时也分享了自己的经验. 一.背景 反欺诈是一项识别服务,是对交易诈骗.网络诈骗.电话诈骗.盗卡盗号等行为的一项风险识别.其核心是通过大数据的收集.分析和处 ...
- python中的turtle库(图形绘画库)
turtle绘图的基础知识:1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置. 设置画布大小 turtle.screensize(canvwidt ...
- selenium自动化实例: 多层框架中关于iframe的定位,以及select下拉框选择
对于一个自动化的初学者来说会很常见的遇到元素明明存在却始终定位不到, 从而导致脚本报错,当然定位不到元素的原因很多, 其中一种就是多层框架iframe导致的 下方截图示意: 下方为写脚本时候的示例并其 ...