如何处理java高并发问题---之页面静态化

转载:如何处理java高并发问题---之页面静态化

解决java中的高并发问题可以从硬件软件等方面入手,硬件如:服务器;软件如:系统缓存、页面静态化等。这里我写的是页面静态化的简单小例子。之所以将这个小例子记录下来是因为之前对页面静态化有误解,原以为静态化页面就是在项目编写中前端页面利用html就可以。但是在参考网上资料后发现理解误差很大,以下是我在参考了一些网上资料后写的实现页面静态化的简单实例:

项目结构图

1.业务处理类Servlet.java(这里为了方便采用的servlet,可根据项目需求在其他的架构中使用其中的业务逻辑)

[java] view plain copy

  1. package com.servlet;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class Servlet extends HttpServlet{
  9. public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
  10. System.out.println("chapterId=====//===="+request.getParameter("chapterId"));
  11. if(request.getParameter("chapterId")!= null){
  12. String chapterFileName = "bookChapterRead_"+request.getParameter("chapterId")+".html";
  13. String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName;
  14. System.out.println("chapterFilePath===//============="+chapterFilePath);
  15. File chapterFile = new File(chapterFilePath);
  16. System.out.println("chapterFile===//============="+chapterFile);
  17. if(chapterFile.exists()){//如果有这个文件就告诉浏览器转向
  18. System.out.println("有此静态页面======");
  19. response.sendRedirect(chapterFileName);
  20. return;
  21. }
  22. System.out.println("没有此静态页面======");
  23. //======存放业务处理后得到的信息
  24. request.setAttribute("novelChapter", "测试单节信息");
  25. request.setAttribute("lastPageId", "lastPageId111");
  26. request.setAttribute("nextPageId", "nextPageId222");
  27. //============
  28. System.out.println("getServletContext()==========//========="+getServletContext());
  29. new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),
  30. chapterFileName, chapterFilePath, "/bookRead.jsp");
  31. }
  32. }
  33. }

2.创建静态页面类CreateStaticHTMLPage.java

[java] view plain copy

  1. package com.servlet;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStreamWriter;
  6. import java.io.PrintWriter;
  7. import javax.servlet.RequestDispatcher;
  8. import javax.servlet.ServletContext;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.ServletOutputStream;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpServletResponseWrapper;
  14. /**
  15. * 创建HTML静态页面
  16. * 功能:创建HTML静态页面
  17. */
  18. public class CreateStaticHTMLPage {
  19. /**
  20. * 生成静态HTML页面的方法
  21. * @param request 请求对象
  22. * @param response 响应对象
  23. * @param servletContext Servlet上下文
  24. * @param fileName 文件名称
  25. * @param fileFullPath 文件完整路径
  26. * @param jspPath 需要生成静态文件的JSP路径(相对即可)
  27. * @throws IOException
  28. * @throws ServletException
  29. */
  30. public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException{
  31. response.setContentType("text/html;charset=utf-8");//设置HTML结果流编码(即HTML文件编码)
  32. RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);//得到JSP资源
  33. final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//用于从ServletOutputStream中接收资源
  34. final ServletOutputStream servletOuputStream = new ServletOutputStream(){//用于从HttpServletResponse中接收资源
  35. public void write(byte[] b, int off,int len){
  36. byteArrayOutputStream.write(b, off, len);
  37. }
  38. public void write(int b){
  39. byteArrayOutputStream.write(b);
  40. }
  41. };
  42. final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));//把转换字节流转换成字符流
  43. HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response){//用于从response获取结果流资源(重写了两个方法)
  44. public ServletOutputStream getOutputStream(){
  45. return servletOuputStream;
  46. }
  47. public PrintWriter getWriter(){
  48. return printWriter;
  49. }
  50. };
  51. rd.include(request, httpServletResponse);//发送结果流
  52. printWriter.flush();//刷新缓冲区,把缓冲区的数据输出
  53. FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);
  54. byteArrayOutputStream.writeTo(fileOutputStream);//把byteArrayOuputStream中的资源全部写入到fileOuputStream中
  55. fileOutputStream.close();//关闭输出流,并释放相关资源
  56. response.sendRedirect(fileName);//发送指定文件流到客户端
  57. }
  58. }

3.web.xml配置文件

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <servlet>
  8. <servlet-name>htmlServlet</servlet-name>
  9. <servlet-class>com.servlet.Servlet</servlet-class>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>htmlServlet</servlet-name>
  13. <url-pattern>*.do</url-pattern>
  14. </servlet-mapping>
  15. <welcome-file-list>
  16. <welcome-file>index.jsp</welcome-file>
  17. </welcome-file-list>
  18. </web-app>

4.首页面index.jsp

