自定义springmvc视图解析器

Java 发表评论


前言

springmvc的视图解析器java程序员应该都很清楚,只要使用的是springmvc框架,那么最终从服务端吐出来的数据都需要经过视图解析器的解析。或者是返回html页面、或者是返回json数据、再或者返回xml、xls等等。

由于spring良好的开放性,我们可以很轻易的继承AbstractView,实现自己的视图解析器,来向调用端吐出合适的数据展现样式。

接下来我们一起看一个自定义的视图解析器,这个解析器将模型中的属性、属性值以及在属性上标记的注释信息打印出来,以html页面的形式吐出给调用方。

解析结果示例

这里写图片描述

实现步骤概览

  1. 首先我们需要自定义一个视图类,这个类要继承springmvc的AbstractView,并实现其中唯一的抽象方法:
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
  1. 将解析器集成到springmvc项目中。

View实现

public class AttibuteExplainView extends AbstractView {

    public static final String DEFAULT_CONTENT_TYPE = "application/explain";

    //指定解析的MediaType类型
    public AttibuteExplainView(){
        setContentType(DEFAULT_CONTENT_TYPE);
    }

    @Override
    //执行Model对象解析
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        response.setContentType("text/html");

        for (Map.Entry<String, Object> entry : model.entrySet()) {
            if (!(entry.getValue() instanceof BindingResult)) {
                Object returnModel = entry.getValue();
                AttributeExplainPrinter printer = new AttributeExplainPrinter(new HtmlMarkConvertor());
                String html = printer.getExplainInfo(returnModel);
                response.setContentLength(html.getBytes().length);
                response.getOutputStream().write(html.getBytes());

                //这里仅解析model中第一个不是BindingResult的结果,也就是说仅解析了一个Model对象
                //一般来说我们向前端返回的也是一个对象,所以这样是没有问题的
                break;
            }
        }

    }

}

里面的AttributeExplainPrinter是一个自定义的类,用来实现对java对象属性、属性值及注释信息的提取。

application/explain是自定义的媒体类型,必须和下一步xml中一致。浏览器支持的媒体类型,可以见这里:http://blog.csdn.net/a123638/article/details/50313485

借助ContentNegotiatingViewResolver集成自定义View

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
      <property name="order" value="1" />
      <property name="mediaTypes">
        <map>
           <entry key="json" value="application/json" />
           <entry key="ae" value="application/explain"></entry>
        </map>
      </property>

      <property name="defaultViews">
        <list>
          <!-- JSON 视图 -->
          <bean
            class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
          </bean>
          <!-- 属性解析视图 -->
          <bean class="com.dangdang.ae.base.spring.AttibuteExplainView"></bean>
         </list>
      </property>
      <property name="ignoreAcceptHeader" value="true" />
    </bean>

源代码和使用范例见:https://github.com/ZhangShufan15/attribute-explain

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *