使用JSP作为视图
JSP作为JavaWeb应用程序的视图技术已经超过15年了,想在仍然是使用量最大的视图技术。
- 视图解析器:
InternalResourceViewResolver是最简单和最常用的JSP视图解析器。这种视图解析器遵循一种约定,会在视图名上添加前缀和后缀,进而确定一个Web应用中视图资源的物理路径。 - 视图位置 在通常的Web应用中,我们把JSP文件放到Web应用的WEB-INF目录下,防止对它的直接访问。
InternalResourceViewResolver视图解析器的配置:
基于Java的配置:
@Bean public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new
InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResovler.setSuffix(".jsp"); return viewResolver; }基于XML的配置:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
这样,books/detail将会解析为“/WEB-INF/views/books/detail.jsp”。注意,当逻辑视图包含斜线时,这个斜线也会带到资源的路径名中。这样,我们可以很方便地将视图模板组织为层级目录结构,而不是将它们都放到同一个目录中。
使用Spring的JSP库
标签库是为JSP添加功能的强大方式,能够避免在脚本块中直接编写Java代码。Spring提供了两个JSP标签库,用来帮助定义SpringMVC Web的视图。其中一个标签库会用来渲染HTML表单标签,这些标签可以绑定model中的某个属性。另外一个标签库包含了一些工具类标签,我们随时都可以非常便利地使用它们。在这两个标签库汇中,表单绑定的标签库更加有用。
将表单绑定到模型上
Spring的表单绑定JSP标签库包含了14个标签,它们中的大多数都用来渲染HTML中的表单标签。但是,它们与原生HTML标签的区别在于它们会绑定模型中的一个对象,能够根据模型中对象的属性填充值。标签库中还包含了一个为用户展现错误的标签,它会将错误信息渲染到最终的HTML之中。为了使用表单绑定库,需要在JSP中对其进行声明:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
上面我们将前缀设置为了“sf”,它是Spring form的简写,也可以设置成其他的字符,如“form”。这14个标签及介绍如下:
以一个简单的注册为例,使用相应标签库的注册表单如下所示:
<sf:form method="POST" commandName="spitter">
First Name:<sf:input path="firstName"/><br/>
Last Name:<sf:input path="lastName"/><br/>
Email:<sf:input path="email"/><br/>
User Name:<sf:input path="username"/><br/>
Password:<sf:password path="password"/><br/>
<input tupe="submit" value="Register" />
</sf:form>
<sf:form>
会渲染一个HTML<form>
标签,但它也会通过commandName属性构建针对某个模型对象的上下文信息。在其他的表单绑定标签中,会引用这个模型对象的属性。在上面的例子中,我们将commandName属性设置为spitter。因此,在模型中必须要有一个key为spitter的对象,否则的话,表单不能正确渲染(会出现JSP错误)。我们在上面设置了path属性,<input>
标签的value属性值将会设置为模型对象中path属性所对应的值。
另外,值得注意的是,从Spring3.1开始,<sf:input>
标签能够允许我们制定type属性,这样的话,除了其他可选得类型外,还能制定HTML5特定类型的文本域,如data、range和email。例如:
Email:<sf:input path="email" type="email" /><br/>
相对于标准的HTML标签,使用Spring的表单绑定标签能够带来一定的功能提升,在校验失败后,表单中会预先填充之前输入的值。但是,这依然没有告诉用户错在什么地方。为了知道用户矫正错误,我们需要使用<sf:errors>
。
展现错误
<sf:form method="POST" commandName="spitter">
First Name:<sf:input path="firstName" />
<sf:errors path="firstName" /><br/>
...
</sf:form>
标签<sf:errors>
渲染了校验错误后的提示信息,如果firstName属性没有错误的话,那么<sf:errors>
不会渲染任何内容。但如果有校验错误的话,那么它将会在一个HTML<span>
标签中显示错误信息。例如,如果用户提交的姓名为字母“J”的话,那么如下的HTML片段就是针对First Name输入域所显示的内容:
First Name:<input id="firstName" name="firstName" type="text" value="J" />
<span id="firstName.errors">size must be between 2 and 30</span>
现在已经能够提示错误信息了,但是我们可以更进一步,修改错误的样式,使其更加显眼。为了做到这一点,可以设置cssClass属性:
<sf:form method="POST" commandName="spitter">
First Name:<sf:input path="firstName" />
<sf:errors path="firstName" cssClass="error" /><br/>
...
</sf:form>
只需要在样式文件中简单地设置:
span.error{
color:red;
}
那么当出现校验错误时,会有红色的提示信息出现。显然,这样的表单才更加的用户友好。
此外,还有一个重要的属性:cssErrorClass。这个属性可以设置在<sf:label>、<sf:input>
等标签中。如:
<sf:input path="firstName" cssErrorClass="error" />
当error的样式为:
input.errer{
background-color:#ffcccc;
}
且firstName域的校验出错时,该输入框的背景将会被设置为淡红色,这样的提示效果更好。
自定义错误信息
现在我们已经有了很好的方式为用户展现错误信息。不过,我们还能够让这些错误信息更加易读。重新修改一下Spitter类就可以达到效果了:
@NotNull
@Size(min=5,max=16,message="{username.size}")
private String username;
...
对于上面每个域,我们都将其@Size注解的message设置为一个字符串,这个字符串是用大括号括起来的。如果没有大括号的话,massage中的值将会作为展现给用户的错误信息。但是使用了大括号之后,我们使用的就是属性文件中的某一个属性,该属性包含了实际的信息。接下来需要做的就是创建一个名为ValidationMessages.properties的文件,并将其放在根类路径之下:
firstName.size= First name must be between {min} and {max} characters long.
lastName.size= First name must be between {min} and {max} characters long.
...
ValidationMessages.properties文件中每条信息的key值对应于注解中message属性占位符的值。同时,最小和最大长度也没有硬编码在文件中,在这个用户友好的信息中也有自己的占位符——{min}和{max}——他们会引用@Size注解上所设置的min和max属性。
将这些错误信息抽取到属性文件中还会带来一个好处,那就是我们可以创建地域相关的配置文件,为用户展现特定地域的特定语言。
上一篇: SpringMVC入门之六:使用Thymeleaf作为视图
下一篇: SpringMVC入门之八:使用Apache Tiles视图定义布局