Beetl实现静态页面生成

Springboot 集成Beetl模板 modelAndView.setViewName(访问的html页面路径) 阅读详情

使用Beetl实现静态页生成

使用Beetl 1.1 实现静态页的 生成。 
使用struts1.2 
首先在Lisener中设置ServletGroupTemplate相关配置。 
模版文件位于WEB-INF/template下 
  1. public class InitLisener implements ServletContextListener{  
  2.     static Log log = LogFactory.getLog(InitLisener.class);  
  3.       
  4.     public void contextDestroyed(ServletContextEvent arg0) {  
  5.         ActionServletContext.destroyed();  
  6.     }  
  7.   
  8.     public void contextInitialized(ServletContextEvent event) {  
  9.         log.info("加载资源文件");  
  10.         ServletContext context = event.getServletContext();  
  11.         String configPath = context.getRealPath("//");  
  12.         ServletGroupTemplate.intance().init(context);  
  13.         ServletGroupTemplate.intance().getGroup().config("<!--:", "-->", "${", "}");  
  14.         ServletGroupTemplate.intance().getGroup().setCharset("UTF-8");  
  15.         ServletGroupTemplate.intance().getGroup().registerFunction("fn.substring",new SubStringFunction());  
  16.         ServletGroupTemplate.intance().getGroup().registerFunction("fn.length",new LengthFunction());  
  17.           
  18.         //context.setAttribute("templatepath", context.getRealPath("WEB-INF/template"));  
  19.         System.out.println(context.getRealPath("WEB-INF/template"));  
  20.           
  21.         ActionServletContext.setServletContext(context);  
  22.         //PropertiesUtil.loadConfig();  
  23.     }  
  24.   
  25. }  


Action类,其中模拟了一些数据,输出路径为跟路径,文件名为index.html 
  1. public class StaticPageAction extends Action {  
  2.     /* 
  3.      * Generated Methods 
  4.      */  
  5.   
  6.     /** 
  7.      * Method execute 
  8.      *  
  9.      * @param mapping 
  10.      * @param form 
  11.      * @param request 
  12.      * @param response 
  13.      * @return ActionForward 
  14.      */  
  15.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  16.             HttpServletRequest request, HttpServletResponse response) {  
  17.         PrintWriter pWriter = null;  
  18.         ActionForward forward = new ActionForward();  
  19.         response.setCharacterEncoding("UTF-8");  
  20.           
  21.         String templatePath = (String) ActionServletContext.getServletContext()  
  22.                 .getAttribute("templatepath");  
  23.         String rootpath = ActionServletContext.getServletContext().getRealPath(  
  24.                 "/");  
  25.         rootpath = rootpath + "/index.html";  
  26.           
  27.         List<Channel> channelList = getNewsData();  
  28.         try {  
  29.             pWriter = response.getWriter();  
  30.             Template template = ServletGroupTemplate.intance().getTemplate(  
  31.                     "/index.html", request, response);  
  32.             template.set("channelList", channelList);  
  33.             template.set("user", "chenlei");  
  34.             template.set("Chal", new Channel(1, "栏目test", "栏目说明", 0, 10, 30));  
  35.   
  36.             StringWriter writer = new StringWriter();  
  37.             template.getText(writer);  
  38.             // false为从文件开始处写入  
  39.             OutputStreamWriter outWriter = new OutputStreamWriter(  
  40.                     new FileOutputStream(rootpath, false), "UTF-8");  
  41.             System.out.println(writer.toString());  
  42.   
  43.             Writer out = new BufferedWriter(outWriter);  
  44.             out.write(writer.toString());  
  45.             out.flush();  
  46.             out.close();  
  47.   
  48.             pWriter.print("输出首页成功!<a href='index.jsp'>返回</>");  
  49.         } catch (IOException e) {  
  50.             pWriter.print("输出首页失败!");  
  51.         } catch (BeeException e) {  
  52.             // e.printStackTrace();  
  53.         }  
  54.   
  55.         return null;  
  56.     }  
  57.   
  58.     private List<Channel> getNewsData() {  
  59.   
  60.         List<Channel> newList = new ArrayList<Channel>(20);  
  61.         for (int i = 1; i <= 10; i++) {  
  62.             Channel chnnel = new Channel(i, "栏目" + i, "栏目说明" + i, 0, 10, 30);  
  63.             for (int j = 1; j <= 11; j++) {  
  64.                 News news = new News(  
  65.                         j + i,  
  66.                         "新闻消息" + j + i,  
  67.                         "新华社消息: 控制语句占位符号是/<!--: ,这样,尽可能然模板少破坏原有文件,你可以通过浏览器直接浏览模板文件",  
  68.                         new Date(), "chnnal/news/" + j + i + "html");  
  69.                 news.setChannelId(i);  
  70.                 news.setChannelTitle(chnnel.getChnnelTitle());  
  71.                 chnnel.addNewsList(news);  
  72.             }  
  73.             newList.add(chnnel);  
  74.         }  
  75.         return newList;  
  76.     }  
  77. }  


