笔记29 视图解析 ——InternalResourceViewResolver
Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现
首先将会介绍 InternalResourceViewResolver,这个视图解析器一般会用来 解析JSP视图。
1. Spring提供了两种支持JSP视图的方式:
- InternalResourceViewResolver会将视图名解析为JSP文 件。另外,如果在你的JSP页面中使用了JSP标准标签库 (JavaServer Pages Standard Tag Library,JSTL)的 话,InternalResourceViewResolver能够将视图名解析为 JstlView形式的JSP文件,从而将JSTL本地化和资源bundle变量暴 露给JSTL的格式化(formatting)和信息(message)标签。
- Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一 个提供了通用的工具类特性。
考虑一个简单的场景,假设逻辑视图名为home。通用的 实践是将JSP文件放到Web应用的WEB-INF目录下,防止对它的直接 访问。如果我们将所有的JSP文件都放在“/WEB-INF/views/”目录下, 并且home页的JSP名为home.jsp,那么我们可以确定物理视图的路径 就是逻辑视图名home再加上“/WEB-INF/views/”前缀和“.jsp”后缀。如下图所示:
当使用@Bean注解的时候,我们可以按照如下的方式配 置Internal-ResourceView Resolver,使其在解析视图时,遵 循上述的约定。
@Bean // 配置JSP视图解析器
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
2. 解析JSTL视图
如果在JSP中使用JSTL标签来处理格式化和信息的话,那么就会让InternalResourceViewResolver将视图解析为JstlView。 JSTL的格式化标签需要一个Locale对象,以便于恰当地格式化地域 相关的值,如日期和货币。信息标签可以借助Spring的信息资源和 Locale,从而选择适当的信息渲染到HTML之中。通过解析 JstlView,JSTL能够获得Locale对象以及Spring中配置的信息资 源。
如果想让InternalResourceViewResolver将视图解析 为JstlView,而不是InternalResourceView的话,那么我们只需设置它的viewClass属性即可:
@Bean // 配置JSP视图解析器
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
3. Spring的JSP库
Spring提供了两个JSP标签库,用来帮助定义 Spring MVC Web的视图。其中一个标签库会用来渲染HTML表单标 签,这些标签可以绑定model中的某个属性。另外一个标签库包含了 一些工具类标签
3.1 将表单绑定到模型上
Spring的表单绑定JSP标签库包含了14个标签,它们中的大多数都用来 渲染HTML中的表单标签。但是,它们与原生HTML标签的区别在于 它们会绑定模型中的一个对象,能够根据模型中对象的属性填充值。 标签库中还包含了一个为用户展现错误的标签,它会将错误信息渲染 到最终的HTML之中。
为了使用表单绑定库,需要在JSP页面中对其进行声明:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
需要注意,将前缀指定为“sf”,但通常也可能使用“form”前缀。 在声明完表单绑定标签库之后,就可以使用14个相关的标签了。如下图所示:
重写registerForm.jsp,程序如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>注册</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<sf:form method="POST" modelAttribute="spitter">
First Name:<sf:input path="firstName"/>
Last Name:<sf:input path="lastName"/>
Email:<sf:input path="email"/>
UserName:<sf:input path="username"/>
Password:<sf:password path="password"/>
<input type="submit" value="注册">
</sf:form>
</body>
</html>
<sf:form>会渲染会一个HTML <form>标签,但它也会通过 commandName属性构建针对某个模型对象的上下文信息。在其他的 表单绑定标签中,会引用这个模型对象的属性。
将commandName属性设置为spitter。因 此,在模型中必须要有一个key为spitter的对象,否则的话,表单 不能正常渲染(会出现JSP错误)。这意味着需要修改一 下SpitterController,以确保模型中存在以spitter为key的 Spitter对象:
@RequestMapping(value = "/register", method = RequestMethod.GET) // 处理对“/spitter/register”的GET请求
public String showRegistrationForm(Model model) {
model.addAttribute(new Spitter());
return "registerForm";
}
修改后的showRegistrationForm()方法中,新增了一 个Spitter实例到模型中。
3.2 展现错误
相对于标准的HTML标签,使用Spring的表单绑定标签能够带来一定 的功能提升,在校验失败后,表单中会预先填充之前输入的值。但 是,这依然没有告诉用户错在什么地方。为了指导用户矫正错误,需要使用<sf:errors>。
如果存在校验错误的话,请求中会包含错误的详细信息,这些信息是 与模型数据放到一起的。我们所需要做的就是到模型中将这些数据抽 取出来,并展现给用户。<sf:errors>能够让这项任务变得很简 单。
<sf:errors path="firstName">
<span id="firstName.errors">必须大于2个字符</span>
</sf:errors>
将<sf:errors>用到First Name输入域的场景,它的path属性设置成了firstName,也就是指定了要显示Spitter 模型对象中哪个属性的错误。如果firstName属性没有错误的话, 那么<sf:errors>不会渲染任何内容。但如果有校验错误的话,那 么它将会在一个HTML <span>标签中显示错误信息。
4. Spring通用的标签库
除了表单绑定标签库之外,Spring还提供了更为通用的JSP标签库。要使用Spring通用的标签库,我们必须要在页面上对其进行声明:
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
标签库声明之后,我们就可以使用下表中的十个JSP标签了。
4.1 展现国际化信息
对于渲染文本来说,是很好的方案,文本能够位于一个或多个属性文 件中。借助<s:message>,我们可以将硬编码的欢迎信息替换为如 下的形式:
按照这里的方式,<s:message>将会根据key为spittr.welcome 的信息源来渲染文本。因此,如果我们希望<s:message>能够正常 完成任务的话,就需要配置一个这样的信息源。
Spring有多个信息源的类,它们都实现了MessageSource接口。在 这些类中,更为常见和有用的 是ResourceBundleMessageSource。它会从一个属性文件中加 载信息,这个属性文件的名称是根据基础名称(base name)衍生而来 的。如下的@Bean方法配置了 ResourceBundleMessageSource:
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("message");
return messageSource;
}
在这个bean声明中,核心在于设置basename属性。你可以将其设置 为任意的值,在这里,我将其设置为message。将其设置 为message后,ResourceBundle-MessageSource就会试图在根 路径的属性文件中解析信息,这些属性文件的名称是根据这个基础名 称衍生得到的。
另外的可选方案是使 用ReloadableResourceBundleMessageSource,它的工作方 式与ResourceBundleMessageSource非常类似,但是它能够重 新加载信息属性,而不必重新编译或重启应用。如下是配 置ReloadableResourceBundle-MessageSource的样例:
@Bean
public MessageSource messageSource2() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("file:///etc/spittr/message");
messageSource.setCacheSeconds();
return messageSource;
}
这里的关键区别在于basename属性设置为在应用的外部查找(而不 是像ResourceBundleMessageSource那样在类路径下查 找)。basename属性可以设置为在类路径下(以“classpath:”作 为前缀)、文件系统中(以“file:”作为前缀)或Web应用的根路径 下(没有前缀)查找属性。在这里,我将其配置为在服务器文件系统 的“/etc/spittr”目录下的属性文件中查找信息,并且基础的文件名 为“message”。
这两个bean放在WebConfig.java中
创建属性文件:message.properties 位置:src下,类的根目录
spittr.welcome=Welcome to Spittr\!
4.2 创建URL
<s:url>是一个很小的标签。它主要的任务就是创建URL,然后将其 赋值给一个变量或者渲染到响应中。它是JSTL中<c:url>标签的替 代者,但是它具备几项特殊的技巧。
按照其最简单的形式,<s:url>会接受一个相对于Servlet上下文的 URL,并在渲染的时候,预先添加上Servlet上下文路径。例如,考虑 如下<s:url>的基本用法:
如果应用的Servlet上下文名为spittr,那么在响应中将会渲染如下 的HTML:
这样,在创建URL的时候,就不必再担心Servlet上下文路径是什 么了,<s:url>将会负责这件事。
另外,还可以使用<s:url>创建URL,并将其赋值给一个变量供 模板在稍后使用:
默认情况下,URL是在页面作用域内创建的。但是通过设置scope属 性,我们可以让<s:url>在应用作用域内、会话作用域内或请求作 用域内创建URL:
如果希望在URL上添加参数的话,那么可以使用<s:param>标 签。比如,如下的<s:url>使用两个内嵌的<s:param>标签,来设 置“/spittles”的max和count参数:
重点:创建带有路径 (path)参数的URL
当href属性中的占位符匹配<s:param>中所指定的参数时,这个参 数将会插入到占位符的位置中。如果<s:param>参数无法匹配href 中的任何占位符,那么这个参数将会作为查询参数。
笔记29 视图解析 ——InternalResourceViewResolver的更多相关文章
- spring 视图解析 ——InternalResourceViewResolver
原文:https://www.cnblogs.com/lyj-gyq/p/8963885.html Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现 首先将会介绍 InternalR ...
- 笔记30 视图解析 ——TilesViewResolver
Apache Tiles,定义适用于所有页面 的通用页面布局.Spring MVC以视图解析器的形式为Apache Tiles提 供了支持,这个视图解析器能够将逻辑视图名解析为Tile定义. 1.配 ...
- SSM-SpringMVC-05:SpringMVC视图解析器InternalResourceViewResolver配置
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器------默认就有配置,但是默认的在实际使用过程中有很多不方便的地方,所以我们配置一道视图解析器 ...
- InternalResourceViewResolver视图解析器(转)
转载地址:https://www.cnblogs.com/liruiloveparents/p/5054605.html springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就 ...
- 【Spring学习笔记-MVC-12】Spring MVC视图解析器之ResourceBundleViewResolver
场景 当我们设计程序界面的时候,中国人希望界面是中文,而美国人希望界面是英文. 我们当然希望后台代码不需改变,系统能够通过配置文件配置,来自己觉得是显示中文界面还是英文界面. 这是,Spring mv ...
- 【SpringMVC笔记】第五课 改进Handler处理器和视图解析器
第四课 已经对注解的映射器和适配器进行了改进. 接下来需要对Handler处理器和视图解析器进行改进. <!-- 配置handler处理器 --> <bean class=" ...
- springMVC初探视图解析器——InternalResourceViewResolver
springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...
- springMVC视图解析器——InternalResourceViewResolver(转)
springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...
- SpringMVC 视图解析器 InternalResourceViewResolver
我们在使用SpringMVC的时候,想必都知道,为了安全性考虑,我们的JSP文件都会放在WEB-INF下, 但是我们在外部是不可以直接访问/WEB-INF/目录下的资源对吧, 只能通过内部服务器进行转 ...
随机推荐
- linux 之文件重命名
没有专门的重命名 命令 用 mv a b 就可以重命名了 mv :move 移动文件(延伸功能:重命名,linux系统没有专门的重命名命令) 基本格式: 移动文件:mv 文件名 移动目的地文件名 重命 ...
- windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭
windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭,错误的解决方法 在 ...
- ie中datepicker赋值不成功
解决办法:删除placeholder即可 比如我代码如下:
- java多线程面试题选择题大全含答案
v java多线程面试题选择题大全含答案 java多线程面试题选择题大全含答案 1.下面程序的运行结果()(选择一项)public static void main(String[] args) {T ...
- SpringBoot 2.x 使用 JWT(JSON Web Token)
一.跨域认证遇到的问题 由于多终端的出现,很多的站点通过 web api restful 的形式对外提供服务,采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于 cookie 的 S ...
- ORACLE动态sql在存储过程中出现表或视图不存在的解决方法
Oracle动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN ...
- 密码学之RSA基础
预备数论知识 互质关系 如果两个正整数,除了1以外,没有其他公因子,那么就称这两个数是互质关系 比如:4和7,13和61 欧拉函数 思考:任意给定整数n,在小于等于n的正整数中,有多少个数与n构成互质 ...
- mongodb副本集(选举,节点设置,读写分离设置)
1.相对于传统主从模式的优势 传统的主从模式,需要手工指定集群中的Master.如果Master发生故障,一般都是人工介入,指定新的Master.这个过程对于应用一般不是透明的,往往伴随着应用重新修改 ...
- Go 方法、接口
在 Go 中,类型可以定义接收此类型的函数,即方法.每个类型都有接口,意味着对那个类型定义了方法集合. 下面定义了结构体类型 S 以及它的两个方法: type S struct { i int ...
- fiddler抓包工具详解
转自:http://www.cnblogs.com/yyhh/p/5140852.html Fiddler 抓包工具总结 阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Sta ...