`
精神分裂
  • 浏览: 29331 次
  • 性别: Icon_minigender_1
  • 来自: 二次元世界
社区版块
存档分类
最新评论

Velocity与Struts 1.* -- 静态页生成

阅读更多
在Struts中有两种使用Velocity的方法,一种是利用Velocity的vm模板进行页面展示,一种则是利用Velocity来生成静态页面。以下介绍在Struts 1.*版本中使用Velocity模板生成静态页面的过程。

    思路是访问一个Action,在Action中进行静态页面的生成,最终该Action跳转到生成好的静态页面中。

步骤为:
1. 获取VelocityContext,该对象中包含了需要展示的数据
2. 获取指定路径下的vm模板内容
3. 根据Velocity模板,生成字符串
4. 根据指定路径及文件名创建文件
5. 将转换好的模板文件写入指定文件中

源码如下:
Velocity模板
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
	<title>StrutsSample_1</title>
</head>
<body>
	<h3>StrutsSample</h3>
	<table width="400" border="1">
		#foreach($name in $list)
		    <tr> <td>$name</td> </tr>
		#end
	</table>
</body>
</html>


public class CreateHtmlPage extends DispatchAction {
	public ActionForward createStaticPage(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		ActionForward forward = new ActionForward();
		ActionMessages errors = new ActionMessages();
		String webServer_dir = "D:/Tomcat6/webapps/Mixele_Velocity";
		
		String filepath = webServer_dir + "/success.htm"; //需要生成的静态页
		String vmpath = webServer_dir + "/templates/namelist.vm"; //Velocity模板
		
		VelocityContext context = getContext();
		String templatebody = getTemplateBody(vmpath);
		String str = createHtmlStrByVelocity(context, templatebody);
		File htmlfile = createFile(filepath);
		writerTxtFile(htmlfile, str);
		
		if (!errors.isEmpty()) {
			saveErrors(request, errors);
			forward = new ActionForward(mapping.getInput());
		} else {
			forward = new ActionForward("/success.htm");
		}
		return forward;
	}
	
	/** 获取VelocityContext对象,并向其中注入模板需要展现的数据 */
	public VelocityContext getContext() {
		/* 这里需要注意,因为在web.xml中配置了VelocityViewServlet
		 * 所以这里Velocity会在系统启动时初始化
		 * 如果没有配置,需要先在这里进行Velocity的初始化工作 */
		VelocityContext context = new VelocityContext();
		List<String> list = new ArrayList<String>();
		String name = null;
		for(int i=0;i<20;i++){
			name = "Hoffman YoYo "+i+" Name";
			list.add(name);
		}
		context.put("list", list);
		return context;
	}
	
	/** 通过指定路径获取vm模板并提取模板内容 */
	public String getTemplateBody(String vmpath) {
		File file = new File(vmpath);
		BufferedReader reader = null;
		StringBuffer strbf = new StringBuffer("");
		try {
			reader = new BufferedReader(new FileReader(file));
			String tempString = null;
			int line = 1;
			while ((tempString = reader.readLine()) != null) {
				strbf.append(tempString);
				line++;
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		return strbf.toString();
	}
	
	/** 根据Velocity模板,生成字符串 */
	public String createHtmlStrByVelocity(VelocityContext context, String vmbody) {
		StringWriter writer = new StringWriter();
		try {
			Velocity.evaluate(context, writer, "myString", vmbody);
		} catch (ParseErrorException e) {
			e.printStackTrace();
		} catch (MethodInvocationException e) {
			e.printStackTrace();
		} catch (ResourceNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return writer.toString();
	}
	
	/** 在指定路径中创建由Velocity解析出的html文件
	 * 当文件存在时,删除该文件,重新创建 */
	public File createFile(String filepath) {
        File file = new File(filepath);
        if(file.exists() && file.isFile()) {
        	boolean delFileSuccess = file.delete(); //文件存在删除之
            if(!delFileSuccess) {
            	System.out.println("删除文件" + filepath + "失败!");
            }
            try {
            	boolean cresteFileSuccess = file.createNewFile();
                if (!cresteFileSuccess) {
                	System.out.println("创建文件" + filepath + "失败!");
                }
			} catch (IOException e) {
				e.printStackTrace();
			}
        }
		return file;
	}
	
	/** 写文本文件 */
	public void writerTxtFile(File filepath, String str) {
		PrintWriter out = null;
		try {
			out = new PrintWriter(new BufferedWriter(new FileWriter(filepath), 1024));
		} catch (IOException e) {
			e.printStackTrace();
		}
		out.println(str);
		out.flush();
		out.close();
	}
}

通过以上的代码,即可将赋予VelocityContext中的数据与VM模板组合,生成静态页面。
以上代码很多地方都是硬编码,其实在实际工程中,静态化的步骤不会发生太大变化,只是模板与生成页面的路径会有更复杂的获取过程。
分享到:
评论

相关推荐

    velocity-1.7.jar

    **Velocity-1.7.jar** 是一个用于Java应用程序的模板引擎,它允许开发者将静态页面内容与动态数据相结合,生成HTML、XML或者其他格式的输出。Velocity由Apache软件基金会开发,是Apache Turbine项目的一部分,后来...

    Velocity语法以及整合struts2总结

    1. **配置Struts2**:在`struts.xml`配置文件中,需要指定`struts.velocity.toolboxlocation`常量,指向Velocity的工具箱配置文件,如`/WEB-INF/toolbox.xml`。 2. **配置Action结果**:在Action的配置中,设置`...

    happycoding_libs_02

    9. **velocity-1.5.jar** - Velocity是一个基于模板语言的Java模板引擎,用于生成动态网页内容。版本1.5在Web应用中生成静态页面和电子邮件等方面非常实用。 10. **spring-beans.jar** - 这是Spring框架的一部分,...

    struts2要用到的所有jar包全集

    1. **struts2-dojo-plugin-2.2.1.jar**:这是Struts2的一个插件,它提供了与Dojo JavaScript库的集成。Dojo是一个强大的JavaScript工具集,用于创建交互式的用户界面,包括数据网格、图表和表单组件。通过这个插件,...

    Struts2 与 Velocity 实例

    在实际开发中,Struts2 通常与 Velocity 结合使用,Struts2 负责业务逻辑和请求处理,Velocity 负责生成动态内容。通过将 Velocity 模板嵌入到 Struts2 的结果中,可以构建出灵活且易于维护的Web应用。在提供的...

    Struts2权威指南完整版pdf

    - 结果(Result)定义了Action执行后如何展示响应,如转发、重定向或生成静态内容。常见的Result类型有dispatcher(用于转发)、stream(用于输出流)和redirectAction(重定向到另一个Action)。 3. **拦截器...

    vtl.rar_VTL.rar_velocity

    - Velocity可以轻松与Spring、Struts等MVC框架集成,提升Web应用的开发效率。 通过这个"vtl.rar_VTL.rar_velocity"压缩包的学习,你可以逐步了解并熟练掌握Velocity框架,提升你的Web开发能力,尤其是对于动态内容...

    struts2.2.3.1帮助文档

    5. **结果类型(Result Types)**:预定义的或自定义的结果类型决定Action执行后如何呈现结果,如转发到另一个页面(`dispatcher`)、生成静态内容(`stream`)等。 6. **插件体系**:Struts2具有强大的插件支持,...

    java面试题(整理)

    Struts可以通过Velocity模板引擎来生成视图。 5. **Struts的优缺点** - **优点**:良好的架构设计,易于维护。 - **缺点**:配置繁琐,学习曲线较陡峭。 #### 五、Hibernate相关 1. **O/R Mapping的理解与在...

    JavaFan 建站系统 v3.9.16-源码.zip

    2. **MVC框架**:JavaFan可能采用了某种MVC(Model-View-Controller)框架,如Spring MVC或Struts,来实现业务逻辑与视图的分离。理解这一设计模式对于提升代码组织和可维护性至关重要。 3. **数据库交互**:系统很...

    struts2配置与工作原理

    ### Struts2配置与工作原理详解 #### 一、Struts2概述 Struts2是Apache Struts项目下的一个开源框架,它继承了Struts1的一些特性,同时又结合了WebWork框架的优点,使得它在Java Web开发领域具有很强的竞争优势。...

    WEB网站架构分析HTML静态化.pdf

    2. **Servlet与web.xml配置**:在Struts或Servlet中处理请求,判断是否需要生成静态HTML,并进行相应的URL重写操作。 3. **JSP生成静态HTML**:常见方法包括: - 直接在JSP页面中使用`&lt;jsp:include&gt;`或`&lt;c:out&gt;`...

    velocity文档

    Velocity 是一个开源的 Java 模板引擎,它允许开发者将静态页面内容与动态数据源分离,从而让网页设计人员专注于页面布局,而开发人员则可以集中精力处理业务逻辑。Velocity 被广泛应用于 Web 开发中的视图层,尤其...

    struts-2.3.24所有架包

    7. **模板技术支持**:Struts2可以与FreeMarker、JSP、Velocity等模板技术无缝结合,方便生成动态视图。 8. **国际化支持**:Struts2内置了对多语言环境的支持,可以轻松实现应用的国际化。 压缩包中的“struts-...

    Velocity用户手册 中文版

    1. **模板(Template)**:模板是Velocity的核心,它是HTML或XML等静态页面中嵌入了Velocity指令的文件,用于生成最终的输出文档。 2. **上下文(Context)**:上下文是模板和应用程序之间的桥梁,它存储了模板需要...

    velocity1.4.jar

    - **MVC 框架**: 与 Struts、Spring MVC 等框架配合,实现动态页面生成。 - **邮件模板**: 生成个性化邮件内容。 - **报告生成**: 生成 PDF、Excel 等格式的报告。 - **配置文件生成**: 根据模板生成配置文件。 ...

    Velocity+Struts生成html

    ** Velocity + Struts 生成 HTML ** 在Java Web开发中,Velocity和Struts是两个非常重要的框架,它们常被用来构建动态网站和企业级应用。Velocity是一个基于模板语言的轻量级视图技术,而Struts则是一个MVC(Model-...

    velocity 使用手冊整理

    - **模板(Template)**: 模板是 Velocity 的基础,它是静态文本与动态内容的混合体。在模板中,你可以插入变量和控制结构,这些元素会被 Velocity 解析并替换为相应的值。 - **上下文(Context)**: 上下文是模板...

    velocity中文文档 教程

    3. **合并上下文和模板**:通过`VelocityTemplate.merge(context, writer)`方法,将上下文中的数据与模板结合,生成最终的输出。 4. **输出结果**:生成的输出可以写入到文件、流或其他输出设备。 **Velocity的优势...

Global site tag (gtag.js) - Google Analytics