专栏名称: Guo_1_9
目录
相关文章推荐
51好读  ›  专栏  ›  Guo_1_9

Spring之旅第九站:JSP视图解析、Apache Tiles布局、使用Thymeleaf

Guo_1_9  · 掘金  ·  · 2018-02-26 01:59

正文

请到「今天看啥」查看全文


comandName = "spitter" > First Name: < sf:input path = "firstName" /> < br /> Last Name: < sf:input path = "lastName" /> < br /> Email: < sf:input path = "email" /> < br /> Username: < sf:input path = "username" /> < br /> Password: < sf:password path = "password" /> < br /> < sf:input type = "submit" value = "Register" /> </ sf:form >

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());
    return "registerForm";
}

新增了一个Spitter实例到模型中,模型中的key根据对象类型推断的,也就是spitter,与我们所需的一致。

我们在这里设置了path属性,** < input>标签的value属性值将会设置为spitter对象中path属性所对应的值** 例如在模型中Spitter对象中firstName属性值为guo,那么<sf:input path="firstname"/>所渲染的< input>标签中,会存在value=“guo”。

sf:password 它的值不会直接明文显示。

从Spring3.1开始 sf:form 标签能够允许我们指定type属性,这样的话,除了其他可选的类型外,还能指定HTML5特定类型的文本域,如date、range、email。我们可以按照如下方式指定email域:

Email: <sf:input path="email" type="email"/> <br/>

为了指导用户矫正错误,我们需要使用 sf:errors

展示错误

如果存在校验错误的话,请求中会包含错误的详细信息,这些信息是与模型数据放到一起的。我们所需要做的就是到模型中将这些数据抽取出来,并展现给用户, sf:errors 可以让这项任务变得简单。

例如,我们将 sf:errors 用到registerForm.jsp中的代码片段

<sf:form method="POST" commandName="spitter" >
    <sf:input path="firstName" cssErrorClass="error" /><br/>
    <sf:errors path="firstName" />
    ......
</sf:form>

尽管我只展现了将<sf;errors>用到了firstname输入域的场景,其他域也一样

默认情况下,错误会渲染在一个HTML 标签中,如果只是显示一个错误的话,这是不错的选择,但是如果要渲染所有的错误,很可能不止一个错误,所以使用像

这样的块级元素更为合适。因此,我们可以将element属性设置为div,这样的话,错误就会渲染到一个
中了。

<sf:form method="POST" commandName="spitter" >
    <sf:errors path="*" element="div" cssClass="errors" />
    <sf:label path="firstName"
              cssErrorClass="error">First Name</sf:label>:
    <sf:input path="firstName" cssErrorClass="error" /><br/>
    <sf:label path="lastName"
              cssErrorClass="error">Last Name</sf:label>:
    <sf:input path="lastName" cssErrorClass="error" /><br/>
    <sf:label path="email"
              cssErrorClass="error">Email</sf:label>:
    <sf:input path="email" cssErrorClass="error" /><br/>
    <sf:label path="username"
              cssErrorClass="error">Username</sf:label>:
    <sf:input path="username" cssErrorClass="error" /><br/>
    <sf:label path="password"
              cssErrorClass="error">Password</sf:label>:
    <sf:password path="password" cssErrorClass="error" /><br/>
    <input type="submit" value="Register" />
</sf:form>

sf:label 标签 像其他的表单绑定标签一样,使用path来指定它属于模型对象中哪个属性,假设没有校验错误的话,它将会渲染为HTML


省略...具体的内容请看书,


@NotNull
@Size(min=5, max=16, message="{username.size}")
private String username;
.......
@NotNull
@Size(min=2, max=30, message="{lastName.size}")
private String lastName;

我们将其@Size注解的 message设置为一个字符串。大括号括起来的。没有没有大括号的话,message中的值将会作为展现给用户的错误信息,使用了就用文件中某个一个属性,该属性包含了实际的信息。

创建一个ValidationMessages.properties的文件,并将其放到根路径之下。

firstName.size=First name must be between {min} and {max} characters long.
lastName.size=Last name must be between {min} and {max} characters long.
username.size=Username must be between {min} and {max} characters long.
password.size=Password must be between {min} and {max} characters long.
email.valid=The email address must be valid.

将这些错误信息抽取到属性文件中还会带来一个好处,那就是我们可以通过创建地域文件相关的属性文件,为用户展现特定语言和地域的信息。

** Spring通用的标签库 **

要使用Spirng通用的标签库,需要在页面首页对其进行声明

<%@ taglib uri="http://www.springframework.org.tags" prefix='s'%>

也可以任意,声明之后可以使用如下JSP标签:

  • <s:bind> :将绑定的属性导出到一个名为status的页面作用域中,与<s:path>组合使用获取绑定的属性
  • <s:escapeBody>:将标签中的内容进行HTML和JavaScrop转义
  • <s:message>:根基给定的编码获取信息,然后进行渲染,要么将其设置为页面作用域、请求、会话作用域或应用作用域的变量
  • <s:theme>:根据给定的编码获取主题信息,然后要么进行渲染。。。。
  • <s:transform>:使用命令对象的属性便阿基器转换命令对象中不包含的属性
  • <s:url>:创建相对于上下文的URL
  • <s:eval>:计算符合Spring表达式语言语法的某个表达式的值,然后进行渲染,要么。。。。
  • <s:param>:

展现国际化信息

Web是全球性和网络,你所构建的应用很可能会有全球化用户。

我们可以把文本放到一个或多个属性文件中。借助<s:message>.

<h1><s:message code="spittr.welcome"/></h1>

按照这里的方式,<s:message>将会根据key为spittr。welcome的信息源来渲染文本。需要完成任务,还需要配置这样一个信息源。

Spring 中有多个信息源的类,它们都实现了 MessageSource 接口,更为常见的是 ResourceBundleMessageSource .他从一个文件中加载信息,这个属性文件的名称是根据基础名称衍生而来的。如下@Bean方法配置类 ResourceBundleMessageSource

@Bean
public MessageSource messageSource () {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("messages");
    messageSource.setCacheSeconds(10);
    return messageSource;
}
spitter.welcome=Welcome to Spitter!

在这个Bean声明中,核心在basename属性,将其设置为messages后, ResourceBundle-MessageSource 就会视图在类路径的属性文件中解析信息,







请到「今天看啥」查看全文