/************ 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);
}
}
发表于 @ 2005年04月05日 16:07:00|评论(loading...)|编辑