Spring MVC 页面渲染( render view )-阿里云开发者社区

开发者社区> 老嗨> 正文

Spring MVC 页面渲染( render view )

简介: 一、理解view解析过程 1.1 从逻辑view到物理view 在Spring MVC 中,controllers不会负责具体的页面渲染,它仅仅是调用业务逻辑并返回model数据给view层,至于view层具体怎么用HTML展现,由专门的view层具体负责,这就是MVC模式,业务层与展示层是松耦合的。那么,Spring MVC是如何解耦合请求处理逻辑和页面渲染的呢?
+关注继续查看

一、理解view解析过程

1.1 从逻辑view到物理view

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

我们在Spring MVC配置介绍文章中已经知道,controller在处理外业务逻辑之后会返回一个逻辑view的字符串,那么Spring MVC是怎么根据这个逻辑view名找到真正的物理view页面呢?这个工作就由Spring的ViewResolvers负责。

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

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

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

@Controller
@RequestMapping(value = "/")
public class HomeController {
    @RequestMapping(method= RequestMethod.GET)
    public String home() {
        return "home";
    }
}

这里写图片描述

1.2 ViewResolver相关接口

ViewResolver接口:

public interface ViewResolver {
    View resolveViewName(String var1, Locale var2) throws Exception;
}

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

View接口:

public interface View {
    String getContentType();

    void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}

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

1.3 各种现成的ViewResolver

当然,我们基本上不需要自己去写ViewResolver,spring mvc为我们提供了各种各样的ViewResolver:
这里写图片描述

上面虽然列了很多个ViewResolver,但我们具体用哪个好呢?其实上面的每个ViewResolver都对应着一种view页面的实现技术,比如InternalResourceViewResolver就是用来处理JSP页面,TilesViewResolver主要处理Apache Tiles Views,FreeMarkerViewResolverVelocityViewResolver分别对应着FreeMarkerVelocity Template页面渲染技术。

二、创建一个JSP View

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

Spring有两种方式来支持JSP页面:

1. InternalResourceViewResolver可以用来解析JSP文件,当然,它也支持JSP页面使用JavaServer Standard Library(JSTL)
2. Spring自己也提供了两种JSP 标签类库,一种是表单数据绑定标签库,另一种是提供了一些通用特性的标签库

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

2.1 InternalResourceViewResolver的配置

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

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

那么对于下面这些逻辑view名,InternalResourceViewResolver则会将其映射成相应的JSP页面:

  • home 解析成 /WEB-INF/views/home.jsp
  • productList 解析成 /WEB-INF/views/productList.jsp
  • books/detail 解析成 /WEB-INF/views/books/detail.jsp

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

2.2 解析标准的JSTL文件

如果要想在JSP中使用JSTL标签很简单,我们只需在InternalResourceViewResolver中指定一个viewClass属性即可:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView />
</bean>

2.3 使用Spring JSP类库

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

2.3.1 使用表单数据绑定标签库

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

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

标签库中的14个标签:
这里写图片描述
下面举个例子,我们使用这个标签库来重写一个注册页面:

<sf:form method="POST" commandName="user">
   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/>
   <input type="submit" value="Register" />
</sf:form>

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

@RequestMapping(value="/register", method= RequestMethod.GET)
public String showRegistrationForm(Model model) {
    model.addAttribute("user",new User());
    return "register";
}

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

2.3.2 使用通用标签库

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

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

标签库中的标签:
这里写图片描述
关于这些标签的详细使用说明可以查看spring的官方文档,这里不多做介绍了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MVC3缓存之一:使用页面缓存
在以前的WebForm的开发中,在页面的头部加上OutputCache即可启用页面缓存,而在MVC3中,使用了Razor模板引擎的话,该如何使用页面缓存呢? 如何启用 在MVC3中要如果要启用页面缓存,在页面对应的Action前面加上一个OutputCache属性即可。
556 0
MVC3缓存之二:页面缓存中的局部动态
在上一篇我们讨论了MVC中使用页面缓存的一些方法,而其中由于页面缓存的粒度太粗,不能对页面进行局部的缓存,或者说,如果我们想在页面缓存的同时对局部进行动态输出该怎么办?下面我们看下这类问题的处理。 MVC中有一个Post-cache substitution的东西,可以对缓存的内容进行替换。
759 0
springMVC对jsp页面的数据进行校验
一. 使用注解校验 a) 引入校验依赖包 javax.validation validation-api 2.0.0.Final org.
1287 0
Android Studio 使用Intent实现页面的跳转(带参数)
不管是在APP,还是在网站中,页面之间的跳转都是很常见的,本文主要讲一下在APP中,如何通过Intent实现页面的跳转。   不带参数: 写在MainActivity页面的代码: 1 Intent intent = new Intent(); 2 intent.
2471 0
在 ASP.NET 页面中使用 TreeView 控件
一、            下载源码 http://www.asp.net/IEWebControls/IEWebControls.exe   二、            安装及编译 1、执行安装文件后,在安装目录找到 “build.bat”文件,用记事本将其打开。
926 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8238 0
轻松学MVC4.0–2 创建用户列表页面
原文 http://www.cnblogs.com/ybst/archive/2012/10/31/2747764.html 接 上回 创建的项目, 1、打开 Controllers\AccountController.cs 2、加入新方法Index: 3、在方法名称上点击右键,选择添加视图 确保选择了图上红色箭头指向的东西,确定之后会在 Views/Account文件夹下生成一个视图:Index.cshtml。
707 0
+关注
87
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载