基于BeanNameViewResolver解析器,自定义视图

概述

基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求。

本文以输出多个pdf文件的压缩文件,供前台下载的需求为例;但是不提供服务层实现。

实现

创建AbstractView的实现类

package cn.sinobest.jzpt.zfba.fzyw.xzfy.dfcl.view;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.AbstractView;
import cn.sinobest.jzpt.zfba.fzyw.xzfy.dfcl.domain.DFCL;
import cn.sinobest.jzpt.zfba.fzyw.xzfy.dfcl.service.IZipService;
@Component("dfclView")
public class DFCLView extends AbstractView {
    @Resource(name = "fzyw.xzfy.service.zip")
    private IZipService zipService;
    @Override
    protected void renderMergedOutputModel(Map<String, Object> model,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        /* 1. 设置响应内容类型 */
        response.setContentType("Application/Octet-stream;charset=utf-8");
        /* 2. 将文件名加入响应头 */
        String zipName = "材料压缩包" + System.currentTimeMillis() + ".zip";
        zipName = new String(zipName.getBytes(), "ISO-8859-1");
        response.addHeader("Content-Disposition", "attachment; filename="
                + zipName);
        /* 3. 输出文件内容 */
        @SuppressWarnings("unchecked")
        List<DFCL> dfclList = (List<DFCL>) model.get("dfclList");
        zipService.write(response.getOutputStream(), dfclList);
        /* 4. 关闭流 */
        response.getOutputStream().flush();
        response.getOutputStream().close();
    }
}

说明:

注解Component用于声明spring的bean

在Controller中返回视图bean的名称

private static final String VIEW_DEFAULT = "dfclView";
@RequestMapping("/download")
public String download(Model model, String writids) {
    List<DFCL> dfclList = dfclService.getDFCL(writids);
    model.addAttribute("dfclList", dfclList);
    return VIEW_DEFAULT;
}

更多内容

注:下面的介绍多以项目框架中的配置为基础,具体实现类的代码不便贴出,权作参考

在spring-mvc中,controller返回的名称需要经过视图解析器的解析,解析器找到对应的视图,并调用对应的方法。

在项目中,一般在Controller的方法返回jsp的相对路径,即能在前台得到对应的内容,是因为webmvc-config.xml中存在下述的配置:

<bean class="cn.sinobest.jzpt.framework.mvc.localization.ExtInternalResourceViewResolver">
<!--bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"-->
    <property name="prefix" value=""/>
    <property name="suffix" value=""/>
</bean>

而详表配置文件,通常是在jsp返回后根据form的formdata属性异步请求的,对应的controller方法返回"xmlView";前台可以得到对应的xml,并渲染视图,是因为webmvc-config.xml中存在下述的配置:

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

BeanNameViewResolver解析器试图将返回的名称当作视图bean的name,而webmvc-config.xml中又配置了"xmlView"的视图:

<bean name="xmlView" class="cn.sinobest.jzpt.framework.mvc.legacysystemsmac.xml.LegacySystemsXMLView">
    <property name="xmlTransformer">
        <bean class="cn.sinobest.jzpt.framework.mvc.legacysystemsmac.xml.LegacySystemsXMLTransformer"/>
    </property>
</bean>

具体研究详表配置文件的返回,就要看LegacySystemsXMLView和LegacySystemsXMLTransformer的源代码了。

当需要返回json的时候,controller方法一般返回"jsonView",是因为webmvc-config.xml中存在了BeanNameViewResolver的配置,还有"jsonView"的配置:

<bean name="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
    <property name="encoding">
        <value type="org.codehaus.jackson.JsonEncoding">UTF8</value>
    </property>
    <property name="contentType" value="text/html;charset=UTF-8"/>
</bean>

spring提供了一套View和ViewResolver的继承体系

参考spring自定义视图可以获取更多的内容。

时间: 2024-08-03 00:10:12

基于BeanNameViewResolver解析器,自定义视图的相关文章

SpringMVC系列(七)视图解析器和视图

在springmvc.xml里面配置视图解析器 1 <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 --> 2 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 3 <property name="prefix" value="/WEB-INF/views/">&l

Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)

View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支持 ViewResolver ViewResolver接口定义了如何通过view 名称来解析对应View实例的行为,即:如何把控制器返回的"视图名 字符串" 解析为View实例,并渲染为HTML.PDF后推向浏览器 同样Spring提供了丰富的ViewResolver实现用来解析不同的Vi

Spring视图和视图解析器

1.配置直接转发的页面 <!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-controller path="/success" view-name="success"/> <!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签 --> <mvc:annotation-driven><

SpringMVC 视图和视图解析器&amp;表单标签

视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图 Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel.JFreeChart 等各种表现形式的视图 视图 视图的作用是渲染模型数据,将模

SpringMVC——视图和视图解析器

请求处理方法执行完成后,最终返回一个 ModelAndView对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图 Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel.JFreeChart 等各种表现形式的视图 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并

SpringMVC源码阅读:视图解析器

1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring4.3.7)分析,弄清楚SpringMVC如何完成视图解析的 2.源码分析 在SpringMVC源码阅读:拦截器分析过doDispatch的运行过程,这里再分析一遍 回到DispatcherServlet类的doDispatch方法,看看doDispatch如何获取ModelAndView Hand

SpringMvc配置自定义视图

<!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 --> <!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 --> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="100&

[转载]开发 Spring 自定义视图和视图解析器

原文出处 http://www.ibm.com/developerworks/cn/java/j-lo-springview/ 概述 Spring 3.0 默认包含了多种视图和视图解析器,比如 JSP.Velocity 视图等,但在某些情况下,我们需要开发自定义的视图及其解析器,以便显示特殊文件格式的视图,我们也可以使用自定义视图及解析器,针对特定的视图做相应的处理.本文将通过一个示例来介绍如何开发 Spring 自定义视图和视图解析器,来显示后缀名为 SWF 的视图,并提供一个简单的注册机制,

springMVC4(13)视图解析器分类详解

在<springMVC4(7)模型视图方法源码综合分析>一文中,我们介绍了ModelAndView的用法,它会在控制层方法调用完毕后作为返回值返回,里面封装好了我们的业务逻辑数据和视图对象或视图名 .下一步,视图对象往往会对模型进一步渲染,再由视图解析器进一步解析并向前端发出响应.在下面,我们详细介绍视图和视图解析器的各种分类. 在View接口中,定义了一个核心方法是: void render(Map<String, ?> model, HttpServletRequest req