日期:2014-05-16  浏览次数:20385 次

仿造spring-json view写的view
仿造spring-json view写的view

前几天了解了下spring-json,仿造它写了个简单的将string(也就是常常JAVA代码里面拼装的html)放到response那边的view。
仿造
org.springframework.web.servlet.view.json.JsonView
写了一个
cn.sccl.base.web.view.HtmlView
他们都要继承自AbstractView
实现里面的
protected void renderMergedOutputModel(Map model,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception
方法。

具体代码如下:
package cn.sccl.base.web.view;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.view.AbstractView;
public class HtmlView extends AbstractView {
private static Log log = LogFactory.getLog(HtmlView.class);
@SuppressWarnings("unchecked")
protected void renderMergedOutputModel(Map model,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   // log.debug(" Map model : " + model.toString());
   PrintWriter out = null;
   out = response.getWriter();
   out.write(getHtmlFromMap(model));
   out.flush();
   out.close();
}
@SuppressWarnings("unchecked")
private String getHtmlFromMap(Map model) {
   String restr = "";
   if (model != null && !model.isEmpty()) {
    // 取第一个元素
    Object obj = model.get(model.keySet().iterator().next());
    if (obj instanceof String) {
     restr = (String) obj;
    }
   }
   log.debug(" html : " + restr);
   return restr;
}
}

在views.xml中增加了如下一行配置
<bean name="htmlView" class="cn.sccl.base.web.view.HtmlView"></bean>
在我们的Controller中,只需要这样写
ModelAndView mav = new ModelAndView("htmlView");
mav.addObject(html);
return mav;
就可以等同于
response.getOutputStream().write(html.getBytes());
或者
PrintWriter out = null;
out = response.getWriter();
out.write(html);
out.flush();
out.close();

其实这样代码并没有节省,反而麻烦些,不过统一了Controller的返回,都是操作ModelAndView了,而不自己去操作response,同时将json或者html的一些代码统一放在了一起,方便以后更改,代码没有散到各个Controller里面。
另外这个扩展完全是为了学习下这种view的方式。以后比如要显示到Excel,pdf,或者向response写二进制文件,都可以仿造这样的方式包装一些,达到集中和统一代码的作用。