public interface ViewResolver {
View resolveViewName(String var1, Locale var2) throws Exception;
}
public interface View {
String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
String PATH_VARIABLES = View.class.getName() + ".pathVariables";
String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";
String getContentType();
void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}
视图解析器 | 描 述 |
BeanNameViewResolver | 将视图解析为Spring应用上下文中的bean, 其中bean的ID与视图的名字相同 |
ContentNegotiatingViewResolver | 通过考虑客户端需要的内容类型来解析视图, 委托给另外一个能够产生对应内容类型的视图解析器 |
FreeMarkerViewResolver | 将视图解析为FreeMarker模板 |
InternalResourceViewResolver | 将视图解析为Web应用的内部资源(一般为JSP) |
JasperReportsViewResolver | 将视图解析为JasperReports定义 |
ResourceBundleViewResolver | 将视图解析为资源bundle(一般为属性文件) |
TilesViewResolver | 将视图解析为Apache Tile定义, 其中tile ID与视图名称相同。 注意有两个不同的TilesViewResolver实现, 分别对应于Tiles 2.0和 Tiles 3.0 |
UrlBasedViewResolver | 直接根据视图的名称解析视图, 视图的名称会匹配一个物理视图的定义 |
VelocityLayoutViewResolver | 将视图解析为Velocity布局, 从不同的Velocity模板中组合页面 |
VelocityViewResolver | 将视图解析为Velocity模板 |
XmlViewResolver | 将视图解析为特定XML文件中的bean定义。 类似于BeanName-ViewResolver |
XsltViewResolver | 将视图解析为XSLT转换后的结果 |
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
home将会解析为“/WEB-INF/views/home.jsp”
productList将会解析为“/WEB-INF/views/productList.jsp”
books/detail将会解析为“/WEB-INF/views/books/detail.jsp”
@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;
}
当为JSP添加功能时, 标签库是一种很强大的方式, 能够避免在脚本块中直接编写Java代码。 Spring提供了两个JSP标签库, 用来帮助定义Spring MVC Web的视图。 其中一个标签库会用来渲染HTML表单标签, 这些标签可以绑定model中的某个属性。 另外一个标签库包含了一些工具类标签, 我们随时都可以非常便利地使用它们。
Spring的表单绑定JSP标签库包含了14个标签, 它们中的大多数都用来渲染HTML中的表单标签。 但是, 它们与原生HTML标签的区别在于它们会绑定模型中的一个对象, 能够根据模型中对象的属性填充值。 标签库中还包含了一个为用户展现错误的标签, 它会将错误信息渲染到最终的HTML之中。
为了使用表单绑定库, 需要在JSP页面中对其进行声明:
需要注意, 我将前缀指定为“sf”, 但通常也可能使用“form”前缀。 你可以选择任意喜欢的前缀, 我之所以选择“sf”是因为它很简洁、 易于输入, 并且还是Spring form的简写形式。 在本书中, 当使用表单绑定库的时候, 我会一直使用“sf”前缀。
<sf:checkbox> | 渲染成一个HTML <input>标签, 其中type属性设置为checkbox |
<sf:checkboxes> | 渲染成多个HTML <input>标签, 其中type属性设置为checkbox |
<sf:errors> | 在一个HTML <span>中渲染输入域的错误 |
<sf:form> | 渲染成一个HTML <form>标签, 并为其内部标签暴露绑定路径, 用于数据绑定 |
<sf:hidden> | 渲染成一个HTML <input>标签, 其中type属性设置为hidden |
<sf:input> | 渲染成一个HTML <input>标签, 其中type属性设置为text |
<sf:label> | 渲染成一个HTML <label>标签 |
<sf:option> | 渲染成一个HTML <option>标签, 其selected属性根据所绑定的值进行设置 |
<sf:options> | 按照绑定的集合、 数组或Map, 渲染成一个HTML <option>标签的列表 |
<sf:password> | 渲染成一个HTML <input>标签, 其中type属性设置为password |
<sf:radiobutton> | 渲染成一个HTML <input>标签, 其中type属性设置为radio |
<sf:radiobuttons> | 渲染成多个HTML <input>标签, 其中type属性设置为radio |
<sf:select> | 渲染为一个HTML <select>标签 |
<sf:textarea> | 渲染为一个HTML <textarea>标签 |
除了表单绑定标签库之外, Spring还提供了更为通用的JSP标签库。 实际上, 这个标签库是Spring中最早的标签库。 这么多年来, 它有所变化, 但是在最早版本的Spring中, 它就已经存在了。
要使用Spring通用的标签库, 我们必须要在页面上对其进行声明:
JSP标签 | 描 述 |
<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:url> | 创建相对于上下文的URL, 支持URI模板变量以及HTML/XML/JavaScript转义。 可以渲染URL(默认行为) , 也可以将其设置为页面作用域、 请求作 用域、 会话作用域或应用作用域的变量(通过使用var和scope属性实现) |
<s:eval> | 计算符合Spring表达式语言(Spring Expression Language, SpEL) 语法的某个表达式的值, 然后要么进行渲染(默认行为) , 要么将其设置为页 面作用域、 请求作用域、 会话作用域或应用作用域的变量(通过使用var和scope属性实现) |
2、使用Apache Tiles视图定义布局
@Bean//Thymeleaf视图解析器
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
@Bean//模板引擎
public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
@Bean//模板解析器
public TemplateResolver templateResolver() {
TemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
return templateResolver;
}
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"><!--命名空间-->
<head>
<title>Spitter</title>
<link rel="stylesheet" type="text/css" th:href="@{/resources/style.css}"></link>
</head>
<body>
<div id="header" th:include="page :: header"></div><!--样式表链接-->
<div id="content">
<h1>Welcome to Spitter</h1>
<!--页面链接-->
<a th:href="@{/spittles}">Spittles</a> |
<a th:href="@{/spitter/register}">Register</a>
<br/>
View: <span th:text="${view}">unknown</span>
</div>
<div id="footer" th:include="page :: copy"></div>
</body>
</html>