天天看点

Spring MVC 页面渲染( render view )

在spring mvc 中,controllers不会负责具体的页面渲染,它仅仅是调用业务逻辑并返回model数据给view层,至于view层具体怎么用html展现,由专门的view层具体负责,这就是mvc模式,业务层与展示层是松耦合的。那么,spring mvc是如何解耦合请求处理逻辑和页面渲染的呢?

对于普通的jsp页面,最常用到的就是view resolver就是<code>internalresourceviewresolver</code>,它有两个属性,一个是匹配物理view的前缀,一个是后缀。前缀一般就是view页面的路径位置,后缀就是文件的格式,而前缀后缀之间的就是逻辑view名称。

比如按照上面的配置,如果controller返回的逻辑view名称是home的话,<code>internalresourceviewresolver</code>会根据这个逻辑view名home找到其对应的实际物理view:<code>/web-inf/views/home.jsp</code>。

Spring MVC 页面渲染( render view )

viewresolver接口:

这个接口很简单,当我们传入一个逻辑view名和locale对象,就会返回一个view实例。

view接口:

view接口的职责就是接收model对象、request对象、response对象,并渲染输出结果给response对象。如果我们要自己写一个viewresolver也很简单,我们只需要实现viewresolver和view两个接口,在view接口中把需要渲染的内容输出到response对象中去就可以了。

当然,我们基本上不需要自己去写viewresolver,spring mvc为我们提供了各种各样的viewresolver:

Spring MVC 页面渲染( render view )

上面虽然列了很多个viewresolver,但我们具体用哪个好呢?其实上面的每个viewresolver都对应着一种view页面的实现技术,比如<code>internalresourceviewresolver</code>就是用来处理jsp页面,<code>tilesviewresolver</code>主要处理<code>apache tiles views</code>,<code>freemarkerviewresolver</code>和<code>velocityviewresolver</code>分别对应着<code>freemarker</code>和<code>velocity template</code>页面渲染技术。

无可否认,在java web编程领域,历史最悠久的页面处理技术便是jsp。所以,这里我们就拿jsp技术来展示spring是如何渲染页面的。

spring有两种方式来支持jsp页面:

无论我们使用jstl还是spring jsp标签类库,我们都需要配置一个viewresolver来解析jsp页面。当然一些其他的viewresolver也可以解析jsp页面,但internalresourceviewresolver是专门针对jsp技术设计的解析器,所以对于jsp页面,它用起来最简单也最方便。

其实<code>internalresourceviewresolver</code>的配置在1.1节已经介绍了,它可以直接把一个逻辑view名映射到转实际渲染数据的物理view页面。如果按照我们这样的配置:

那么对于下面这些逻辑view名,<code>internalresourceviewresolver</code>则会将其映射成相应的jsp页面:

home 解析成 /web-inf/views/home.jsp

productlist 解析成 /web-inf/views/productlist.jsp

books/detail 解析成 /web-inf/views/books/detail.jsp

上面例子中还可以看到,当我们的逻辑名称中含有反斜线/时,解析器会将其解析成资源文件的路径,这样我们就可以对页面资源文件进行目录管理了。

如果要想在jsp中使用jstl标签很简单,我们只需在internalresourceviewresolver中指定一个viewclass属性即可:

上面已经讲过,spring jsp提供了两种类库,一种是表单数据绑定标签库,另一种提供了更多样话的通用标签库。

spring的表单数据绑定标签库提供了14个标签,它和普通标签的区别就是能够将表单属性和model对象属性绑定在一起。要想使用表单数据绑定标签库,只需要在jsp页面中声明:

标签库中的14个标签:

Spring MVC 页面渲染( render view )

下面举个例子,我们使用这个标签库来重写一个注册页面:

commandname:对应后端model数据对象名称,也就是model中的对应的key值

path:我们可以看到form表单内部每个标签都有个path属性,这个属性对应的就是model对象的属性

除了表单数据绑定标签库之外,spring还提供了一个更加通用的标签库,要想使用这个更通用的标签库,只需要在jsp页面中添加:

标签库中的标签:

Spring MVC 页面渲染( render view )

关于这些标签的详细使用说明可以查看spring的官方文档,这里不多做介绍了。