模版文件:index.html 
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <html>  
  3.   <head>  
  4.     <title>Index.html</title>  
  5.       
  6.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  7.     <meta http-equiv="description" content="this is my page">  
  8.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
  9.   
  10.   </head>  
  11.     
  12.   <body>  
  13.   <!--:if(user!=null){  -->  
  14.     你好!${user}<br>  
  15.     ${Chal.chnnelTitle}  
  16.     ${channelList.~size}  
  17.   <!--:}  -->  
  18.     栏目列表  
  19.       
  20.    <div>  
  21.      
  22.    <!--: if(channelList.~size!=0){  
  23.       for(Channel in channelList){  -->  
  24.    <span >  
  25. <br>web.xml中的配置  
  26. <br><pre name="code" class="java"><?xml version="1.0" encoding="UTF-8"?>  
  27. <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">  
  28.   <listener>  
  29.     <listener-class>com.otos.cl.common.listerner.InitLisener</listener-class>  
  30.   </listener>  
  31.   <context-param>  
  32. <param-name>GroupTemplate.Root</param-name>  
  33. <param-value>/WEB-INF/template</param-value>  
  34. </context-param>  
  35. <context-param>  
  36. <param-name>GroupTemplate.Optimize</param-name>  
  37. <param-value>true</param-value>  
  38. </context-param>  
  39. <context-param>  
  40. <param-name>GroupTemplate.NativeCall</param-name>  
  41. <param-value>true</param-value>  
  42. </context-param>  
  43. <context-param>  
  44. <param-name>GroupTemplate.Check</param-name>  
  45. <param-value>2</param-value>  
  46. </context-param>  
  47.   <filter>  
  48.     <filter-name>encode</filter-name>  
  49.     <filter-class>com.otos.cl.common.filter.FilterEncoding</filter-class>  
  50.     <init-param>  
  51.       <param-name>encoding</param-name>  
  52.       <param-value>utf-8</param-value>  
  53.     </init-param>  
  54.   </filter>  
  55.   <filter-mapping>  
  56.     <filter-name>encode</filter-name>  
  57.     <url-pattern>/*</url-pattern> 
  58.   </filter-mapping> 
  59.   <servlet> 
  60.     <servlet-name>act</servlet-name> 
  61.     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
  62.     <init-param> 
  63.       <param-name>config</param-name> 
  64.       <param-value>/WEB-INF/struts-config.xml</param-value> 
  65.     </init-param> 
  66.     <init-param> 
  67.       <param-name>debug</param-name> 
  68.       <param-value>3</param-value> 
  69.     </init-param> 
  70.     <init-param> 
  71.       <param-name>detail</param-name> 
  72.       <param-value>3</param-value> 
  73.     </init-param> 
  74.     <load-on-startup>0</load-on-startup> 
  75.   </servlet> 
  76.   <servlet-mapping> 
  77.     <servlet-name>act</servlet-name> 
  78.     <url-pattern>*.do</url-pattern> 
  79.   </servlet-mapping> 
  80.   <welcome-file-list> 
  81.     <welcome-file>index.html</welcome-file> 
  82.     <welcome-file>index.jsp</welcome-file> 
  83.      
  84.   </welcome-file-list> 
  85. </web-app> 
  86. </pre> 
  87. <br>由于要对显示的字符串进行截取,定义了两个函数: 
  88. <br><pre name="code" class="java">/** 
  89.  * 用于在模版中截取字符串长度的函数 
  90.  *  
  91.  * @author chenl 
  92.  *  
  93.  */  
  94. public class SubStringFunction implements Function {  
  95.   
  96.     public Object call(Object[] objects, Context ctx) {  
  97.         String parentStr = "";  
  98.         Integer start = 0;  
  99.         Integer end = 0;  
  100.         Object str = objects[0];  
  101.         if (str == null) {  
  102.             return "";  
  103.         } else {  
  104.             parentStr = String.valueOf(str);  
  105.         }  
  106.   
  107.         Object startindex = objects[1];  
  108.         if (startindex == null) {  
  109.             return "";  
  110.         } else {  
  111.             start = Integer.valueOf(startindex.toString());  
  112.         }  
  113.         if (objects.length >= 3) {  
  114.             Object endindex = objects[2];  
  115.             if (endindex != null) {  
  116.                 end = Integer.valueOf(endindex.toString());  
  117.             }  
  118.         }  
  119.         if (start < 0 || end < 0) {  
  120.             throw new IllegalStateException("SubString函数中参数startindex和endindex不能小于0");  
  121.         }  
  122.   
  123.         int length = parentStr.length();  
  124.   
  125.         if (length == 1) {  
  126.             return parentStr;  
  127.         } else {  
  128.             if (end == 0)  
  129.                 parentStr = parentStr.substring(start);  
  130.             else  
  131.                 parentStr = parentStr.substring(start, end);  
  132.         }  
  133.   
  134.         return parentStr;  
  135.     }  
  136. }  
  137. </pre>  
  138. <br>  
  139. <br><pre name="code" class="java">/** 
  140.  * Beetl自定义函数 
  141.  * @author chenl 
  142.  * 
  143.  */  
  144. public class LengthFunction implements Function {  
  145.   
  146.     public Object call(Object[] arg0, Context arg1) {  
  147.         int length = 0;  
  148.         if(arg0.length==1){  
  149.             Object obj = arg0[0];  
  150.             if(obj instanceof String) {  
  151.                 length = ((String) obj).length();  
  152.             }else if(obj instanceof Integer){  
  153.                 length = ((String) obj).length();  
  154.             }else if(obj instanceof Double){  
  155.                 length = ((String) obj).length();  
  156.             }else if(obj instanceof Float){  
  157.                 length = ((String) obj).length();  
  158.             }else{  
  159.                 throw new IllegalStateException("参数不正确");  
  160.             }  
  161.         }else{  
  162.             throw new IllegalStateException("参数不正确");  
  163.         }  
  164.         return length;  
  165.     }  
  166.   
  167. }  
  168. </pre>  
  169. <br>  
  170. <br><strong>生成</strong>结果:index.html  
  171. <br><pre name="code" class="java"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  172. <html>  
  173.   <head>  
  174.     <title>Index.html</title>  
  175.       
  176.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  177.     <meta http-equiv="description" content="this is my page">  
  178.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
  179.   </head>  
  180.     
  181.   <body>  
  182.     你好!chenlei<br>  
  183.     栏目test  
  184.     10  
  185.     栏目  
  186.       
  187.    <div>  
  188.      
  189.    <span >  
  190. <br>感觉自定义函数功能不错,但是也麻烦了些,两个函数就要写两个类。  
  191. <br>如果能归类就好了,比如对字符串的操作,一个自定义函数中不同的方法就可以搞定。  
  192.   </pre>  
Beetl模板引擎 v3.1 为您提供Beetl模板引擎下载,Beetl相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下:1、功能完备:同主流的java模板引擎相比,Beetl具有绝大多数功能。适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。2、非常简单:类似 立即下载

相关推荐

SAP系统从ECC升级至S/4 HANA的实现路径及项目过程

从SAP ECC升级到 S/4 HANA,通常是一个复杂的转型过程,涉及到企业资源规划系统的全面现代化

saplakes的博客 2905

Thymeleaf和Beetl生成静态化页面速度的简单测试

1.Thymeleaf主要代码 public class StaticUtil{ private static final String TEMPLATE_PREFIX = "templates/"; private static final String TEMPLATE_SUFFIX = ".html"; public static void makeThymele...

Horsleyli的博客 2124

合成生物学中试:花钱只是开始,烧钱才是常态

2026年合成生物学行业面临严峻产业化挑战:多家企业终止发酵项目或延期投产,显示从实验室到工厂的转化困境。核心问题并非基因合成成本,而是工艺放大难题——67%项目在中试阶段因工艺问题失败。AI辅助无法替代工程经验,菌株-配方-工艺的三元适配需要长期数据积累。中试成本惊人,涉及设备折旧、原料消耗和稀缺工艺人才,而行业普遍回避讨论这些工程现实,导致认知偏差。建议创业者提前布局中试,将其视为核心竞争力而非简单成本项。合成生物学的真正瓶颈在于工程化能力,这需要时间沉淀而非技术叙事。

AIexander的博客 943

使用Beetl实现静态页生成

使用Beetl 1.1实现静态页的生成。 使用struts1.2 首先在Lisener中设置ServletGroupTemplate相关配置。 模版文件位于WEB-INF/template下 [code="java"] public class InitLisener implements ServletContextListener{ static Log log = LogFac...

chenlei65368的专栏 737

分享通达信破解交易接口的使用!

那其实通达信破解交易接口的使用方法比较复杂,这里以MA均线指标为例子,只要理解了这些操作步骤,就可以很容易地使用其他指标包括自己编写的指标来进行交易。委托结果(包含委托编号), 需要分配 1024*1024 字节的空间。委托结果数组, 每项结果需要分配 1024*1024 字节的空间。0: 买入, 1: 卖出, 2: 融资买入, 3: 融券卖出,4: (市价委托)上海五档即成剩撤, 深圳五档即成剩撤。4: 买券还券, 5: 卖券还款, 6: 现券还券。0: 上海限价委托, 深圳限价委托。

1841085904的博客 2361

Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

Projectsauron 的博客 7万+

springboot 用beetl 搭建展示页面的注意点

(1)springboot 可以加入以下依赖,用beetl 搭建展示页面(beetl 页面以.btl结尾,位置位于 /resources/templates/ 下面): <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl-framework-starter</...

mumucgq的博客 640

从零到一:STM32 CubeMX与WS2812B的DMA驱动艺术

本文详细介绍了如何使用STM32 CubeMX和DMA技术驱动WS2812B RGB LED灯条,从硬件设计到软件实现的全过程。通过CubeMX配置定时器和DMA,实现高效的PWM波形生成与数据传输,解决传统GPIO控制资源占用高的问题。文章还提供了颜色编码、动画效果实现及常见问题解决方案,助力开发者快速掌握智能LED控制技术。

weixin_28278377的博客 980

03.Beetl模板变量以及自定义模板配置---《Beetl视频课程》

为什么80%的码农都做不了架构师?>>> ...

weixin_33887443的博客 464

STM32F407控制舵机

STM32F407控制舵机运行 使用STM32F407控制舵机,首先来看下舵机图片 [黑红白,黑线接GND,红线接VCC,信号线接白色线(有的舵机线的颜色不同,例如褐色红色橘色,仅颜色不同接法还如上述)] 舵机需要信号的周期为20ms,即频率为50Hz。 接下来正式操作: 步骤一:STM32F4程序(本次程序的PWM信号产生的周期频率由定时器TIM14通道1产生(TIM14_CH1),想要使用其它定时器也没关系下面会讲到) #include "pwm.h" void TIM14_CH1_PWM_In

Ievn_Hare的博客 1万+

使用NXP SBC插件开发FS26软件

FS26作为功能安全可达ASIL D的SBC,在配合NXP MCU的使用中非常广泛,本文介绍基于NXP官网的SBC代码包快速进行FS26软件的开发FS26使用过程中还有不少坑的地方,后面有空可以再介绍相关的功能。

赞的博客 653

【java模板引擎】-beetl

一、什么是模板引擎:         模板引擎我理解的就是写好了静态页面,在其中动态加载好数据,在项目启动的时候,将静态的html页面加载 出来,然后将数据绑定其中,这样一定程度上减少了加载时占用CPU的时间。 二、模板引擎的好处         显而易见的好处就是可以提高了加载的速度,提高了性能,模板引擎可以精确定位每个模板出错点,加快了开 发速度,同时在更改错误的时候

遇见未来的自己 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Beetl3.0 功能预览

为什么80%的码农都做不了架构师?>>> ...

weixin_34345560的博客 909

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Beetl 3.0.0.M2 版本发布,Java 模板引擎

Beetl是一款全功能,高性的国产模板引擎,可以广泛用于动态页面生成,静态页面生成,代码生成,文本转换,脚本和规则引擎等,从2011年来,一直维护,并得到国内用户的肯定 本次发布增加了俩个功能 新增循环属性dataIndex,从0开始。比如 @for(user in userList){ <span> ${userLP.dataIndex} ${user.name} </...

FHGFHFYUUGY的博客 337

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

关于beetl认识的几个误区

为什么80%的码农都做不了架构师?>>> ...

weixin_34284188的博客 678

Beetl 3.0.0.M1 版本发布,Java 模板引擎

开发四年只会写业务代码,分布式高并发都不会还做程序员? Beetl是一款全功能,性能优秀的国产模板引擎,可以广泛用于动...

weixin_34270606的博客 211

大型电子商务网站欧美淘启用,基于beetl技术

为什么80%的码农都做不了架构师?>>> ...

weixin_33709364的博客 96

【模板引擎】

模板引擎

dyn的博客 736

利用Java生成静态HMTL页面

原文地址:http://www.blogjava.net/klpk222/archive/2007/11/05/158217.html 这几天公司需要生成静态的HTML页面以减小数据库与服务器的压力和负担,于是在网络上一阵狂搜,找到几篇相当不错的文章和一些相当有用的资料。为了方便,我整理在自己的BLOG,以供参考! 在接下来的应用中,我自己想到另一种解决方案,就是通过Ajax + St

未来希望 2153

动态页面静态化

@TOC1、拆中做法、 、 判断静态文件是否存在、不存在就新建一个(提前编辑好一个静态页模板 &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&a

wqs15192095633的专栏 665

常见的Java模板引擎

Java中有多种模板引擎,每种模板引擎都有其特点和适用场景。

2401_85480529的博客 2327

模板中 List 和 Map 的遍历

最近一段时间在整一个项目,里面用到很多知识点,其中有 freemarker,以前没用过,花一段时间来研究。 使用 freemarker 根据模板生成静态页面时,经常会在页面中显示数值,List或者Map形式的。 下面的代码是我在项目中运行成功的代码, 欢迎高手指点优化。 遍历List:(topTenDocList为10篇文章的List, docDocumen为文章对象) &lt;#li...

dato0123 125
上一篇: Struts2 validation验证讲解(annotaion方式)
下一篇: js将金额小写自动转换成大写
夜半灬灰太狼
博客等级 码龄15年 11粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值