目前功能已经全部完成了,暂定名字为ayada.
Ayada是一个java版的模板引擎, 支持jstl语法, 支持el表达式. 支持自定义标签.
1. 基本使用
// webapp代表应用根目录
// 如果页面使用了t:include指令, 则根目录必须指定
// TemplateContext对模板进行管理, 默认情况下模板在修改5分钟之后重新编译,
// 因此TemplateContext对象在应用中应该是单粒.
TemplateContext templateContext = new TemplateContext("webapp");
Template template = templateContext.getTemplate("/user/userList.tml");
StringWriter writer = new StringWriter();
PageContext pageContext = JspFactory.getPageContext(writer);
List
userList = UserHandler.getUserList(16);
pageContext.setAttribute("userList", userList);
DefaultExecutor.execute(template, pageContext);
System.out.println(writer.toString());
2. 自定义标签
在classes目录下建taglib.tld文件, 内容如下:
## ---- compile tag ----
t:taglib com.skin.ayada.jstl.core.LibTag
## ---- jstl.core ----
## default tag support
c:if com.skin.ayada.jstl.core.IfTag
c:set com.skin.ayada.jstl.core.SetTag
c:out com.skin.ayada.jstl.core.OutTag
c:each com.skin.ayada.jstl.core.ForEachTag
c:forEach com.skin.ayada.jstl.core.ForEachTag
c:choose com.skin.ayada.jstl.core.ChooseTag
c:when com.skin.ayada.jstl.core.WhenTag
c:otherwise com.skin.ayada.jstl.core.OtherwiseTag
c:comment com.skin.ayada.jstl.core.CommentTag按照该格式添加自定义标签即可.
自定义标签支持两种引入方式.
全局引入: 在taglib.tld文件中定义的都是全局标签
局部引入: 在页面中引入, 使用
局部引入的方式要求必须全局引入t:taglib(t:taglib可以在taglib.tld文件中修改为其他名字)
建议使用全局引入的方式.
3. el表达式
el表达式解析采用的是ognl, ognl在对不存在的对象进行解析的时候会抛异常, 为了避免在页面中有过多的null检查
因此对这种异常进行了屏蔽, 屏蔽的方式请参看ExpressionContext:
// 此处覆盖了OgnlContext的get方法
@Override
public Object get(Object key)
{
Object value = this.pageContext.getAttribute(key.toString());
// 如果此处拿到的对象为空, 则返回一个空的Map对象
if(value == null)
{
return new HashMap();
}
return value;
}
4. 模板页面示例
------------------------------------------------------------
testc:cout test
c:if test
1 == 1
c:each test
${varValue}
my:hello test
新添加了filter支持,这样不需要把模板渲染的代码写到servlet了,只需要配置一个filter即可
TemplateFilter
com.skin.ayada.filter.TemplateFilter
home
/template
TemplateFilter
/template/*
FORWARD
servlet示例
public class HelloServlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
List userList = null; // userManager.getUserList();
request.setAttribute("userList", userList);
// forward之后会被TemplateFilter拦截进行模板渲染
request.getRequestDispatcher("/template/user/userList.html").forward(request, response);
}
}
下载地址: https://code.google.com/p/ayada/