`
conkeyn
  • 浏览: 1529234 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Struts2和Freemarker整合应用批量静态页面的生成

阅读更多

利用Struts2生成静态页面其实很灵活,很强大,尤其是利用Struts2对Freemarker较好的支持,充分利用Freemarker的模板功能来生成静态页面。
基本思路为:利用Struts2对自定义result type的支持,自定义能够生成静态页面的result type,结合模板引擎Freemarker可以实现大批量静态页面的生成。
参看org.apache.struts2.views.freemarker.FreemarkerResult的代码实现,自定义了自己的生 成静态页面的result type。此种方案不单纯用于生成静态页面,其实也可以用于生成诸如wml、xhtml等内容,具体可以参考Struts2缺省提供的各种result type的实现。

 

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;
	}
}
 
<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>

 http://ariyue.iteye.com/blog/443523

分享到:
评论
2 楼 qjls19861217 2013-02-21  
能不能说下步骤,这里方法太多,都不知道是做什么的。
1 楼 wb284551926 2013-01-07  
  

相关推荐

    Struts2整合Freemarker生成静态页面

    8. **静态页面生成**:整合Struts2和Freemarker的一个常见应用是生成静态页面,提高网站性能。这通常通过在Action中触发静态化逻辑,将Freemarker渲染后的HTML保存到磁盘,然后直接返回这些静态页面。 9. **错误和...

    struts2和freemarker整合

    Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个基于MVC(Model-View-Controller)架构模式的开源框架,用于构建动态、数据驱动的Web应用程序,而FreeMarker则是一个模板引擎,它允许...

    struts2+freemarker 生成静态页面

    总之,“struts2+freemarker 生成静态页面”是一个旨在提升Web应用性能的技术实践,通过结合Struts2的MVC框架和FreeMarker的模板引擎,实现了动态内容到静态HTML的转化,为用户提供更快的加载速度和更好的浏览体验。...

    FreeMarker与struts2整合生成静态页面

    FreeMarker与Struts2的...通过这个案例,开发者可以学习到如何将FreeMarker与Struts2结合起来,实现动态生成静态页面,以及如何使用c3p0和dbUtils进行数据库操作。这对于理解Web应用的架构和提高开发效率具有重要意义。

    Struts2 与Freemarker 的配置方法

    Struts2 和 Freemarker 的整合是企业级Java Web开发中常用的技术组合,它们结合使用能够实现灵活、高效的表现层设计。Struts2 是一个强大的MVC框架,而Freemarker则是一个模板引擎,用于生成动态内容。以下是关于...

    Struts2与Freemarker生成xml文本详细步骤

    Struts2是一个流行的Java Web应用程序框架,它提供了一种组织和控制MVC(模型-视图-控制器)架构的方式。而Freemarker则是一个强大的模板引擎,常用于生成动态HTML、XML或其他格式的文本。在Struts2中结合使用...

    Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化

    Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化,以后直接调用即可,无需修改任何源代码,改压缩文件包括 1、工具类; 2、源码(含jar包); 3、mysql数据库可执行文件; 4、struts2集成...

    struts2-freemarker

    Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个强大的MVC(Model-View-Controller)框架,它极大地简化了构建基于Java的Web应用程序的过程。而FreeMarker则是一种模板引擎,主要用于生成...

    freeMarker整合struts2实例调用模板生成html页面

    freeMarker整合struts2实例调用模板生成html页面,对于初学者肯定有用的

    Struts2 和freemarker实例

    Struts2是一个强大的MVC(Model-View-Controller)框架,它是Apache软件基金会下的一个开源项目...这将帮助我们深入理解这两个工具的协同工作方式,以及在实际项目中如何有效地利用它们提高开发效率和应用的可维护性。

    struts2+freemarker

    Struts2 和 Freemarker 是两个在Java Web开发中广泛应用的技术,它们共同构成了强大的MVC(模型-视图-控制器)框架。Struts2是Action框架,主要负责处理用户请求、业务逻辑控制以及与视图层的交互,而Freemarker则是...

    Struts2静态页面生成

    Struts2结合FreeMarker模板引擎可以方便地生成静态页面,提高网站的响应速度和用户体验。 FreeMarker是一个强大的、轻量级的模板语言,用于生成动态内容。它与Java紧密集成,允许开发者用模板来分离业务逻辑和表现...

    Struts2+FreeMarker部署

    Struts2和FreeMarker是两种在Java Web开发中广泛应用的技术。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,用于构建企业级Web应用程序,而FreeMarker则是一个模板引擎,用于生成动态HTML或...

    Struts2与Freemarker的配置方法

    Struts2和Freemarker是Java Web开发中的两个重要组件,它们在构建MVC(Model-View-Controller)架构的应用程序中发挥着关键作用。Struts2作为一个强大的MVC框架,负责处理请求、控制应用程序流程,而Freemarker则是...

    struts2+hibernate+freemarker项目实例

    在Struts2框架中,FreeMarker作为视图层的模板技术,接收来自控制器的数据并根据模板规则生成最终的响应页面。FreeMarker模板语言简洁,易于学习,允许开发者将逻辑与表现分离,提高代码可维护性。 项目实例中的...

    struts1.2+freemarker实现登录成功页面静态化例子

    在本例子中,我们将探讨如何使用Struts1.2和Freemarker2.3.8来实现登录成功页面的静态化。静态化是一种优化网站性能的技术,通过将动态内容提前渲染为静态HTML页面,可以减少服务器处理时间,提高页面加载速度,降低...

    struts2+freemarker 国际化

    Struts2和Freemarker是两个非常流行的Java Web开发框架,它们经常被一起使用来构建动态、交互式的Web应用程序。国际化(Internationalization,通常缩写为i18n)是软件开发中的一个重要概念,它允许应用程序支持不同...

    spring+hibernate+struts2+freemarker SSH2 新闻发布系统

    在新闻发布系统中,Freemarker被用作视图层技术,与Struts2结合,根据Action返回的数据动态生成静态页面。这样可以将业务逻辑与表现逻辑分离,使得代码更加清晰。 5. **用户认证与权限管理** 系统中预设了一个管理...

    生成静态页面 freemarker模板

    在IT行业中,生成静态...总之,使用Freemarker和Struts2生成静态页面能够提高网站的访问速度,降低服务器压力,同时简化了开发流程。结合合理的缓存策略和自动化更新机制,可以实现高效、自动化的静态页面生成方案。

    在struts2中使用freemarker模版

    Struts2是一个强大的Java web应用程序框架,它提供了一种组织应用程序的方式,并且支持多种视图技术,其中之一就是FreeMarker模板。FreeMarker是一个基于模板的、声明式的语言,用于生成动态内容,尤其适合Web应用中...

Global site tag (gtag.js) - Google Analytics