项目里需要在把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();
 }
}

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 9, comments - 27, trackbacks - 0, articles - 19

Copyright © publisher luo