`
allskystar
  • 浏览: 4468 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

smarty4j的一些新特性

阅读更多
项目地址:http://ordinary.googlecode.com
以下功能均是与标准smarty manual的不同之处,不影响原有的使用

1.扩展的break,continue函数,加上参数允许指定跳出多少层,在不特别指定的情况下只跳出一层,如
{foreach from=$values item="item" key="key"}
  {$key}:{$item}
  {if $key>10}{break}{/if}
{/foreach}

当values是Map时,{$key}表示键值;当values是List时,{$key}表示序号,从0开始,在有多层循环的时候,可以使用{break 2}跳出2层循环

2.扩展的assign函数,支持delimiter参数,可以直接定义一个数组,delimiter表示分隔符,例如
{assign var="list" values="1,2,3,4,5,6" delimiter=","}


3.扩展的bytes函数,允许向字节流中输出一个变量,使用时,必须merge的参数是OutputStream,否则会失败,一般用于向Socket进行特殊输出。例如
{bytes $array}


4.扩展的date_format函数,支持将long,date或者字符串代表的日期转换成标准日期类型,对于字符串日期,使用from参数定义输入字符串的格式,使用to参数定义输出字符串的格式,格式代表的意义参见jdk中java.text.SimpleDateFormat类的说明,使用locale与timezone参数指定国别与时区,例如
{date_format date="2008/12/12" from="yyyy/MM/dd" to="MM/dd/yyyy"}


5.扩展的macro函数,与include不同的是,macro表示直接在当前位置展开一段smarty语法的文本,这段文本本身可以是不完整的smarty语法

6.扩展的b2s变量调节器,能将一个字节数组变为字符串,例如
{$barray|b2s}


7.扩展的truncate变量调节器,在截取字符时,会换算非ASCII字符,一个非ASCII字符长度计算为两个ASCII字符

8.扩展的block函数,用于优化,smarty4j在编译过程中,会自动优化被多次出现的变量,前提是这一个区块中没有出现数据的回写操作,例如一个区块中有assign函数,这个区块就不会优化,默认情况下整个文档是一个最大的区块,如果反复出现对一个变量的操作,例如
...
{$items.data[0]}
...
{$items.data[1]}
...
{$items.data[2]}
...

可以写为
{assign var="data" values=$items.data}
{block}
...
{$data[0]}
...
{$data[1]}
...
{$data[2]}
...
{/block}

这样可以将后面的操作人为的划分出一个区块,而这个区块内没有回写数据进入容器的操作,$data变量将进行缓存,性能会有明显的提升

9.高速的条件短路算法,在实现短路算法时,smarty4j引擎会自动计算哪些代码块是可以越过的,加快条件判断的执行速度

10.允许重新定义左右边界符,例如重定义为<!--与-->,这样,smarty4j的代码不会影响整个文档在浏览器中的阅读效果,使用Engine.setLeftDelimiter与Engine.setRightDelimiter方法可以重新设置,之后使用
<!--foreach from=$values item="item"-->
...
<!--/foreach-->
即可

11.新增行函数,继承org.lilystudio.smarty4j.statement.AbstractLineFunction;新增区块函数,继承org.lilystudio.smarty4j.statement.AbstractBlockFunction;新增变量调节器,继承org.lilystudio.smarty4j.statement.AbstractCustomModifier;都是通过设置parameter这个属性来定义默认的参数格式
单行函数的例子:
public class $repeat extends AbstractLineFunction {
  @SuppressWarnings("unused")
  private static Parameter[] parameters = {
      new Parameter("value", Parameter.STROBJECT), // 第一个参数名字叫value,是一个字符串对象
      new Parameter("count", Parameter.INTOBJECT) }; // 第二个参数名字叫count,是一个整数对象

  @Override
  public void execute(Context context, Writer writer, Object[] values) //values就是参数表
      throws Exception {
    StringBuilder s = new StringBuilder();
    String value = (String) values[0]; // 参数value
    int count = (Integer) values[1]; // 参数count
    for (int i = 0; i < count; i++) {
      s.append(value);
    }
    writer.write(s.toString());
  }

  @Override
  public boolean isSimpleNode() {
    return true;
  }
}

{repeat value=$text count=3}
即可以调用
区块函数的例子:
public class $strip extends AbstractBlockFunction {

  @Override
  public Writer start(Context context, Writer writer, Object[] values) {
    return new StringWriter();
  }

  @Override
  public void end(Context context, Writer writer, Object[] values,
      Writer childWriter) throws Exception {
    StringBuilder buffer = new StringBuilder();
    String text = childWriter.toString();
    int len = text.length();
    int start = 0;
    out: while (true) {
      while (true) {
        if (start >= len) {
          break out;
        }
        char c = text.charAt(start);
        if (!Character.isWhitespace(c)) {
          break;
        }
        start++;
      }
      int i = text.indexOf('\n', start);
      if (i < 0) {
        break;
      }
      int end = i - 1;
      while (true) {
        char c = text.charAt(end);
        if (!Character.isWhitespace(c)) {
          buffer.append(text.substring(start, end + 1));
          start = i;
          break;
        }
        end--;
      }
    }
    buffer.append(text.substring(start));
    writer.write(buffer.toString());
  }
}
其中start的返回值是表示区块内部的处理使用的Writer对象,这里生成了一个新的StringWriter来拦截中间的输出,这个对象稍后会在end中被访问,即childWriter这个值。
变量调节器的例子:
public class $cat extends AbstractCustomModifier {

  @SuppressWarnings("unused")
  private static Object[] parameters = { "" }; // 第一个参数是字符串类型,默认是空字符串

  @Override
  protected Object execute(Object var, Object[] values) {
    if (((String) values[0]).length() > 0) {
      return var.toString() + values[0];
    } else {
      return var.toString();
    }
  }
}

{"Psychics predict world didn't end"|cat:" yesterday."}
即可使用
需要注意的是,默认的函数都应该位于org.lilystudio.smarty4j.statement.function包下,以$开头;默认的变量调节器都应该位于org.lilystudio.smarty4j.statement.modifier包下,同样以$开头。需要自定义包的位置,参见Engine内的说明
分享到:
评论
4 楼 crackfan 2009-05-13  
Smarty4J 网上资源好少啊!希望老大出一些和框架结合的例子
3 楼 dancewhyw 2008-12-22  
牛人啊 关注你的东西 支持一下
很期待 php与java开发时候代沟减少 能保持开发习惯的一致性真是不错啊
2 楼 allskystar 2008-12-17  
fnet 写道
smarty? 好熟悉的语法,难道是PHP的Smarty的java版?


是的,语法是一致的,整体上有差别的地方上文都列出来了
1 楼 fnet 2008-12-17  
smarty? 好熟悉的语法,难道是PHP的Smarty的java版?

相关推荐

    springmvc4+smarty4j 实例

    整合了springmvc4 smarty4j的小例子

    smarty4j jar包

    smarty4j jar包

    smarty4j (Java模板引擎) v1.0.0.rar

    smarty4j将文本解析成语法树,然后根据语法树生成Java Code的字节码,相当于一个基于JVM的smarty语法的编译器。语法树的生成采用左序遍历的方式依次生成,大致的语法结点包含语句与表达式两大基本类型,语句结点能...

    smarty4j (Java模板引擎) v1.0.0

    smarty4j将文本解析成语法树,然后根据语法树生成Java Code的字节码,相当于一个基于JVM的smarty语法的编译器。语法树的生成采用左序遍历的方式依次生成,大致的语法结点包含语句与表达式两大基本类型,语句结点能...

    Smarty4j 源码

    Smarty4j的源码,网上下载下来的因为jdk版本是jdk1.5,同时也缺失部分jar包,所以下载下来并不能使用,这个是我整理后的切实可用的版本。 jdk版本为jdk1.6,运行环境为MyEclipse8.5

    smarty3.0,smarty最新版本

    smarty3.0,smarty最新版本

    5分钟搞定smarty

    5分钟搞定smarty5分钟搞定smarty

    Smarty最新版下载自Smarty官网

    Smarty最新版官网,Smarty最新版下载自Smarty官网

    smarty4j (Java模板引擎)源代码

    smarty4j是一个smarty for java的模板引擎,该引擎是将... smarty4j将文本解析成语法树,然后根据语法树生成Java Code的字节码,相当于一个基于JVM的smarty语法的编译器。语法树的生成采用左序遍历的方式依次生成,

    smarty4jDemo

    smarty4j与Struts2结合使用,网上这方面的资料比较少,特别是在Struts2的Action中页面数据传递是个问题,这个demo很好的完成了Strust2中调用smarty4j。

    Smarty

    Smarty Smarty Smarty

    smarty最新版3.1.16

    最新版的smarty不需要自己指定templates文件夹,模板文件可以放在当前目录下,也可以放在templates文件下,也不需要指定templates_c文件夹,会自动生成。

    smarty 模板最新 手册 最新版本下载

    smarty 模板最新 手册 最新版本下载smarty 模板最新 手册 最新版本下载smarty 模板最新 手册 最新版本下载

    Php Smarty 中文版手册 最新版

    Php Smarty 中文版手册 最新版

    最新版smarty类库

    最新的smarty类库文件,是一个压缩包,下载后解压就能用

    最新版smarty插件

    最新版的smarty。Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。

    最新smarty3中文手册

    2013 最新 smarty3 中文手册 帮助教程

    smarty安装与入门

    (1) 我在根目录下建立了新的目录learn/,再在learn/里建立一个目录smarty/。将刚才解压缩出来的目录的libs/拷贝到smarty/里,再在smarty/里新建templates目录,templates里新建cache/,templates/,templates_c/, ...

    Smarty-3.1.21 最新发布版本

    Smarty-3.1.21 最新发布版本

    smarty最新手册 smarty中英文结合版

    中文版和中英文结合版smarty中英文结合版

Global site tag (gtag.js) - Google Analytics