/************ Template.java ****************/ package com.youngor; import java.io.*; import java.util.*; import java.util.regex.*; /** * file:Template.class JAVA模板类 * author:伍子 * website:http://www.54youngor.com * reference:phplib */ public class Template { private String classname=”Template”; private boolean debug=false; private HashMap file=new HashMap(); private String root=”"; private HashMap varkeys=new HashMap(); private HashMap varvals=new HashMap(); private String unknowns=”remove”; private String halt_on_error=”yes”; private String last_error=”"; public Template() { } /** * 设置模板文件根目录 * @param root */ public void set_root(String root) { if(!is_dir(root)) { halt(“set_root:”+root+” is not a directory.”); } this.root=root; } /** * 设定对未知模板变量的处理办法 * @param unknowns */ public void set_unknowns(String unknowns) { this.unknowns=unknowns; } /** * 设定模板文件 * @param handle * @param filename */ public void set_file(String handle,String filename) { file.put(handle,filename(filename)); } /** * 设定模板变量 * @param varname * @param value */ public void set_var(String varname,String value) { if(!varkeys.containsKey(varname)) { varkeys.put(varname,varname(varname)); } if(!varvals.containsKey(varname)) { varvals.put(varname,value); } else { varvals.remove(varname); varvals.put(varname,value); } //System.out.println(varname+”==================”+value); } /** * 设定块变量 * @param parent * @param handle * @param name */ public void set_block(String parent,String handle,String name) { if(!loadfile(parent)) { halt(“subst:unable to load “+parent); } if(name==”") { name=handle; } String str=get_var(parent); Pattern p=Pattern.compile(“<!–\\s+BEGIN ” + handle + “\\s+–>([\\s\\S.]*)<!–\\s+END ” + handle + “\\s+–>”); Matcher m=p.matcher(str); boolean rs=m.find(); String t=m.group(m.groupCount()); set_var(handle,t); str=m.replaceAll(“\\{“+name+”\\}”); set_var(parent,str); } /** * 进行变量替换 * @param handle * @return */ public String subst(String handle) { if(!loadfile(handle)) { halt(“subst:unable to load “+handle); } String str=get_var(handle); Set keys=varkeys.keySet(); Iterator keyIter=keys.iterator(); while(keyIter.hasNext()) { String key=(String)keyIter.next(); Pattern p=Pattern.compile((String)varkeys.get(key)); Matcher m=p.matcher(str); str=m.replaceAll((String)varvals.get(key)); } //System.out.println(handle+”++++++++++++++++++”+str); return str; } /** * 进行变量复制 * @param target * @param handle * @param append */ public void parse(String target,String handle,boolean append) { String str=subst(handle); if(append) { set_var(target,get_var(target)+str); } else { set_var(target,str); } } /** * 返回替换后的文件 * @param varname * @return */ public String p(String varname) { return finish(get_var(varname)); } /** * parse()和p()的合并 * @param target * @param handle * @param append * @return */ public String pparse(String target,String handle,boolean append) { parse(target,handle,append); return p(target); } /** * 加载模板文件 * @param handle * @return */ private boolean loadfile(String handle) { if(varkeys.containsKey(handle) && varvals.get(handle)!=null) { return true; } if(!file.containsKey(handle)) { halt(“loadfile:”+handle+” is not a valid handle.”); return false; } String filename=(String)file.get(handle); if(!file_exists(filename)) { halt(“loadfile:while loading “+handle+”,”+filename+” does not exist.”); return false; } try { FileReader fr=new FileReader(filename); StringBuffer sb=new StringBuffer(“”); int ch=0; while((ch=fr.read())!=-1) { sb.append((char)ch); } String s=sb.toString(); if(s==”") { halt(“loadfile:while loading “+handle+”,”+filename+” is empty.”); return false; } fr.close(); set_var(handle,s); } catch(Exception e) { } return true; } /** * 获取变量 * @param varname * @return */ private String get_var(String varname) { if(varvals.containsKey(varname)) return (String)varvals.get(varname); else return “”; } /** * 判断目录 * @param path * @return */ private boolean is_dir(String path) { File dir=new File(path); if(dir.isDirectory()) return true; else return false; } /** * 判断文件 * @param filename * @return */ private boolean file_exists(String filename) { File file=new File(filename); if(file.isFile()) return true; else return false; } /** * 文件名处理 * @param filename * @return */ private String filename(String filename) { if(!file_exists(root+filename)) { halt(“filename:file “+filename+” does not exist.”); } return root+filename; } /** * 变量名处理 * @param varname * @return */ private String varname(String varname) { return “\\{“+varname+”\\}”; } /** * 完成字符串的处理 * @param str * @return */ private String finish(String str) { Pattern p=Pattern.compile(“\\{[^ \\t\\r\\n\\}]+\\}”); Matcher m=p.matcher(str); if(unknowns==”remove”) { str=m.replaceAll(“”); } else if(unknowns==”comment”) { str=m.replaceAll(“<!– Template Variable undefined –>”); } else { ; } return str; } private void halt(String msg) { last_error=msg; if(halt_on_error!=”no”) { haltmsg(msg); } if(halt_on_error==”yes”) { System.out.println(“<b>Halted.</b>”); //System.exit(0); } } private void haltmsg(String msg) { System.out.println(“<b>Template Error:</b> “+msg+” <br>\n”); } } /***************** index.html **********************/ <html> <head> <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=GBK”></meta> <title>untitled1</title> </head> <body> <P>{HEAD}</P> <P>{CONTENT}{UNDEFINED}</P> <table cellspacing=”2″ cellpadding=”3″ border=”1″ width=”100%”> <!– BEGIN BROW –> <tr> <!– BEGIN BCOL –> <td>{NUMBER}</td> <!– END BCOL –> </tr> <!– END BROW –> </table> <P> </P>{FOOT} </body> </html> /****************** head.html *************************/ <html> <head> <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=GBK”></meta> <title>untitled1</title> </head> <body>欢迎您,{NAME} </body> </html> /******************* foot.html *************************/ <html> <head> <meta HTTP-EQUIV=”Content-Type” CONTENT=”text/html; charset=GBK”></meta> <title>untitled1</title> </head> <body>版权所有:{COMPANY} </body> </html> /******************** AbstractServlet.java ****************/ package com.youngor; import javax.servlet.*; import javax.servlet.http.*; import java.io.PrintWriter; import java.io.IOException; public class AbstractServlet extends HttpServlet { private static final String CONTENT_TYPE = “text/html; charset=GB2312″; public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); process(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); process(request,response); } public void process(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { } } /********************** Index.java ***********************/ package com.youngor; import java.io.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Index extends AbstractServlet { public Index() { } public void process(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { Template tp=new Template(); String realPath = getServletConfig().getServletContext().getRealPath(“/”); tp.set_root(realPath); //tp.set_unknowns(“keep”); tp.set_file(“fh”,”tpl/index.html”); tp.set_file(“head”,”tpl/head.html”); tp.set_file(“foot”,”tpl/foot.html”); tp.set_block(“fh”,”BROW”,”row”); tp.set_block(“BROW”,”BCOL”,”col”); tp.set_var(“NAME”,”朋友“); tp.set_var(“CONTENT”,”JAVA模板技术,支持模板嵌套,块操作“); for(int i=0;i<10;i++) { tp.set_var(“col”,”"); for(int j=0;j<10;j++) { tp.set_var(“NUMBER”,String.valueOf(i)+String.valueOf(j)); tp.parse(“col”,”BCOL”,true); } tp.parse(“row”,”BROW”,true); } tp.set_var(“COMPANY”,”youngor-studio”); tp.parse(“HEAD”,”head”,false); tp.parse(“FOOT”,”foot”,false); //tp.parse(“out”,”fh”,false); String s=tp.pparse(“out”,”fh”,false); PrintWriter out; out=response.getWriter(); out.println(s); } }