Freemarker定时生成静态网页

本文介绍如何使用Quartz和Freemarker在Web环境中实现定时任务及网页静态化功能,通过Maven项目配置、依赖管理、Spring整合、定时任务调度等步骤,详细阐述了整个实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Web 环境中设计定时器,需要借助quartz包的支持,本文介绍如何借助quartz和freemarker实现网页静态化的功能

一、新建Maven项目
配置pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test</groupId>
  <artifactId>freemarkerweb</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>freemarkerweb Maven Webapp</name>
  <url>http://maven.apache.org</url>

	<properties>
		<junit.version>4.12</junit.version>
		<spring.version>4.3.7.RELEASE</spring.version>
		<jackson.version>2.8.7</jackson.version>
		<jstl.version>1.2</jstl.version>
		<commons-logging.version>1.1.3</commons-logging.version>
		<log4j.version>1.2.14</log4j.version>
		<freemarker.version>2.3.23</freemarker.version>
		<mybatis.version>3.2.8</mybatis.version>
		<mybatis.spring.version>1.2.2</mybatis.spring.version>
		<mysql.version>5.1.32</mysql.version>
		<druid.version>1.0.29</druid.version>
		<commons.io.version>2.3</commons.io.version>
		<commons.fileupload>1.3.1</commons.fileupload>
		<servlet-api.version>3.0.1</servlet-api.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>${commons-logging.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatis.spring.version}</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>${druid.version}</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons.io.version}</version>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>${commons.fileupload}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${servlet-api.version}</version>
		<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>${freemarker.version}</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
		  <groupId>org.springframework</groupId>
		  <artifactId>spring-context-support</artifactId>
		  <version>${spring.version}</version>
		</dependency>
	</dependencies>

  <build>
    <finalName>freemarkerweb</finalName>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.7.0</version>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
			</configuration>
		</plugin>

		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<version>2.2</version>
			<configuration>
				<port>8080</port>
				<path>/</path>
			</configuration>
		</plugin>
	</plugins>
  </build>
</project>

Spring.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/rabbit    
    		http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- Spring为什么要整合Mybatis ? -->
	<!-- 1.Spring帮助Mybatis管理事务 -->
	<!-- 2.SqlSession是由SqlSessionFactory来创建的,SqlSessionFactory是一个重量级
		   管理SqlSessionFactory
		 3.整合映射文件xml,自动映射接口,生成代理
	-->
	
	<!-- 数据源 -->
	<bean id="ds" class="com.alibaba.druid.pool.DruidDataSource">
		<property name="url" value="${jdbc.url}"></property>
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="username" value="${jdbc.uname}"></property>
		<property name="password" value="${jdbc.pwd}"></property>
	</bean>
	
	<!-- Session工厂 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
		<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
		<property name="dataSource" ref="ds"></property>
		<!-- 给实体类取别名 -->
		<property name="typeAliasesPackage" value="com.test.bean"></property>
	</bean>
	
	<!-- 接口代理 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
		<property name="basePackage" value="com.test.mapper"></property>
	</bean>
	
	<!-- 事务管理器 -->
	<bean  id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
		<property name="dataSource" ref="ds"></property>
	</bean>
	
	<!-- 哪些方法需要事务处理 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="insert*"/>
			<tx:method name="add*"/>
			<tx:method name="save*"/>
			<tx:method name="update*"/>
			<tx:method name="upd*"/>
			<tx:method name="modify*"/>
			<tx:method name="delete*"/>
			<tx:method name="del*"/>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="find*" read-only="true"/>
			<tx:method name="select*" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- 事务切面 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.test.service.impl.*.*(..))" id="pc"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
	</aop:config>
	<!-- 扫描service -->
	<context:component-scan base-package="com.test.service.impl"></context:component-scan>

	<!-- 执行的任务的对象 -->
	<bean id="myTask" class="com.test.service.impl.MyTask" />
	<!-- 调度对象 -->
    <bean id="schedulerBean"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">  
            <ref bean="myTask" /> <!-- 注入任务对象 -->
        </property>  
        <property name="targetMethod">  
            <value>doTask</value> <!-- 调用任务对象的方法 -->
        </property>  
        <property name="concurrent" value="false" />  
    </bean>
	<!-- 根据定时表达式触发调用 -->
    <bean id="schedulerCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail">
			<ref bean="schedulerBean"/>
		</property>
		<property name="cronExpression">
			<value>0/5 * * * * ?</value> <!-- 从0秒开始,每5秒触发一次 -->
		</property>
    </bean>

    <!-- 工厂对象 -->
    <bean id="schedulerFactoryBean"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="schedulerCronTrigger" />
            </list>
        </property>
    </bean>

	<import resource="classpath*:/springmvc.xml"/>
</beans>

Cron表达式,至少设置6个,第7个可选
[秒] [分] [时] [每月中哪天] [月] [每星期中哪天] [年]

[秒]  可以用数字0-59 表示
[分] 可以用数字0-59 表示
[时] 可以用数字0-23表示
[每月中哪天] 可以用数字1-31 中的任一一个值
[月] 可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
[每星期中哪天] 可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
[年] 可选

由于[每月中哪天]与[每星期中哪天]的设置冲突,所以其中之一必须设置为?

“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行

“?”:表示每月的某一天,或第周的某一天

“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”

“W”:表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”

““#”:是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为"6#3" or “FRI#3” 则表示“每月第三个星期五”

例程

             每星期的每一天每隔10秒执行一次:*/10 * * * * ?

             每星期的每一天每隔2分钟执行一次:0 */2 * * * ?

             每星期的每一天每天23点执行一次:0 0 23 * * ?

             每星期的每一天每天凌晨1点执行一次:0 0 1 * * ?

             每星期的每一天每小时在10分、20分、30分执行一次:0 10,20,30 * * * ?

任务类

package com.test.service.impl;

import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.test.bean.GoodInfo;
import com.test.freemarker.FRUtil;
import com.test.service.GoodsService;

public class MyTask {
	@Autowired
	private GoodsService gService;
	
	public void doTask() {
		try
		{
			List<GoodInfo> gList = gService.findGoods();
			Map<String, Object> map = new HashMap<>();
			map.put("gList", gList);
			FRUtil.createStaticHtml("glist.ftl", map, "glist.html");
			System.out.println("gList==="+gList);
			System.out.println("doTask === "+new Timestamp(System.currentTimeMillis()));
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

FRUtil工具类

package com.test.freemarker;

import java.io.File;
import java.io.FileWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import freemarker.cache.ClassTemplateLoader;
import freemarker.ext.dom.NodeModel;
import freemarker.template.Configuration;
import freemarker.template.Template;

public class FRUtil {
	public static void createStaticHtml(String tmptFile,Map map,String htmlFile)
	{
    	try
    	{
	    	Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
	    	//获取Web工程根目录
	    	String webRoot = System.getProperty("webroot");
	    	cfg.setDirectoryForTemplateLoading(new File(webRoot+"/WEB-INF/ftl"));
	    	cfg.setDefaultEncoding("utf-8");
	    	Template t1 = cfg.getTemplate("test.ftl");
			//生成静态页面
	    	String file = webRoot + "/" + htmlFile;
			FileWriter fw = new FileWriter(file);
			
			t1.process(map, fw);


    	}
    	catch(Exception e)
    	{
    		e.printStackTrace();
    	}
	}
}

模板文件

<html>
	<head>First freemarker demo</head>
	<body>
	<table border=1>
<#list gList as g>
	<tr>
		<td>${g.id}</td>
		<td>${g.name}</td>
		<td>${g.dt}</td>
		<td>${g.price}</td>
	</tr>
</#list>
	</table>
	</body>

</html>

Web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>easyuiProj</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
  </context-param>
  <listener>
    <listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
  </listener>
	<context-param>
		<param-name>webAppRootKey</param-name>
		<param-value>webroot</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
	</listener>
	
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
	<!-- 字符编码过滤器 -->
	<filter>
		<filter-name>cFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>cFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

Tomcat后台
在这里插入图片描述

前台输出
在这里插入图片描述

代码
https://pan.baidu.com/s/17FgYY71z8ouBjFdih77rUA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值