KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > web > layout > LayoutTag


1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU Library General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15  */

16 package web.layout;
17
18 import java.io.IOException JavaDoc;
19 import java.io.Reader JavaDoc;
20 import java.util.ArrayList JavaDoc;
21 import java.util.Collections JavaDoc;
22 import java.util.Hashtable JavaDoc;
23 import java.util.List JavaDoc;
24
25 import javax.servlet.http.HttpServletRequest JavaDoc;
26 import javax.servlet.http.HttpServletResponse JavaDoc;
27 import javax.servlet.jsp.JspException JavaDoc;
28 import javax.servlet.jsp.PageContext JavaDoc;
29 import javax.servlet.jsp.tagext.BodyTagSupport JavaDoc;
30
31 import org.xml.sax.SAXException JavaDoc;
32
33 import dlog4j.util.StringUtils;
34
35 /**
36  * 用于处理页面排版文件中变量的替换
37  * @author liudong
38  */

39 public class LayoutTag extends BodyTagSupport JavaDoc {
40
41     protected final static int BUFFER_SIZE = 512;
42     protected final static String JavaDoc ROOT = "{ROOT}";
43     
44     public int doStartTag() throws JspException JavaDoc {
45         return EVAL_BODY_BUFFERED;
46     }
47     public int doEndTag() throws JspException JavaDoc {
48         Reader JavaDoc reader = getBodyContent().getReader();
49         char[] buf = new char[BUFFER_SIZE];
50         try{
51             HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc)pageContext.getRequest();
52             HttpServletResponse JavaDoc res = (HttpServletResponse JavaDoc)pageContext.getResponse();
53             StringBuffer JavaDoc content1 = new StringBuffer JavaDoc(BUFFER_SIZE);
54             do{
55                 int rc = reader.read(buf);
56                 if(rc>0)
57                     content1.append(buf,0,rc);
58                 if(rc<BUFFER_SIZE)
59                     break;
60             }while(true);
61             String JavaDoc html = StringUtils.replaceIgnoreCase(content1.toString(), ROOT, req.getContextPath());
62             List JavaDoc tokens = listTokens(html);
63             int curIdx = 0;
64             for(int i=0;i<tokens.size();i++){
65                 Token token = (Token)tokens.get(i);
66                 pageContext.getOut().write(html.substring(curIdx,token.begin));
67                 try{
68                     if(ROOT.equals(token.name)){
69                         pageContext.getOut().write(req.getContextPath());
70                     }
71                     else{
72                         String JavaDoc tokenPage = getTokenPage(token.name,token.page);
73                         pageContext.include(tokenPage);
74                     }
75                 }catch (Exception JavaDoc e0) {
76                     pageContext.getServletContext().log("LayoutTag.doEndTag page="+token.page,e0);
77                     pageContext.setAttribute("excetion", e0, PageContext.REQUEST_SCOPE);
78                     if(!errorPage.startsWith("/"))
79                         pageContext.include(baseDir + errorPage);
80                     else
81                         pageContext.include(errorPage);
82                 }
83                 curIdx = token.begin + token.name.length();
84             }
85             pageContext.getOut().write(html.substring(curIdx));
86         }catch(Exception JavaDoc e1){
87             pageContext.getServletContext().log("LayoutTag.doEndTag",e1);
88         }
89         return EVAL_PAGE;
90     }
91     
92     /**
93      * 根据参数来决定是否替换页面中的BODY部分
94      * @param token 变量名称
95      * @param page 变量对应的默认页面
96      * @return
97      */

98     protected String JavaDoc getTokenPage(String JavaDoc token, String JavaDoc page){
99         String JavaDoc sPage;
100         if(mainPage==null || !"$BODY$".equals(token))
101             sPage = page;
102         else
103             sPage = (String JavaDoc)pageContext.findAttribute(mainPage);
104         return (sPage.startsWith("/"))?sPage:(baseDir + sPage);
105     }
106     
107     /**
108      * 列出排版页面中存在的所有变量并进行位置的排续
109      * @param content
110      * @return
111      * @throws SAXException
112      * @throws IOException
113      */

114     protected synchronized List JavaDoc listTokens(String JavaDoc content) throws Exception JavaDoc{
115         int hashcode = content.toString().hashCode();
116         Integer JavaDoc layout_hashcode = (Integer JavaDoc)ht_hashcodes.get(id);
117         final int layout_hc = (layout_hashcode!=null)?layout_hashcode.intValue():-1;
118         final List JavaDoc last_tokens = (List JavaDoc)ht_tokens.get(id);
119         if(hashcode==layout_hc && last_tokens!=null)
120             return last_tokens;
121         List JavaDoc tokens = new ArrayList JavaDoc();
122         LayoutConfig config = LayoutConfig.getConfig(pageContext.getServletContext());
123         int pc = config.pageSize();
124         for(int i=0;i<pc;i++){
125             Page page = config.getPage(i);
126             int begin = content.indexOf(page.getName());
127             if(begin!=-1){
128                 Token token = new Token();
129                 token.begin = begin;
130                 token.name = page.getName();
131                 token.page = page.getUri();
132                 tokens.add(token);
133             }
134         }
135         int begin = content.indexOf(ROOT);
136         if(begin!=-1){
137             Token token = new Token();
138             token.begin = begin;
139             token.name = ROOT;
140             tokens.add(token);
141         }
142         Collections.sort(tokens);//按位置进行排序
143
//缓冲信息
144
ht_hashcodes.put(id, new Integer JavaDoc(hashcode));
145         ht_tokens.put(id, tokens);
146         return tokens;
147     }
148     
149     private static Hashtable JavaDoc ht_tokens = new Hashtable JavaDoc();
150     private static Hashtable JavaDoc ht_hashcodes = new Hashtable JavaDoc();
151     
152     /**
153      * 用于变量替换保存临时参数
154      */

155     private class Token implements Comparable JavaDoc{
156         public int ident;
157         public String JavaDoc name;
158         public int begin;
159         public String JavaDoc page;
160         
161         public int compareTo(Object JavaDoc obj) {
162             return begin - ((Token)obj).begin;
163         }
164         public int hashCode() {
165             return begin;
166         }
167     };
168     
169     protected String JavaDoc mainPage;
170     protected String JavaDoc baseDir = "/WEB-INF/jsp/";
171     protected String JavaDoc errorPage = "error/error.jsp";
172     
173     public String JavaDoc getMainPage() {
174         return mainPage;
175     }
176     public void setMainPage(String JavaDoc mainPage) {
177         this.mainPage = mainPage;
178     }
179     public String JavaDoc getBaseDir() {
180         return baseDir;
181     }
182     public void setBaseDir(String JavaDoc baseDir) {
183         if(!baseDir.endsWith("/"))
184             baseDir += "/";
185         this.baseDir = baseDir;
186     }
187     public String JavaDoc getErrorPage() {
188         return errorPage;
189     }
190     public void setErrorPage(String JavaDoc errorPage) {
191         this.errorPage = errorPage;
192     }
193 }
194
Popular Tags