今天想写一下关于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 ...
随机推荐
- python 读取excel文件
方法一:利用pandas import pandas as pd inputfile_1 = "F:\\大论文实验\\福贡县数据\\贫困人口数据_2015.xlsx" data1 ...
- FPM六:接五,跳转到明细
1.在RESULT的Feeder class里添加点击单号事件: method IF_FPM_GUIBB_LIST~GET_DEFINITION. DATA:GW_ACTION TYPE FPMGB_ ...
- elasticSearch安装 Kibana安装 Sense安装
安装最新版本,安装6.*版本 先提示一个重要的事情,kibana新版本不需要安装Sense, 官方的是老版的Kibana才需要,我们现在用devTool http://localhost:5601/a ...
- ZYNQ DMA驱动及测试分析
之前没有接触过DMA驱动.不了解它的原理,稍作学习先总结下dma驱动步骤: 1. 申请DMA中断. 2. 申请内存空间作为src和dts的空间. 3. 注册设备注册节点 4. 将申请到的src和dst ...
- [LeetCode] 80. Remove Duplicates from Sorted Array II ☆☆☆(从有序数组中删除重复项之二)
https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/discuss/27976/3-6-easy-lines-C% ...
- JVM工具jstat使用说明
输入:jstat -help得到以下帮助信息 Usage: jstat --help|-options jstat -<option> [-t] [-h<lines>] < ...
- 发现sql注入的一些技巧
1.如果一个'导致错误,试着查看\'能否成功(因为反斜杠在MySQL中取消了单引号)2.你也可以尝试注释掉,--',看页面返回是否正常.3.如果正常的输入只是一个整数,你可以尝试减去一些量,然后查看减 ...
- Road of computer tec 01
回顾自己过去将近3年的学习经历 当初报考的时候,自己是真正喜欢这个专业的么? 当初报这个专业的时候,对计算机还没有什么很明显的概念,只知道这个专业以后是要每天面对电脑的,喜欢不喜欢谈不上吧,但是还蛮感 ...
- 洛谷P1073 最优贸易
题面要求的是一个差值,即走过一条路径能找到的路径上最大值-最小值. 那么相当于跑一遍最长路和一遍最短路,当然不是概念上的最长路最短路,这里把dis[v]的松弛改成用路径上传递来的最大/最小值维护,而不 ...
- CEPH集群操作入门--部署和运维
部署 预检和安装Ceph 参考 虚拟机使用ceph-deploy安装ceph 创建群集 添加/删除监视器 密钥管理 添加/删除OSD 添加/删除MDS 清除主机 管理任务 运维 操作群集 健康检查 ...