Spring实战(六:渲染Web视图)(未改)

1.理解视图解析

    将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性。如果控制器中的方法直接负责产生HTML的话,就很难在不影响请求处理逻辑的前提下,维护和更新视图。控制器方法和视图的实现会在模型内容上达成一致,这是两者的最大关联,除此之外,两者应该保持足够的距离。
    Spring MVC定义了一个名为ViewResolver的接口,它大致如下所示:

    当给resolveViewName()方法传入一个视图名和Locale对象时,它会返回一个View实例。View是另外一个接口,如下所示:


View接口的任务就是接受模型以及Servlet的request和response对象,并将输出结果渲染到response中。


    Spring 4和Spring 3.2支持表6.1中的所有视图解析器。Spring 3.1支持除Tiles 3 TilesViewResolver之外的所有视图解析器。

    对于大部分视图解析器来讲,每一项都对应Java Web应用中特定的某种视图技术。InternalResourceViewResolver一般会用于JSP,TilesViewResolver用于Apache Tiles视图,而FreeMarkerViewResolver和VelocityViewResolver分别对应FreeMarker和Velocity模板视图。

2.创建JSP视图

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

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

    有一些视图解析器,如ResourceBundleViewResolver会直接将逻辑视图名映射为特定的View接口实现,而InternalResourceViewResolver所采取的方式并不那么直接。它遵循一种约定,会在视图名上添加前缀和后缀,进而确定一个Web应用中视图资源的物理路径。



    当使用@Bean注解的时候,我们可以按照如下的方式配置Internal-ResourceView Resolver,使其在解析视图时,遵循上述的约定。

如果更喜欢使用基于XML的Spring配置,那么可以按照如下的方式配置InternalResourceViewResolver:


InternalResourceViewResolver配置就绪之后,它就会将逻辑视图名解析为JSP文件,如下所示:
    home将会解析为“/WEB-INF/views/home.jsp”

    productList将会解析为“/WEB-INF/views/productList.jsp”

    books/detail将会解析为“/WEB-INF/views/books/detail.jsp”

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

使用Spring的JSP库

使用表单绑定库,需要在JSP页面中对其进行声明:

因为不常用到所以不做过多介绍有兴趣的可以去百度查询相关资料。需要添加:


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


因为不常用到所以不做过多介绍有兴趣的可以去百度查询相关资料。


3.使用Apache Tiles视图定义布局

1.配置Thymeleaf视图解析器

要在Spring中使用Thymeleaf,我们需要配置三个启用Thymeleaf与Spring集成的bean:

1.ThymeleafViewResolver:将逻辑视图名称解析为Thymeleaf模板视图;
2.SpringTemplateEngine:处理模板并渲染结果;
3.TemplateResolver:加载Thymeleaf模板。

使用Java代码的方式,配置Spring对Thymeleaf的支持

用XML配置:

    ThymeleafViewResolver是Spring MVC中ViewResolver的一个实现类。像其他的视图解析器一样,它会接受一个逻辑视图名称,并将其解析为视图。不过在该场景下,视图会是一个Thymeleaf模板。

    ThymeleafViewResolverbean中注入了一个对SpringTemplate Enginebean的引用。SpringTemplateEngine会在Spring中启用Thymeleaf引擎,用来解析模板,并基于这些模板渲染结果。可以看到,我们为其注入了一个TemplateResolverbean的引用。

    TemplateResolver会最终定位和查找模板。与之前配置InternalResource-ViewResolver类似,它使用了prefix和suffix属性。前缀和后缀将会与逻辑视图名组合使用,进而定位Thymeleaf引擎。它的templateMode属性被设置成了HTML 5,这表明我们预期要解析的模板会渲染成HTML 5输出。

2. 定义Thymeleaf模板

    Thymeleaf之所以能够发挥作用,是因为它通过自定义的命名空间,为标准的HTML标签集合添加Thymeleaf属性。

    使用Thymeleaf命名空间的首页模板引擎

    在这里th:href属性的特殊之处在于它的值中可以包含Thymeleaf表达式,用来计算动态的值。它会渲染成一个标准的href属性,其中会包含在渲染时动态创建得到的值。这是Thymeleaf命名空间中很多属性的运行方式:它们对应标准的HTML属性,并且具有相同的名称,但是会渲染一些计算后得到的值。在本例中,使用th:href属性的三个地方都用到了“@{}”表达式,用来计算相对于URL的路径(就像在JSP页面中的JSTL <c:url>标签或Spring<s:url>标签类似)。

借助Thymeleaf实现表单绑定

    表单绑定是Spring MVC的一项重要特性。它能够将表单提交的数据填充到命令对象中,并将其传递给控制器,而在展现表单的时候,表单中也会填充命令对象中的值。如果没有表单绑定功能的话,我们需要确保HTML表单域要映射后端命令对象中的属性,并且在校验失败后展现表单的时候,还要负责确保输入域中值要设置为命令对象的属性。

    th:class属性会渲染为一个class属性,它的值是根据给定的表达式计算得到的。在上面的这两个th:class属性中,它会直接检查firstName域有没有校验错误。如果有的话,class属性在渲染时的值为error。如果这个域没有错误的话,将不会渲染class属性。<input>标签使用了th:field属性,用来引用后端对象的firstName域。

    表单的顶部使用Thymeleaf,它会用来渲染所有的错误。<div>元素使用th:if属性来检查是否有校验错误。如果有的话,会渲染<div>,否则的话,它将不会渲染。

(对于Thymeleaf的使用请查看别的博文或者视频学习)


参考:《Spring实战》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值