抛砖:用freemarker、webwork发布静态页面的方法
方法一:(这个方法借鉴freemarker的docs文档Programmer's Guide 的quick start部分,详细请看相关的文档。
public class HtmlTemplateGenerator { Configuration cfg = null; public HtmlTemplateGenerator(String templatePath) throws IOException { cfg = new Configuration(); cfg.setDefaultEncoding("UTF-8"); cfg.setDirectoryForTemplateLoading(new File(templatePath)); cfg.setObjectWrapper(new DefaultObjectWrapper()); } /** * 生成静态文件 * @param ftlTemplate ftl模版文件 * @param contents ftl要用到的动态内容 * @param savePath 文件保存路径 * @param saveFilename 保存文件名 * @throws IOException * @throws TemplateException */ public void create(String ftlTemplate, Map contents, String savePath, String saveFilename) throws IOException, TemplateException { Template temp = cfg.getTemplate(ftlTemplate); /* Merge data model with template */ String realPath = ServletActionContext.getServletContext().getRealPath(savePath); System.out.println( saveFilename + ":" + realPath); File file = new File(realPath); if(!file.exists()) file.mkdirs(); Writer out = new OutputStreamWriter(new FileOutputStream(realPath + "/" + saveFilename),"UTF-8"); temp.process(contents, out); out.flush(); } }
如果用spring,可以将它配置成bean,然后在其他地方使用。第五行的 templatePath 是模版文件的路径,比如/WEB-INF/template。 action中的使用:HtmlTemplateGenerator.create("html/magazine/search.ftl", null, "/magazine", "search.html"); 其中“html/magazine/search.ftl”是在“/WEB-INF/template”目录下。这里还需要注意的是。模版文件(search.ftl)中如果还要引用其他文件,它的路径也是不需要添加总路径“/WEB-INF/template”。
方法二:继承webwork的FreemarkerResult,改写getWriter方法:不知有无好的法子。
protected Writer getWriter() throws IOException { String savePath = (String) ActionContext.getContext().getSession().get("SAVE_PATH"); String saveFilename = (String) ActionContext.getContext().getSession().get("SAVE_FILENAME"); String realPath = ServletActionContext.getServletContext().getRealPath(savePath); System.out.println( saveFilename + ":" + realPath); File file = new File(realPath); if(!file.exists()) file.mkdirs(); return templateOut = new OutputStreamWriter(new FileOutputStream(realPath + "/" + saveFilename),"UTF-8"); }
这里的路径和文件名通过webwork的session传入,不知有无其他好方法。
如果生成文件的同时还需要看到生成的页面,则要改写“doExecute”:
template.process(model, getWriter()); template.process(model, super.getWriter()); //添加这句 templateOut.flush();
生成的文件格式不限于html,可以是其他文件格式,如js,text等。
比较这两种方法:
方法一:在需要生成分页文件时,比较合适。
方法二:可以象往常一样使用,一次需要生成多文件则不适合。不知各位在做这些项目时,使用甚么好方法。
相关推荐
81314797 2020-11-18
89314493 2020-11-03
81941231 2020-09-17
thisisid 2020-09-09
如狼 2020-08-15
82384399 2020-06-16
86384798 2020-05-12
80183053 2020-05-02
86384798 2020-04-26
86384798 2020-04-11
rionchen 2020-04-09
86384798 2020-04-07
86384798 2020-04-04
80183053 2020-03-07
87201943 2020-03-06
83961233 2020-02-26
87201943 2020-02-21