- 浏览: 6006 次
- 性别:
- 来自: 北京
最新评论
-
chenlei65368:
mycom<div class="quote_ ...
使用Beetl实现静态页生成 -
javamonkey:
非常好的建议啊,可以让GroupTempl注册一个特殊的类,此 ...
使用Beetl实现静态页生成
使用Beetl 1.1实现静态页的生成。
使用struts1.2
首先在Lisener中设置ServletGroupTemplate相关配置。
模版文件位于WEB-INF/template下
Action类,其中模拟了一些数据,输出路径为跟路径,文件名为index.html
模版文件:index.html
web.xml中的配置
由于要对显示的字符串进行截取,定义了两个函数:
生成结果:index.html
感觉自定义函数功能不错,但是也麻烦了些,两个函数就要写两个类。
如果能归类就好了,比如对字符串的操作,一个自定义函数中不同的方法就可以搞定。
使用struts1.2
首先在Lisener中设置ServletGroupTemplate相关配置。
模版文件位于WEB-INF/template下
public class InitLisener implements ServletContextListener{ static Log log = LogFactory.getLog(InitLisener.class); public void contextDestroyed(ServletContextEvent arg0) { ActionServletContext.destroyed(); } public void contextInitialized(ServletContextEvent event) { log.info("加载资源文件"); ServletContext context = event.getServletContext(); String configPath = context.getRealPath("//"); ServletGroupTemplate.intance().init(context); ServletGroupTemplate.intance().getGroup().config("<!--:", "-->", "${", "}"); ServletGroupTemplate.intance().getGroup().setCharset("UTF-8"); ServletGroupTemplate.intance().getGroup().registerFunction("fn.substring",new SubStringFunction()); ServletGroupTemplate.intance().getGroup().registerFunction("fn.length",new LengthFunction()); //context.setAttribute("templatepath", context.getRealPath("WEB-INF/template")); System.out.println(context.getRealPath("WEB-INF/template")); ActionServletContext.setServletContext(context); //PropertiesUtil.loadConfig(); } }
Action类,其中模拟了一些数据,输出路径为跟路径,文件名为index.html
public class StaticPageAction extends Action { /* * Generated Methods */ /** * Method execute * * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { PrintWriter pWriter = null; ActionForward forward = new ActionForward(); response.setCharacterEncoding("UTF-8"); String templatePath = (String) ActionServletContext.getServletContext() .getAttribute("templatepath"); String rootpath = ActionServletContext.getServletContext().getRealPath( "/"); rootpath = rootpath + "/index.html"; List<Channel> channelList = getNewsData(); try { pWriter = response.getWriter(); Template template = ServletGroupTemplate.intance().getTemplate( "/index.html", request, response); template.set("channelList", channelList); template.set("user", "chenlei"); template.set("Chal", new Channel(1, "栏目test", "栏目说明", 0, 10, 30)); StringWriter writer = new StringWriter(); template.getText(writer); // false为从文件开始处写入 OutputStreamWriter outWriter = new OutputStreamWriter( new FileOutputStream(rootpath, false), "UTF-8"); System.out.println(writer.toString()); Writer out = new BufferedWriter(outWriter); out.write(writer.toString()); out.flush(); out.close(); pWriter.print("输出首页成功!<a href='index.jsp'>返回</>"); } catch (IOException e) { pWriter.print("输出首页失败!"); } catch (BeeException e) { // e.printStackTrace(); } return null; } private List<Channel> getNewsData() { List<Channel> newList = new ArrayList<Channel>(20); for (int i = 1; i <= 10; i++) { Channel chnnel = new Channel(i, "栏目" + i, "栏目说明" + i, 0, 10, 30); for (int j = 1; j <= 11; j++) { News news = new News( j + i, "新闻消息" + j + i, "新华社消息: 控制语句占位符号是/<!--: ,这样,尽可能然模板少破坏原有文件,你可以通过浏览器直接浏览模板文件", new Date(), "chnnal/news/" + j + i + "html"); news.setChannelId(i); news.setChannelTitle(chnnel.getChnnelTitle()); chnnel.addNewsList(news); } newList.add(chnnel); } return newList; } }
模版文件:index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Index.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <!--:if(user!=null){ --> 你好!${user}<br> ${Chal.chnnelTitle} ${channelList.~size} <!--:} --> 栏目列表 <div> <!--: if(channelList.~size!=0){ for(Channel in channelList){ --> <span style="color:red;">${Channel.chnnelTitle}</span> <ul> <!--: for(News in Channel.newsList){--> <li>[<!--:if(fn.length(News.channelTitle)>2){ -->${fn.substring(News.channelTitle,0,2)}…<!--: }else{ -->${News.channelTitle} <!--:} -->]-${News.title}---[${News.newdate,dateFormat='yyyy-MM-dd'}]</li> <!--: } --> </ul> <!--: } }else { --> <span style="color:red;">没有数据</span> <!--:} --> </div> </body> </html>
web.xml中的配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <listener> <listener-class>com.otos.cl.common.listerner.InitLisener</listener-class> </listener> <context-param> <param-name>GroupTemplate.Root</param-name> <param-value>/WEB-INF/template</param-value> </context-param> <context-param> <param-name>GroupTemplate.Optimize</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>GroupTemplate.NativeCall</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>GroupTemplate.Check</param-name> <param-value>2</param-value> </context-param> <filter> <filter-name>encode</filter-name> <filter-class>com.otos.cl.common.filter.FilterEncoding</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encode</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>act</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>act</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
由于要对显示的字符串进行截取,定义了两个函数:
/** * 用于在模版中截取字符串长度的函数 * * @author chenl * */ public class SubStringFunction implements Function { public Object call(Object[] objects, Context ctx) { String parentStr = ""; Integer start = 0; Integer end = 0; Object str = objects[0]; if (str == null) { return ""; } else { parentStr = String.valueOf(str); } Object startindex = objects[1]; if (startindex == null) { return ""; } else { start = Integer.valueOf(startindex.toString()); } if (objects.length >= 3) { Object endindex = objects[2]; if (endindex != null) { end = Integer.valueOf(endindex.toString()); } } if (start < 0 || end < 0) { throw new IllegalStateException("SubString函数中参数startindex和endindex不能小于0"); } int length = parentStr.length(); if (length == 1) { return parentStr; } else { if (end == 0) parentStr = parentStr.substring(start); else parentStr = parentStr.substring(start, end); } return parentStr; } }
/** * Beetl自定义函数 * @author chenl * */ public class LengthFunction implements Function { public Object call(Object[] arg0, Context arg1) { int length = 0; if(arg0.length==1){ Object obj = arg0[0]; if(obj instanceof String) { length = ((String) obj).length(); }else if(obj instanceof Integer){ length = ((String) obj).length(); }else if(obj instanceof Double){ length = ((String) obj).length(); }else if(obj instanceof Float){ length = ((String) obj).length(); }else{ throw new IllegalStateException("参数不正确"); } }else{ throw new IllegalStateException("参数不正确"); } return length; } }
生成结果:index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Index.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 你好!chenlei<br> 栏目test 10 栏目 <div> <span style="color:red;">栏目1</span> <ul> <li>[栏目…]-新闻消息11---[2012-05-07]</li> <li>[栏目…]-新闻消息21---[2012-05-07]</li> <li>[栏目…]-新闻消息31---[2012-05-07]</li> <li>[栏目…]-新闻消息41---[2012-05-07]</li> <li>[栏目…]-新闻消息51---[2012-05-07]</li> <li>[栏目…]-新闻消息61---[2012-05-07]</li> <li>[栏目…]-新闻消息71---[2012-05-07]</li> <li>[栏目…]-新闻消息81---[2012-05-07]</li> <li>[栏目…]-新闻消息91---[2012-05-07]</li> <li>[栏目…]-新闻消息101---[2012-05-07]</li> <li>[栏目…]-新闻消息111---[2012-05-07]</li> </ul> <span style="color:red;">栏目2</span> <ul> <li>[栏目…]-新闻消息12---[2012-05-07]</li> <li>[栏目…]-新闻消息22---[2012-05-07]</li> <li>[栏目…]-新闻消息32---[2012-05-07]</li> <li>[栏目…]-新闻消息42---[2012-05-07]</li> <li>[栏目…]-新闻消息52---[2012-05-07]</li> <li>[栏目…]-新闻消息62---[2012-05-07]</li> <li>[栏目…]-新闻消息72---[2012-05-07]</li> <li>[栏目…]-新闻消息82---[2012-05-07]</li> <li>[栏目…]-新闻消息92---[2012-05-07]</li> <li>[栏目…]-新闻消息102---[2012-05-07]</li> <li>[栏目…]-新闻消息112---[2012-05-07]</li> </ul> <span style="color:red;">栏目3</span> <ul> <li>[栏目…]-新闻消息13---[2012-05-07]</li> <li>[栏目…]-新闻消息23---[2012-05-07]</li> <li>[栏目…]-新闻消息33---[2012-05-07]</li> <li>[栏目…]-新闻消息43---[2012-05-07]</li> <li>[栏目…]-新闻消息53---[2012-05-07]</li> <li>[栏目…]-新闻消息63---[2012-05-07]</li> <li>[栏目…]-新闻消息73---[2012-05-07]</li> <li>[栏目…]-新闻消息83---[2012-05-07]</li> <li>[栏目…]-新闻消息93---[2012-05-07]</li> <li>[栏目…]-新闻消息103---[2012-05-07]</li> <li>[栏目…]-新闻消息113---[2012-05-07]</li> </ul> <span style="color:red;">栏目4</span> <ul> <li>[栏目…]-新闻消息14---[2012-05-07]</li> <li>[栏目…]-新闻消息24---[2012-05-07]</li> <li>[栏目…]-新闻消息34---[2012-05-07]</li> <li>[栏目…]-新闻消息44---[2012-05-07]</li> <li>[栏目…]-新闻消息54---[2012-05-07]</li> <li>[栏目…]-新闻消息64---[2012-05-07]</li> <li>[栏目…]-新闻消息74---[2012-05-07]</li> <li>[栏目…]-新闻消息84---[2012-05-07]</li> <li>[栏目…]-新闻消息94---[2012-05-07]</li> <li>[栏目…]-新闻消息104---[2012-05-07]</li> <li>[栏目…]-新闻消息114---[2012-05-07]</li> </ul> <span style="color:red;">栏目5</span> <ul> <li>[栏目…]-新闻消息15---[2012-05-07]</li> <li>[栏目…]-新闻消息25---[2012-05-07]</li> <li>[栏目…]-新闻消息35---[2012-05-07]</li> <li>[栏目…]-新闻消息45---[2012-05-07]</li> <li>[栏目…]-新闻消息55---[2012-05-07]</li> <li>[栏目…]-新闻消息65---[2012-05-07]</li> <li>[栏目…]-新闻消息75---[2012-05-07]</li> <li>[栏目…]-新闻消息85---[2012-05-07]</li> <li>[栏目…]-新闻消息95---[2012-05-07]</li> <li>[栏目…]-新闻消息105---[2012-05-07]</li> <li>[栏目…]-新闻消息115---[2012-05-07]</li> </ul> <span style="color:red;">栏目6</span> <ul> <li>[栏目…]-新闻消息16---[2012-05-07]</li> <li>[栏目…]-新闻消息26---[2012-05-07]</li> <li>[栏目…]-新闻消息36---[2012-05-07]</li> <li>[栏目…]-新闻消息46---[2012-05-07]</li> <li>[栏目…]-新闻消息56---[2012-05-07]</li> <li>[栏目…]-新闻消息66---[2012-05-07]</li> <li>[栏目…]-新闻消息76---[2012-05-07]</li> <li>[栏目…]-新闻消息86---[2012-05-07]</li> <li>[栏目…]-新闻消息96---[2012-05-07]</li> <li>[栏目…]-新闻消息106---[2012-05-07]</li> <li>[栏目…]-新闻消息116---[2012-05-07]</li> </ul> <span style="color:red;">栏目7</span> <ul> <li>[栏目…]-新闻消息17---[2012-05-07]</li> <li>[栏目…]-新闻消息27---[2012-05-07]</li> <li>[栏目…]-新闻消息37---[2012-05-07]</li> <li>[栏目…]-新闻消息47---[2012-05-07]</li> <li>[栏目…]-新闻消息57---[2012-05-07]</li> <li>[栏目…]-新闻消息67---[2012-05-07]</li> <li>[栏目…]-新闻消息77---[2012-05-07]</li> <li>[栏目…]-新闻消息87---[2012-05-07]</li> <li>[栏目…]-新闻消息97---[2012-05-07]</li> <li>[栏目…]-新闻消息107---[2012-05-07]</li> <li>[栏目…]-新闻消息117---[2012-05-07]</li> </ul> <span style="color:red;">栏目8</span> <ul> <li>[栏目…]-新闻消息18---[2012-05-07]</li> <li>[栏目…]-新闻消息28---[2012-05-07]</li> <li>[栏目…]-新闻消息38---[2012-05-07]</li> <li>[栏目…]-新闻消息48---[2012-05-07]</li> <li>[栏目…]-新闻消息58---[2012-05-07]</li> <li>[栏目…]-新闻消息68---[2012-05-07]</li> <li>[栏目…]-新闻消息78---[2012-05-07]</li> <li>[栏目…]-新闻消息88---[2012-05-07]</li> <li>[栏目…]-新闻消息98---[2012-05-07]</li> <li>[栏目…]-新闻消息108---[2012-05-07]</li> <li>[栏目…]-新闻消息118---[2012-05-07]</li> </ul> <span style="color:red;">栏目9</span> <ul> <li>[栏目…]-新闻消息19---[2012-05-07]</li> <li>[栏目…]-新闻消息29---[2012-05-07]</li> <li>[栏目…]-新闻消息39---[2012-05-07]</li> <li>[栏目…]-新闻消息49---[2012-05-07]</li> <li>[栏目…]-新闻消息59---[2012-05-07]</li> <li>[栏目…]-新闻消息69---[2012-05-07]</li> <li>[栏目…]-新闻消息79---[2012-05-07]</li> <li>[栏目…]-新闻消息89---[2012-05-07]</li> <li>[栏目…]-新闻消息99---[2012-05-07]</li> <li>[栏目…]-新闻消息109---[2012-05-07]</li> <li>[栏目…]-新闻消息119---[2012-05-07]</li> </ul> <span style="color:red;">栏目10</span> <ul> <li>[栏目…]-新闻消息110---[2012-05-07]</li> <li>[栏目…]-新闻消息210---[2012-05-07]</li> <li>[栏目…]-新闻消息310---[2012-05-07]</li> <li>[栏目…]-新闻消息410---[2012-05-07]</li> <li>[栏目…]-新闻消息510---[2012-05-07]</li> <li>[栏目…]-新闻消息610---[2012-05-07]</li> <li>[栏目…]-新闻消息710---[2012-05-07]</li> <li>[栏目…]-新闻消息810---[2012-05-07]</li> <li>[栏目…]-新闻消息910---[2012-05-07]</li> <li>[栏目…]-新闻消息1010---[2012-05-07]</li> <li>[栏目…]-新闻消息1110---[2012-05-07]</li> </ul> </div> </body> </html>
感觉自定义函数功能不错,但是也麻烦了些,两个函数就要写两个类。
如果能归类就好了,比如对字符串的操作,一个自定义函数中不同的方法就可以搞定。
评论
2 楼
chenlei65368
2012-05-18
mycom
这样不错
javamonkey 写道
非常好的建议啊,可以让GroupTempl注册一个特殊的类,此类实现FunctionPackage接口
class myStringsFunction implments FunctionPackage
{
@Override
public String getPackageName(){
return "mycom.string"
}
public string substring(String str,int,int,Context ctx){........}
public int lenght(String str,Context ctx){...........}
}
然后,GroupTemplate.registerFunctionPackage(new myStringsFunction() )
这样,就可以在模板里使用
${mycom.string.substring("abcddd",1,4)}
你觉得怎么样?
class myStringsFunction implments FunctionPackage
{
@Override
public String getPackageName(){
return "mycom.string"
}
public string substring(String str,int,int,Context ctx){........}
public int lenght(String str,Context ctx){...........}
}
然后,GroupTemplate.registerFunctionPackage(new myStringsFunction() )
这样,就可以在模板里使用
${mycom.string.substring("abcddd",1,4)}
你觉得怎么样?
这样不错
1 楼
javamonkey
2012-05-18
非常好的建议啊,可以让GroupTempl注册一个特殊的类,此类实现FunctionPackage接口
class myStringsFunction implments FunctionPackage
{
@Override
public String getPackageName(){
return "mycom.string"
}
public string substring(String str,int,int,Context ctx){........}
public int lenght(String str,Context ctx){...........}
}
然后,GroupTemplate.registerFunctionPackage(new myStringsFunction() )
这样,就可以在模板里使用
${mycom.string.substring("abcddd",1,4)}
你觉得怎么样?
class myStringsFunction implments FunctionPackage
{
@Override
public String getPackageName(){
return "mycom.string"
}
public string substring(String str,int,int,Context ctx){........}
public int lenght(String str,Context ctx){...........}
}
然后,GroupTemplate.registerFunctionPackage(new myStringsFunction() )
这样,就可以在模板里使用
${mycom.string.substring("abcddd",1,4)}
你觉得怎么样?
相关推荐
Beetl是一款强大的Java模板引擎,它主要用于动态页面和静态页面的生成,以及代码、XML、PDF、WORD等格式的生成。在Web开发中,模板引擎是连接后端逻辑和前端展示的重要工具,它允许开发者将业务逻辑和视图分离,提高...
- 微观层面,通过一维数组保存上下文、静态文本合并处理、重复使用字节数组来避免Java频繁创建和销毁数组、模板缓存和运行时优化等。 ### 独特功能 1. **自定义占位符和控制语句起始符号:** 这些功能可以减小...
而Beetl则是一款强大的、高性能的模板引擎,能够帮助开发者将动态数据与静态HTML模板结合,生成最终的网页。 首先,让我们了解Beetl的基本概念。Beetl设计的目标是简洁、高效和易用,它的语法接近自然语言,使得...
为您提供Beetl模板引擎下载,Beetl相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下:1、功能完备:同主流的java模板引擎相比...
在CicadasCMS中,Beetl负责页面渲染,允许开发者使用强大的模板语言来创建动态网页,同时支持自定义标签库,使得模板更加灵活和模块化。 关于自定义内容模型,CicadasCMS允许用户根据需求定义不同的数据结构,例如...
Java模板语言Beetl是一个强大的、高效的、易用的模板引擎,主要应用于Web开发中,用于将静态HTML模板与动态数据结合,生成最终的HTML页面。这个压缩包包含的是一系列基于Java实现的Beetl模板语言实例源码,帮助...
同时,由于其良好的扩展性和灵活性,Beetl也常被用于生成静态文件、邮件内容、报表等多种场景。 总的来说,Beetl作为Java的一种高效模板语言,以其简洁的语法、强大的功能和优秀的性能,为Java开发者提供了便捷的...
- **模板语言**: 模板语言是用于生成动态HTML或其他格式文档的一种编程语言,它允许开发者将静态内容与动态数据相结合。 - **Beetl语法**: Beetl语法简洁且接近Java,支持表达式、控制结构(如if/else、for循环)...
Beetl还具有局部渲染技术,结合现代JavaScript的ajax技术,可以在Web应用中实现动态内容的异步加载和更新。Beetl适合用于各种模板应用,包括代码生成工具、CMS系统、普通网站、超高访问量的门户系统,以及与富客户端...
- **文档生成**:在生成报表、PDF、Excel等静态文档时,Beetl也能发挥重要作用。 5. **优化与性能** - **预编译**:预编译模板可以显著提升运行效率,减少解析时间。 - **模板缓存**:对经常使用的模板进行缓存...
模板引擎的主要任务是将静态模板与动态数据结合,生成最终的HTML或其他格式的输出。Beetl的设计理念是尽可能接近自然语言,让开发者编写模板时感觉更自然,减少学习成本。它的语法简洁,支持多种控制结构,如条件...
Beetl是一款强大的Java模板引擎,它为Java开发者提供了一种高效、简洁的方式来将静态模板与动态数据结合,生成HTML、XML、JSON等格式的输出。在Beetl v3.3.1版本中,我们可以期待一系列的改进和优化,以提升开发效率...
Beetl模板引擎是一款基于Java的模板引擎,用于生成静态网页的模板文件。.btl文件类型是Beetl模板引擎的默认文件类型,它包含了模板的定义和逻辑。 在Java项目中,使用Beetl模板引擎可以提高开发效率和质量。Beetl...
这个"矢量切片绘图Demo"项目是针对这一技术的一个实践应用,它利用SpringBoot框架和BeetlSQL数据库工具来实现动态生成和保存矢量切片。 首先,让我们深入了解一下矢量切片。矢量数据通常包含点、线和多边形等几何...
核心思想 5.1 分包 5.2 统一异常拦截 5.2.1 介绍 5.2.2 优点 5.2.3 关于性能 5.3 结果包装器 5.3.1 如何使用 5.3.2 ConstantFactory 5.4 前端思想 5.4.1 布局 5.4.2 标签 5.4.3 手动新增标签页 6. 常见问题答疑 6.1...
3. **模板引擎**:JFinal 集成了 Beetl 或 Freemarker 等模板引擎,用于渲染前端页面,实现动态数据展示。 4. **拦截器**:利用拦截器实现权限控制,比如只有登录用户才能访问某些页面或执行某些操作。 5. **插件...
- 在Beetl模板中,可以直接使用`ctxf`来构建URL,如`${ctxf}/myPage">我的页面</a>`,这将生成`我的页面</a>`的HTML代码。 - 如果需要添加更多的自定义变量,只需在`afterPropertiesSet()`方法中按照`sharedVars....
开发手册部分涵盖了Guns的核心技术点,包括对项目结构的理解、模块划分、包结构设计、数据库建表、代码生成、菜单添加与权限分配、业务代码编写、权限控制与校验、多数据源配置、分页技术、数据范围使用、guns-rest...
Freemarker 是一种基于模板的静态文本生成器,而 Beetl 则提供了一套更为丰富的语法和强大的功能,包括变量、控制结构、函数等。在实际应用中,我们可以通过配置 JFinal 的启动参数,来指定使用哪种模板引擎。例如,...
- **为何使用Beetl**:解释Guns选用Beetl作为模板引擎的原因。 - **为何有的业务没有Service层**:解答为何部分业务逻辑不使用Service层的原因。 - **为何既有DAO,又有Mapper**:解释Guns项目中DAO和Mapper层的区别...