- 浏览: 10533 次
- 性别:
- 来自: 上海
文章分类
最新评论
顶
0
踩 利用Struts2生成静态页面其实很灵活,很强大,尤其是利用Struts2对Freemarker较好的支持,充分利用Freemarker的模板功能来生成静态页面。
基本思路为:利用Struts2对自定义result type的支持,自定义能够生成静态页面的result type,结合模板引擎Freemarker可以实现大批量静态页面的生成。
参看org.apache.struts2.views.freemarker.FreemarkerResult的代码实现,自定义了自己的生成静态页 面的result type。此种方案不单纯用于生成静态页面,其实也可以用于生成诸如wml、xhtml等内容,具体可以参考Struts2缺省提供的各种result type的实现。
标签: FreeMarker web.xml Struts 代码片段(2)
[代码] FreemarkerResult.java
view sourceprint?
001 package com.mobilesoft.esales.webapp.action;
002 import java.io.BufferedWriter;
003 import java.io.File;
004 import java.io.FileOutputStream;
005 import java.io.IOException;
006 import java.io.OutputStreamWriter;
007 import java.io.Writer;
008 import java.util.Locale;
009 import javax.servlet.ServletContext;
010 import javax.servlet.http.HttpServletRequest;
011 import javax.servlet.http.HttpServletResponse;
012 import org.apache.struts2.ServletActionContext;
013 import org.apache.struts2.dispatcher.StrutsResultSupport;
014 import org.apache.struts2.views.freemarker.FreemarkerManager;
015 import org.apache.struts2.views.util.ResourceUtil;
016 import com.opensymphony.xwork2.ActionContext;
017 import com.opensymphony.xwork2.ActionInvocation;
018 import com.opensymphony.xwork2.LocaleProvider;
019 import com.opensymphony.xwork2.inject.Inject;
020 import com.opensymphony.xwork2.util.ValueStack;
021 import freemarker.template.Configuration;
022 import freemarker.template.ObjectWrapper;
023 import freemarker.template.Template;
024 import freemarker.template.TemplateException;
025 import freemarker.template.TemplateModel;
026 import freemarker.template.TemplateModelException;
027
028 public class FreemarkerResult extends StrutsResultSupport {
029 private static final long serialVersionUID = -3778230771704661631L;
030 protected ActionInvocation invocation;
031 protected Configuration configuration;
032 protected ObjectWrapper wrapper;
033 protected FreemarkerManager freemarkerManager;
034 private Writer writer;
035 protected String location;
036 private String pContentType = “text/html”;
037 protected String fileName; // 要生成的静态页面名称
038 protected String filePath; // 要生成的静态页面的路径
039 protected String staticTemplate; // 用于生成静态页面Freemarker模板的路径
040 public FreemarkerResult() {
041 super();
042 }
043 public FreemarkerResult(String location) {
044 super(location);
045 }
046 @Inject
047 public void setFreemarkerManager(FreemarkerManager mgr) {
048 this.freemarkerManager = mgr;
049 }
050 public void setContentType(String aContentType) {
051 pContentType = aContentType;
052 }
053 public String getContentType() {
054 return pContentType;
055 }
056 public void doExecute(String location, ActionInvocation invocation)
057 throws IOException, TemplateException {
058 this.location = location;
059 this.invocation = invocation;
060 this.configuration = getConfiguration();
061 this.wrapper = getObjectWrapper();
062 this.fileName = (String) conditionalParse(fileName, invocation);
063 this.staticTemplate = (String) conditionalParse(staticTemplate, invocation);
064 this.filePath = ((String) conditionalParse(filePath, invocation)) == null ? “”
065 : ((String) conditionalParse(filePath, invocation));
066 if (!location.startsWith(”/”)) {
067 ActionContext ctx = invocation.getInvocationContext();
068 HttpServletRequest req = (HttpServletRequest) ctx
069 .get(ServletActionContext.HTTP_REQUEST);
070 String base = ResourceUtil.getResourceBase(req);
071 location = base + “/” + location;
072 }
073 //生成html页面的模板类
074 Template template = configuration.getTemplate(location, deduceLocale());
075 // 生成静态页面的的模板类
076 Template staticTemplate = configuration.getTemplate(this.staticTemplate,
077 deduceLocale());
078 TemplateModel model = createModel();
079 String path = ServletActionContext.getServletContext().getRealPath(
080 filePath)
081 + File.separator;
082 Writer out = new BufferedWriter(new OutputStreamWriter(
083 new FileOutputStream(path + fileName)));
084 if (preTemplateProcess(template, model)) {
085 try {
086 staticTemplate.process(model, out);
087 template.process(model, getWriter());
088 } finally {
089 postTemplateProcess(template, model);
090 postTemplateProcess(staticTemplate, model);
091 }
092 }
093 }
094 protected Configuration getConfiguration() throws TemplateException {
095 return freemarkerManager.getConfiguration(ServletActionContext
096 .getServletContext());
097 }
098 protected ObjectWrapper getObjectWrapper() {
099 return configuration.getObjectWrapper();
100 }
101 public void setWriter(Writer writer) {
102 this.writer = writer;
103 }
104 protected Writer getWriter() throws IOException {
105 if (writer != null) {
106 return writer;
107 }
108 return ServletActionContext.getResponse().getWriter();
109 }
110 protected TemplateModel createModel() throws TemplateModelException {
111 ServletContext servletContext = ServletActionContext
112 .getServletContext();
113 HttpServletRequest request = ServletActionContext.getRequest();
114 HttpServletResponse response = ServletActionContext.getResponse();
115 ValueStack stack = ServletActionContext.getContext().getValueStack();
116 Object action = null;
117 if (invocation != null)
118 action = invocation.getAction(); // Added for NullPointException
119 return freemarkerManager.buildTemplateModel(stack, action,
120 servletContext, request, response, wrapper);
121 }
122 protected Locale deduceLocale() {
123 if (invocation.getAction() instanceof LocaleProvider) {
124 return ((LocaleProvider) invocation.getAction()).getLocale();
125 } else {
126 return configuration.getLocale();
127 }
128 }
129 protected void postTemplateProcess(Template template, TemplateModel data)
130 throws IOException {
131 }
132 protected boolean preTemplateProcess(Template template, TemplateModel model)
133 throws IOException {
134 Object attrContentType = template.getCustomAttribute(”content_type”);
135 if (attrContentType != null) {
136 ServletActionContext.getResponse().setContentType(
137 attrContentType.toString());
138 } else {
139 String contentType = getContentType();
140 if (contentType == null) {
141 contentType = “text/html”;
142 }
143 String encoding = template.getEncoding();
144 if (encoding != null) {
145 contentType = contentType + “; charset=” + encoding;
146 }
147 ServletActionContext.getResponse().setContentType(contentType);
148 }
149 return true;
150 }
151 public String getFileName() {
152 return fileName;
153 }
154 public void setFileName(String fileName) {
155 this.fileName = fileName;
156 }
157 public String getFilePath() {
158 return filePath;
159 }
160 public void setFilePath(String filePath) {
161 this.filePath = filePath;
162 }
163 public String getStaticTemplate() {
164 return staticTemplate;
165 }
166 public void setStaticTemplate(String staticTemplate) {
167 this.staticTemplate = staticTemplate;
168 }
169 }
[代码] struts.xml
view sourceprint?1 <action name=”staticViewAction” class=”com.mobilesoft.esales.webapp.action.StaticViewtAction”>
2 <result name=”success” type=”staticview”>
3 <param name=”location”>test/freemarkertest.ftl</param>
4 <param name=”contentType”>text/html</param>
5 <param name=”fileName”>${filename}</param>
6 <param name=”staticTemplate”>test/freemarkertest.ftl</param>
7 <param name=”filePath”>static</param>
8 </result>
9 </action>
0
踩 利用Struts2生成静态页面其实很灵活,很强大,尤其是利用Struts2对Freemarker较好的支持,充分利用Freemarker的模板功能来生成静态页面。
基本思路为:利用Struts2对自定义result type的支持,自定义能够生成静态页面的result type,结合模板引擎Freemarker可以实现大批量静态页面的生成。
参看org.apache.struts2.views.freemarker.FreemarkerResult的代码实现,自定义了自己的生成静态页 面的result type。此种方案不单纯用于生成静态页面,其实也可以用于生成诸如wml、xhtml等内容,具体可以参考Struts2缺省提供的各种result type的实现。
标签: FreeMarker web.xml Struts 代码片段(2)
[代码] FreemarkerResult.java
view sourceprint?
001 package com.mobilesoft.esales.webapp.action;
002 import java.io.BufferedWriter;
003 import java.io.File;
004 import java.io.FileOutputStream;
005 import java.io.IOException;
006 import java.io.OutputStreamWriter;
007 import java.io.Writer;
008 import java.util.Locale;
009 import javax.servlet.ServletContext;
010 import javax.servlet.http.HttpServletRequest;
011 import javax.servlet.http.HttpServletResponse;
012 import org.apache.struts2.ServletActionContext;
013 import org.apache.struts2.dispatcher.StrutsResultSupport;
014 import org.apache.struts2.views.freemarker.FreemarkerManager;
015 import org.apache.struts2.views.util.ResourceUtil;
016 import com.opensymphony.xwork2.ActionContext;
017 import com.opensymphony.xwork2.ActionInvocation;
018 import com.opensymphony.xwork2.LocaleProvider;
019 import com.opensymphony.xwork2.inject.Inject;
020 import com.opensymphony.xwork2.util.ValueStack;
021 import freemarker.template.Configuration;
022 import freemarker.template.ObjectWrapper;
023 import freemarker.template.Template;
024 import freemarker.template.TemplateException;
025 import freemarker.template.TemplateModel;
026 import freemarker.template.TemplateModelException;
027
028 public class FreemarkerResult extends StrutsResultSupport {
029 private static final long serialVersionUID = -3778230771704661631L;
030 protected ActionInvocation invocation;
031 protected Configuration configuration;
032 protected ObjectWrapper wrapper;
033 protected FreemarkerManager freemarkerManager;
034 private Writer writer;
035 protected String location;
036 private String pContentType = “text/html”;
037 protected String fileName; // 要生成的静态页面名称
038 protected String filePath; // 要生成的静态页面的路径
039 protected String staticTemplate; // 用于生成静态页面Freemarker模板的路径
040 public FreemarkerResult() {
041 super();
042 }
043 public FreemarkerResult(String location) {
044 super(location);
045 }
046 @Inject
047 public void setFreemarkerManager(FreemarkerManager mgr) {
048 this.freemarkerManager = mgr;
049 }
050 public void setContentType(String aContentType) {
051 pContentType = aContentType;
052 }
053 public String getContentType() {
054 return pContentType;
055 }
056 public void doExecute(String location, ActionInvocation invocation)
057 throws IOException, TemplateException {
058 this.location = location;
059 this.invocation = invocation;
060 this.configuration = getConfiguration();
061 this.wrapper = getObjectWrapper();
062 this.fileName = (String) conditionalParse(fileName, invocation);
063 this.staticTemplate = (String) conditionalParse(staticTemplate, invocation);
064 this.filePath = ((String) conditionalParse(filePath, invocation)) == null ? “”
065 : ((String) conditionalParse(filePath, invocation));
066 if (!location.startsWith(”/”)) {
067 ActionContext ctx = invocation.getInvocationContext();
068 HttpServletRequest req = (HttpServletRequest) ctx
069 .get(ServletActionContext.HTTP_REQUEST);
070 String base = ResourceUtil.getResourceBase(req);
071 location = base + “/” + location;
072 }
073 //生成html页面的模板类
074 Template template = configuration.getTemplate(location, deduceLocale());
075 // 生成静态页面的的模板类
076 Template staticTemplate = configuration.getTemplate(this.staticTemplate,
077 deduceLocale());
078 TemplateModel model = createModel();
079 String path = ServletActionContext.getServletContext().getRealPath(
080 filePath)
081 + File.separator;
082 Writer out = new BufferedWriter(new OutputStreamWriter(
083 new FileOutputStream(path + fileName)));
084 if (preTemplateProcess(template, model)) {
085 try {
086 staticTemplate.process(model, out);
087 template.process(model, getWriter());
088 } finally {
089 postTemplateProcess(template, model);
090 postTemplateProcess(staticTemplate, model);
091 }
092 }
093 }
094 protected Configuration getConfiguration() throws TemplateException {
095 return freemarkerManager.getConfiguration(ServletActionContext
096 .getServletContext());
097 }
098 protected ObjectWrapper getObjectWrapper() {
099 return configuration.getObjectWrapper();
100 }
101 public void setWriter(Writer writer) {
102 this.writer = writer;
103 }
104 protected Writer getWriter() throws IOException {
105 if (writer != null) {
106 return writer;
107 }
108 return ServletActionContext.getResponse().getWriter();
109 }
110 protected TemplateModel createModel() throws TemplateModelException {
111 ServletContext servletContext = ServletActionContext
112 .getServletContext();
113 HttpServletRequest request = ServletActionContext.getRequest();
114 HttpServletResponse response = ServletActionContext.getResponse();
115 ValueStack stack = ServletActionContext.getContext().getValueStack();
116 Object action = null;
117 if (invocation != null)
118 action = invocation.getAction(); // Added for NullPointException
119 return freemarkerManager.buildTemplateModel(stack, action,
120 servletContext, request, response, wrapper);
121 }
122 protected Locale deduceLocale() {
123 if (invocation.getAction() instanceof LocaleProvider) {
124 return ((LocaleProvider) invocation.getAction()).getLocale();
125 } else {
126 return configuration.getLocale();
127 }
128 }
129 protected void postTemplateProcess(Template template, TemplateModel data)
130 throws IOException {
131 }
132 protected boolean preTemplateProcess(Template template, TemplateModel model)
133 throws IOException {
134 Object attrContentType = template.getCustomAttribute(”content_type”);
135 if (attrContentType != null) {
136 ServletActionContext.getResponse().setContentType(
137 attrContentType.toString());
138 } else {
139 String contentType = getContentType();
140 if (contentType == null) {
141 contentType = “text/html”;
142 }
143 String encoding = template.getEncoding();
144 if (encoding != null) {
145 contentType = contentType + “; charset=” + encoding;
146 }
147 ServletActionContext.getResponse().setContentType(contentType);
148 }
149 return true;
150 }
151 public String getFileName() {
152 return fileName;
153 }
154 public void setFileName(String fileName) {
155 this.fileName = fileName;
156 }
157 public String getFilePath() {
158 return filePath;
159 }
160 public void setFilePath(String filePath) {
161 this.filePath = filePath;
162 }
163 public String getStaticTemplate() {
164 return staticTemplate;
165 }
166 public void setStaticTemplate(String staticTemplate) {
167 this.staticTemplate = staticTemplate;
168 }
169 }
[代码] struts.xml
view sourceprint?1 <action name=”staticViewAction” class=”com.mobilesoft.esales.webapp.action.StaticViewtAction”>
2 <result name=”success” type=”staticview”>
3 <param name=”location”>test/freemarkertest.ftl</param>
4 <param name=”contentType”>text/html</param>
5 <param name=”fileName”>${filename}</param>
6 <param name=”staticTemplate”>test/freemarkertest.ftl</param>
7 <param name=”filePath”>static</param>
8 </result>
9 </action>
相关推荐
8. **静态页面生成**:整合Struts2和Freemarker的一个常见应用是生成静态页面,提高网站性能。这通常通过在Action中触发静态化逻辑,将Freemarker渲染后的HTML保存到磁盘,然后直接返回这些静态页面。 9. **错误和...
FreeMarker与Struts2的...通过这个案例,开发者可以学习到如何将FreeMarker与Struts2结合起来,实现动态生成静态页面,以及如何使用c3p0和dbUtils进行数据库操作。这对于理解Web应用的架构和提高开发效率具有重要意义。
在新闻发布系统中,Freemarker被用作视图层技术,与Struts2结合,根据Action返回的数据动态生成静态页面。这样可以将业务逻辑与表现逻辑分离,使得代码更加清晰。 5. **用户认证与权限管理** 系统中预设了一个管理...
部署到tomcat中, 访问/freemarker/build_index.action 点击首页生成,当显示生成成功过后 然后访问 ...已经完美将struts2+freemarker+spring整合~ 希望对你们有所帮助。 经测试:tomcat5.5 无法正常运行
Struts2整合FreeMarker实例框架初学例子....利用Struts2生成静态页面其实很灵活,很强大,尤其是利用Struts2对Freemarker较好的支持,充分利用Freemarker的模板功能来生成静态页面。 比较简单.大家见笑了.
- 在实际应用中,可以通过缓存机制将生成的静态页面保存,减少不必要的数据库查询。 综上所述,Struts1.2与FreeMarker的结合使用,能够有效地提升Web应用的性能,通过FreeMarker模板的预渲染减少与数据库的交互,...
在Struts与FreeMarker的整合中,通常需要在Struts的配置文件(struts-config.xml或struts2的struts.xml)中定义Action和对应的Result,指定使用FreeMarker来渲染结果。例如: ```xml <result type="freemarker">/...
Struts2、Freemarker和Log4j是Java Web开发中的三个重要组件,它们各自扮演着不同的角色。这里,我们来深入探讨这三个技术的核心概念及其整合应用。 **Struts2** 是一个开源的MVC(Model-View-Controller)框架,...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责不同的职责,并通过整合可以构建出高效、模块化的应用程序。在这个“基于Struts2 Spring Hibernate整合”的项目中,我们看到开发者使用了Maven...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责Web应用的不同层面,协同工作可以构建出高效、可维护的系统。Struts2主要用于处理MVC(Model-View-Controller)架构中的Controller部分,Spring...
Struts2、Spring、Hibernate 和 FreeMarker 是Java Web开发中常用的四大框架,它们结合使用能够构建高效、可维护的企业级应用程序。以下是对这些技术及其整合的详细解释: **Struts2** 是一个基于MVC(Model-View-...
FreeMarker是一款强大的、开源的模板引擎,主要用于生成...通过以上内容的学习,开发者不仅可以理解FreeMarker的基础知识,还能掌握在Struts2项目中实际运用FreeMarker的方法,从而提高Web应用的开发效率和代码质量。
在本文中,我们将深入探讨...通过以上步骤,我们成功地将Spring MVC、Tiles和FreeMarker整合在一起,实现了动态内容和页面布局的灵活管理。这样的整合使得Web应用程序的开发更加高效,提高了代码的可维护性和可扩展性。
6. **整合应用优势**: 将Struts、Spring、Hibernate和Freemarker整合在一起,可以实现松耦合、高内聚的设计,提高代码的可维护性和可扩展性。此外,这四个框架都有丰富的社区支持和强大的功能,可以应对复杂的应用...
整合Struts2、Hibernate和JSP,主要是将Struts2的动作控制与Hibernate的数据访问结合,通过JSP展示数据。以下是一些整合过程中的关键点: 1. **配置整合**:在Struts2的配置文件(struts.xml)中,需要定义Action类...
Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为构建可维护性高、结构清晰的Web应用程序提供了一种解决方案。这个框架旨在简化开发过程,提高代码的可测试性和可重用性。下面...
FreeMarker 和 Struts2 是两种常见的 Java Web 开发技术,它们在构建 MVC(Model-View-Controller)架构的应用程序中发挥着关键作用。 **FreeMarker 知识点:** 1. **FreeMarker 是一个模板引擎**:它的主要功能是...
Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建高效、可扩展的Java Web应用程序。...在实际开发中,理解并熟练掌握Struts2的各种概念和实践,将有助于构建高效、可维护的Web应用程序。
总的来说,JFreeChart和Struts2的整合,使得开发者能够方便地在Web应用中集成动态图表功能,这对于数据分析、监控和报告等场景尤其有用。理解并掌握这种整合方式,对于提升Java Web开发能力是非常有益的。
Struts2、Hibernate、Spring 和 ExtJS 是四个在IT行业中广泛应用的开源框架和技术,它们各自在Web应用程序开发中扮演着重要角色。这个压缩包文件似乎包含了一个整合了这些技术的实际项目,为学习者提供了宝贵的实践...