渲染Web视图
Spring MVC定义了一个名为ViewResolver的接口
public interface ViewResolver{
View resolveViewName(String viewName, Locale locale) throws Exception;
}
public interface View{
String getContentType();
void render(Map<String, ? > model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
View接口的任务就是接受模型以及Servlet的request和response,并将输出结果渲染到response中。
BeanNameViewResolver 将视图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同
ContentNegotiatingViewResovler 通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器
FreeMarketViewResovler 将视图解析为FreeMarker模板
InternalResourceViewResolver 将视图解析为Web应用的内部资源
JasperReportsViewResolver 将视图解析为JasperReports定义
ResourceBundleViewResolver 将视图解析为资源bundle
TilesViewResovler 将视图解析为Apache Tile定义,其中tile ID与视图名称相同
UrlBasedViewResolver 直接根据视图的名称解析视图,视图的名称会匹配一个屋里视图的定义
VelocityLayoutViewResolver 将视图解析为Velocity布局,从不同的Velocity模板中组合页面
VelocityViewResolver 将视图解析为Velocity模板
XmlViewResolver 将视图解析为特定XML文件中的bean定义
XsltViewResolver 将视图解析为XSML转换后的结果
Spring提供了两种支持JSP视图的方式:
InternalResourceViewResolver会将视图名解析为JSP文件。若在JSP页面使用了JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)的话,InternalResourceViewResolver能够将视图名解析为JstlView形式的JSP文件,蓉儿将JSTL本地化的资源bundle变量暴漏给JSTL格式化(formatting)和信息(message)标签。
Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性
InternalResourceViewResolver会在视图名上添加前缀和后缀,进而确定一个Web应用中视图资源的物理路径
Java配置
- @Bean
- public ViewResolver viewResolver(){
- InternalResourceViewResolver resolver = new InternalResourceViewResolver();
- resolver.setPrefix("/WEB-INF/views/");
- resolver.setSuffix(".jsp");
- return resolver;
- }
XML配置
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views" p:suffix=".jsp" />
解析JSTL视图
JSTL的格式化标签需要一个Locale对象,以便于恰当地格式化地域相关的值。信息标签可以借助Spring的信息资源和Locale,从而选择适当的信息渲染到HTML中,通过解析JstlView,JSTL能够获得Locale对象以及Spring中配置的信息资源。
Java实现
- @Bean
- public ViewResolver viewResolver(){
- InternalResourceViewResolver resolver = new InternalResourceViewResolver();
- resolver.setPrefix("/WEB-INF/views/");
- resolver.setSuffix(".jsp");
- resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
- return resolver;
- }
XML实现
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceResolver" p:prefix="/WEB-INF/views" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView" />
使用Spring的JSP库
将表单绑定到模型上
Spring的表单绑定JSP标签库包含了14个标签。它们与原生HTML标签的区别在于它们会绑定模型中的一个对象,能够根据模型中对象的属性填充值。标签库中还包含了一个为用户展现错误的标签,它会将错误信息渲染到最终的HTML之中。
为了使用表单绑定库,需要在JSP页面中对其进行声明:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" /> (制定前缀为form)
form:checkbox 渲染成一个HTML<input>标签,其中type属性设置为checkbox
form:checkboxes 渲染成多个HTML<input>标签,其中type属性设置为checkbox
form:errors 在一个HTML<span>中渲染输入域错误
form:form 渲染成一个HMTL<form>标签,并为其内部标签暴漏绑定路径,用于数据绑定。它会通过commandName属性构建针对某个模型对象的上下文信息,在其他的表单绑定标签中,会引用这个模型对象的属性。
form:hidden 渲染成一个HTML<input>标签,其中type属性设置为hidden
form:input 渲染成一个HTML<input>标签,其中type属性为text
form:label 渲染成一个HTML<label>标签
form:options 渲染成一个HTML<option>标签,其selected属性根据所绑定的值设置
form:password 渲染成一个HTML<input>标签,其type属性设置为password
form:radiobutton 渲染成一个HTML<radiobutton>标签,其type属性设置为radio
form:radiobuttons 渲染成一个HTML<radiobuttons>标签,其type属性设置为radio
form:select 渲染成一个HTML<select>标签
form:textarea 渲染成一个HTML<textarea>标签
- <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
- <form:form method="POST" commandName="spitter">
- First Name : <form:input path="firstName" /><br />
- Last Name : <form:input path="lastName" /><br />
- Username : <form:input path="username" /><br />
- Password : <form:password path="password" /><br />
- </form>
commandName属性设置为spitter。在模型中必须有一个key为spitter的对象,否则表单不能正常渲染。
- @RequestMapping(value="/register", method=RequestMethod.GET)
- public String showRegistrationForm(Model model){
- model.addAttribute(new Spitter());
- return "registerForm";
- }
Spring通用的标签库
要使用Spring通用的标签库,必须要在页面上对其进行声明:
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<s:bind> 将绑定属性的状态到处到一个名为status的页面作用域属性中,与<s:path>组合使用获取绑定属性的值
<s:escapeBody> 将标签体中的内容进行HTML和/或JavaScript转义
<s:hasBindErrors> 根据指定模型对象是否有绑定错误,有条件渲染内容
<s:htmlEscape> 为当前页面设置默认的HTML转义值
<s:message> 根据给定的编码获取信息,然后要么进行渲染,要么将其设置为页面作用域,请求作用域、会话作用域或应用作用域的变量(通过var和scope属性实现)
<s:nestedPath> 设置嵌入式的path,用于<s:bind>之中
<s:theme> 根据给定的编码获取主题信息,然后要么进行渲染,要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过var和scope属性实现)
<s:transform> 使用命令对象的属性编辑器转换命令对象中不包含的属性
<s:uri> 创建相对于上下文的URL,支持URI模板变量以及HTML/XML/JavaScript转义,可以渲染URL,也可以将其作为页面作用域、请求作用域、会话作用域或应用作用域的变量
<s:eval> 计算负荷Spring表达式语言(Spring Expression Language, SpEL)语法的某个表达式的值,要么进行渲染,要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量
使用Apache Tiles视图定义布局
在Spring中使用Tiles,需要配置几个bean。需要一个TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Tiles。除此之外,还需要TilesViewResolver bean将逻辑视图名称解析为Tile定义。
当配置TilesConfigurer的时候,所要设置的最重要的属性就是definitions。这个属性接受一个String类型的数组,其中每个条目都指定一个Tile定义的XML文件。
- @Bean
- public TilesConfigurer tilesConfigurer(){
- TilesConfigurer tiles = new TilesConfigurer();
- tiles.setDefinitions(new String[]{"/WEB-INF/layout/tiles.xml"});
- tiles.setCheckRefresh(true);
- return tiles;
- }
配置TilesViewResolver
- @Bean
- public ViewResolver viewResolver(){
- return new TilesViewResolver();
- }
定义Tiles
Apache Tiles提供一个文档类型的定义(document type definition, DTD),用来在XML文件中指定Tile的定义。每个定义中需要包含一个<definition>元素,这个元素会有一个或多个<put-attribute>元素。
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
- "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
- <tiles-definitions>
- <definition name="base" template="/WEB-INF/layout/page.jsp">
- <put-attribute name="header" value="/WEB-INF/layout/header.jsp" />
- <put-attribute name="footer" value="/WEB-INF/layout/footer.jsp" />
- </definition>
- <definition name="home" extends="base">
- <put-attribute name="body" value="/WEB-INF/jsp/home.jsp"/>
- </definition>
- <definition name="registerForm" extends="base">
- <put-attribute name="body" value="/WEB-INF/jsp/registerForm.jsp" />
- </definition>
- <definition name="profile" extends="base">
- <put-attribute name="body" value="/WEB-INF/jsp/profile.jsp" />
- </definition>
- <definition name="spittles" extends="base">
- <put-attribute name="body" value="/WEB-INF/jsp/spittles" />
- </definition>
- <definition name="spittle" extends="base">
- <put-attribute name="body" value="/WEB-INF/jsp/spittle" />
- </definition>
- </tiles-definitions>
- <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
- <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="t" %>
- <%@ page session="false" %>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
- <title>Spittr</title>
- </head>
- <body>
- <div id="header">
- <t:insertAttribute name="header" />
- </div>
- <div id="content">
- <t:insertAttribute name="body" />
- </div>
- <div id="foot">
- <t:insertAttribute name="footer" />
- </div>
- </body>
- </html>
使用Thymeleaf
配置Thymeleaf视图解析器
我们需要启动三个Thymeleaf与Spring集成的bean:
ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf模板视图
SpringTemplateEngine:处理模板并渲染结果
TemplateResolver:加载Thymeleaf模板
Java Config
- @Bean
- public ViewResolver viewResolver(SpringTemplateEngine templateEngine){
- ThymeleafViewResolver viewResolver = new TyhmeleafViewResolver();
- viewResolver.setTemplateEngine(templateEngine);
- return viewResolver;
- }
- @Bean
- public TemplateEngine templateEngine(ITemplateResolver templateResovler){
- SpringTemplateEngine templateEngine = new SpringTemplateEngine();
- templateEngine.setTemplateResolver(templateResovler);
- return templateEnigine;
- }
- @Bean
- public ITemplateResolver templateResolver(){
- SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
- templateResolver.setPrefix("/WEB-INF/templates");
- templateResolver.setSuffixe(".html");
- templateResolver.setTemplateMode("HTML5");
- return templateResolver;
- }
xml configure
- <bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver" p:templateEngine-ref="templateEngine" />
- <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine" p:templateResolver=ref="templateResolver" />
- <bean id="templateResolver" class="org.thymeleaf.template.ServletContextTemplateResolver" p:prefix="/WEB-INF/templates" p:suffix=".html" p:templateMode="HTML5" />
ThymeleafViewResolver是Spring MVC中viewResolver的一个实现类,他会接受一个逻辑视图名称,并将其解析为视图。视图会是一个Thymeleaf模板。ThymeleafViewResolver bean中注入了一个对SpringTemplateEngine bean的引用。SpringTemplateEngine会在Spring中启动Thymeleaf引擎,用来解析模板,并基于这些模板渲染结果。TemplateResolver会最终定位和查找模板,使用了prefix和suffiex属性,前缀和后缀将会与逻辑视图名组合使用,进而定位Thymeleaf引擎。
th:href属性的特殊之处在于它的值中可以包含Thymeleaf表达式,用来计算动态的值。它会渲染成一个标准的href属性,其中会包含在渲染时动态创建得到的值。这是Thymeleaf命名空间中很多属性的运行方式:它们对应标准的HTML属性,并且具有相同的名称,但是会渲染计算后得到的值
th:class属性会渲染为一个class属性,它的值是根据给定的表达式计算得到的。
th:field属性用来引用后端对象的域。通过th:field,可以达到同时设置name和value。
th:if属性用来检查是否有校验错误。
th:each属性将会通知Thymeleaf为每项错误都渲染一个标签。
th:text属性会计算某个表达式并将它的值填入到内容体
${} 是变量表达式。*{}是选择表达式。变量表达式是基于整个SpEL上下文计算的,选择表达式是基于某个选中对象计算的
渲染Web视图的更多相关文章
- 【Spring】渲染Web视图
前言 前面学习了编写Web请求的控制器,创建简单的视图,本篇博文讲解控制器完成请求到结果渲染到用户的浏览器的过程. 渲染Web视图 理解视图解析 前面所编写的控制器方法都没有直接产生浏览器中渲染所需要 ...
- Spring实战第六章学习笔记————渲染Web视图
Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...
- Spring学习(六)--渲染Web视图
一.将模型数据渲染为Html 在上一篇文章中,我们所编写的控制器方法都没有直接产生浏览器中渲染所需的HTML.这些方法只是将数据填充到模型中,然后将模型传递给一个用来渲染的视图.这些方法会返回一个St ...
- Spring Boot☞ 使用Thymeleaf模板引擎渲染web视图
静态资源访问 在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /s ...
- SpringBoot:2.SpringBoot整合Thymeleaf模板引擎渲染web视图
在Web开发过程中,Spring Boot可以通过@RestController来返回json数据,那如何渲染Web页面?Spring Boot提供了多种默认渲染html的模板引擎,主要有以下几种: ...
- Spring 学习笔记(十)渲染 Web 视图 (Apache Tilesa 和 Thymeleaf)
使用Apache Tiles视图定义布局 为了在Spring中使用Tiles,需要配置几个bean.我们需要一个TilesConfigurer bean,它会负责定位和加载Tile定义并协调生成Til ...
- 第6章—渲染web视图—使用Thymeleaf
使用Thymeleaf 长期以来,jsp在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thymeleaf是原生的,不依赖于标签库.它能够在接受原始HTML的地方 ...
- 第06章-渲染Web视图
1. 理解视图解析 将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性.如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图. ...
- SpringMVC之四:渲染Web视图
理解视图解析 在前面的例子中,我们看到控制器返回的都是一个逻辑视图的名称,然后把这个逻辑视图名称交给view resolver,然后返回渲染后的 html 页面给 client. 将控制器中请求处理的 ...
随机推荐
- 安装docker No package docker available
安装docker 时候出现以下问题 yum -y install dockerLoaded plugins: fastestmirrorDetermining fastest mirrors * ba ...
- Spring Boot 打war包并利用docBase指定根目录为打包的工程
指定根目录有两种方式 1:直接将打的war包名称定义为ROOT 2:利用docBase 比如笔者war包名为xibu.war,将该war包丢到/Users/archerlj/Library/apach ...
- 【转】EF 获取类的属性并排除特定属性(getType().GetProperties())
当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...
- Microsoft Windows远程桌面协议中间人攻击漏洞(CVE-2005-1794)漏洞解决方案(Windows server2003)
1.启动“终端服务配置” 2.选择“连接”,看到“RDP-Tcp”,在其上右键,选择“属性” 3.“常规”选项卡,将加密级别修改为“符合FIPS标准”,点击应用 应用即可,实验发现并不需要重启服务或操 ...
- WebSphere部署应用教程
在WebSphere中应用是部署在“应用程序服务器”,而“应用程序服务器”建立在“节点”上 所以部署应用的几个前提是:要创立好受控server(亦即节点)并加入到控制台中且处于启动(亦即同步)状态:要 ...
- python列表反转函数
def reverse(ListInput): RevList=[] for i in range (len(ListInput)): RevList.append(ListInput.pop()) ...
- angular 常用插件集合
md5加密 https://www.npmjs.com/package/md5-typescript angular echarts https://github.com/xieziyu/ng ...
- Python自然语言处理---TF-IDF模型
一. 信息检索技术简述 信息检索技术是当前比较热门的一项技术,我们通常意义上的论文检索,搜索引擎都属于信息检索的范畴.信息检索的问题可以抽象为:在文档集合D上,对于关键词w[1]…w[k]组成的查询串 ...
- windows 路由的配置
查看ip路由表 route print : netstat -r windows 下添加一条路由 route命令 route [-f][-p][command [distinataion] [MASK ...
- POJ 3436 ACM Computer Factory 最大流,拆点 难度:1
题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...