`

Struts2和Freemarker整合应用静态页面

阅读更多

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>
分享到:
评论

相关推荐

    Struts2整合Freemarker生成静态页面

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

    FreeMarker与struts2整合生成静态页面

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

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

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

    freemarker+struts2+spring完美整合!

    部署到tomcat中, 访问/freemarker/build_index.action 点击首页生成,当显示生成成功过后 然后访问 ...已经完美将struts2+freemarker+spring整合~ 希望对你们有所帮助。 经测试:tomcat5.5 无法正常运行

    struts2+freemarker 框架

    Struts2整合FreeMarker实例框架初学例子....利用Struts2生成静态页面其实很灵活,很强大,尤其是利用Struts2对Freemarker较好的支持,充分利用Freemarker的模板功能来生成静态页面。 比较简单.大家见笑了.

    struts1.2+freeMarker

    - 在实际应用中,可以通过缓存机制将生成的静态页面保存,减少不必要的数据库查询。 综上所述,Struts1.2与FreeMarker的结合使用,能够有效地提升Web应用的性能,通过FreeMarker模板的预渲染减少与数据库的交互,...

    struts+freemarker 源码例

    在Struts与FreeMarker的整合中,通常需要在Struts的配置文件(struts-config.xml或struts2的struts.xml)中定义Action和对应的Result,指定使用FreeMarker来渲染结果。例如: ```xml &lt;result type="freemarker"&gt;/...

    struts2+freemarker+log4j

    Struts2、Freemarker和Log4j是Java Web开发中的三个重要组件,它们各自扮演着不同的角色。这里,我们来深入探讨这三个技术的核心概念及其整合应用。 **Struts2** 是一个开源的MVC(Model-View-Controller)框架,...

    基于struts2 spring hibernate整合

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责不同的职责,并通过整合可以构建出高效、模块化的应用程序。在这个“基于Struts2 Spring Hibernate整合”的项目中,我们看到开发者使用了Maven...

    struts2 spring hibernate 整合架构

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自负责Web应用的不同层面,协同工作可以构建出高效、可维护的系统。Struts2主要用于处理MVC(Model-View-Controller)架构中的Controller部分,Spring...

    Struts2+Spring2.5+hibernate3.2+freemarker

    Struts2、Spring、Hibernate 和 FreeMarker 是Java Web开发中常用的四大框架,它们结合使用能够构建高效、可维护的企业级应用程序。以下是对这些技术及其整合的详细解释: **Struts2** 是一个基于MVC(Model-View-...

    FreeMarker应用实例和PPT

    FreeMarker是一款强大的、开源的模板引擎,主要用于生成...通过以上内容的学习,开发者不仅可以理解FreeMarker的基础知识,还能掌握在Struts2项目中实际运用FreeMarker的方法,从而提高Web应用的开发效率和代码质量。

    Spring MVC + Tiles + FreeMarker 的整合

    在本文中,我们将深入探讨...通过以上步骤,我们成功地将Spring MVC、Tiles和FreeMarker整合在一起,实现了动态内容和页面布局的灵活管理。这样的整合使得Web应用程序的开发更加高效,提高了代码的可维护性和可扩展性。

    Struts+Spring+Hibernate+Freemarker新闻系统

    6. **整合应用优势**: 将Struts、Spring、Hibernate和Freemarker整合在一起,可以实现松耦合、高内聚的设计,提高代码的可维护性和可扩展性。此外,这四个框架都有丰富的社区支持和强大的功能,可以应对复杂的应用...

    当当网用struts2和hibernate和jsp的整合版

    整合Struts2、Hibernate和JSP,主要是将Struts2的动作控制与Hibernate的数据访问结合,通过JSP展示数据。以下是一些整合过程中的关键点: 1. **配置整合**:在Struts2的配置文件(struts.xml)中,需要定义Action类...

    Struts2框架及注释和用法

    Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为构建可维护性高、结构清晰的Web应用程序提供了一种解决方案。这个框架旨在简化开发过程,提高代码的可测试性和可重用性。下面...

    freemaker+struts2

    FreeMarker 和 Struts2 是两种常见的 Java Web 开发技术,它们在构建 MVC(Model-View-Controller)架构的应用程序中发挥着关键作用。 **FreeMarker 知识点:** 1. **FreeMarker 是一个模板引擎**:它的主要功能是...

    使用Struts2开发Java Web应用程序

    Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建高效、可扩展的Java Web应用程序。...在实际开发中,理解并熟练掌握Struts2的各种概念和实践,将有助于构建高效、可维护的Web应用程序。

    jfreechart整合struts2的压缩包

    总的来说,JFreeChart和Struts2的整合,使得开发者能够方便地在Web应用中集成动态图表功能,这对于数据分析、监控和报告等场景尤其有用。理解并掌握这种整合方式,对于提升Java Web开发能力是非常有益的。

    struts2 hibernate spring extjs 应用项目

    Struts2、Hibernate、Spring 和 ExtJS 是四个在IT行业中广泛应用的开源框架和技术,它们各自在Web应用程序开发中扮演着重要角色。这个压缩包文件似乎包含了一个整合了这些技术的实际项目,为学习者提供了宝贵的实践...

Global site tag (gtag.js) - Google Analytics