`
lsj626472785
  • 浏览: 16055 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JavaWeb高并发访问之使用Filter实现页面静态化

阅读更多
什么是静态化?静态化就是将动态的jsp转换为静态的html;
为什么要静态化?提高性能加快访问速度,静态化的页面html不需要访问数据库等操作所以要比动态的jsp快很多。
怎样实现静态化?实现静态化的方法很多,本文章要说明的是通过Filter过滤器实现jsp的静态化。
1、我们先了解下jsp页面的请求流程

JSP的静态化 - 程序民工 - suntengjiao1的博客

通过上图我们可以知道servlet对象的响应是html,如果我们在servlet对象之后增加个拦截htm响应的功能将html响应保存到服务器,下次访问时直接返回这个静态页面,也就实现了静态化功能。
2、新的请求流程如下图:
JSP的静态化 - 程序民工 - suntengjiao1的博客

实现上图拦截servlet响应、判断是否已经静态化功能最好的方法就是拦截器Filter。
具体代码如下:
1.过滤器:FileCaptureFilter
package com.filter;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Description: 静态化过滤器
* @ClassName: FileCaptureFilter
* @author lsj
* @email: lsj626472785@163.com
* @date 2016年10月27日 下午5:23:10
*/
public class FileCaptureFilter implements Filter {
private FilterConfig filterConfig;
private String protDirPath;// 项目绝对路径
private ServletContext context;
private String contextPath;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.context = filterConfig.getServletContext();
this.protDirPath = filterConfig.getServletContext().getRealPath("/");
this.contextPath = context.getContextPath();
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8"); // 防止中文乱码
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI();
if (!path.contains("gotoLogin1.do")) {
chain.doFilter(request, response);
return;
}
/****************************************** 方式二 ***************************************/
// 得到ServletContext中的"page_map"属性的值,也就是上面说的map集合
Map<String, String> map = (Map<String, String>) context
.getAttribute("page_map");
if (map == null) {
map = new HashMap<String, String>();
context.setAttribute("page_map", map);
}
// 这就是键值
String key = "htmlFile_" + "test";
// 只是value
String htmlPath = map.get(key);
// 为空说明,没有静态页面,不为空直接重定向到该页面
if (htmlPath == null) {
String fileName = "htmlFile" + File.separator + "test.html";
String filePath = protDirPath + fileName;
FileCaptureResponseWrapper responseWrapper = new FileCaptureResponseWrapper(
(HttpServletResponse) response);
chain.doFilter(request, responseWrapper);
// 写成html 文件
responseWrapper.writeFile(filePath);
map.put(key, fileName);
htmlPath = fileName;
}
request.getRequestDispatcher("/" + htmlPath).forward(request, response);
/****************************************** 方式一 ***************************************/
// String fileName = "htmlFile" + File.separator + "test.html";
// File file = new File(context.getRealPath(fileName));
// /*
// * 如果文件存在则直接使用缓存的静态文件,否则保存静态文件再转发
// */
// if (file.exists()) {
// request.getRequestDispatcher("/" + fileName).forward(request,
// response);
// } else {
// String filePath = protDirPath + fileName;
// FileCaptureResponseWrapper responseWrapper = new
// FileCaptureResponseWrapper(
// (HttpServletResponse) response);
// chain.doFilter(request, responseWrapper);
// // 写成html 文件
// responseWrapper.writeFile(filePath);
// // back to browser
// responseWrapper.writeResponse();
// }
}

public void destroy() {


}

}

2.装饰者:FileCaptureResponseWrapper
package com.filter;
import java.io.CharArrayWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* @Description: 静态化处理(装饰者)
* @ClassName: FileCaptureResponseWrapper
* @author lsj
* @email: lsj626472785@163.com
* @date 2016年10月27日 下午5:39:54
*/
public class FileCaptureResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
private HttpServletResponse response;
private PrintWriter out;

@Override
public String toString() {
return output.toString();
}

public FileCaptureResponseWrapper(HttpServletResponse response) {
super(response);
this.response = response;
output = new CharArrayWriter();
}

// 覆写getWriter()
@Override
public PrintWriter getWriter() {
return new PrintWriter(output);
}


public void writeFile(String fileName) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
osw.write(output.toCharArray());
osw.close();
}


public void writeResponse() throws IOException {
out = response.getWriter();
// 重置响应输出的内容长度
response.setContentLength(-1);
out.print(output.toCharArray());
out.flush();
out.close();
}
public void close(){
out.close();
}
}
3.web.xml配置
<!-- 静态页面拦截器 -->
<filter>
<filter-name>FileCaptureFilter</filter-name>
<filter-class>com.filter.FileCaptureFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FileCaptureFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
分享到:
评论

相关推荐

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

    这样,当用户再次访问相同页面时,服务器可以直接返回预先生成的静态页面,而不是重新执行数据库查询等操作。 首先,我们需要创建一个实现了ServletContextListener接口的类,例如`PageStaticListener`。在这个类中...

    jsp伪静态,javaweb实现伪静态

    7. **优化SEO**:伪静态的主要目的之一是优化搜索引擎优化(SEO)。静态化的URL更容易被搜索引擎抓取,提高网页的排名。同时,对于用户来说,静态化的URL看起来更加直观和专业。 8. **性能提升**:静态URL可以减少...

    javaweb高并发量网站解决方案

    一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目 录下,这样的网站对系统架构、性能的要求都很简单。随着互联网业务的不断丰富,网站相关的技术经过...

    javaweb伪静态

    搜索引擎对静态页面的友好度高于动态页面,因为静态页面的内容在服务器生成后不再改变,便于搜索引擎抓取和索引。而动态页面的内容会根据用户请求的不同参数而变化,搜索引擎可能难以完全抓取。此外,静态页面加载...

    javaweb实现的访问权限控制示例

    在“javaweb实现的访问权限控制示例”中,我们主要关注的是如何利用Filter进行权限校验。通常,我们会创建一个自定义的Filter类,继承自`javax.servlet.Filter`接口,并实现其`doFilter()`方法。在这个方法中,我们...

    java统计高并发首页访问量,记录客户登录信息

    并发控制是高并发环境中的关键问题,Spring提供了多种并发工具类,如`Semaphore`、`ReentrantLock`等,可以用来限制并发访问的数量,防止过多的并发导致数据库压力过大。此外,还可以使用乐观锁或者悲观锁策略来处理...

    如何利用Java开发高性能、高并发Web应用

    Java开发高性能、高并发Web应用需要了解Java程序性能优化的技巧,包括生成对象时的合理分配空间和大小、优化循环体、少用new初始化一个实例、重复使用一个对象等。只有通过这些技巧,我们才能开发出高性能、高并发...

    javaweb高并发量网站解决方案.pdf.zip

    1. **负载均衡**:当网站面临高并发访问时,单台服务器可能无法承受全部流量。因此,我们需要使用负载均衡技术,将请求分发到多台服务器,确保没有一台服务器过载。常见的负载均衡器有Nginx、HAProxy等。 2. **...

    酒店前端项目,JavaScript+css+html,静态网页,适用于大作业,上机任务 多页面Javaweb

    项目设计了多个静态网页,展示了完整的多页面JavaWeb应用的前端部分。以下将详细介绍其中涉及的主要知识点: 1. HTML基础:HTML(HyperText Markup Language)是构建网页的基础,用于定义网页的结构。在这个项目中...

    JavaWeb并发编程与高并发解决方案.docx

    ### JavaWeb并发编程与高并发解决方案 #### 一、并发编程概述 在现代软件开发中,尤其是对于基于JavaWeb的应用程序来说,面对大量的用户请求和数据处理任务时,高效的并发处理能力至关重要。并发编程旨在利用多...

    狂神说javaweb实战静态资源.rar

    综上,"狂神说javaweb实战静态资源"这部分内容可能涉及了如何在JavaWeb环境中管理、优化和访问静态资源的方方面面,对于深入理解JavaWeb开发和提升项目性能至关重要。学习者应关注静态资源的组织结构、访问方式、...

    Javaweb博客系统页面设计

    通过学习的前端知识来构建出网页.Javaweb博客系统页面设计,包含4个页面:博客登录页,博客列表页,博客详情页,博客编辑页。 实现一个简单的博客系统. 当前先完成页面设计的部分. 通过学习的前端知识来构建出网页....

    JavaWeb登录注册页面

    在这个项目中,Filter可能用于实现用户登录检查,未登录用户访问特定资源时会被拦截并重定向到登录页面。此外,Filter还可以用来进行权限控制、URL编码解码、日志记录等多种用途。 MyBatis是Java的持久层框架,它...

    酒店管理系统(html、js、css、dom)静态页面 适合大作业 上机任务 包含酒店展示页面 以及后台管理页面 Javaweb

    本项目是一个适用于大作业或上机任务的静态页面实现,它涵盖了HTML、CSS、JavaScript和DOM等核心前端技术,并且结合了JavaWeb后端服务。以下是关于这些技术及系统的详细解释: 1. **HTML(HyperText Markup ...

    Java页面静态化视频教程

    Java页面静态化视频教程,将动态化页面转为静态化页面,减少服务器压力

    Android与JavaWeb的互相访问

    为了实现与JavaWeb的交互,Android应用通常会使用WebView组件加载Web页面,或者通过异步任务(如AsyncTask)和网络请求库(如Retrofit、Volley、OkHttp)来后台获取数据,更新UI。 **JavaWeb**是使用Java技术构建...

    JAVAWEB-19:JDBC之过滤器Filter

    在标题"JAVAWEB-19:JDBC之过滤器Filter"中,我们关注的是如何利用过滤器来优化JDBC操作。JDBC(Java Database Connectivity)是Java语言中访问数据库的标准API,它允许Java程序与各种类型的数据库进行交互。然而,...

    基于JavaWeb人事管理系统的设计与实现_毕业论文设计.pdf

    基于JavaWeb人事管理系统的...本系统通过使用JavaWeb技术、SQL Server 2005数据库、面向对象编程语言、模块化设计和需求分析等技术要点,实现了一个高效、可靠的人事管理系统,旨在提高企业的人事管理效率和运作效率。

    JavaWeb页面过滤器之编码过滤

    在给定的标题“JavaWeb页面过滤器之编码过滤”和描述中,我们可以深入探讨JavaWeb中的编码过滤器,以及如何在MyEclipse 8.5环境下开发和应用这样的过滤器。这个过滤器不仅适用于JSP页面,也适用于Servlet和HTML等Web...

    javaweb中实现页面功能

    在JavaWeb开发中,"页面功能"通常是指与用户交互的部分,这主要通过Servlet和JSP(JavaServer Pages)技术来实现。Servlet是Java编写的一种服务器端程序,它处理来自客户端(如浏览器)的请求,并返回响应。JSP则是...

Global site tag (gtag.js) - Google Analytics