文档章节

JAVA模板技术

完美世界
 完美世界
发布于 2014/06/05 17:01
字数 999
阅读 249
收藏 0
点赞 0
评论 0
/************
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);
  }
}


© 著作权归作者所有

共有 人打赏支持
完美世界
粉丝 10
博文 149
码字总数 134011
作品 0
西城
高级程序员
Java序列化技术即将被废除!!!

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据...

Java技术栈 ⋅ 05/30 ⋅ 0

基于 Spring Boot 的字段元数据管理 - fieldmeta

fieldmeta: 基于springboot的字段元数据管理 version:Alpha 0.0.1 ,码云地址:https://gitee.com/klguang/fieldmeta 元数据(Metadata), 又称中介数据、中继数据,为描述数据的数据(dat...

klguang ⋅ 06/15 ⋅ 0

java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机 ⋅ 05/16 ⋅ 0

Spring之jdbc Template实现CRUD操作

Spring为各种持久化技术都提供了简单操作的模板回调。比如jdbc、hibernate、Mybatis以及JPA等。 这里我们就以JDBC为例,看看JDBC template怎么实现CRUD操作。 JdbcTemplate主要提供以下几类方...

Java攻城玩家 ⋅ 05/31 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Java开发学习之三版本简介 java编程

  Java编程语言,在更迭迅速的互联网领域多年屹立不倒,足以得见Java这门语言旺盛的生命力,因此,会有很多想要进入互联网领域的朋友,想要学Java来转行开发。但是,所谓“隔行如隔山”,j...

老男孩Linux培训 ⋅ 06/05 ⋅ 0

java编程新手入门学习的基础语法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/28 ⋅ 0

燃!Java全球标准中国人参与制定,阿里成首个受邀中国公司

2018年5月17日,作为唯一中国代表,阿里巴巴获邀加入Java全球管理组织Java Community Process (JCP)的最高执行委员会。此次获得执行委员会席位,让中国企业首次加入到Java全球标准的制定中,...

技术小能手 ⋅ 05/17 ⋅ 0

阿里获邀加入 JCP ,参与制定 Java 全球标准和技术规范

2018年5月17日,作为唯一中国代表,阿里巴巴获邀加入 Java 全球管理组织 Java Community Process (JCP) 的最高执行委员会。此次获得执行委员会席位,让中国企业首次加入到 Java 全球标准的制...

王练 ⋅ 05/17 ⋅ 5

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

apollo配置中心的学习笔记

公司现在配置文件太多了,导致配置文件修改起来还是非常麻烦的。在boss(业务运营支撑系统)中,配置文件是存放在jar包的,通过应用jar包来引用配置文件(区分不同环境)。这种方式虽然能够满足...

miaojiangmin ⋅ 3分钟前 ⋅ 0

Jena增删改查AP

插入、更新数据 public static void insert(){ String query = "PREFIX book: <http://www.book.com/jinyong/> \n" + " INSERT DATA \n" + ......

Vincent-Duan ⋅ 4分钟前 ⋅ 0

springMVC之与json数据交互方法

因为我也要返回json数据。所以需要这个注解@ResponseBody,把Java对象转换成json字符串 注意: 1、@RequestBody不能省,因为前台发过来的数据是json数据,得用这个注解去解析该怎么接收这些数...

颖伙虫 ⋅ 7分钟前 ⋅ 0

用实例域代替序号(31)

1、许多枚举天生就与一个单独的int 值相关联 ordinal 方法,返回枚举常量在类型中的数字位置 下述,枚举修改很不方便,不好维护 永远不要根据枚举的序数导出与他相关联的值 而是将他保存在一...

职业搬砖20年 ⋅ 9分钟前 ⋅ 0

并发编程---ConcurrentHashMap源码解析

ConcurrentHashMap是java中为了解决HashMap不能支持高并发而设计的新的实现。 ConcurrentHashMap的类结构 public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements C......

千古一梦888 ⋅ 12分钟前 ⋅ 0

微服务 WildFly Swarm 简介

我们将看到的最后一个Java微服务框架是一个相对较新的场景,它利用了 JBoss WildFly 应用服务器中已试过且受信任的 JavaEE 功能。WildFly Swarm 是 WildFly 应用服务器的一个完整的拆下来的组...

woshixin ⋅ 17分钟前 ⋅ 0

android apk 瘦身

头条APK瘦身之路 随着版本迭代,功能增加安装包体积也会慢慢增大。 今日头条576版本APK达到了25M,通过一系列的优化,到目前的607版本为12M。本文主要是介绍头条APK瘦身中用到的一些方法。 ...

GoldenVein ⋅ 21分钟前 ⋅ 1

mac机器学习开发环境部署及helloworld

一、下载并安装Anaconda2.7 https://repo.anaconda.com/archive/Anaconda2-5.2.0-MacOSX-x86_64.pkg 路径:/Users/shijun/anaconda2 二、运行Anaconda Navigator -> Environments -> base(ro......

八戒八戒八戒 ⋅ 32分钟前 ⋅ 0

关于日常开发的经验总结(Java),持续更新中

常量尽量使用枚举来表示,这样表现力会很强,因为枚举比一个常量类要有更多的扩展性 方法的入参和出参尽量不要使用Map,因为Map会让调用者感到迷惑,他不知道你里面装的什么,面向对象的开发...

小99 ⋅ 32分钟前 ⋅ 0

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 33分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部