`
truelove12358
  • 浏览: 77488 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Spring MVC 页面渲染( render view )

 
阅读更多

一、理解view解析过程

1.1 从逻辑view到物理view

springMVC 中,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

无可否认,在Javaweb编程领域,历史最悠久的页面处理技术便是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的官方文档,这里不多做介绍了。

分享到:
评论

相关推荐

    spring-webmvc-portlet.rar

    在这个例子中,`HelloWorldPortlet`是一个简单的portlet,它使用Spring的`@Autowired`注解注入`HelloWorldService`,并在视图渲染时将服务返回的消息传递给JSP页面。 总结,Spring Web MVC与Portlet的整合为开发者...

    SPRINGMVCDEMO

    Spring MVC 的核心组件包括 DispatcherServlet、Model、View 和 Controller。DispatcherServlet 负责接收请求并分发给合适的处理程序,通常是一个实现了 Controller 接口的类。Controller 处理业务逻辑,与模型交互...

    SpringMVC-5 视图和视图解析器

    自定义视图需要实现View接口,至少包含`render`方法,该方法接收ModelAndView对象,从中提取数据并进行渲染。 4. **重定向操作** 在Spring MVC中,重定向是通过RedirectView或设置模型属性`redirectAttributes`...

    Spring ModeAndView

    在Spring框架中,`ModelAndView`类是一种重要的机制,用于实现MVC(Model-View-Controller)架构模式中的模型(Model)和视图(View)组件之间的解耦。正如其名所表示的那样,`ModelAndView`类同时封装了模型数据...

    手写mvc框架

    在我们的框架中,可以设计一个`View`接口,定义渲染数据的方法,如`render()`。视图应当根据接收到的数据进行相应的渲染,可以是HTML页面,也可以是JSON格式的响应。视图与模型解耦,只通过控制器获取数据,不直接...

    spring web flow 官方文档

    Spring Web Flow依赖于Spring Framework的核心组件,包括Spring Core、Spring Context、Spring Web MVC等,同时还需要Servlet API的支持。此外,对于某些特定功能,如持久化管理,可能还需集成如Hibernate或JPA等...

    基于MVC的留言板

    在软件开发领域,模型-视图-控制器(Model-View-Controller,简称MVC)是一种广泛使用的架构模式,尤其在Web应用开发中。本项目是一个自编的基于MVC模式的留言板系统,适用于初学者进行学习和实践。通过这个项目,...

    SpringMVC源码分析系列

    SpringMVC是Spring框架中用于构建Web应用程序的一个模块,它遵循MVC(模型-视图-控制器)设计模式,使得代码分离,易于管理。本文将通过源码分析,深入探索SpringMVC视图层的核心原理及关键组件。 首先,我们从视...

    Java 47道面试题和答案.docx

    2. **天然分层**:框架如Spring MVC引入了Model-View-Controller模式,将业务逻辑、数据处理和用户界面分离开来,降低了代码之间的耦合度,使代码更加清晰易读。 3. **生态系统**:强大的生态系统是框架的一大优势...

    Portlet

    开发者可以使用Java、JSF、Struts、Spring MVC等框架来构建portlet。 ### Portlet的优势 1. **重用性**: Portlets可以在多个门户页面和项目中重复使用,减少开发成本。 2. **集成性**: 可以轻松地与其他portlet和...

    JSF程序设计

    6. **Render Response**:渲染响应,返回给客户端。 ### 六、JSF事件处理 JSF允许定义事件监听器,处理用户交互或组件间通信。事件通过事件队列传播,允许组件根据需要响应。 ### 七、JSF与其他技术的集成 JSF...

    jsf 开发

    - **挑战**: 性能可能不如其他轻量级框架,如Spring MVC;学习曲线相对较陡峭;社区相比其他现代框架略显活跃度不足。 **5. 进阶概念** - **FacesContext**: 是JSF应用的核心对象,提供了与当前请求相关的上下文...

    Apress.Pro.JSF.and.Ajax.pdf

    1. **JavaServer Faces (JSF)**:JSF是Sun Microsystems(现Oracle)推出的一种MVC(Model-View-Controller)框架,它简化了Web应用程序的开发,特别是处理用户界面部分。JSF的核心概念包括组件、事件和转换,以及与...

    Jfinal api word版

    - **MVC 架构**:遵循经典的 Model-View-Controller 设计模式。 - **COC 原则**:即 Convention Over Configuration(约定优于配置),减少配置工作量。 - **轻量级**:框架体积小,无第三方依赖,便于部署和维护...

    jfinal文档.pdf

    5. **render 系列方法**:渲染响应,即将结果返回给客户端。 #### 五、Interceptor 类详解 **Interceptor** 类实现了 AOP 功能,可以在不修改原有代码的基础上添加新功能。主要包含以下方面: 1. **Interceptor ...

    index-database-portlet

    2. **MVC模式**:大多数portlet采用Model-View-Controller设计模式,分离业务逻辑、视图展示和用户交互。 3. **JSP(JavaServer Pages)**:用于创建portlet的动态视图部分,结合EL(Expression Language)和JSTL...

    beetl模板语音教学

    - **配置ViewResolver**: `&lt;bean id="viewResolver" class="org.beetl.spring.view.BeatlViewResolver" /&gt;` - **获取参数**: `${param.name}` **2. Struts2** - **配置**: 将Beetl设置为默认视图技术。 - **示例**:...

Global site tag (gtag.js) - Google Analytics