今天想写一下关于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 ...
随机推荐
- 20165309 《网络对抗技术》实验一:PC平台逆向破解
20165309 <网络对抗技术>实验一:PC平台逆向破解 目录 实践目标 基础知识 实验原理.内容及步骤 问题与解决 实验收获 一.实践目标 本次实践的对象是一个名为pwn1的linux ...
- Java线程池—ThreadPool简介
一.Java线程池类/接口关系图及作用 Executor接口:只有一个方法execute(Runnable command),用来执行用户的任务线程. ExecutorService接口:继承自Exe ...
- Spring Http Invoke 请求过程图
Spring Http Invoke 请求过程图:
- python--多线程多进程
一.进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程.进程是很多资源 ...
- kafka 常用参数
通常的讲:kafka 的参数分为 Broker Configs 和 Topic-Level Configs,以 min.insync.replicas 为例,可以在 broker 和 topic 级别 ...
- 关于sql的查询操作记录
1.--读取库中的所有表名 select name from sysobjects where xtype='u' --读取指定表的所有列名 select name from syscolumns ...
- 一位资深Java架构师的晋级心得
架构师是什么? 是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物.一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清 ...
- Spring、SpringMVC区别
1. 为什么使用Spring ? 1). 方便解耦,简化开发 通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合. 2). AOP编程的 ...
- idea 的Maven执行异常终止(退出代码1)
Maven execution terminated abnormally (exit code 1)译文:Maven执行异常终止(退出代码1) 我遇到这个错很迷茫 你们遇见了不要慌 只需要粘贴一行代 ...
- 用户认证:基于jwt和session的区别和优缺点
背景知识: Authentication和Authorization的区别: Authentication:用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码 ...