@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
https://stackoverflow.com/questions/9177926/unable-to-retrieve-properties-with-exposecontextbeansasattributes
这个例子中使用了InternalResourceViewResolver
视图解析器。
视图解析基础知识
Spring MVC定义了一个名为ViewResolver的接口
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
当给resolveVIewName()方法传入一个视图名和Locale对象时,他会返回一个View实例
public class View {
String getContentType();
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
View接口的任务就是接受模型以及Servlet的request和response对象,并将输出结果渲染到response中。
我们所需要做的就是编写ViewResolver和View的实现,在Sping中提供了多个内置实现。
创建JSP视图
InternalResourceViewResolver
是最简单和常用的JSP视图解析器
在xml中配置
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
以上的InternalResourceViewResolver
的配置都比较基础,他最终会将逻辑视图名解析为InternalResourceView
的实例,这个实例会引用jsp文件。但如果这些jsp使用jstl标签来处理格式化和信息的话,那么我们会希望InternalResourceViewResolver
将视图解析为JstlView
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
viewResolver.setViewClass("org.springframework.web.servlet.view.JstlView");
return viewResolver;
}
或
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView"/>
使用Spring的JSP库
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<sf:checkbox>
渲染成一个checkbox<sf:checkboxs>
渲染成多个checkbox<sf:errors>
在一个HTML<span>中渲染输入域的错误<sf:form>
渲染成一个HTML<form>标签,并为其内部暴露绑定路径,用于数据绑定<sf:hidden>
渲染成一个<input type=“hidden”><sf:input>
渲染成一个<input type=“text”><sf:label>
渲染成一个HTML<label><sf:option>
渲染成一个HTML<option>标签,其selected属性根据所绑定的值进行设置<sf:options>
按照绑定的集合、数组或Map,渲染成一个HTML<option>标签的列表<sf:password>
渲染成一个<input type=“passeord”><sf:radiobutton>
渲染成一个<input type=“radio”><sf:select>
渲染成一个<select><sf:textarea>
渲染成一个HTML<textarea>
<sf:form method="POST" commandName="spitter">
First Name: <sf:input path="firstName">
<sf:errors path="firstName"><br/>
...
<input type="submit" value="Register">
</sf:form>
<sf:form>
通过commandName属性构建针对某个模型对象的上下文信息,在其他的表单绑定标签中,会引用这个模型对象的属性- 如果存在校验错误的话,请求中会包含错误的详细信息,这些信息是与模型数据放到一起的。上面的例子中,如果firstName属性没有错误的话,那么
<sf:errors>
不会渲染任何内容,如果有校验错误,会在一个<span>标签中显示错误信息- 设置cssClass属性,添加样式
<sf:errors path="firstName" cssClass="error">
span.error {color: red;}
- 可以将所有错误信息放到一起
<sf:errors path="*" element="div" cssClass="errors">
会展现所有属性的所有错误
div.errors {...}
- 设置cssClass属性,添加样式
<sf:label path="firstName" cssErrorClass="error">First Name</sf:label>:
<sf:input path="firstName" cssErrorClass="error">
...
<sf:label>
如果它绑定的属性有任何错误的话,在渲染得到的<label>中,class属性将会被设置为error。
<label for="firstName" class="error">First Name</label>
<sf:input cssErrorClass="error">
与之类似
//设置message属性,使其引用对用户更为有好的信息
@NotNull
@Size(min=5, max=16, message="{username.size}")
private String username;
······································································
//而这些信息可以定义在属性文件中
firstName.size=First name must be between {min} and {max} characters long
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和scopr属性实现)<s:nestedPath>
设置嵌入式path,用于<s:bind> 中<s:theme>
根据给定的编码获取主题信息,然后要么进行渲染(默认行为),要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过var和scopr属性实现)<s:transform>
使用命令对象的属性编辑器转换命令对象中不包含的属性<s:url>
创建相对于上下文的URL,支持URL模板变量以及HTML/XML/JavaScript转义,可以渲染URL(默认行为),也可以将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过var和scopr属性实现)<s:eval>
计算符合Spring表达式的语言语法的某个表达式的值,然后要么进行渲染(默认行为),要么将其设置为页面作用域、请求作用域、会话作用域或应用作用域的变量(通过var和scopr属性实现)
使用<s:url> 创建URL,并将其复制给一个变量供模板在稍后使用:
<s:url href="/spitter/register" var="registerUrl">
<a href="${registerUrl}">Register</a>
在URL上添加请求参数:
<s:url href="/spittles" var="spittlesUrl">
<s:param name="max" value="60">
<s:param name="count" value="20">
</s:url>
添加路径参数:
<s:url href="/spittles/{username}" var="spitterUrl">
<s:param name="username" value="jbauer">
</s:url>
- 当href属性中的占位符匹配<s:param>指定的参数时,这个参数将会插入到占位符的位置中。如果<s:param>参数无法匹配href中的任何占位符,那么这个参数将会作为查询参数。