仿造spring-json view写的view

仿造spring-jsonview写的view

前几天了解了下spring-json,仿造它写了个简单的将string(也就是常常JAVA代码里面拼装的html)放到response那边的view。

仿造

org.springframework.web.servlet.view.json.JsonView

写了一个

cn.sccl.base.web.view.HtmlView

他们都要继承自AbstractView

实现里面的

protectedvoidrenderMergedOutputModel(Mapmodel,

HttpServletRequestrequest,HttpServletResponseresponse)

throwsException

方法。

具体代码如下:

packagecn.sccl.base.web.view;

importjava.io.PrintWriter;

importjava.util.Map;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;

importorg.springframework.web.servlet.view.AbstractView;

publicclassHtmlViewextendsAbstractView{

privatestaticLoglog=LogFactory.getLog(HtmlView.class);

@SuppressWarnings("unchecked")

protectedvoidrenderMergedOutputModel(Mapmodel,

HttpServletRequestrequest,HttpServletResponseresponse)

throwsException{

//log.debug("Mapmodel:"+model.toString());

PrintWriterout=null;

out=response.getWriter();

out.write(getHtmlFromMap(model));

out.flush();

out.close();

}

@SuppressWarnings("unchecked")

privateStringgetHtmlFromMap(Mapmodel){

Stringrestr="";

if(model!=null&&!model.isEmpty()){

//取第一个元素

Objectobj=model.get(model.keySet().iterator().next());

if(objinstanceofString){

restr=(String)obj;

}

}

log.debug("html:"+restr);

returnrestr;

}

}

在views.xml中增加了如下一行配置

<beanname="htmlView"class="cn.sccl.base.web.view.HtmlView"></bean>

在我们的Controller中,只需要这样写

ModelAndViewmav=newModelAndView("htmlView");

mav.addObject(html);

returnmav;

就可以等同于

response.getOutputStream().write(html.getBytes());

或者

PrintWriterout=null;

out=response.getWriter();

out.write(html);

out.flush();

out.close();

其实这样代码并没有节省,反而麻烦些,不过统一了Controller的返回,都是操作ModelAndView了,而不自己去操作response,同时将json或者html的一些代码统一放在了一起,方便以后更改,代码没有散到各个Controller里面。

另外这个扩展完全是为了学习下这种view的方式。以后比如要显示到Excel,pdf,或者向response写二进制文件,都可以仿造这样的方式包装一些,达到集中和统一代码的作用。

相关推荐