1 理解视图解析
视图解析器首先往视图逻辑名上添加前后缀,找到渲染模型的JSP文件(也可以不是JSP),使用JSP对模型进行渲染。简而言之,就是对模型进行渲染,并将渲染后的视图发送给浏览器。
作用:如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图。只返回一个视图逻辑名,控制器方法和视图的实现会在模型内容上达成一致,这是两者的最大关联,除此之 外,两者应该保持足够的距离。
2 视图解析器的分类
总共有13种视图解析器,我们使用呢最多的是JSP视图解析器InternalResourceViewResolver。其他解析器可查看相关资料。
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属性即可:
3.2 使用Spring的JSP库
Spring提供了两个JSP标签库,用来帮助定义Spring MVC Web的视图。其中一个标签库会用来渲染HTML表单标签,这些标签可以绑定model中的某个属性。另外一个标签库包含了一些工具类标签。
3.2.1 表单标签
为了使用表单绑定库,需要在JSP页面中对其进行声明:
具体来讲,也就是<sf:form>、<sf:input>和<sf:password>。在注册JSP中使用这些标签后,所得到的程序如下所示:
在之前的代码中,我们将commandName属性设置为spitter。因此,在模型中必须要有一个key为spitter的对象,否则的话,表单不能正常渲染(会出现JSP错误)。这意味着我们需要修改一下SpitterController,以确保模型中存在以spitter为key的Spitter对 象:
我们在这里设置了path 属性,<input>标签的value属性值将会设置为模型对象中path属性所对应的值。例如,如果在模型中Spitter对象的firstName属性值为Jack,那么<sf:inputpath="firstName"/>所渲染的<input>标签中,会存在value="Jack"。
展现错误
spring可以设置表单的校验,当校验出输入有误的时候,应该提示错误。
配置错误提示
这个<sf:errors>与之前相比,值得注意的不同之处在于它的path被设置成了“*”。这是一个通配符选择器,会告诉<sf:errors>展现所有属性的所有错误。
3.2.2 Spring通用的标签库
除了表单绑定标签库之外,Spring还提供了更为通用的JSP标签库。实际上,这个标签库是Spring中最早的标签库。
要使用Spring通用的标签库,我们必须要在页面上对其进行声明:
举例说明其中几个标签
(1)展现国际化信息
到现在为止,我们的JSP模板包含了很多硬编码的文本。这其实也算不上什么大问题,但是如果你要修改这些文本的话,就不那么容易了。而且,没有办法根据用户的语言设置国际化 这些文本。
例如,考虑首页中的欢迎信息:
修改这个信息的唯一办法是打开home.jsp,然后对其进行变更。我觉得,这算不上什么大 事。但是,应用中的文本散布到多个模板中,如果要大规模修改应用的信息时,你需要修改大量的JSP文件。
解决方法:把欢迎信息放到配置文件中,借助<s:message>从配置文件中读取信息,修改时只需要修改配置文件。
读取配置信息:
设置信息来源:
在这个bean声明中,核心在于设置basename属性。你可以将其设置为任意你喜欢的值,在这里,我将其设置为message。将其设置为message后,ResourceBundleMessageSource就会试图在根路径的属性文件中解析信息,这些属性文件的名称是根据这个基础名称衍生得到的。
创建这些属性文件。首先,创建默认的属性文件,名为messages. properties。它要么位于根类路径下(如果使用ResourceBundleMessageSource的话),要么位于pathname属性指定的路径下(如果使用ReloadableResourceBundleMessageSource的话)。对spittr.welcome信息来讲,它需要如下的条目:
(2)转义内容
<s:escapeBody>标签是一个通用的转义标签。它会渲染标签体中内嵌的内容,并且在必要的时候进行转义。
虽然转义后的格式看起来很难读,但浏览器会很乐意将其转换为未转义的HTML,也就是我们希望用户能够看到的样子。
还可以转义成JS。