2 springMVC详解(视图解析器)

1 理解视图解析

视图解析器首先往视图逻辑名上添加前后缀,找到渲染模型的JSP文件(也可以不是JSP),使用JSP对模型进行渲染。简而言之,就是对模型进行渲染,并将渲染后的视图发送给浏览器。

作用:如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图。只返回一个视图逻辑名,控制器方法和视图的实现会在模型内容上达成一致,这是两者的最大关联,除此之   外,两者应该保持足够的距离。

 2 springMVC详解(视图解析器)

2 springMVC详解(视图解析器)

2 springMVC详解(视图解析器)

2 视图解析器的分类

总共有13种视图解析器,我们使用呢最多的是JSP视图解析器InternalResourceViewResolver。Thymeleaf是一种代替jsp的新兴技术,Thymeleaf是一种用来替代JSP的新兴技术,Spring提供了与Thymeleaf的原生模板(natural template)协作的视图解析器,这种模板之所以得到这样的称呼是因为它更像是最终产生的HTML,而不是驱动它们的Java代码。

3 创建JSP视图

Spring提供了两种支持JSP视图的方式:

  • InternalResourceViewResolver会将视图名解析为JSP文件。另外,如果在你的JSP页面中使用了JSP标准标签库(JavaServer Pages  Standard  Tag  Library,JSTL)的 话,InternalResourceViewResolver能够将视图名解析为JstlView形式的JSP文件,从而将JSTL本地化和资源bundle变措暴露给JSTL的格式化(formatting)和信息
  •  Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性。

3.1 配置适用于JSP的视图解析

如果这些JSP使用JSTL标签来处理格式化和信息的话,那么我们会希望InternalResourceViewResolver将视图解析为JstlView。JSTL的格式化标签需要一个Locale对象,以便于恰当地格式化地域相关的值,如日期和货币。信息标签可以借助Spring的信息资源和Locale,从而选择适当的信息渲染到HTML之 中。通过解析JstlView,JSTL能够获得Locale对象以及Spring中配置的信息资源。如果想让InternalResourceViewResolver将视图解析为JstlView,而不是InternalResourceView的话,那么我们只需设置它的viewClass属性即可:

2 springMVC详解(视图解析器)2 springMVC详解(视图解析器)

 

3.2 使用SpringJSP

Spring提供了两个JSP标签库,用来帮助定义Spring MVC Web的视图。其中一个标签库会用来渲染HTML表单标签,这些标签可以绑定model中的某个属性。另外一个标签库包含了一些工具类标签。

3.2.1 表单标签

为了使用表单绑定库,需要在JSP页面中对其进行声明:2 springMVC详解(视图解析器)

具体来讲,也就是<sf:form>、<sf:input>和<sf:password>。在注册JSP中使用这些标签后,所得到的程序如下所示:

2 springMVC详解(视图解析器)

在之前的代码中,我们将commandName属性设置为spitter。因此,在模型中必须要有一个key为spitter的对象,否则的话,表单不能正常渲染(会出现JSP错误)。这意味着我们需要修改一下SpitterController,以确保模型中存在以spitter为key的Spitter对 象:

2 springMVC详解(视图解析器)

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

展现错误

spring可以设置表单的校验,当校验出输入有误的时候,应该提示错误。

2 springMVC详解(视图解析器)

配置错误提示

2 springMVC详解(视图解析器) 

这个<sf:errors>与之前相比,值得注意的不同之处在于它的path被设置成了“*”。这是一个通配符选择器,会告诉<sf:errors>展现所有属性的所有错误。

2 springMVC详解(视图解析器)

3.2.2 Spring通用的标签库

除了表单绑定标签库之外,Spring还提供了更为通用的JSP标签库。实际上,这个标签库是Spring中最早的标签库。

要使用Spring通用的标签库,我们必须要在页面上对其进行声明:

2 springMVC详解(视图解析器)

举例说明其中几个标签

2 springMVC详解(视图解析器)

(1)展现国际化信息

到现在为止,我们的JSP模板包含了很多硬编码的文本。这其实也算不上什么大问题,但是如果你要修改这些文本的话,就不那么容易了。而且,没有办法根据用户的语言设置国际化 这些文本。

例如,考虑首页中的欢迎信息:

2 springMVC详解(视图解析器)

修改这个信息的唯一办法是打开home.jsp,然后对其进行变更。我觉得,这算不上什么大  事。但是,应用中的文本散布到多个模板中,如果要大规模修改应用的信息时,你需要修改大量的JSP文件。

解决方法:把欢迎信息放到配置文件中,借助<s:message>从配置文件中读取信息,修改时只需要修改配置文件。

读取配置信息:

2 springMVC详解(视图解析器)

设置信息来源:

2 springMVC详解(视图解析器)

在这个bean声明中,核心在于设置basename属性。你可以将其设置为任意你喜欢的值,在这里,我将其设置为message。将其设置为message后,ResourceBundleMessageSource就会试图在根路径的属性文件中解析信息,这些属性文件的名称是根据这个基础名称衍生得到的。

创建这些属性文件。首先,创建默认的属性文件,名为messages. properties。它要么位于根类路径下(如果使用ResourceBundleMessageSource的话),要么位于pathname属性指定的路径下(如果使用ReloadableResourceBundleMessageSource的话)。对spittr.welcome信息来讲,它需要如下的条目:

2 springMVC详解(视图解析器)

(2)转义内容

<s:escapeBody>标签是一个通用的转义标签。它会渲染标签体中内嵌的内容,并且在必要的时候进行转义。

2 springMVC详解(视图解析器)

2 springMVC详解(视图解析器)

虽然转义后的格式看起来很难读,但浏览器会很乐意将其转换为未转义的HTML,也就是我们希望用户能够看到的样子。

还可以转义成JS。