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