仿造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写二进制文件,都可以仿造这样的方式包装一些,达到集中和统一代码的作用。