如何从response里面取出向客户端输出的html流

 我来答
白子屡188
2014-12-20 · TA获得超过351个赞
知道小有建树答主
回答量:257
采纳率:100%
帮助的人:57.5万
展开全部
项目里需要在把servlet,jsp生成的html代码存储到数据库中。如何解决,比较直接的想法是客户端用xmlhttp,或者直接在客户端js代码里发出请求,然后把得到的html代码在作为提交数据发送给服务器端,由服务器端程序接受并存入数据库中。
但是此方法需要耗费两次网络传输,肯定性能不加,而且处理起来要几块程序同时协作才行。还是想办法从服务器端直接获取。因为从response无法直接得到输出流,得想其他的办法。一种是干脆在服务器端写一个监控socket接口的客户端程序,或者用httpunit帮助完成,就是把客户端程序移到服务器端执行。还是相对比较复杂,能不能从response入手?
答案是肯定的,采用response代理来截获response的几个输出函数,然后存储起来,已备查询。
灵感来自于前一阵一直研究的java动态代理机制(现在应用在spring的aop实现中),此处不用动态代理,就使用静态代理,proxy模式就足够了。
分别实现三个代理类:ServletResponseProxy,ServletOutputStreamProxy,PrintWriterProxy
Responseproxy 主要代码:
public class ServletResponseProxy implements HttpServletResponse {
private HttpServletResponse obj;//实际的HttpServletResponse 实例

public ServletResponseProxy(HttpServletResponse obj) {
this.obj = obj;
HtmlBuffer.cleanStr(); //情空缓存
}

//获得outputStreamProxy
public ServletOutputStream getOutputStream() throws IOException {
ServletOutputStream so = obj.getOutputStream();
ServletOutputStreamProxy sop = new ServletOutputStreamProxy(so);
return sop;
}
//获得printWriterProxy
public PrintWriter getWriter() throws IOException {
PrintWriter pw = obj.getWriter();
PrintWriterProxy pwp = new PrintWriterProxy(pw);
return (PrintWriter) pwp;
}
}

PrintWriterProxy:

public class PrintWriterProxy
extends PrintWriter {
private PrintWriter pw = null;

public PrintWriterProxy(PrintWriter pw) {
super(pw);
this.pw = pw;
}
//截获写内容写入buffer
public void write(int c) {
char a = (char) c;
String s = new String(new char[] {a});
HtmlBuffer.addStr(s);
pw.write(c);
}
}

ServletOutputStreamProxy:
public class ServletOutputStreamProxy
extends ServletOutputStream {
private ServletOutputStream obj;
public ServletOutputStreamProxy(ServletOutputStream obj){
this.obj = obj;
}
//截获写内容写入buffer
public void write(int b) throws IOException {
Integer it = new Integer(b);
HtmlBuffer.addStr(new String(new byte[]{it.byteValue()}));
obj.write(b);
}
}

由于web Httpserver 是多线程执行服务端程序,所以buffer应该分线程来存取,这样大家才能不互相干扰。所以buffer需要实现TreadLocal接口。
HtmlBuffer代码简单实现如下:
public class HtmlBuffer {
private static class HtmlInfo extends ThreadLocal {
private Map values = Collections.synchronizedMap(new HashMap());
public Object initialValue() {
return new String();
}
public String getHtmlStr() {
return (String) this.get();
}
public Object get() {
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread)) {
o = initialValue();
values.put(curThread, o);
}
return o;
}
public void set(Object newValue) {
values.put(Thread.currentThread(), newValue);
}
}
private static HtmlInfo htmlInfo = new HtmlInfo();

public static void cleanStr(){
htmlInfo.set( "");
}
public static void addStr(String htmlStr) {
String htmlstr = (String)htmlInfo.get();
if(htmlstr == null) htmlstr ="";
htmlstr += htmlStr;
htmlInfo.set( htmlstr);
}
public static String getStr() {
return (String)htmlInfo.get();
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式