FreeMarker生成静态HTML页面的工具类FreeMarkerUtil
一.FreeMarkerUtil工具类:
import com.huaxia.entity.News; import com.huaxia.entity.User; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * 创建人: leon * 创建时间: 2014年11月28日 上午10:07:51 * 类描述:Freemarker的工具类 */ public class FreemarkerUtil { /** * 通过指定的名字获取相应的模板 * @param fileName * @return */ public Template getTemplate(HttpServletRequest request,String fileName) { try { Configuration cfg = new Configuration(); cfg.setOutputEncoding("UTF-8"); cfg.setDefaultEncoding("UTF-8");// 编码设置1 cfg.setEncoding(Locale.CHINA, "UTF-8"); //设定读取ftl模板文件的目录 //cfg.setClassForTemplateLoading(this.getClass(), "/template"); //读取src目录下 cfg.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template"); //读取webroot目录下 //在模板文件目录中找到名称为name的文件,并加载为模板 Template template = cfg.getTemplate(fileName); template.setEncoding("UTF-8");// 编码设置2 return template; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 通过指定的文件目录和文件名生成相应的文件 * @param fileDir * @param fileName */ public Boolean printToFile(Template template,String fileDir,String fileName,Map<String,Object> root) { boolean done = false; Writer writer = null; try { //判断多级目录是否存在,不存在则一级级创建 String[] paths = fileDir.split("\\\\");//注意:此处“\\”是错误的,必须要“\\\\”才能分割字符串 String dir = paths[0]; for (int i = 1; i < paths.length; i++) { dir = dir + File.separator + paths[i]; File file=new File(dir.toString()); if (!file.exists()) { file.mkdir(); } } //创建输出流 File file = new File(fileDir +File.separator+ fileName); //设置生成的文件编码为UTF-8 //服务器不支持UTF-8格式HTML时候使用ANSI格式HTML文件,即系统默认编码 writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8")); // 编码设置3 //writer = new FileWriter(fileDir +File.separator+ fileName); //输出模板和数据模型都对应的文件 template.process(root, writer); done = true; } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } finally { try { if(writer!=null){ writer.close(); } } catch (IOException e) { e.printStackTrace(); } } return done; } /** * 通过传入的请求和新闻信息重新生成html文件 * @param news //新闻实体类 * @param request //请求 * @param user //用户 * @return */ public boolean genenateHtml(News news,HttpServletRequest request,User user) { String fileName = news.getFileName(); Map<String, Object> root = new HashMap<String, Object>(); root.put("id", news.getId()); root.put("title", news.getTitle()); root.put("create_date", news.getCreateDate()); root.put("creator", news.getCreator()); root.put("content", ClobUtil.ClobToString(news.getContent())); root.put("fileName", news.getUploadFile()==null?"":news.getUploadFile()); FreemarkerUtil freemarkerUtil = new FreemarkerUtil(); Template template = null; template = freemarkerUtil.getTemplate(request, "news.ftl");//新闻发布系统的freemarker模板 String htmlDir = news.getDir(); boolean done = printToFile(template, htmlDir, fileName, root); return done; } }
二.发布新闻信息的Servlet:
if ("publishNews".equals(action)) { //发布新闻:通过传入的新闻id获取新闻信息生成新闻模板 String idsStr = request.getParameter("newsIds"); INewsDao newsDao = new NewsDaoImpl(); boolean done = newsDao.publishNews(idsStr,request,user); String str =null; if(done){ str="{success:true}"; }else{ str="{success:false}"; } response.setContentType("text/html;charset=UTF-8"); out=response.getWriter(); out.print(str); out.close(); return; }
三.发布新闻信息的Dao方法:
/** * 发布新闻信息的Dao方法 * @param idsStr //新闻ID * @param request * @param user */ public boolean publishNews(String idsStr, HttpServletRequest request, User user) { Session s = null; boolean done = false; FreemarkerUtil freemarkerUtil = new FreemarkerUtil(); List<Integer> ids = new ArrayList<Integer>(); String[] newIds = idsStr.split(","); for (int i = 0; i < newIds.length; i++) { ids.add(Integer.valueOf(newIds[i])); } try { s = HibernateUtil.getSession(); s.beginTransaction(); StringBuffer sb = new StringBuffer("select * from news where id in("); for (int i = 0; i < ids.size(); i++) { sb.append(ids.get(i)); if (i != ids.size() -1) { sb.append(","); } } sb.append(")"); SQLQuery query = s.createSQLQuery(sb.toString()); List<News> list = query.addEntity(News.class).list(); for (int i = 0; i < list.size(); i++) { News news = list.get(i); done = freemarkerUtil.genenateHtml(news, request, user); if (!done) { return done; } } s.getTransaction().commit(); done = true; } catch (Throwable e) { logger.error(e.toString()); HibernateUtil.endSession(s); } finally { HibernateUtil.endSession(s); } return done; }
相关链接:
Freemarker模板应用
Freemarker生成html页面
Freemarker 设置编码
相关推荐
**使用FreeMarker生成静态页面的步骤** 1. **创建模板**: 设计并编写FreeMarker模板文件,模板中包含HTML结构和FreeMarker指令。 2. **构建数据**: 准备好要展示的数据,可能来自于数据库或其他数据源。 3. **...
在实现FreeMarker生成静态页面的过程中,主要有以下几个步骤: 1. **创建FreeMarker模板文件**: 例如,创建一个名为`user.ftl`的模板文件,其中包含HTML结构,并使用`${...}`来标记动态数据的占位符。在这个例子...
FreeMarker 是一个强大的...综上所述,FreeMarker是一个强大的模板引擎,通过FreeMarkerUtil工具类可以方便地进行模板操作,实现静态页面的生成。在实际项目中,合理利用这些功能可以极大地提高开发效率和应用性能。
3 Android SqliteManager 源码.zip
内容概要:本文详细介绍了基于S7-200 PLC的煤矿排水系统智能控制方案,重点讨论了三台水泵(两台工作水泵和一台备用水泵)的联动与备援策略。系统通过超声波液位传感器实时监测水位,根据不同水位情况自动控制水泵的启停。具体而言,水位低时不启动水泵,水位介于中水位和高水位之间时启动1号水泵,水位超过高水位则启动1号和2号水泵共同工作。若1号或2号水泵出现故障,系统会自动启用3号备用水泵。此外,MCGS6.2组态画面用于实时监控水位和水泵状态,帮助操作员及时应对异常情况,确保矿井安全。 适合人群:从事煤矿自动化控制领域的技术人员、矿业工程管理人员及相关研究人员。 使用场景及目标:适用于需要提高煤矿排水系统自动化水平的场合,旨在提升矿井排水效率和安全性,减少人工干预,确保矿井生产安全。 其他说明:文中提到的技术方案不仅提高了排水系统的可靠性,还为未来的智能化矿山建设提供了有益借鉴。
scratch少儿编程逻辑思维游戏源码-灌篮之王.zip
scratch少儿编程逻辑思维游戏源码-飞翔马里奥(2).zip
scratch少儿编程逻辑思维游戏源码-火柴人大战 中世纪战争.zip
scratch少儿编程逻辑思维游戏源码-几何冲刺(2).zip
南京证券-低轨卫星互联网启动,天地一体通信迈向6G
nginx-1.20.1
sshpass-1.06-8.ky10.aarch
少儿编程scratch项目源代码文件案例素材-我的世界2D(更新北极).zip
通信行业专题研究:车载全息数字人——AI+Agent新场景,全息投影新方向-20231121-国盛证券-13页
内容概要:本文详细介绍了利用西门子S7-200 PLC和组态王软件构建的邮件分拣系统的具体设计方案和技术细节。首先,文中阐述了硬件部分的设计,包括光电传感器、传送带电机以及分拣机械臂的连接方式,特别是旋转编码器用于精确测量包裹位移的技术要点。接着,展示了PLC编程中的关键代码段,如初始化分拣计数器、读取编码器数据并进行位置跟踪等。然后,描述了组态王作为上位机软件的作用,它不仅提供了直观的人机交互界面,还允许通过简单的下拉菜单选择不同的分拣规则(按省份、按重量或加急件)。此外,针对可能出现的通信问题提出了有效的解决方案,比如采用心跳包机制确保稳定的数据传输,并解决了因电磁干扰导致的问题。最后,分享了一些现场调试的经验教训,例如为减少编码器安装误差对分拣精度的影响而引入的位移补偿算法。 适合人群:从事自动化控制领域的工程师或者对此感兴趣的初学者。 使用场景及目标:适用于需要提高邮件或其他物品自动分拣效率的企业或机构,旨在降低人工成本、提升工作效率和准确性。 其他说明:文中提到的实际案例表明,经过优化后的系统能够显著改善分拣性能,将分拣错误率大幅降至0.3%,并且日均处理量可达2万件包裹。
scratch少儿编程逻辑思维游戏源码-机械汽车.zip
内容概要:本文详细探讨了在连续介质中利用束缚态驱动设计并实现具有最大和可调谐手征光学响应的平面手征超表面的方法。文中首先介绍了comsol三次谐波和本征手性BIC(束缚态诱导的透明)两种重要光学现象,随后阐述了具体的手征超表面结构设计,包括远场偏振图、手性透射曲线、二维能带图、Q因子图和电场图的分析。最后,通过大子刊nc复现实验验证了设计方案的有效性,并对未来的研究方向进行了展望。 适合人群:从事光学研究的专业人士、高校物理系师生、对光与物质相互作用感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解手征超表面设计原理及其光学响应机制的研究人员,旨在推动新型光学器件的研发和技术进步。 其他说明:本文不仅展示了理论分析和模拟计算,还通过实验证明了设计方法的可行性,为后续研究奠定了坚实的基础。
少儿编程scratch项目源代码文件案例素材-位图冒险.zip
少儿编程scratch项目源代码文件案例素材-校园困境2.zip
少儿编程scratch项目源代码文件案例素材-兔子吃萝卜.zip