现在的位置: 首页 > 综合 > 正文

jsp页面静态化

2018年05月23日 ⁄ 综合 ⁄ 共 8901字 ⁄ 字号 评论关闭
092012

 

对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。
为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资源。如果这期间还有和数据库的通讯,那么代价将会更大。
如果一个页面在一定的时间内,其内容没有发生改变,那么就不必为每一次对它的访问进行一次“新”的编译或执行。我们可以把它在这段没有发生改变的时间内的 结果保存到一个静态的页面里面,然后每次访问这个页面时,就用刚才保存的静态页面进行回复。这样便能大大地减少系统资源的消耗,并且提高对客户的响应速 度。而这个过程就称之为页面静态化。
现在所面临的问题就是如何在JSP中将页面的内容保存下来。
在访问JSP页面的时候,服务器会先将JSP文件编译为Servlet文件,然后对这个Servlet编译、执行,并最终把结果返回给客户端。而我们的任务就是要把这个最终生成的HTML静态页面保留下来,存放在服务器上。
解决的方法其实很简单。普通的对于JSP的访问,最终的数据流是回写到客户端的,如果我们把它重定向,让它回写到服务器上一个本地的文件,这样就能把JSP的执行结果保存起来,而这个文件就是我们想要得到的静态化的结果。
好了,说了那么多废话,现在说说具体怎么实现。看过将JSP编译成的Servlet文件以后,可以知道这个Servlet是通过一个”JspWriter”类型的对象将数据回写给客户端的,而这个对象 正是JSP里面的内置对象”out”,现在我们只需要定义一个自己的类,让它继承”JspWriter”类,覆盖里面的输出相关函数,让数据都输出到一个 指定的文件就可以了。
例如(省略了部分重载函数):
程序代码
import java.io.*;
import javax.servlet.jsp.*;
public class ConstPageWriter extends JspWriter {
private PrintWriter pw;
public ConstPageWriter(String fileName){
super(JspWriter.DEFAULT_BUFFER, false);
try{
pw = new PrintWriter(fileName, “UTF-8″);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void print(String arg0) throws IOException {
pw.print(arg0);
}
……
@Override
public void println() throws IOException {
pw.println();
}
@Override
public void println(Object arg0) throws IOException {
pw.println(arg0);
}
……
@Override
public void write(char[] arg0, int arg1, int arg2) throws IOException {
pw.write(arg0, arg1, arg2);
}
}

然后将需要静态化的页面写成如下形式:
程序代码
<%
String fileName = “ConstPageName”; // 生成的静态页面文件名
if (notNeedUpdate){ // 判断是否需要更新
response.sendRedirect(fileName);
return;
}
out = new ConstPageWriter(pageContext.getServletContext().getRealPath(fileName));
%>
<%
// Build this page,更新页面
%>
<%
out.close();
response.sendRedirect(fileName);
%>

这样页面静态化基本上就算完成了,余下的操作就是处理何时需要更新。至于何时更新是跟特定的应用程序相关的,这里就不详细分析了。
JSP使用URLRewirte实现url地址伪静态化
JSP使用URLRewirte实现url地址伪静态化
在网上找了很多关于URLRewirte的使用,基本都是关于asp的,jsp的相关文档很少,而且大多写的很模糊,看了之后也是不清不楚,而且在 项目中无法使用成功,鉴于此,自己整理了关于URLRewirte的用法.该方法只是实现了url的伪静态化,并不是真正的静态化.
工作环境:Eclipse3.2.2+MyEclipse_5.5.1+Tomcat5.0.28
URLRewirte版本:urlrewrite-2.6.0.jar
前提条件:有一个可以正常使用的web应用项目
URLRewirte的用处:
1.满足搜索引擎的要求
2.隐藏技术实现,提高网站的移植性
3.满足美感的要求(个人感觉这个用处太牵强)
项目部署
1.首先在http://tuckey.org/urlrewirte/ 下载urlrewirtefilter
2.解压所下载的文件,把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录下,然后编译
3.把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录下
4.在web.xml文件中加入以下:
<!– 动态地址静态化 –>
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.需要配置urlrewrite.xml文件来实现url静态化,下面将详细说明
到这里相关的配置已经完成,下面看如何把动态地址静态化
1.普通url静态化
例如:要把http://localhost/prjtest/user/list.jsp 转换成http://localhost/prjtest/user/list.html
这种是最简单的,当一个servlet跳转到list.jsp页面列出user列表时,在urlrewrite.xml中这样配置:
<rule>
<from>^/user/list.html</from>
<to>/user/list.jsp</to>
</rule>
当请求/user/list.html这个页面时,实际上相当于请求/user/list.jsp页面
在servlet的跳转要这样写:
response.sendRedirect(“./user/list.html”);
2.带参数的url静态化
例如:要把http://localhost/prjtest/user/view.jsp?cid=1&cname=admin 转换成

http://localhost/prjtest/user/view/1_admin.html

在urlrewrite.xml中这样配置:
<rule>
<from>^/user/view/([0-9]+)_([a-z]+).html$</from>
<to>/user/view.jsp?cid=$1&amp;cname=$2</to>
</rule>
当请求/user/view/1_admin.html这个页面时,实际上相当于请求/user/list.jsp?cid=1&cname=admin页面
在servlet的跳转要这样写(cid,cname为变量):
response.sendRedirect(“./user/view/”+ cid +”_”+ cname +”.html”);
注意:配置文件中用”&amp;”来代替”&”

文档冲亿季,好礼乐相随mini ipad移动硬盘拍立得百度书包
 

一、

从数据库中取相应数据并替换掉模板中的对应标签,

下面是一个简单的示例

一、从数据库中取相应数据并替换掉模板中的对应标签,下面是一个简单的示例

一、

从数据库中取相应数据并替换掉模板中的对应标签,

下面是一个简单的示例

<head>  
<title>###title###</title>  
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">  <LINK href="../css.css" rel=stylesheet type=text/css>  </head>   
<body>  
<table width="500" border="0" align="center" cellpadding="0" cellspacing="2">     <tr>   
     <td align="center">###title###</td>     </tr>     <tr>   
     <td align="center">author:###author###&nbsp;&nbsp;</td>     </tr>     <tr>  
     <td>###content###</td>     </tr>  </table>  </body>  </html>    
=======================================================   
二、从动态页的URL获取相应页面内容并写入到文件   /*  
* Created on 2006-3-4  
* To change the template for this generated file go to  
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments  */  
package com.easydone.cn.tools.utils;   
import java.io.BufferedReader;  import java.io.File;  
import java.io.FileOutputStream;  import java.io.InputStream;  
import java.io.InputStreamReader;  import java.io.PrintWriter;  
import java.net.HttpURLConnection;  import java.net.URL;  import java.util.Date;   /**  

 

* @author Administrator  
* To change the template for this generated type comment go to  
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments  */  
public class MakeHtml {  
         private static long star = 0;           private static long end = 0;           private static long ttime = 0;   
         //返回html代码  
         public static String getHtmlCode(String httpUrl){           Date before = new Date();           star = before.getTime();           String htmlCode = "";           try {  
         InputStream   in;  
         URL url = new java.net.URL(httpUrl);  
         HttpURLConnection connection = (HttpURLConnection)url.openConnection();           connection = (HttpURLConnection) url.openConnection();           connection.setRequestProperty("User-Agent","Mozilla/4.0");           connection.connect();  
         in = connection.getInputStream();  
         java.io.BufferedReader breader = new BufferedReader(new InputStreamReader(in , "GBK"));           String currentLine;  
           while((currentLine=breader.readLine())!=null){           htmlCode+=currentLine;             }  
         } catch (Exception e) {           e.printStackTrace();           }finally{  
         Date after = new Date();           end = after.getTime();           ttime = end-star   
         System.out.println("执行时间:"+ttime +"秒");           }  
         return htmlCode;           }  
         //存储文件  
         public static synchronized void writeHtml(String filePath,String info,String flag) {   
         PrintWriter pw = null;           try {  
         File writeFile = new File(filePath);           boolean isExit = writeFile.exists();  

 

         if (isExit != true) {  
         writeFile.createNewFile();           } else {  
         if (!flag.equals("NO")) {           writeFile.delete();  
         writeFile.createNewFile();           }            }  
         pw = new PrintWriter(new FileOutputStream(filePath, true));           pw.println(info);           pw.close();  
         } catch (Exception ex) {  
         System.out.println(ex.getMessage());           }finally{           pw.close();           }           }   
         public static void main(String[] args) {  
         String url = "http://www.easydone.cn/index.htm";           writeHtml("c:/demo.htm",getHtmlCode(url),"NO");           }  }   
三、利用Filter和定制Response,把服务器返回的JSP响应输出到我们自己的Response中,就可以将响应快速写入Html文件,然后再发送给客户。   
import java.io.*;  
import javax.servlet.*;  import javax.servlet.http.*;  import java.util.Calendar;   
public class CacheFilter implements Filter {     ServletContext sc;     FilterConfig fc;  
   long cacheTimeout = Long.MAX_VALUE;   
   public void doFilter(ServletRequest req,                          ServletResponse res,                          FilterChain chain)  
       throws IOException, ServletException {       HttpServletRequest request =           (HttpServletRequest) req;       HttpServletResponse response =  

 

         (HttpServletResponse) res;   
     // check if was a resource that shouldn't be cached.       String r = sc.getRealPath("");       String path =   
         fc.getInitParameter(request.getRequestURI());       if (path!= null && path.equals("nocache")) {         chain.doFilter(request, response);         return;       }  
     path = r+path;   
     String id = request.getRequestURI() +            request.getQueryString();  
     File tempDir = (File)sc.getAttribute(         "javax.servlet.context.tempdir");   
     // get possible cache  
     String temp = tempDir.getAbsolutePath();       File file = new File(temp+id);   
     // get current resource       if (path == null) {  
       path = sc.getRealPath(request.getRequestURI());       }  
     File current = new File(path);   
     try {  
       long now =  
         Calendar.getInstance().getTimeInMillis();         //set timestamp check  
       if (!file.exists() || (file.exists() &&  
           current.lastModified() > file.lastModified()) ||             cacheTimeout < now - file.lastModified()) {           String name = file.getAbsolutePath();           name =  
             name.substring(0,name.lastIndexOf("/"));           new File(name).mkdirs();  
         ByteArrayOutputStream baos =               new ByteArrayOutputStream();  
         CacheResponseWrapper wrappedResponse =             new CacheResponseWrapper(response, baos);           chain.doFilter(req, wrappedResponse);   

 

         FileOutputStream fos = new FileOutputStream(file);           fos.write(baos.toByteArray());           fos.flush();           fos.close();         }  
     } catch (ServletException e) {         if (!file.exists()) {  
         throw new ServletException(e);         }       }  
     catch (IOException e) {         if (!file.exists()) {           throw e;         }       }   
     FileInputStream fis = new FileInputStream(file);  
     String mt = sc.getMimeType(request.getRequestURI());       response.setContentType(mt);  
     ServletOutputStream sos = res.getOutputStream();       for (int i = fis.read(); i!= -1; i = fis.read()) {         sos.write((byte)i);       }     }   
   public void init(FilterConfig filterConfig) {       this.fc = filterConfig;       String ct =  
         fc.getInitParameter("cacheTimeout");       if (ct != null) {  
       cacheTimeout = 60*1000*Long.parseLong(ct);       }  
     this.sc = filterConfig.getServletContext();     }   
   public void destroy() {       this.sc = null;       this.fc = null;     }  }

【上篇】
【下篇】

抱歉!评论已关闭.