渲染 Web 视图

	@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 {...}
<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中的任何占位符,那么这个参数将会作为查询参数。
JSTL
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值