`
dengwenwei121
  • 浏览: 40978 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

网站性能优化,使用velocity实现页面静态化,实现实时更新静态页面

 
阅读更多

使用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 freemarke 模版 静态化 实现

    本文将详细介绍如何使用Velocity和FreeMarker模板实现页面静态化,并提供具体的代码实现。 1. **Velocity与FreeMarker介绍** - **Velocity** 是Apache软件基金会的一个开源项目,它提供了简单易用的API,用于生成...

    java JSP页面静态化总结_动态页面变为静态页面以减少访问数据库的次数提高速度.zip

    Java JSP页面静态化是一种...总之,JSP页面静态化是一种有效的优化手段,通过合理运用,可以在保持动态功能的同时,提升网站性能和用户体验。不同的静态化策略适用于不同的场景,开发者应根据项目需求选择合适的方法。

    有关Java页面静态化

    Java页面静态化是一种提高Web应用性能的技术,它通过将动态生成的HTML页面转换为静态HTML文件,从而减少了服务器处理请求的负担,加快了用户访问速度。这种技术在高并发、大数据量的网站中尤其重要,因为它能显著...

    velocity实现静态页面分页

    本文将深入探讨如何使用Velocity来实现静态页面的分页功能。 一、Velocity简介 Velocity是由Apache软件基金会开发的开源项目,它提供了一个简单的模板语言,使得开发者可以将内容与展示逻辑分离,让设计人员专注于...

    velocity生成静态页面实例

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

    页面静态化

    页面静态化是Web开发中的一个重要概念,主要目的是提高网站的访问速度和搜索引擎优化(SEO)。在Java Web开发中,页面静态化通常涉及到将动态生成的HTML页面转化为纯HTML文件,以便用户请求时无需通过服务器执行复杂...

    Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化

    Struts2集成FreeMarker和Velocity,写成了工具类,快速实现页面静态化,以后直接调用即可,无需修改任何源代码,改压缩文件包括 1、工具类; 2、源码(含jar包); 3、mysql数据库可执行文件; 4、struts2集成...

    JSP页面静态化

    包括使用freemarker和velocity两种技术来实现静态化。压缩包里面的文件有说明文档,说得很仔细,特别适合入门级别的人参考。还有freemarker和velocity开发所需要的jar包和插件。

    新闻静态化技术整理,服务器端包含技术SSI,模板技术velocity

    新闻静态化技术是一种提高网站性能和搜索引擎...总结,新闻静态化通过SSI和Velocity等技术,实现了动态内容与静态展示的高效结合,提高了网站性能和用户体验。在实际应用中,可根据项目需求和资源选择合适的技术方案。

    javaCMS 生成静态页面简单列子

    Java CMS(内容管理系统)生成静态页面是一种常见的优化网站性能和提升用户体验的方法。在这个过程中,原本由动态脚本生成的网页内容被转化为HTML文件,这些HTML文件可以被浏览器直接读取,减少了服务器处理请求的...

    网站性能优化 Web开发 JSP java

    综上所述,通过对页面静态化、缓存技术、数据源管理、SSI技术以及权限模块等方面的深入研究和实践,我们可以有效地提升网站的整体性能和用户体验。在实际开发过程中,还需要根据具体的业务需求和技术架构,选择最...

    velocity生成静态网页并分页

    在IT行业中,Velocity是一款强大的Java模板引擎,常用于生成动态Web内容并转化为静态HTML页面,以提高网站的访问速度和效率。本项目的核心是利用Velocity模板语言和分页技术,生成具有分页功能的静态网页。 ...

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

    【HTML静态化】是Web网站架构优化的一种重要技术,它将动态生成的HTML页面转化为静态的HTML文件,以便直接由浏览器加载,无需服务器处理。这种技术对于提高网站性能、优化SEO以及增强安全性都有显著效果。 **一、...

    Velocity初始化过程解析

    Velocity是一个流行的Java模板引擎,常用于构建MVC架构的表示层。它的主要优点在于简洁、高效,无需使用EL(Expression Language)或...理解这个过程有助于优化 Velocity 的性能和日志记录,使其更好地适应项目需求。

    JavaWeb监听器—案例(二)页面静态化

    本案例将探讨如何利用JavaWeb监听器实现页面静态化,以提高网站性能和用户体验。页面静态化是将动态生成的网页转化为HTML静态文件,使得用户在访问时无需经过服务器端复杂的处理过程,直接从硬盘或缓存中读取内容,...

    velocity jar包

    总的来说,Velocity作为一个强大的模板引擎,能够帮助开发者轻松地实现动态内容的渲染和页面静态化,提高网站的性能和用户体验。在项目中使用velocity.jar包,结合适当的页面模板设计,可以有效地实现MVC架构,让...

    java解决网站静态页面生成方案(源码)

    通过研究和理解`CreatorHtmlServlet.java`中的代码,开发者可以学习如何在Java环境中实现实时生成和管理静态页面,从而提高网站的性能和用户体验。同时,这也为自定义和扩展这种静态化方案提供了基础。

    jsp静态化总结(jsp2html)

    1. **数据更新**:静态化后,若数据频繁更新,需要考虑如何同步静态页面与数据库中的数据。 2. **个性化内容**:对于含有用户个性化信息的页面,静态化可能导致用户看到的信息不是最新的。 3. **缓存管理**:需要...

    detail静态化

    - 是否使用ESI技术实现页面部分更新。 - 是否使用物理机提高性能。 - 压缩处理由谁完成。 - 选择何种类型的网卡以适应高并发场景。 #### 四、总结 通过Detail系统的静态化改造,淘宝技术团队成功地解决了原有架构...

    java自动生成静态页面Demo源码

    自动化生成静态页面适用于新闻网站、博客系统、电商产品页面等需要频繁更新但结构相对固定的网站。 通过深入研究这个Java自动生成静态页面的Demo源码,你可以了解到如何在实际项目中应用这项技术,提升网站的性能...

Global site tag (gtag.js) - Google Analytics