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

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

项目结构图



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

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

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

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

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.       
  8.     <servlet>  
  9.       <servlet-name>htmlServlet</servlet-name>  
  10.       <servlet-class>com.servlet.Servlet</servlet-class>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.       <servlet-name>htmlServlet</servlet-name>  
  14.       <url-pattern>*.do</url-pattern>  
  15.     </servlet-mapping>  
  16.   
  17.   <welcome-file-list>  
  18.     <welcome-file>index.jsp</welcome-file>  
  19.   </welcome-file-list>  
  20. </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.       
  11.     <title>首页面</title>  
  12.     <meta http-equiv="pragma" content="no-cache">  
  13.     <meta http-equiv="cache-control" content="no-cache">  
  14.     <meta http-equiv="expires" content="0">      
  15.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  16.     <meta http-equiv="description" content="This is my page">  
  17.     <!-- 
  18.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  19.     -->  
  20.   </head>  
  21.     
  22.   <body>  
  23.    <form action="kanName.do">  
  24.      <input name="chapterId" type="text" value="122"/>  
  25.      <input name="userName" type="text" value="张庆伟"/>  
  26.      <input type="submit" value="提交"/>  
  27.    </form>  
  28.   </body>  
  29. </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.       
  14.     <title>book页</title>  
  15.     <meta http-equiv="pragma" content="no-cache">  
  16.     <meta http-equiv="cache-control" content="no-cache">  
  17.     <meta http-equiv="expires" content="0">      
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  19.     <meta http-equiv="description" content="This is my page">  
  20.     <!-- 
  21.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  22.     -->  
  23.   </head>  
  24.     
  25.   <body>  
  26.   这是跳转页面:  
  27.    <%=lastPageId %>  
  28.   </body>  
  29. </html>  


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


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