- 浏览: 345359 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
弦月001:
我目前也是碰到这样的情况,在jsp里面没有问题,但在free ...
Spring+Freemarker(国际化) -
laj12347:
zhangsw_00 写道我参照你的方法,配置环境,在jsp文 ...
Spring+Freemarker(国际化) -
yctan:
hi,能不能把发送邮件的代码也贴一下啊。
用webdav协议访问exchange邮件服务器,下载附件的问题 -
maketc:
楼上正解,这个问题也被郁闷了半天,试过重启tomcat、ecl ...
Tomcat 部署 Could not copy all resources to 或者Undeployment Failure could not be re -
masuweng:
楼上正解,这个问题曾被郁闷了半天
Tomcat 部署 Could not copy all resources to 或者Undeployment Failure could not be re
利用Struts2生成静态页面其实很灵活,很强大,尤其是利用Struts2对Freemarker较好的支持,充分利用Freemarker的模板功能来生成静态页面。
基本思路为:利用Struts2对自定义result type的支持,自定义能够生成静态页面的result type,结合模板引擎Freemarker可以实现大批量静态页面的生成。
参看org.apache.struts2.views.freemarker.FreemarkerResult的代码实现,自定义了自己的生成静态页面的result type。此种方案不单纯用于生成静态页面,其实也可以用于生成诸如wml、xhtml等内容,具体可以参考Struts2缺省提供的各种result type的实现。
1、com.mobilesoft.esales.webapp.action.FreemarkerResult
package com.mobilesoft.esales.webapp.action;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import org.apache.struts2.views.util.ResourceUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;
import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
public class FreemarkerResult extends StrutsResultSupport {
private static final long serialVersionUID = -3778230771704661631L;
protected ActionInvocation invocation;
protected Configuration configuration;
protected ObjectWrapper wrapper;
protected FreemarkerManager freemarkerManager;
private Writer writer;
protected String location;
private String pContentType = “text/html”;
protected String fileName; // 要生成的静态页面名称
protected String filePath; // 要生成的静态页面的路径
protected String staticTemplate; // 用于生成静态页面Freemarker模板的路径
public FreemarkerResult() {
super();
}
public FreemarkerResult(String location) {
super(location);
}
@Inject
public void setFreemarkerManager(FreemarkerManager mgr) {
this.freemarkerManager = mgr;
}
public void setContentType(String aContentType) {
pContentType = aContentType;
}
public String getContentType() {
return pContentType;
}
public void doExecute(String location, ActionInvocation invocation)
throws IOException, TemplateException {
this.location = location;
this.invocation = invocation;
this.configuration = getConfiguration();
this.wrapper = getObjectWrapper();
this.fileName = (String) conditionalParse(fileName, invocation);
this.staticTemplate = (String) conditionalParse(staticTemplate, invocation);
this.filePath = ((String) conditionalParse(filePath, invocation)) == null ? “”
: ((String) conditionalParse(filePath, invocation));
if (!location.startsWith(”/”)) {
ActionContext ctx = invocation.getInvocationContext();
HttpServletRequest req = (HttpServletRequest) ctx
.get(ServletActionContext.HTTP_REQUEST);
String base = ResourceUtil.getResourceBase(req);
location = base + “/” + location;
}
//生成html页面的模板类
Template template = configuration.getTemplate(location, deduceLocale());
// 生成静态页面的的模板类
Template staticTemplate = configuration.getTemplate(this.staticTemplate,
deduceLocale());
TemplateModel model = createModel();
String path = ServletActionContext.getServletContext().getRealPath(
filePath)
+ File.separator;
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(path + fileName)));
if (preTemplateProcess(template, model)) {
try {
staticTemplate.process(model, out);
template.process(model, getWriter());
} finally {
postTemplateProcess(template, model);
postTemplateProcess(staticTemplate, model);
}
}
}
protected Configuration getConfiguration() throws TemplateException {
return freemarkerManager.getConfiguration(ServletActionContext
.getServletContext());
}
protected ObjectWrapper getObjectWrapper() {
return configuration.getObjectWrapper();
}
public void setWriter(Writer writer) {
this.writer = writer;
}
protected Writer getWriter() throws IOException {
if (writer != null) {
return writer;
}
return ServletActionContext.getResponse().getWriter();
}
protected TemplateModel createModel() throws TemplateModelException {
ServletContext servletContext = ServletActionContext
.getServletContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ValueStack stack = ServletActionContext.getContext().getValueStack();
Object action = null;
if (invocation != null)
action = invocation.getAction(); // Added for NullPointException
return freemarkerManager.buildTemplateModel(stack, action,
servletContext, request, response, wrapper);
}
protected Locale deduceLocale() {
if (invocation.getAction() instanceof LocaleProvider) {
return ((LocaleProvider) invocation.getAction()).getLocale();
} else {
return configuration.getLocale();
}
}
protected void postTemplateProcess(Template template, TemplateModel data)
throws IOException {
}
protected boolean preTemplateProcess(Template template, TemplateModel model)
throws IOException {
Object attrContentType = template.getCustomAttribute(”content_type”);
if (attrContentType != null) {
ServletActionContext.getResponse().setContentType(
attrContentType.toString());
} else {
String contentType = getContentType();
if (contentType == null) {
contentType = “text/html”;
}
String encoding = template.getEncoding();
if (encoding != null) {
contentType = contentType + “; charset=” + encoding;
}
ServletActionContext.getResponse().setContentType(contentType);
}
return true;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getStaticTemplate() {
return staticTemplate;
}
public void setStaticTemplate(String staticTemplate) {
this.staticTemplate = staticTemplate;
}
}
2、struts.xml
<action name=”staticViewAction” class=”com.mobilesoft.esales.webapp.action.StaticViewtAction”>
<result name=”success” type=”staticview”>
<param name=”location”>test/freemarkertest.ftl</param>
<param name=”contentType”>text/html</param>
<param name=”fileName”>${filename}</param>
<param name=”staticTemplate”>test/freemarkertest.ftl</param>
<param name=”filePath”>static</param>
</result>
</action>
基本思路为:利用Struts2对自定义result type的支持,自定义能够生成静态页面的result type,结合模板引擎Freemarker可以实现大批量静态页面的生成。
参看org.apache.struts2.views.freemarker.FreemarkerResult的代码实现,自定义了自己的生成静态页面的result type。此种方案不单纯用于生成静态页面,其实也可以用于生成诸如wml、xhtml等内容,具体可以参考Struts2缺省提供的各种result type的实现。
1、com.mobilesoft.esales.webapp.action.FreemarkerResult
package com.mobilesoft.esales.webapp.action;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Locale;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import org.apache.struts2.views.util.ResourceUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;
import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
public class FreemarkerResult extends StrutsResultSupport {
private static final long serialVersionUID = -3778230771704661631L;
protected ActionInvocation invocation;
protected Configuration configuration;
protected ObjectWrapper wrapper;
protected FreemarkerManager freemarkerManager;
private Writer writer;
protected String location;
private String pContentType = “text/html”;
protected String fileName; // 要生成的静态页面名称
protected String filePath; // 要生成的静态页面的路径
protected String staticTemplate; // 用于生成静态页面Freemarker模板的路径
public FreemarkerResult() {
super();
}
public FreemarkerResult(String location) {
super(location);
}
@Inject
public void setFreemarkerManager(FreemarkerManager mgr) {
this.freemarkerManager = mgr;
}
public void setContentType(String aContentType) {
pContentType = aContentType;
}
public String getContentType() {
return pContentType;
}
public void doExecute(String location, ActionInvocation invocation)
throws IOException, TemplateException {
this.location = location;
this.invocation = invocation;
this.configuration = getConfiguration();
this.wrapper = getObjectWrapper();
this.fileName = (String) conditionalParse(fileName, invocation);
this.staticTemplate = (String) conditionalParse(staticTemplate, invocation);
this.filePath = ((String) conditionalParse(filePath, invocation)) == null ? “”
: ((String) conditionalParse(filePath, invocation));
if (!location.startsWith(”/”)) {
ActionContext ctx = invocation.getInvocationContext();
HttpServletRequest req = (HttpServletRequest) ctx
.get(ServletActionContext.HTTP_REQUEST);
String base = ResourceUtil.getResourceBase(req);
location = base + “/” + location;
}
//生成html页面的模板类
Template template = configuration.getTemplate(location, deduceLocale());
// 生成静态页面的的模板类
Template staticTemplate = configuration.getTemplate(this.staticTemplate,
deduceLocale());
TemplateModel model = createModel();
String path = ServletActionContext.getServletContext().getRealPath(
filePath)
+ File.separator;
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(path + fileName)));
if (preTemplateProcess(template, model)) {
try {
staticTemplate.process(model, out);
template.process(model, getWriter());
} finally {
postTemplateProcess(template, model);
postTemplateProcess(staticTemplate, model);
}
}
}
protected Configuration getConfiguration() throws TemplateException {
return freemarkerManager.getConfiguration(ServletActionContext
.getServletContext());
}
protected ObjectWrapper getObjectWrapper() {
return configuration.getObjectWrapper();
}
public void setWriter(Writer writer) {
this.writer = writer;
}
protected Writer getWriter() throws IOException {
if (writer != null) {
return writer;
}
return ServletActionContext.getResponse().getWriter();
}
protected TemplateModel createModel() throws TemplateModelException {
ServletContext servletContext = ServletActionContext
.getServletContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ValueStack stack = ServletActionContext.getContext().getValueStack();
Object action = null;
if (invocation != null)
action = invocation.getAction(); // Added for NullPointException
return freemarkerManager.buildTemplateModel(stack, action,
servletContext, request, response, wrapper);
}
protected Locale deduceLocale() {
if (invocation.getAction() instanceof LocaleProvider) {
return ((LocaleProvider) invocation.getAction()).getLocale();
} else {
return configuration.getLocale();
}
}
protected void postTemplateProcess(Template template, TemplateModel data)
throws IOException {
}
protected boolean preTemplateProcess(Template template, TemplateModel model)
throws IOException {
Object attrContentType = template.getCustomAttribute(”content_type”);
if (attrContentType != null) {
ServletActionContext.getResponse().setContentType(
attrContentType.toString());
} else {
String contentType = getContentType();
if (contentType == null) {
contentType = “text/html”;
}
String encoding = template.getEncoding();
if (encoding != null) {
contentType = contentType + “; charset=” + encoding;
}
ServletActionContext.getResponse().setContentType(contentType);
}
return true;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getStaticTemplate() {
return staticTemplate;
}
public void setStaticTemplate(String staticTemplate) {
this.staticTemplate = staticTemplate;
}
}
2、struts.xml
<action name=”staticViewAction” class=”com.mobilesoft.esales.webapp.action.StaticViewtAction”>
<result name=”success” type=”staticview”>
<param name=”location”>test/freemarkertest.ftl</param>
<param name=”contentType”>text/html</param>
<param name=”fileName”>${filename}</param>
<param name=”staticTemplate”>test/freemarkertest.ftl</param>
<param name=”filePath”>static</param>
</result>
</action>
发表评论
-
手动将class打包成jar包方法
2010-09-10 00:41 2824<!-- ------------------ --&g ... -
教你用Java生成RSS 简单实用
2010-09-10 00:40 3299<!-- ------------------ --&g ... -
代码的坏味道
2010-06-29 13:10 16301. Duplicated Code(重 ... -
java 获取客户端ip mac地址
2010-02-23 15:47 2955转自:http://hi.baidu.com/coolcode ... -
java中输出流OutputStream类应用实例
2010-02-04 15:30 5240OutputStream类 该类是字节输出流的抽象类,定义了输 ... -
大幅优化myeclipse的速度&关闭自动更新
2010-02-01 21:24 1440去除不需要加载的模块 一个系统20%的功能往往能够满足80% ... -
Servlet 上传文件(转)
2010-01-18 14:45 1597编程思路:下面的UploadServlet.java ,其主 ... -
JAVA线程实例-----卖票
2010-01-08 15:44 2001package test; import java. ... -
如何学习Hibernate
2009-12-21 09:28 940Hibernate入门容易,掌握精通我也不敢自夸。我第 ... -
Tomcat 部署 Could not copy all resources to 或者Undeployment Failure could not be re
2009-12-16 22:13 3223Tomcat 部署,在部署可能会出现以下问题: Deploy ... -
Java 的JDBC 数据库连接池实现方法
2009-12-16 01:10 1355关键字: Java, JDBC, Connection Poo ... -
jdbc PreparedStatement的用法
2009-12-15 21:51 40416jdbc(java database connectivity ... -
用java获取文件夹的大小
2009-12-14 09:15 2490/** * <p> * Created on ... -
JavaBean实现多文件上传的两种方法
2009-12-10 10:32 1078摘要:本文介绍了J ... -
通过 http 协议上传文件
2009-12-10 10:07 21291、概述 在最初的 http ... -
自学Javabean迅速成为Java高手
2009-12-10 09:17 832很多网友咨询学习Java有 ... -
response.setContentType()的String参数及对应类型
2009-12-09 13:43 2505response.setContentType()的Strin ... -
Apache Commons fileUpload实现文件上传
2009-10-19 00:15 1281Apache的commons-fileupload.jar可方 ... -
Postfix邮件服务器架设笔记
2009-08-26 06:57 1678# 安装步骤1、安装操作系统 2、安装postfixadmin ... -
3分钟安装配置Postfix邮件服务器
2009-08-26 06:51 3046Linux邮件服务器通常使用sendmail,在网上googl ...
相关推荐
8. **静态页面生成**:整合Struts2和Freemarker的一个常见应用是生成静态页面,提高网站性能。这通常通过在Action中触发静态化逻辑,将Freemarker渲染后的HTML保存到磁盘,然后直接返回这些静态页面。 9. **错误和...
总之,“struts2+freemarker 生成静态页面”是一个旨在提升Web应用性能的技术实践,通过结合Struts2的MVC框架和FreeMarker的模板引擎,实现了动态内容到静态HTML的转化,为用户提供更快的加载速度和更好的浏览体验。...
Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个基于MVC(Model-View-Controller)架构模式的开源框架,用于构建动态、数据驱动的Web应用程序,而FreeMarker则是一个模板引擎,它允许...
FreeMarker与Struts2的...通过这个案例,开发者可以学习到如何将FreeMarker与Struts2结合起来,实现动态生成静态页面,以及如何使用c3p0和dbUtils进行数据库操作。这对于理解Web应用的架构和提高开发效率具有重要意义。
Struts2 和 Freemarker 的整合是企业级Java Web开发中常用的技术组合,它们结合使用能够实现灵活、高效的表现层设计。Struts2 是一个强大的MVC框架,而Freemarker则是一个模板引擎,用于生成动态内容。以下是关于...
Struts2是一个流行的Java Web应用程序框架,它提供了一种组织和控制MVC(模型-视图-控制器)架构的方式。而Freemarker则是一个强大的模板引擎,常用于生成动态HTML、XML或其他格式的文本。在Struts2中结合使用...
Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化,以后直接调用即可,无需修改任何源代码,改压缩文件包括 1、工具类; 2、源码(含jar包); 3、mysql数据库可执行文件; 4、struts2集成...
Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个强大的MVC(Model-View-Controller)框架,它极大地简化了构建基于Java的Web应用程序的过程。而FreeMarker则是一种模板引擎,主要用于生成...
freeMarker整合struts2实例调用模板生成html页面,对于初学者肯定有用的
Struts2是一个强大的MVC(Model-View-Controller)框架,它是Apache软件基金会下的一个开源项目...这将帮助我们深入理解这两个工具的协同工作方式,以及在实际项目中如何有效地利用它们提高开发效率和应用的可维护性。
Struts2 和 Freemarker 是两个在Java Web开发中广泛应用的技术,它们共同构成了强大的MVC(模型-视图-控制器)框架。Struts2是Action框架,主要负责处理用户请求、业务逻辑控制以及与视图层的交互,而Freemarker则是...
Struts2结合FreeMarker模板引擎可以方便地生成静态页面,提高网站的响应速度和用户体验。 FreeMarker是一个强大的、轻量级的模板语言,用于生成动态内容。它与Java紧密集成,允许开发者用模板来分离业务逻辑和表现...
Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,用于构建企业级Web应用程序,而FreeMarker则是一个模板引擎,用于生成动态HTML或...
Struts2和Freemarker是Java Web开发中的两个重要组件,它们在构建MVC(Model-View-Controller)架构的应用程序中发挥着关键作用。Struts2作为一个强大的MVC框架,负责处理请求、控制应用程序流程,而Freemarker则是...
在Struts2框架中,FreeMarker作为视图层的模板技术,接收来自控制器的数据并根据模板规则生成最终的响应页面。FreeMarker模板语言简洁,易于学习,允许开发者将逻辑与表现分离,提高代码可维护性。 项目实例中的...
部署到tomcat中, 访问/freemarker/build_index.action 点击首页生成,当显示生成成功过后 然后访问 ...已经完美将struts2+freemarker+spring整合~ 希望对你们有所帮助。 经测试:tomcat5.5 无法正常运行
在本例子中,我们将探讨如何使用Struts1.2和Freemarker2.3.8来实现登录成功页面的静态化。静态化是一种优化网站性能的技术,通过将动态内容提前渲染为静态HTML页面,可以减少服务器处理时间,提高页面加载速度,降低...
Struts2和Freemarker是两个非常流行的Java Web开发框架,它们经常被一起使用来构建动态、交互式的Web应用程序。国际化(Internationalization,通常缩写为i18n)是软件开发中的一个重要概念,它允许应用程序支持不同...
在新闻发布系统中,Freemarker被用作视图层技术,与Struts2结合,根据Action返回的数据动态生成静态页面。这样可以将业务逻辑与表现逻辑分离,使得代码更加清晰。 5. **用户认证与权限管理** 系统中预设了一个管理...
在IT行业中,生成静态...总之,使用Freemarker和Struts2生成静态页面能够提高网站的访问速度,降低服务器压力,同时简化了开发流程。结合合理的缓存策略和自动化更新机制,可以实现高效、自动化的静态页面生成方案。