posts - 36, comments - 419, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

过滤器中向所有JSP页面插入html代码

Posted on 2009-03-12 14:48 BearRui(AK-47) 阅读(2892) 评论(4)  编辑  收藏 所属分类: Java
为公司内部开发了1个简单的MVC框架,框架中需要向所有JSP页面的<head>中插入2条引用JS的代码,实现如下:

主要是继承HttpServletResponseWrapper写1个类(PageResponseWrapper),代码:
 1 public class PageResponseWrapper extends HttpServletResponseWrapper {
 2     private Buffer buffer;
 3     private HttpServletResponse originalResponse;
 4 
 5     public PageResponseWrapper(final HttpServletResponse response){
 6         super(response);
 7         this.originalResponse = response;
 8         buffer = new Buffer();
 9     }
10 
11     @Override
12     public PrintWriter getWriter() throws IOException {
13         return buffer.getWriter();
14     }
15 
16     public CharArrayWriter getContent(){
17         return buffer.getBufferedWriter();
18     }
19 
20     public void close() throws IOException {
21         buffer.getWriter().close();
22     }
23     
24     public void finalize() throws Throwable {
25        super.finalize();
26        buffer.getWriter().close();
27     }
28 
29     /**
30      * 获取原始的response
31      * @return the originalResponse
32      */
33     public HttpServletResponse getOriginalResponse() {
34         return originalResponse;
35     }
36 }

Buffer类:
 1 public class Buffer {
 2 
 3     private CharArrayWriter bufferedWriter;
 4     private PrintWriter exposedWriter;
 5     
 6     public char[] getContents() throws IOException {
 7         //bufferedWriter 表示请求的页面的html
 8         if (getBufferedWriter() != null) {
 9             return getBufferedWriter().toCharArray();
10         }
11         return null;
12     }
        public PrintWriter getWriter() {
16         if (getBufferedWriter() == null) {
17             bufferedWriter = new CharArrayWriter();
18             exposedWriter = new PrintWriter(getBufferedWriter());
19         }
20         return exposedWriter;
21     }
22     /**
23      * @return the bufferedWriter
24      */
25     public CharArrayWriter getBufferedWriter() {
26         return bufferedWriter;
27     }
28 }

过滤器的代码:
 1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 2     HttpServletRequest hRequest = (HttpServletRequest)request;
 3     HttpServletResponse hResponse = (HttpServletResponse)response;
 4     PageResponseWrapper prw = new PageResponseWrapper(hResponse);
 5  
 6     chain.doFilter(request, prw);
 7     // 得到视图html代码
 8     String tmpHtml = prw.getContent();
 9     // 最终输出的html代码
10     String retHtml = "";
11     // 查找<head>
12     int index = tmpHtml.toLowerCase().indexOf("<head>");
13     if(index != -1){
14         index +=6;
15         retHtml = tmp.substring(0, index) + "<script src='http://./..js'></script>" + tmp.substring(index);
16     }else{
17         retHtml = tmpHtml;
18     }
19     // 输出(注意,这里只能使用hResponse,不能使用prwgetWriter())
20     PrintWriter writer = hResponse.getWriter();
21     writer.write(retHtml);
22     writer.close();   
23     writer.close();
24     writer.flush();     
25 }





[作者]:BearRui(AK-47)
[博客]: http://www.blogjava.net/bearrui/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
英雄,别走啊,帮哥评论下:  

精彩推荐 好文要顶 水平一般 看不懂 还需努力

评论

# re: 过滤器中向所有JSP页面插入html代码[未登录]  回复  更多评论   

2009-03-16 14:38 by abc
用sitemesh 很轻松就做到了

# re: 过滤器中向所有JSP页面插入html代码  回复  更多评论   

2009-03-16 15:47 by BearRui(AK-47)
@abc
sitemesh 是可以,sitemesh也是这样实现的

# re: 过滤器中向所有JSP页面插入html代码  回复  更多评论   

2010-06-09 13:57 by BearRui(AK-47)
文章很精彩,推荐一下!

# re: 过滤器中向所有JSP页面插入html代码  回复  更多评论   

2010-06-09 14:00 by BearRui(AK-47)
好文章,顶一下!

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


网站导航: