使用velocity实现页面静态化可以提高网站的性能,但是生成的静态页面怎么做到实时更新呢?
1、最笨的方式,手动刷新.
例如:网站首页,当管理员更新一个功能之后,手动点击后台的一个按钮直接更新对应的html文件
2、定时刷新。
每隔一段指定的时间去更新所有已经存在的html文件,当然前提是你要先验证哪些已经生成了html文件.至于怎么验证?你可以在每生成一个文件的时候往内存的某个list或者某个文件,或者某个表写入当前生成的文件名
3、智能刷新
管理员在后台的每个操作 增删改查,都进行监听,并在操作完成后去验证一下对应的文件是否存在,存在就更新,不存在就不操作
使用第三智能刷新明显科学一点,使用第三种方法我们就需要使用到 设计模式中的——观察者模式
初始化velocity的配置:
package com.wwxl.filter;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.velocity.app.Velocity;
import com.wwxl.servletcontext.FConfig;
/**
* Servlet Filter implementation class SetCodeFilter
*/
public class SetCodeFilter implements Filter {
/**
* Default constructor.
*/
public SetCodeFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
// pass the request along the filter chain
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
@SuppressWarnings("static-access")
public void init(FilterConfig fConfig) throws ServletException {
//初始化velocity配置
Properties properties=new Properties();
//指定velocity日志存放位置
properties.put("runtime.log",fConfig.getServletContext().getRealPath("/WEB-INF/log/velocity_example.log"));
//指定模板存放的位置
properties.put("file.resource.loader.path",fConfig.getServletContext().getRealPath("/WEB-INF/velocity/"));
properties.put("input.encoding","UTF-8");
properties.put("default.contentType","text/html;charset\\=UTF-8");
properties.put("output.encoding","UTF-8 ");
Velocity.init(properties);
//初始化时获取servletcontext,在java 代码里面会用到这个servletcontext来获取服务器的相对路径
FConfig fc=new FConfig();
fc.setServletcontext(fConfig.getServletContext());
}
}
package com.wwxl.servletcontext;
import javax.servlet.ServletContext;
/**
* 获取servletcontext,生命周期是 从servletContext创建到服务器关闭
* @author Administrator
*
*/
public class FConfig {
public static ServletContext servletcontext;
public static ServletContext getServletcontext() {
return servletcontext;
}
public static void setServletcontext(ServletContext servletcontext) {
FConfig.servletcontext = servletcontext;
}
}
被观察者:
package com.wwxl.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.wwxl.dao.UserDao;
import com.wwxl.entity.User;
import com.wwxl.observer.UserServiceimplObserver;
import com.wwxl.service.UserService;
//被观察对象 继承observable
@Service
@Transactional
public class UserServiceimpl extends Observable implements UserService{
@Autowired
@Qualifier("userDao")
private UserDao userDao;
/**
* 添加用户
*/
public boolean sva(User user) {
boolean falg=this.userDao.sva(user);
if(falg)
{
Map<String,Object> maps=new HashMap<String, Object>();
maps.put("falg","save");
maps.put("user",user);
//标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。
this.setChanged();
//如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变,maps是更改的内容
this.notifyObservers(maps);
}
return falg;
}
/**
* 查询用户
*/
public List<User> findAll() {
return this.userDao.findAll();
}
/**
* 根据id查询用户
*/
public User findUserById(String id) {
return this.userDao.getById(id);
}
//注册观察者,一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象
public UserServiceimpl(){
//注册观察者
this.addObserver(new UserServiceimplObserver());
}
}
观察者,观察用户做了什么操作,然后更新或者删除、生成html页面
package com.wwxl.observer;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import com.wwxl.entity.User;
import com.wwxl.servletcontext.FConfig;
import com.wwxl.util.JHtmlVelocityGenerator;
//观察者,观察用户发生改变就生成静态页面
public class UserServiceimplObserver extends FConfig implements Observer{
//观察用户是否修改了数据
@SuppressWarnings("unchecked")
public void update(Observable o, Object arg) {
Map<String,Object> maps=(Map<String, Object>)arg;
String falg=(String) maps.get("falg");
System.out.println("对用户做了什么操作:"+falg);
User user=(User) maps.get("user");
boolean falgs=JHtmlVelocityGenerator.JHtmlVelocityGenerators(getServletcontext(), user, "mytemplates.html","res/template");
if(falgs)
{
System.out.println("生成静态页面成功");
}
else
{
System.out.println("生成静态页面失败");
}
}
}
生成静态页面:
package com.wwxl.util;
import java.io.File;
import javax.servlet.ServletContext;
import org.apache.velocity.VelocityContext;
import com.wwxl.constant.ClassConstant;
import com.wwxl.entity.User;
public class JHtmlVelocityGenerator extends HtmlVelocityGenerator {
/**
* 生成静态页面
* @param servletcontext servlert上下文
* @param entity 修改的对象
* @param templateName 模板名称
* @param savePath 存放路径
*/
public static boolean JHtmlVelocityGenerators(ServletContext servletcontext,User user,String templateName,String savePath) {
boolean falg=false;
// 获得相对路径
String realPath =servletcontext.getRealPath(savePath);
File savefiles = new File(realPath);
if (!savefiles.exists())
savefiles.mkdirs();
String htmlName=ClassConstant.HTML_PREFIX+user.getId();
VelocityContext context = new VelocityContext();
context.put("user",user);
falg=HtmlVelocityGenerator.HtmlCreate(savefiles, templateName, htmlName, context);
return falg;
}
}
生成静态页面通用方法:
package com.wwxl.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
/**
* velocity静态页面生成通用类
* @author 邓文伟
*
*/
public class HtmlVelocityGenerator{
/**
* 静态页面生成器
* @param savefiles 生成的html页面保存的路径
* @param templateName 模板名称
* @param htmlName 生成的html名称
* @param context velocity上下文
* @return
*/
public static boolean HtmlCreate(File savefiles,String templateName,String htmlName,VelocityContext context) {
try {
Template template = Velocity.getTemplate(templateName);
File savefile = new File(savefiles,htmlName+".html");
FileOutputStream outstream = new FileOutputStream(savefile);
OutputStreamWriter writer = new OutputStreamWriter(outstream,"UTF-8");
BufferedWriter bufferWriter = new BufferedWriter(writer);
template.merge(context, bufferWriter);
bufferWriter.flush();
outstream.close();
bufferWriter.close();
return true;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
//HtmlVelocityGenerator.HtmlCreate("c:/");
}
}
静态页面生成成功后访问静态资源:
/**
* 查询静态资源
* @param request
* @param response
* @param id
* @return
*/
@RequestMapping({ "/userIds.htm" })
public ModelAndView userByIds(HttpServletRequest request,
HttpServletResponse response, String id) {
ModelAndView mv = new JModelAndView(null, request, response);
// 获得要生成的静态html文件的名字
String htmlName =HTML_PREFIX + id + ".html";
mv.setViewName(CONTEXT_RES_TEMPLATE+htmlName);
return mv;
}
很多细节还待优化,先这样记录下来吧,花了我半天时间弄这个!
分享到:
相关推荐
本文将详细介绍如何使用Velocity和FreeMarker模板实现页面静态化,并提供具体的代码实现。 1. **Velocity与FreeMarker介绍** - **Velocity** 是Apache软件基金会的一个开源项目,它提供了简单易用的API,用于生成...
Java JSP页面静态化是一种...总之,JSP页面静态化是一种有效的优化手段,通过合理运用,可以在保持动态功能的同时,提升网站性能和用户体验。不同的静态化策略适用于不同的场景,开发者应根据项目需求选择合适的方法。
Java页面静态化是一种提高Web应用性能的技术,它通过将动态生成的HTML页面转换为静态HTML文件,从而减少了服务器处理请求的负担,加快了用户访问速度。这种技术在高并发、大数据量的网站中尤其重要,因为它能显著...
本文将深入探讨如何使用Velocity来实现静态页面的分页功能。 一、Velocity简介 Velocity是由Apache软件基金会开发的开源项目,它提供了一个简单的模板语言,使得开发者可以将内容与展示逻辑分离,让设计人员专注于...
在“velocity生成静态页面实例”中,我们首先需要一个 Velocity模板文件(通常以`.vm`为扩展名),在这个文件中,我们可以使用Velocity语法来定义页面结构,并插入动态数据占位符。例如,我们可以写一个简单的模板:...
页面静态化是Web开发中的一个重要概念,主要目的是提高网站的访问速度和搜索引擎优化(SEO)。在Java Web开发中,页面静态化通常涉及到将动态生成的HTML页面转化为纯HTML文件,以便用户请求时无需通过服务器执行复杂...
Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化,以后直接调用即可,无需修改任何源代码,改压缩文件包括 1、工具类; 2、源码(含jar包); 3、mysql数据库可执行文件; 4、struts2集成...
包括使用freemarker和velocity两种技术来实现静态化。压缩包里面的文件有说明文档,说得很仔细,特别适合入门级别的人参考。还有freemarker和velocity开发所需要的jar包和插件。
新闻静态化技术是一种提高网站性能和搜索引擎...总结,新闻静态化通过SSI和Velocity等技术,实现了动态内容与静态展示的高效结合,提高了网站性能和用户体验。在实际应用中,可根据项目需求和资源选择合适的技术方案。
Java CMS(内容管理系统)生成静态页面是一种常见的优化网站性能和提升用户体验的方法。在这个过程中,原本由动态脚本生成的网页内容被转化为HTML文件,这些HTML文件可以被浏览器直接读取,减少了服务器处理请求的...
综上所述,通过对页面静态化、缓存技术、数据源管理、SSI技术以及权限模块等方面的深入研究和实践,我们可以有效地提升网站的整体性能和用户体验。在实际开发过程中,还需要根据具体的业务需求和技术架构,选择最...
在IT行业中,Velocity是一款强大的Java模板引擎,常用于生成动态Web内容并转化为静态HTML页面,以提高网站的访问速度和效率。本项目的核心是利用Velocity模板语言和分页技术,生成具有分页功能的静态网页。 ...
【HTML静态化】是Web网站架构优化的一种重要技术,它将动态生成的HTML页面转化为静态的HTML文件,以便直接由浏览器加载,无需服务器处理。这种技术对于提高网站性能、优化SEO以及增强安全性都有显著效果。 **一、...
Velocity是一个流行的Java模板引擎,常用于构建MVC架构的表示层。它的主要优点在于简洁、高效,无需使用EL(Expression Language)或...理解这个过程有助于优化 Velocity 的性能和日志记录,使其更好地适应项目需求。
本案例将探讨如何利用JavaWeb监听器实现页面静态化,以提高网站性能和用户体验。页面静态化是将动态生成的网页转化为HTML静态文件,使得用户在访问时无需经过服务器端复杂的处理过程,直接从硬盘或缓存中读取内容,...
总的来说,Velocity作为一个强大的模板引擎,能够帮助开发者轻松地实现动态内容的渲染和页面静态化,提高网站的性能和用户体验。在项目中使用velocity.jar包,结合适当的页面模板设计,可以有效地实现MVC架构,让...
通过研究和理解`CreatorHtmlServlet.java`中的代码,开发者可以学习如何在Java环境中实现实时生成和管理静态页面,从而提高网站的性能和用户体验。同时,这也为自定义和扩展这种静态化方案提供了基础。
1. **数据更新**:静态化后,若数据频繁更新,需要考虑如何同步静态页面与数据库中的数据。 2. **个性化内容**:对于含有用户个性化信息的页面,静态化可能导致用户看到的信息不是最新的。 3. **缓存管理**:需要...
- 是否使用ESI技术实现页面部分更新。 - 是否使用物理机提高性能。 - 压缩处理由谁完成。 - 选择何种类型的网卡以适应高并发场景。 #### 四、总结 通过Detail系统的静态化改造,淘宝技术团队成功地解决了原有架构...
自动化生成静态页面适用于新闻网站、博客系统、电商产品页面等需要频繁更新但结构相对固定的网站。 通过深入研究这个Java自动生成静态页面的Demo源码,你可以了解到如何在实际项目中应用这项技术,提升网站的性能...