[html] view plain copy

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>首页面</title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <!--
  17. <link rel="stylesheet" type="text/css" href="styles.css">
  18. -->
  19. </head>
  20. <body>
  21. <form action="kanName.do">
  22. <input name="chapterId" type="text" value="122"/>
  23. <input name="userName" type="text" value="张庆伟"/>
  24. <input type="submit" value="提交"/>
  25. </form>
  26. </body>
  27. </html>

5.跳转后的结果页面bookRead.jsp

[html] view plain copy

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <%
  10. String lastPageId=(String)request.getAttribute("lastPageId");
  11. %>
  12. <base href="<%=basePath%>">
  13. <title>book页</title>
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22. </head>
  23. <body>
  24. 这是跳转页面:
  25. <%=lastPageId %>
  26. </body>
  27. </html>

以上代码是实例的所有代码,启动项目后点击提交按钮后,会看到跳转到一个html页面。

以上代码参考自:http://blog.csdn.net/jimmy609/article/details/37810591

时间: 2024-08-28 11:08:05

如何处理java高并发问题---之页面静态化的相关文章

浅谈页面静态化

(本篇所述基于wamp集成环境而言,适合新手参考.当然,也欢迎大神们给予宝贵意见,谢谢!) 页面静态化,就是将php文件转换成html文件.当页面的数据要求的实时性不是很高的时候[换言之,数据的更新率不高时],使用页面静态化. 页面静态化可分为伪静态[URL地址重写].真正的静态文件[由php产生]. 说明:伪静态化并不是真实意义上存在的,其意义在于地址栏的美化.便于seo收录[对搜索引擎友好],不能提高页面的响应速度,也无法减少数据库请求的压力. 页面静态化的意义在于提高页面的响应速度,减少数

高并发解决方案--页面静态化

一.什么是页面静态化: 简 单的说,我们如果访问一个链接 ,服务器对应的模块会处理这个请求,转到对应的jsp界面,最后生成我们想要看到的数据.这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如 果有太多的高并发请求,那么就会加重应用服务器的压力,弄不好就把服务器 搞down 掉了.那么如何去避免呢?如果我们把对 test.do 请求后的结果保存成一个 html 文件,然后每次用户都去访问 ,这样应用服务器的压力不就减少了? 那么静态页面从哪里来呢?总不能让我们每个页面都手动处理吧?这里

Java高并发,如何解决,什么方式解决

对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到 返回的值或消息后才往下执行其它的命令. 异步,执行完函数或方法

java高并发

转自:https://www.cnblogs.com/lr393993507/p/5909804.html 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧. 为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1.同步和异步的区别和联系 所谓同步,可以理解为在执行完一个函数或方法之后,一直等待系统返

java高并发,如何解决,什么方式解决 (转)

之前我将高并发的解决方法误认为是线程或者是队列可以解决,因为高并发的时候是有很多用户在访问,导致出现系统数据不正确.丢失数据现象,所以想到的是用队列解决,其实队列解决的方式也可以处理,比如我们在竞拍商品.转发评论微博或者是秒杀商品等,同一时间访问量特别大,队列在此起到特别的作用,将所有请求放入队列,以毫秒计时单位,有序的进行,从而不会出现数据丢失系统数据不正确的情况. 今天我经过查资料,高并发的解决方法有俩种,一种是使用缓存.另一种是使用生成静态页面:还有就是从最基础的地方优化我们写代码减少不必

java高并发解决方案

高并发的时候是有很多用户在访问,导致出现系统数据不正确.丢失数据现象,所以想到 的是用队列解决,其实队列解决的方式也可以处理,比如我们在竞拍商品.转发评论微博或者是秒杀商品等,同一时间访问量特别大,队列在此起到特别的作用,将 所有请求放入队列,以毫秒计时单位,有序的进行,从而不会出现数据丢失系统数据不正确的情况. 今天我经过查资料,高并发的解决方法有俩种,一种是使用缓存.另一种是使用生成静态页面:还有就是从最基础的地方优化我们写代码减少不必要的资源浪费:( 1.不要频繁的new对象,对于在整个应

java 高并发

ava处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves方

Java高并发的常见应对方案

Java高并发的常见应对方案 一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广义的,通常指指每秒请求数 响应时间:从请求发出到收到响应花费的时间,例如:系统处理一个HTTP请求需要100ms,这个100ms就是系统的响应时间 带宽:计算带宽大小需关注两个指标,峰值流量和页面的平均大小 PV:综合浏览量(Page View),即页面浏览量或者点击量,通常关注在24小时内访问的页

Java高并发高性能分布式框架从无到有微服务架构设计

微服务架构模式(Microservice Architect Pattern).近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API).每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境.类生产环境等.另外,应尽量避免统一的.集中式的服务管理