1、freemaker模板静态化
/**
* 根据ftl模板生成html
*
* @param ftlPath
* 模板路径
* @param htmlPath
* 生成html路径
* @param freemarkerManager
*/
public static void createHtmlByFtl(String ftlPath, String htmlPath, FreemarkerManager freemarkerManager) {
try {
FreemarkerManager fm = freemarkerManager;
Configuration conf = fm.getConfiguration(ServletActionContext.getServletContext());
ActionInvocation actionInvocation = ActionContext.getContext().getActionInvocation();
HttpServletRequest request = ServletActionContext.getRequest();
ServletActionContext.getValueStack(request);
ServletContext servletContext = ServletActionContext.getServletContext();
HttpServletResponse response = ServletActionContext.getResponse();
ValueStack stack = ServletActionContext.getContext().getValueStack();
Template template = conf.getTemplate(ftlPath);
FileWriter writer = new FileWriter(htmlPath);
//核心
TemplateModel model = fm.buildTemplateModel(stack, actionInvocation.getAction(), servletContext, request,
response, conf.getObjectWrapper());
template.process(model, writer);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
怎么得到FreemarkerManager呢?
@Inject
private FreemarkerManager freemarkerManager;
2、jsp页面
/**
* 根据jsp模板生成html
*
* @param jspPath
* 模板路径
* @param htmlPath
* 生成html路径
*/
public static void createHtmlByJsp(String jspPath, String htmlPath) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
RequestDispatcher dispatcher = request.getRequestDispatcher(jspPath);
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ServletOutputStream outputStream = new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
baos.write(b);
}
};
final PrintWriter pw = new PrintWriter(new OutputStreamWriter(baos, "utf-8"), true);
HttpServletResponse resp = new HttpServletResponseWrapper(response) {
@Override
public ServletOutputStream getOutputStream() {
return outputStream;
}
@Override
public PrintWriter getWriter() {
return pw;
}
};
dispatcher.include(request, resp);
pw.flush();
FileOutputStream fos = new FileOutputStream(htmlPath);
baos.writeTo(fos);
fos.close();
}
还有第二种方式,自定义StrutsResult,继承StrutsResultSupport,在struts.xml配置自己的resultType,就可以把静态工作交给struts2处理了,核心代码基本一致。