[风雨者]

山高路远,风雨兼程!

伍维波ID:letsflytogether
80569次访问,排名1179好友8人,关注者90
一个非计算机专业毕业的,带着对计算机的热爱,如今从事在软件开发领域。我想,我已经证明了专业不应是我们就业的标尺。
除了软件开发,我的爱好还有篮球和美食。
letsflytogether的文章
原创 67 篇
翻译 0 篇
转载 58 篇
评论 116 篇
伍子的公告
    没有比人更高的山,
    没有比脚更长的路。
------------------------
    既然选择了远方,
    便只顾风雨兼程。
------------------------
    失败只有一种,
    就是半途而废。
------------------------
    天下难事必作于易,
    天下大事必作于细。
------------------------
    从用户的角度考虑,
    你就成功了一半。
------------------------
月 [下月] [上月]
最近评论
cqg1220:机柜
badonly:原来模板技术是这样的!!!谢了~~~
apollosun:恭喜啊

女儿就是宝,享福了啊

我女儿现在虚岁4岁,太可爱了,我每天下班回家的感觉就象过节。
letsflytogether:phpMVC是我两三年前接触的一个框架,为什么我选择它呢,是因为当时我首先接触了JAVA的Struts,学起来很好理解.但是如今我发现这个框架用起来稍嫌烦琐,代码更新也挺慢的.PHP语言同类型的框架还有cakePHP,ZendFramework,Symfony等,它们的发展都挺好的,而已有些是原生就支持ajax,你可以看看这些框架.其实框架是次要,最重要的还是思想.只不过有些时候思想过于抽象……
tjbaso:我暂时先把MVC搞定,接着就去弄XAJAX,天津用PHP的很少,可能还是去北京闯闯了,你的文章对我们来说是很有价值的。谢谢你。
文章分类
收藏
相册
个人风采
精品收藏
文章贴图
个人网站
女儿的博客
我在ITPUB上的博客
我在世界经理人上的博客
技术网站
CSDN
MSDN
UML软件工程组织
中国UI设计网
蓝色理想
软件工程专家网
休闲娱乐
学习网站
ICXO
网页设计师
金桥译港世界通
友情链接
heiyeluren的Blog(RSS)
博客中国上的琴剑楼
小肥羊
汉博园——陈希成
韦子的空中楼阁
资源网站
中国盟动力
太平洋电脑网
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 JAVA模板技术收藏

新一篇: 用PHP实现分页功能 | 旧一篇: ASP模板技术

/************ 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>&nbsp;</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...)|编辑

新一篇: 用PHP实现分页功能 | 旧一篇: ASP模板技术

评论

#大鹏 发表于2005-04-07 09:22:00  IP: 202.110.225.*
有实际意义吗?
#WDSF 发表于2005-04-12 08:27:00  IP: 202.110.225.*
我觉得很不错,收藏
#清风 发表于2005-04-18 09:02:00  IP: 202.110.225.*
请问楼主,你这个模板类怎样才能在JSP里也能使用
#枫叶 发表于2006-10-27 17:49:00  IP: 222.92.109.*
我按例子写了一遍 怎么运行不起来呀???
#伍子 发表于2006-11-03 07:46:00  IP: 222.173.113.*
可否把你的错误描述的更为详细一些
#badonly 发表于2008-03-11 16:33:32  IP: 60.177.235.*
原来模板技术是这样的!!!谢了~~~
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 伍子