`

使用Spring计时器和velocity模板定时生成静态html/jsp文件

阅读更多
当一个页面不是经常需要更新的话,就需要为它定时生成一个静态文件,这样可以减轻服务器压力,相应的也减少了用户等待时间。

首先看一下一个主jsp文件:
<%@ page contentType="text/html; charset=UTF-8"%>
 <?xml version="1.0"?>  
 <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html>
<head>
	<title>新闻快讯</title>
	<link rel="stylesheet" type="text/css" href="CSS/styles.css">
</head>
<body>
	。。。。。。
	<!--这是个需要生成的文件,当然你也可以生成html文件,但是需要注意乱码-->
	<jsp:include page="baseInfoMiddle.jsp"></jsp:include>
	
	。。。。。。
</body>
</html>


配置Spring文件:
<!-- velocityEngine生成模板文件 -->
  <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
        <property name="velocityProperties">   
            <props>   
                <prop key="resource.loader">class</prop>   
                <prop key="class.resource.loader.class">   
                    org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader   
                </prop>   
                <prop key="velocimacro.library"></prop>   
            </props>   
        </property>   
   </bean>
  <!-- 定时器 -->
<!-- 要调用的工作类 --> 
 <bean id ="quartzJob" class ="com.tlt.app.util.QuartzJob">
 	<property name="velocityEngine" ref="velocityEngine" />
 </bean>
 <!-- 定义调用对象和调用对象的方法 --> 
 <bean id ="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
	 <!-- 调用的类 --> 
	 <property name="targetObject"> 
	 	<ref bean="quartzJob" /> 
	 </property> 
	 <!-- 调用类中的方法 --> 
	 <property name="targetMethod"> 
	 	<value>work</value> 
	 </property> 
 </bean>
 <!-- 定义触发时间 --> 
 <bean id ="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
	 <property name="jobDetail"> 
	 	<ref bean="jobtask" /> 
	 </property> 
	 <!-- cron表达式 --> 
	 <property name="cronExpression">
	 	<!-- 每天凌晨4点触发
	 	<value>0 0 4 * * ?</value> 
	 	 -->
	 	 <!-- 每隔1分钟执行1次,为了测试 -->
	 	<value>0 0/1 * * * ?</value> 
	 </property> 
 </bean>
 <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 --> 
 <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
	 <property name="triggers" > 
		 <list> 
		 	<ref bean="doTime" /> 
		 </list> 
	 </property> 
 </bean>


编写要调用的工作类QuartzJob:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.VelocityException;
import org.springframework.ui.velocity.VelocityEngineUtils;

public class QuartzJob {
	VelocityEngine velocityEngine;
	private int count;
	public void work(){
////////////////////////////////////////////////////////////////////////////
//这里每个人的写法不同,但不管怎么样,目的只有一个:获得想要的数据。我这里是通过post请求返回数据后解析,最后把想要的数据填入下面的HashMap<String, String>中就ok了;当然你也可以从数据库中获取数据。
//		System.out.println("----------开始HTTP连接----------");
//		String url="http://XXX.XXX.XXX.XXX";
//		WebClient client=new WebClient();
//		String content="";
//		try {
//			content = client.getWebContentByPost(url,"action=login&loginname=13761083826&password=111111");
//			content = new String(content.getBytes("iso-8859-1"),"UTF-8");
//			System.out.println(content);
//			client=null;
//		} catch (IOException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//		System.out.println("----------结束HTTP连接----------");
//		System.out.println("----------解析xml开始----------");
//		parse(content);
//		System.out.println("----------解析xml结束----------");
////////////////////////////////////////////////////////////////////////////		
		Map<String, String> model=new HashMap<String, String>();
		model.put("填入需要的key1", "填入需要的值1");
		model.put("填入需要的key2", "填入需要的值2");
		String result = null;
		try {
			result=VelocityEngineUtils.mergeTemplateIntoString(this.getVelocityEngine(), "vm/baseInfoMiddle.vm", "UTF-8",model);
		} catch (VelocityException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
//		System.out.println("result="+result);//打印看看,如果乱码,将baseInfoMiddle.vm文件保存成UTF-8格式
		try {
//通常情况下,静态文件都需要生成在tomcat\webapps\yourProject下
//			String toPath="D:\\Program Files\\Apache Software Foundation\\Tomcat 5.5\\webapps\\yourProject\\baseInfoMiddle.jsp";
//如果下面的写法,文件将生成在tomcat\bin下
//String toPath="baseInfoMiddle.jsp";
//文件最终的生成地址,可以像下面那样。这样不管tomcat装在哪里!
			String toPath="..\\webapps\\yourProject\\baseInfoMiddle.jsp";
			PrintWriter writer = new PrintWriter(toPath,"UTF-8");
			writer.println(result);
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println( "[Quartz任务调度生成文件]:"+count++ );
	}
	
	public VelocityEngine getVelocityEngine() {
		return velocityEngine;
	}
	public void setVelocityEngine(VelocityEngine velocityEngine) {
		this.velocityEngine = velocityEngine;
	}
}


同时奉送WebClient.java类,该类用于网络连接,应该一看就能明白
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class WebClient {
	
	public WebClient(){
		
	}

	public String getWebContentByGet(String urlString, final String charset,
			int timeout) throws IOException {
		if (urlString == null || urlString.length() == 0) {
			return null;
		}
		urlString = (urlString.startsWith("http://") || urlString
				.startsWith("https://")) ? urlString : ("http://" + urlString)
				.intern();
		URL url = new URL(urlString);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("GET");
		// 增加报头,模拟浏览器,防止屏蔽
		conn.setRequestProperty(
						"User-Agent",
						"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
		// 只接受text/html类型,当然也可以接受图片,pdf,*/*任意,就是tomcat/conf/web里面定义那些
		conn.setRequestProperty("Accept", "text/html");
		conn.setConnectTimeout(timeout);
		try {
			if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
				return null;
			}
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		InputStream input = conn.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(input,charset));
		String line = null;
		StringBuffer sb = new StringBuffer();
		while ((line = reader.readLine()) != null) {
			sb.append(line).append("\r\n");
		}
		if (reader != null) {
			reader.close();
		}
		if (conn != null) {
			conn.disconnect();
		}
		return sb.toString();

	}

	public String getWebContentByGet(String urlString) throws IOException {
		return getWebContentByGet(urlString, "iso-8859-1", 5000);
	}

	public String getWebContentByPost(String urlString,String data, final String charset,
			int timeout)throws IOException{
		if (urlString == null || urlString.length() == 0) {
			return null;
		}
		urlString = (urlString.startsWith("http://") || urlString
				.startsWith("https://")) ? urlString : ("http://" + urlString).intern();
		URL url = new URL(urlString);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		 // 设置是否向connection输出,因为这个是post请求,参数要放在  http正文内,因此需要设为true
        connection.setDoOutput(true);   
        connection.setDoInput(true); 
        connection.setRequestMethod("POST");
        // Post 请求不能使用缓存   
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        // 增加报头,模拟浏览器,防止屏蔽
        connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows vista)");
        // 只接受text/html类型,当然也可以接受图片,pdf,*/*任意
        connection.setRequestProperty("Accept", "text/xml");
        connection.setConnectTimeout(timeout);
        connection.connect();
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        String content = URLEncoder.encode(data, "utf-8");//+URLEncoder.encode("中文 ", "utf-8");
        out.writeBytes(content);
        out.flush();   
        out.close();
        
		try {
			//必须写在发送数据的后面
			if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
				return null;
			}
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),charset));
        String line;
        StringBuffer sb=new StringBuffer();
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\r\n");
        }
        if (reader != null) {
			reader.close();
		}
		if (connection != null) {
			connection.disconnect();
		}
		return sb.toString();
	}
	public String getWebContentByPost(String urlString,String data) throws IOException {
		return getWebContentByPost(urlString, data,"iso-8859-1", 5000);
	}
	
	public static void main(String[] args) throws IOException {
		WebClient client=new WebClient();
//		String s = client.getWebContentByGet("http://www.baidu.com");
//		s = new String(s.getBytes("iso-8859-1"), "gb2312");
		
		String s = client.getWebContentByPost("http://localhost:8080/Lottery/login.portal","action=login&loginname=13761083826&password=111111");
		s = new String(s.getBytes("iso-8859-1"), "UTF-8");
		System.out.println(s);
	}
	

}


模板类自己设计,比如我的baseInfoMiddle.vm:
<%@ page contentType="text/html; charset=UTF-8" %>
<?xml version="1.0"?>
<!DOCTYPE HTML PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0 //EN" "http://www.wapforun.org/DTD/xhtml-mobile10.dtd">
<html>
	<head>
	<title></title>
	</head>
	<body>
		<p>$key1</p>
		<p>$key2</p>
		
	</body>
</html>


如有看不明白,请先看这里:
http://ben-sin.iteye.com/blog/426435
分享到:
评论
2 楼 joewalker 2011-11-21  
楼上要求太多啦,能够有这样的demo已经很好了
xiechao240 写道
最好上传一份代码,让我们下载后附加就可以运行,这样学习起来效率高一些。

1 楼 xiechao240 2010-08-12  
最好上传一份代码,让我们下载后附加就可以运行,这样学习起来效率高一些。

相关推荐

    Jsp结合Velocity实现依据Word模板文件生成对应数据文件

    在这种场景下,"Jsp结合Velocity实现依据Word模板文件生成对应数据文件"的技术方案显得尤为实用。JSP(JavaServer Pages)是用于构建动态Web应用的服务器端技术,而Velocity则是一个强大的模板引擎,它允许开发者将...

    SpringBoot Velocity 代码生成模板

    在Spring Boot项目中,利用Velocity模板引擎,我们可以创建一系列模板文件,如Mapper、Mapper.xml、Service和Controller等,这些模板在运行时会根据数据库中的表结构动态生成对应的Java源码。这不仅避免了手动编写...

    velocity生成静态页面实例

    在“velocity生成静态页面实例”中,我们首先需要一个 Velocity模板文件(通常以`.vm`为扩展名),在这个文件中,我们可以使用Velocity语法来定义页面结构,并插入动态数据占位符。例如,我们可以写一个简单的模板:...

    92.Spring Boot使用模板velocity【从零开始学Spring Boot】

    《Spring Boot整合Velocity模板引擎详解》 在现代Java Web开发中,Spring Boot以其简洁的配置、强大的功能和高效的开发效率,成为了许多开发者的首选框架。而Velocity作为一款轻量级的模板引擎,能够帮助我们快速...

    Spring已集成jsp的环境下同时集成Velocity

    在Java Web开发中,Spring框架和Velocity模板引擎都是常见的工具。Spring主要用于依赖注入、AOP(面向切面编程)以及企业级应用的构建,而Velocity则是一个轻量级的模板引擎,专注于视图层的渲染,提供简洁的语法来...

    spring mvc与velocity整合

    Spring MVC 是一个强大的Java Web应用程序开发框架,它提供了模型-视图-控制器(MVC)架构,用于构建灵活、可维护的Web应用。Velocity则是一个轻量级的模板引擎,专注于生成动态内容,如HTML、XML、JSON等,使得...

    Velocity+Struts生成html

    开发者使用Velocity模板语言(VTL)来编写模板,这些模板可以包含静态HTML内容和动态逻辑。VTL通过#set、#if、#foreach等指令来控制流程和条件,同时通过${variable}来插入动态数据。当模板与后端的数据源(如Java...

    velocity生成静态网页并分页

    Velocity的工作原理是将HTML模板与Java代码分离,开发者可以在HTML模板中插入特定的Velocity指令,然后由Velocity引擎负责解析这些指令并与后台的数据源(如数据库)结合,生成最终的静态HTML文件。这种模式提高了...

    spring mvc mybatis velocity 示范

    开发者可以在Velocity模板中使用变量和控制结构,这些变量由Java后端提供,然后 Velocity 将这些模板和数据结合,生成最终的HTML或者其他格式的输出。Velocity 的语法简洁,易于学习,且执行效率高。 结合使用...

    spring+velocity+ibatis

    当用户请求到达时,Spring MVC控制器会调用业务服务层的方法,这些方法进一步通过iBATIS的SqlSession查询或更新数据库,然后将返回的数据传递给Velocity模板,由Velocity负责生成HTML响应给客户端。 文件名 ...

    velocity jsp多视图解析器整合

    本话题将详细讲解如何在Spring MVC框架中整合Velocity和JSP,实现多视图解析器的功能,从而根据需求返回不同的视图。 **1. Velocity模板引擎** Velocity是一个开源的Java模板引擎,它允许开发者将业务逻辑与展示...

    简单学习使用Spring+Velocity发送邮件

    这样,当发送邮件时,Spring会使用这些模板并替换变量,生成最终的邮件内容。 为了在Spring中集成Velocity,我们需要添加以下依赖: 1. `velocity-engine-core`:Velocity的核心库。 2. `velocity-tools-view`:...

    使用了Struts结构和Velocity模板技术的BLOG

    本项目“使用了Struts结构和Velocity模板技术的BLOG”旨在演示如何结合这两种技术来创建一个功能完善的博客系统。 **Struts框架** Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它为...

    test_static_html:java生成静态HTML

    无论是使用模板引擎、直接构建字符串,还是借助静态站点生成器,都可以根据项目需求选择合适的方法。在实际应用中,开发者还需要考虑性能、可维护性以及SEO等因素,以确保生成的HTML页面既高效又易于管理。

    Spring+SpringMVC+Mybatis+Velocity+Maven demo

    **Velocity**:Velocity是一个基于Java的模板引擎,用于生成静态网页或动态内容。与JSP相比,Velocity更专注于模板语言,其语法简洁且易于理解。在Spring MVC中,Velocity可以作为视图渲染引擎,将模型数据填充到...

    Velocity Template的另类用法:生成XML

    在生成XML时,我们通常会创建一个 Velocity 模板文件,其中包含XML的结构,并使用VTL插入动态数据。例如,假设我们有以下模板: ```xml #foreach($item in $items) $item.name&lt;/name&gt; $item.price&lt;/price&gt; ...

    Velocity模板入门DEMO

    在“Apache-Velocity-java”这个压缩包中,很可能包含了示例代码和一个简单的 Velocity 模板文件,展示如何在Java应用程序中使用Velocity来生成动态HTML。你可以通过以下步骤运行DEMO: 1. 解压压缩包。 2. 查看...

    Velocity模板使用指南中文版

    例如,Spring MVC 中的视图解析器可以配置为使用 Velocity,从而利用其强大的模板能力。 ### 9. 最佳实践 - 保持模板简洁,避免过多的逻辑处理。 - 使用适当的注释和文档,便于维护。 - 遵循一致的命名规范和代码...

Global site tag (gtag.js) - Google Analytics