`
zhangwei_david
  • 浏览: 476086 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring MVC之视图呈现

阅读更多

     在Spring MVC DispatcherServlet.doDispatch中请求在经过handler处理返回一个ModelAndView.

那么ModelAndView又是如何最终转换为一个具体的View的呢?下面就对视图呈现部分作出一些简介。

视图的渲染是处理一个请求的最后阶段:

 

/**   根据ModelAndView中的视图名称进行解析,得到具体的视图对象
	 * Render the given ModelAndView.
	 * <p>This is the last stage in handling a request. It may involve resolving the view by name.
	 * @param mv the ModelAndView to render
	 * @param request current HTTP servlet request
	 * @param response current HTTP servlet response
	 * @throws ServletException if view is missing or cannot be resolved
	 * @throws Exception if there's a problem rendering the view
	 */
	protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 确定请求的位置,并将位置信息应用到响应中
		Locale locale = this.localeResolver.resolveLocale(request);
		response.setLocale(locale);

		View view;
		// 如果只是一个视图的引用,则需要解析视图
		if (mv.isReference()) {
			// 解析视图名
			view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
			if (view == null) {
				throw new ServletException(
						"Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" +
								getServletName() + "'");
			}
		}
		else {
			// 不需要解析视图名,从ModleAndView中获取实际的视图对象
			view = mv.getView();
			if (view == null) {
				throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " +
						"View object in servlet with name '" + getServletName() + "'");
			}
		}

		// 将视图的渲染委派给视图对象,并通过HttpResponse把视图呈现给Http客户端
		if (logger.isDebugEnabled()) {
			logger.debug("Rendering view [" + view + "] in DispatcherServlet with name '" + getServletName() + "'");
		}
		view.render(mv.getModelInternal(), request, response);
	}

 

  通过上面的代码可以发现对于视图的解析是使用如下方法:在该方法中遍历视图注册的视图解析器,如果优先级高的视图解析器可以解析出正确的视图对象,则直接放回视图对象。

 

 

 

	/**
	 * 将给定的视图名称解析成一个将被渲染的视图对象
         *  默认的实现要求调用所有的视图解析器。也可以基于特定的模型参数或请求参数使用自定义
         *  策略重写。 
	 * <p>The default implementations asks all ViewResolvers of this dispatcher.
	 * Can be overridden for custom resolution strategies, potentially based on
	 * specific model attributes or request parameters.
	 * @param viewName the name of the view to resolve
	 * @param model the model to be passed to the view
	 * @param locale the current locale
	 * @param request current HTTP servlet request
	 * @return the View object, or <code>null</code> if none found
	 * @throws Exception if the view cannot be resolved
	 * (typically in case of problems creating an actual View object)
	 * @see ViewResolver#resolveViewName
	 */
	protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
			HttpServletRequest request) throws Exception {

		for (ViewResolver viewResolver : this.viewResolvers) {
			View view = viewResolver.resolveViewName(viewName, locale);
			if (view != null) {
				return view;
			}
		}
		return null;
	}

 

自定义的一个JSON视图解析器:

**
 *
 * @author zhangwei_david
 * @version $Id: JsonViewResolver.java, v 0.1 2014��11��30�� ����12:09:44 zhangwei_david Exp $
 */
public class JsonViewResolver implements ViewResolver, Ordered {

    private static final Logger logger = LogManager.getLogger(JsonViewResolver.class);

    private int                 order  = Ordered.HIGHEST_PRECEDENCE;
    private UrlPathHelper       urlPathHelper;

    /**
     * @see org.springframework.web.servlet.ViewResolver#resolveViewName(java.lang.String, java.util.Locale)
     */
    public View resolveViewName(String viewName, Locale locale) throws Exception {

        RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
        Assert.isInstanceOf(ServletRequestAttributes.class, attrs);
        HttpServletRequest request = ((ServletRequestAttributes) attrs).getRequest();
        String uri = urlPathHelper.getRequestUri(request);
        if (uri.contains(".json")) {
            LogUtils.info(logger, "Handler the Uri {0} and Return A JSON View", uri);
            return new MappingJacksonJsonView();
        }
        //
        return null;
    }

    /**
     * Getter method for property <tt>urlPathHelper</tt>.
     *
     * @return property value of urlPathHelper
     */
    public UrlPathHelper getUrlPathHelper() {
        return urlPathHelper;
    }

    /**
     * Setter method for property <tt>urlPathHelper</tt>.
     *
     * @param urlPathHelper value to be assigned to property urlPathHelper
     */
    public void setUrlPathHelper(UrlPathHelper urlPathHelper) {
        this.urlPathHelper = urlPathHelper;
    }

    /**
     * @see org.springframework.core.Ordered#getOrder()
     */
    public int getOrder() {
        return order;
    }

    /**
     * Setter method for property <tt>order</tt>.
     *
     * @param order value to be assigned to property order
     */
    public void setOrder(int order) {
        this.order = order;
    }

}

 

 

0
0
分享到:
评论

相关推荐

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC支持多种视图技术,如JSP、FreeMarker或Thymeleaf,开发者可以根据项目需求选择合适的视图解析器。 视图解析器是Spring MVC中用于确定视图名对应的实际资源路径的组件。例如,...

    最全最经典spring-mvc教程

    Spring MVC 是一款强大的Java Web开发框架,用于构建高效、可维护和模块化的Web应用程序。它作为Spring框架的一部分,提供了一种优雅的方式来处理HTTP请求和响应,使得开发者可以专注于业务逻辑而不是底层实现。在这...

    Spring MVC 4.2.3

    7. **多视图解析器**:Spring MVC支持多种视图解析器,如JSP、FreeMarker、Thymeleaf等,可以根据项目需求灵活选择。 8. **模板引擎集成**:例如,与Thymeleaf的集成使得开发者能编写声明式逻辑的模板,提高了视...

    Spring MVC 教程快速入门 深入分析

    十八、Spring MVC多视图控制器:解释了如何配置和使用Spring MVC的多视图控制器来处理不同的视图需求。 十九、&lt;mvc:annotation-driven/&gt;到底做了什么工作:描述了&lt;mvc:annotation-driven /&gt;标签的作用,它自动注册...

    spring mvc 4.0

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    总之,“Spring MVC - A Tutorial”这份指南会详细讲解Spring MVC的各个核心组件和使用技巧,包括控制器的创建、模型数据的管理、视图的渲染、以及各种高级特性。通过学习,开发者可以熟练地运用Spring MVC来构建...

    spring MVC .docx

    Spring MVC的设计目标是提供一个清晰的组件化架构,使得开发者可以独立地开发和测试控制器、服务层、数据访问层以及视图层。这个框架通过Model-View-Controller(MVC)设计模式,将业务逻辑、用户界面和数据处理有效...

    Spring MVC使用Demo

    此外,Spring MVC提供了ModelAndView类,它可以将处理结果(模型数据)和视图名组合在一起,方便返回给视图层进行渲染。`@ResponseBody`注解可以让方法的返回值直接写入HTTP响应体,常用于返回JSON或XML等格式的数据...

    《精通Spring MVC 4》源码

    首先,Spring MVC的核心组件包括DispatcherServlet、Controller、Model-View-Controller(MVC)架构、视图解析器和数据绑定等。DispatcherServlet作为Spring MVC的前端控制器,负责接收HTTP请求,然后根据配置分发到...

    Spring MVC 4.2.4.RELEASE 中文文档

    Spring MVC的核心是MVC模式,它将应用程序分为三个主要部分:模型、视图和控制器。模型负责管理应用程序的数据和业务逻辑,视图负责呈现数据,而控制器处理用户的请求,协调模型和视图。 **2. 处理器映射器与处理器...

    spring mvc框架依赖全面jar

    Spring MVC 是一个基于 Java 的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本压缩包中包含了一系列与Spring MVC相关的jar文件,这些文件是构建和运行Spring MVC项目所...

    Spring MVC 简单Demo

    - 在Spring MVC配置文件中声明处理器映射器、视图解析器、以及自定义的控制器等。 4. **创建简单示例** 在这个"Spring MVC 简单Demo"中,我们可能有一个名为`SummerWeb`的目录,其中包含以下文件: - `web.xml`...

    Spring MVC--5.视图和视图解析器

    在Spring MVC框架中,视图和视图解析器是实现MVC模式中“V”(View)部分的关键组件。它们负责将处理完的数据转化为用户可以理解的格式,并展示在浏览器上。视图解析器则是连接控制器与视图的桥梁,它负责根据返回的...

    Spring MVC入门教程

    个人认为相当适合入门和知识巩固!! 一、前言 ...十八、spring mvc 多视图控制器 十九、 &lt;mvc:annotation-driven /&gt; 到底做了什么工作 二十、 本文中springMVC.xml配置文件是核心,这里给一个下载地址

    Spring MVC + Mybatis+Spring实现的个人博客系统

    Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。在Spring MVC中,Controller负责处理HTTP请求,Model持有业务数据,而View则负责数据的展示。通过DispatcherServlet...

Global site tag (gtag.js) - Google Analytics