请戳我
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;
}
两种方式
InternalResourceViewResolver 主要是采用拼接的方式,将视图名称拼接到配置的字符串,即添加前缀和后缀,从而确认Web应用中视图资源的物理路径。
@Configuration
@EnableWebMvc //启用Spring MVC
@ComponentScan("com.zexing.spittr.web") //启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() { //配置视图解析器
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
//```
}
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven />
<context:component-scan base-package="com.zexing.spittr" />
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
beans:bean>
beans:beans>
以上配置解析的是InternalResourceView视图
JSTL的格式化标签需要一个Locale对象,以便于恰当地格式化地域
相关的值,如日期和货币。信息标签可以借助Spring的信息资源和
Locale,从而选择适当的信息渲染到HTML之中。通过解析
JstlView,JSTL能够获得Locale对象以及Spring中配置的信息资
源。
设置它的viewClass属性,即加上以下代码
resolver.setViewClass(JstlView.class);
而 xml 加上
<beans:property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
在JSP页面声明标签库
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
就Spitter样例,用到注册表单
First Name:
Last Name:
Email:
Username:
Password:
其中sf:form会渲染一个HTMl 标签,同时通过commandName属性构建针对某个模型对象的上下文信息。
因此在模型中必须要有一个key为Spitter对象,否则的话,表单不能正常渲染(会出现JSP错误).这意味着我们需要修改SpitterController,以确保模型中存在以Spitter为key的Spitter对象。
@RequestMapping(value = "/register",method = RequestMethod.GET)
public String showRegistrationForm(Model model){
model.addAttribute(new Spitter());//对应registerForm.jsp中 的commandName属性值
return "registerForm";
}
我们在这里设置了path属性,< input>标签的value属性值将会设置为spitter对象中path属性所对应的值。
例如在模型中Spitter对象中firstName属性值为guo,那么
当用户注册失败后,返回表单将预设先前用户的填写内容
从Spring 3.1开始,
定type属性,即还能指定HTML 5
特定类型的文本域,如date、range和email。例如,我们可以按
照如下的方式指定email域:
Email:
如果存在校验错误的话,请求中会包含错误的详细信息,这些信息是
与模型数据放到一起的。我们所需要做的就是到模型中将这些数据抽
取出来,并展现给用户
path属性指定了将要显示模型对象的哪个属性的错误信息,当校验错误,将会在一个HTML 标签中显示错误信息,否则不渲染任何内容。
如以上校验失败时渲染的内容是:
size must be between 2 and 30
在校验注解上设置message属性,使其引
用对用户更为友好的信息。(PS:没有使用{}将直接显示)
Spitter.java
@NotNull
@Size(min=5, max=16, message="{username.size}")
private String username;
ValidationMessages.properties
firstName.size=First name must be between {min} and {max} characters long.
{min}和{max}会引用@Size注解上所设
置的min和max属性。
声明标签库
<%@ taglib uri="http://www.springframework.org.tags" prefix='s'%>
几种标签说明
@Bean
public MessageSource messageSource () { //配置信息源
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setCacheSeconds(10);
return messageSource;
}
basename属性可以设置为在类路径下(以“classpath:”作
为前缀)、文件系统中(以“file:”作为前缀)或Web应用的根路径
下(没有前缀)查找属性
messages.properties
spittr.welcome=Welcome to Spitter!
2.使用
">register
标签内容是
register
register
Spittles
跳转的URl将会拼接参数:
http://localhost:8080/spittles?max=60&count=20
设置属性 htmlEscape 为true
将在页面直接显示URL的内容
/spittles?max=60&count=20
在javascript里面使用
设置属性 javaScriptEscape 为true
为所有页面定义通用页面布局模板
参考链接
需导入Tiles相关的jar包(缺少包可能导致的Exception):
负责定位和加载Tile定义并协调生成Tiles
// Tiles
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer tiles = new TilesConfigurer();
tiles.setDefinitions(new String[] {
"/WEB-INF/layout/tiles.xml", //指定Tiles定义的位置
"/WEB-INF/views/**/tiles.xml" //遍历“WEB-INF/”的所有子目录来查找Tile定义。
});
tiles.setCheckRefresh(true); //启用刷新功能
return tiles;
}
将逻辑视图名称解析为Tile定义。
@Bean
public ViewResolver viewResolver() {
return new TilesViewResolver();
}
@Configuration
@EnableWebMvc //启用Spring MVC
@ComponentScan("com.zexing.spittr.web") //启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() { //配置视图解析器
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { //配置静态资源的处理
// TODO Auto-generated method stub
super.addResourceHandlers(registry);
}
}
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="difinitions">
<list>
<value>WEB-INF/layout/tiles.xmlvalue>
<value>/WEB-INF/view/**.tiles.xmlvalue>
property>
bean>
<bean id="ViewResolver"
class="org.springframework.web.servlet.view.tiles3.TilesViewResolver" />
1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
2.Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
3.Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
配置启用的三个bean
@Bean
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;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
使用 xml
<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.templateresolver.ServletContextTemplateResolver"
p:prefix="WEB-INF/templates/"
p:suffix=".html"
p:templateMode="HTML5" />
ThymeleafViewResolver是Spirng MVC中ViewResolver的一个实现类。像其他视图解析器一样,会接受一个逻辑视图名称,并将其解析为视图。不过在该场景下 ,视图会是一个Thymeleaf模板。
需要注意的是:ThymeleafViewResolver bean中注入了一个对SpringTemplateEnginebean 的引用。SpringTemplateEngine会在Spring中启用Thymeleaf引擎,用来解析模板并基于这些模板渲染结果。
TemplateResolver会最终定位和查找模板。与之前配置的InternalResourceVIewResolver类似,他使用了prefix 和 suffix属性。它的templateMode属性被设置为HTML5,这表明我们预期要解析的模板会渲染成HTML5输出。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Spittertitle>
<link rel="stylesheet"
type="text/css"
th:href="@{/resources/style.css}">link>
head>
<body>
<h1>Welcome to Spitterh1>
<a th:href="@{/spittles}">Spittlesa> |
<a th:href="@{/spitter/register}">Registera>
body>
html>
这里使用th:href属性的三个地方都是用到了“@{}”表达式,用来计算相对于URL的路径,相比于在JSP中 使用JSTL的
<label th:class="${#fields.hasErrors('firstName')}? 'error'">First Namelabel>:
<input type="text" th:field="*{firstName}"
th:class="${#fields.hasErrors('firstName')}? 'error'" /><br/>
这里th:class属性会渲染为一个class属性,它的值是根据给定的表达式计算得到的。在上面的这两个th:class属性中,它会直接检查firstName域有没有校验错误。如果有的话,class属性在渲染时的值为error。如果这个域没有错误的话,将不会渲染class属性。
标签使用了th:field属性,用来引用后端对象的firstName域。
<form method="POST" th:object="${spitter}">
<div class="errors" th:if="${#fields.hasErrors('*')}">
<ul>
<li th:each="err : ${#fields.errors('*')}"
th:text="${err}">Input is incorrectli>
ul>
div>
<label th:class="${#fields.hasErrors('firstName')}? 'error'">First Namelabel>:
<input type="text" th:field="*{firstName}"
th:class="${#fields.hasErrors('firstName')}? 'error'" /><br/>
<label th:class="${#fields.hasErrors('lastName')}? 'error'">Last Namelabel>:
<input type="text" th:field="*{lastName}"
th:class="${#fields.hasErrors('lastName')}? 'error'" /><br/>
<label th:class="${#fields.hasErrors('email')}? 'error'">Emaillabel>:
<input type="text" th:field="*{email}"
th:class="${#fields.hasErrors('email')}? 'error'" /><br/>
<label th:class="${#fields.hasErrors('username')}? 'error'">Usernamelabel>:
<input type="text" th:field="*{username}"
th:class="${#fields.hasErrors('username')}? 'error'" /><br/>
<label th:class="${#fields.hasErrors('password')}? 'error'">Passwordlabel>:
<input type="password" th:field="*{password}"
th:class="${#fields.hasErrors('password')}? 'error'" /><br/>
<input type="submit" value="Register" />
form>
在顶部,
" " 表 达 式 是 变 量 表 达 式 , 一 般 来 讲 , 他 们 是 对 象 图 导 航 语 言 ( O b j e c t − G r a p g N a v i g a t i o n l a n g u a g e O G N L ) 表 达 式 , 但 是 在 使 用 S p i r n g 的 时 候 , 他 们 是 S p E L 表 达 式 , 在 {}"表达式是变量表达式,一般来讲,他们是对象图导航语言(Object-Grapg Navigation language OGNL)表达式,但是在使用Spirng的时候,他们是SpEL表达式,在 "表达式是变量表达式,一般来讲,他们是对象图导航语言(Object−GrapgNavigationlanguageOGNL)表达式,但是在使用Spirng的时候,他们是SpEL表达式,在{Spitter}这里 例子中,它会解析为ket为spitter的model属性。
而对于*{}表达式,他们是选择表达式。变量表达式是基于整个SpEl上下文计算的,而选择表达式是基于某一个选中对象计算的。在本例的表单中,选中对象就是标签中的th:object属性所设置的对象:模型中的Spitter对象。因此,“*{firsrName}”表达式就会计算为Spitter对象的firstName属性。
具体的语法参考官网 或者 博客