`
vincent_com
  • 浏览: 41904 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类

关于JSP静态化与伪静态

 
阅读更多
首先是静态化:
private static final String CONTENT_TYPE = "text/html; charset=utf-8";
public static String isStatus(String picName,String jspName,HttpSession session,HttpServletRequest request, HttpServletResponse response){
   String uuid=java.util.UUID.randomUUID().toString();
   session=request.getSession();
   DAOFactory dao=DAOFactory.getInstance();
   String name = "";
   String htmlName="";
   try {
    response.setContentType(StatUtil.CONTENT_TYPE);
    String url = "";
   
    ServletContext sc =session.getServletContext();
   
    // 你要访问的jsp文件,如index.jsp
    // 则你访问这个servlet时加参数.如http://localhost/toHtml?file_name=index
    url = "/"+jspName;
    // 这是你要生成HTML的jsp文件,如
  

    name = request.getRealPath("/")+"pic-name-"+uuid+".html";
    htmlName="pic-name-"+uuid+".html";
  
    // 这是生成的html文件名,如index.htm.
    RequestDispatcher rd = sc.getRequestDispatcher(url);
    final ByteArrayOutputStream os = new ByteArrayOutputStream();
    final ServletOutputStream stream = new ServletOutputStream() {
     public void write(byte[] data, int offset, int length) {
      os.write(data, offset, length);
     }

     public void write(int b) throws IOException {
      os.write(b);
     }
    };
    final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));
    HttpServletResponse rep = new HttpServletResponseWrapper(response) {
     public ServletOutputStream getOutputStream() {
      return stream;
     }

     public PrintWriter getWriter() {
      return pw;
     }
    };
    rd.include(request, rep);
    pw.flush();
    FileOutputStream fos = new FileOutputStream(name);
    // 把jsp输出的内容写到xxx.htm
    os.writeTo(fos);
    fos.close();
  
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return htmlName;
}

以上是个方法,可以摘摘剪剪的放在自己的程序里。

但是要注意,request传值,一定要放在这个上面去做,否则得话,页面里将没有内容。反正我试的结果就是这样。

下面是伪静态。这块我也是从网上摘找的工具类,试了一下,很好使,很强大。

第一步,创建两个工具类。

代码如下,直接粘过去就可以用了。


public class Base64Coder {

private static char[] map1 = new char[64];
static {
   int i = 0;
   for (char c = 'a'; c <= 'z'; c++)
    map1[i++] = c;
   for (char c = '0'; c <= '9'; c++)
    map1[i++] = c;
   for (char c = 'A'; c <= 'Z'; c++)
    map1[i++] = c;
   map1[i++] = '+';
   map1[i++] = '/';
}

private static byte[] map2 = new byte[128];
static {
   for (int i = 0; i < map2.length; i++)
    map2[i] = -1;
   for (int i = 0; i < 64; i++)
    map2[map1[i]] = (byte) i;
}

public static String encodeString(String s) {
   return new String(encode(s.getBytes()));
}

public static char[] encode(byte[] in) {
   return encode(in, in.length);
}

public static char[] encode(byte[] in, int iLen) {
   int oDataLen = (iLen * 4 + 2) / 3; // output length without padding
   int oLen = ((iLen + 2) / 3) * 4; // output length including padding
   char[] out = new char[oLen];
   int ip = 0;
   int op = 0;
   while (ip < iLen) {
    int i0 = in[ip++] & 0xff;
    int i1 = ip < iLen ? in[ip++] & 0xff : 0;
    int i2 = ip < iLen ? in[ip++] & 0xff : 0;
    int o0 = i0 >>> 2;
    int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
    int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
    int o3 = i2 & 0x3F;
    out[op++] = map1[o0];
    out[op++] = map1[o1];
    out[op] = op < oDataLen ? map1[o2] : '_';
    op++;
    out[op] = op < oDataLen ? map1[o3] : '_';
    op++;
   }
   return out;
}

public static String decodeString(String s) {
   return new String(decode(s));
}

public static byte[] decode(String s) {
   return decode(s.toCharArray());
}

public static byte[] decode(char[] in) {
   int iLen = in.length;
   if (iLen % 4 != 0)
    throw new IllegalArgumentException(
      "Length of Base64 encoded input string is not a multiple of 4.");
   while (iLen > 0 && in[iLen - 1] == '_')
    iLen--;
   int oLen = (iLen * 3) / 4;
   byte[] out = new byte[oLen];
   int ip = 0;
   int op = 0;
   while (ip < iLen) {
    int i0 = in[ip++];
    int i1 = in[ip++];
    int i2 = ip < iLen ? in[ip++] : 'A';
    int i3 = ip < iLen ? in[ip++] : 'A';
    if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
     throw new IllegalArgumentException(
       "Illegal character in Base64 encoded data.");
    int b0 = map2[i0];
    int b1 = map2[i1];
    int b2 = map2[i2];
    int b3 = map2[i3];
    if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
     throw new IllegalArgumentException(
       "Illegal character in Base64 encoded data.");
    int o0 = (b0 << 2) | (b1 >>> 4);
    int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
    int o2 = ((b2 & 3) << 6) | b3;
    out[op++] = (byte) o0;
    if (op < oLen)
     out[op++] = (byte) o1;
    if (op < oLen)
     out[op++] = (byte) o2;
   }
   return out;
}

private Base64Coder() {
}

}

-----------------------------------------------------------------------------------------------

import java.util.*;
public class HtmlUtil {
protected static int JSP=20091;
protected static int ACTION=20092;
protected static int HTML=20093;
protected static int SEALED=404;
protected static String propertyName;//项目名称以及 前面得 那段文件夹路径
protected static String actionName;//action的名称
protected static String operate;//action执行的方 或则 jsp页面的名称
protected static int type;//类型
protected static HashMap<String, String> items=new HashMap<String, String>();
/**
* 把真实得url转换为html路径 (例:/Shopping/user.do?operate=doLogin&userName=xiaowu&password=19890104)
*/
public static synchronized String getHtmlUrl(String url){
   //判断类型
   type=getType(url);
   propertyName=getPropertyName(url);
   //如果是一个ACTION
   if(type==ACTION){
    actionName=getActionName(url,true);
    operate=getFunctionName(url,true);
    items=getItems(url,true);
   }
   if(type==JSP){
    actionName=getJspName(url,true);
    items=getItems(url,true);
   }

   //创建URL
   return createHtmlUrl();
}
/**
* 创建Html路径
* @return
*/
protected static String createHtmlUrl(){
   StringBuffer newUrl=new StringBuffer("");
   newUrl.append(actionName);
   newUrl.append("_");
   if(operate!=null&&!operate.equals("")){
    newUrl.append(operate);
   }
   newUrl.append("_");
   newUrl.append(type);
   newUrl.append("_");
   Set<String> keys=items.keySet();
   for (Object key : keys) {
    newUrl.append(key+"_"+items.get(key)+"_");
   }
   //对字符串进行编码
   String coding=Base64Coder.encodeString(newUrl.toString());
   if(propertyName!=null&&!propertyName.equals("")){
    return propertyName+coding+".html";
   }
   return coding+".html";
}
/**
* 把html路径转换为真实的路径
*/
public static synchronized String getRealityUrl(String url){
   //判断类型
   type=getType(url);
   if(type==JSP||type==ACTION){
    //路径为加密就直接返回
    return url;
   }
   propertyName=getPropertyName(url);
   String newUrl="";
   if(type==HTML){
    try{
     newUrl=url.substring(url.lastIndexOf("/")+1,url.length()-5);
     //对字符串进行解码
     newUrl=Base64Coder.decodeString(newUrl);
     actionName=getActionName(newUrl, false);
     operate=getFunctionName(newUrl,false);
     items=getItems(newUrl,false);
     type=getUrlType(newUrl);
    }catch(Exception ee){
     //如果是html页面强制改为jsp
     if(url.substring(url.length()-5).equalsIgnoreCase(".html")){
      //newUrl被改写过 所有要重新取得
      newUrl=url.substring(url.lastIndexOf("/")+1,url.length()-5);
      return newUrl+".jsp";
     }
     //如果URL无法通过解码那么就直接返回
     return url;
    }
   }
   return createRealityUrl();
}
// /**
// * 动态创建
// */
// public static synchronized String getHtmlUrl(String url,boolean b){
//   if(b==true){
//    if(url.indexOf("?")==-1){
//     url+="?";
//     url+="id"+System.currentTimeMillis()+"="+new Random().nextFloat();
//    }else{
//     url+="&id"+System.currentTimeMillis()+"="+new Random().nextFloat();
//    }
//   }
//   return getHtmlUrl(url);
// }
/**
* 还原真实路径
* @return
*/
protected static String createRealityUrl(){
   StringBuffer newUrl=new StringBuffer("");
   if(propertyName!=null&&!propertyName.equals("")){
    newUrl.append(propertyName);
   }
   if(actionName!=null&&!actionName.equals("")){
    if(type==ACTION){
     if(!operate.equals("")){
      newUrl.append(actionName+".do?operate="+operate);
     }else{
      newUrl.append(actionName+".do");
     }
    }else if(type==JSP){
     newUrl.append(actionName+".jsp");
    }else if(type==HTML){
     newUrl.append(actionName+".html");
    }else{
     newUrl.append(actionName);
    }
   }
   Set<String> keys=items.keySet();
   boolean isInterrogation=newUrl.toString().indexOf("?")!=-1?true:false;
   for (Object key : keys) {
    if(isInterrogation==false){
     newUrl.append("?");
     isInterrogation=true;
    }else{
     newUrl.append("&");
    }
    newUrl.append(key+"="+items.get(key));
   }
   return newUrl.toString();
}
// public static void main(String[] args) {
//   String strs[]={"/Shopping/user.do?operate=doLogin&userName=xiaowu&password=19890104",
//     "/Shopping/user.jsp?userName=xiaowu&password=19890104",
//     "user.do?operate=doLogin&userName=xiaowu&password=19890104",
//     "user.jsp?userName=xiaowu&password=19890104",
//     "/user.do?operate=doLogin&userName=xiaowu&password=19890104",
//     "/user.jsp?userName=xiaowu&password=19890104",
//     "user.do?operate=doLogin",
//     "/user.jsp",
//     "/Shopping/user.do",
//     "/Shopping/user.jsp",
//     "user.do",
//     "/user.do",
//     "user.jsp",
//     "/user.jsp",
//     "/Shopping/MyJsp.jsp"};
//   for (int i = 0; i < strs.length; i++) {
//    System.err.println("原路径"+strs[i]);
//    String str=HtmlUtil.getHtmlUrl(strs[i]);
//    System.err.println("加密后"+str);
//    str=HtmlUtil.getRealityUrl(str);
//    System.err.println("还原后"+str);
//    System.err.println("-----------------------------------------");
//   }
// }
/**
* 返回类型
*/
protected static int getUrlType(String url){
   if(url.indexOf("__")!=-1){
    return Integer.parseInt(getStr(url,1,"_"));
   }
   return Integer.parseInt(getStr(url,2,"_"));
}
/**
* 返回项目名称
*/
protected static String getPropertyName(String url){
   if(url.indexOf("/")==-1){
    return "";
   }
   return url.substring(0,url.lastIndexOf("/")+1);
}
/**
* 返回ACTION名称
*/
protected static String getActionName(String url,boolean b){
   if(b==false){
    return getStr(url,0,"_");
   }
   if(url.indexOf("/")==-1){
    return url.substring(0,url.indexOf("."));
   }
   return url.substring(url.lastIndexOf("/")+1,url.indexOf("."));
}
/**
* 返回JSP名称
*/
protected static String getJspName(String url,boolean b){
   if(url.indexOf("/")==-1){
    return url.substring(0,url.indexOf("."));
   }
   return url.substring(url.lastIndexOf("/")+1,url.indexOf("."));
}
/**
* 返回方法名称
*/
protected static String getFunctionName(String url,boolean b){
   if(b==false){
    if(url.indexOf("__")!=-1){
     return "";
    }
    return getStr(url,1,"_");
   }
   if(url.indexOf("?")==-1)
    return "";
   url=url.substring(url.lastIndexOf("operate=")+8,url.length());
   if(url.indexOf("&")==-1){
    return url;
   }
   return url.substring(0,url.indexOf("&"));
}

/**
* 
*/
protected static String getStr(String str,int count,String condition){
   java.util.StringTokenizer tok=new StringTokenizer(str,condition);
   int index=0;
   while(tok.hasMoreElements()){
    String newStr=tok.nextElement().toString();
    if(index==count){
     return newStr;
    }
    index++;
   }
   return "";
}

/**
* 返回items
*/
protected static HashMap<String, String> getItems(String url,boolean b){
   HashMap<String, String> items=new HashMap<String, String>();
   if(b==false){
    java.util.StringTokenizer tok=new StringTokenizer(url,"_");
    int index=0;
    if(url.indexOf("__")!=-1){
     index++;
    }
    while(tok.hasMoreElements()){
     String newStr=tok.nextToken();
     if(index>=3){
      String key=newStr;
      String value=null;
      try {
       value=tok.nextToken();
      } catch (Exception e) {
       value="";
      }
      items.put(key, value);
     }
     index++;
    }
    return items;
   }
   url=url.substring(url.lastIndexOf("?")+1,url.length());
   java.util.StringTokenizer tok=new StringTokenizer(url,"&");
   while(tok.hasMoreElements()){
    String str=tok.nextToken();
    if(str.indexOf("operate=")==-1&&str.indexOf("=")!=-1){
     StringTokenizer newTok=new StringTokenizer(str,"=");
     if(newTok.hasMoreElements()){
      String key=newTok.nextToken();
      newTok.hasMoreElements();
      String value=null;
      try {
       value=newTok.nextToken();
       if(value.equals("")){
        value=null;
       }
      } catch (Exception e) {
       value=null;
      }
      if(key.equals("")){
       key=null;
      }
      items.put(key, value);
     }
    }
   }
   return items;
}
/**
* 判断类型
*/
protected static int getType(String url){
   if(url.toUpperCase().indexOf(".DO")!=-1){
    return ACTION;
   }else if(url.toUpperCase().indexOf(".JSP")!=-1){
    return JSP;
   }else if(url.toUpperCase().indexOf(".HTML")!=-1){
    return HTML;
   }else{
    return SEALED;
   }
}
}

------------------------------------------

第二步,创建一个servlet。嗯,我的程序时用status做的,只要在web.xml里面添加一个servlet标签就可以了。如下:

<servlet>
   <servlet-name>HtmlDecode</servlet-name>
   <servlet-class>
    com.clothes.util.statUtil.HtmlDecode ///////这是你的servlet的位置
   </servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>HtmlDecode</servlet-name>
   <url-pattern>*.html</url-pattern>

</servlet-mapping>

///这是让你的所有以*.html跳转都跑到这个servlet里面,当然,也可以改成别的。都可以的。只要在htmlUtil类里去修改一下就可以了。用起来很舒服的。

第三步,就是使用咯。很简单,如下:

<A href="<%=HtmlUtil.getHtmlUrl("findProject.do?goodsid=123“)%>" >啦啦啦</a>

直接使用HtmlUtil里面的getHtmlUrl方法,他会在servlet编译的时候,将你要跳转的地址栏加密,同时在提交的时候,先跑到我们上面配置的哪个servlet里面,进行解密,然后跳转到你的.do或者其他的里面。挺好用的,不过一定要注意一点,就是那个goodsid这最好别加“_”,前面也最好别加。否则得话,就不灵了。嗯,这也是亲身经历。当然,这个传中文。。。我先试下!

嗯,不错,刚试了<a>提交和表单提交。结果是都可以的。如果用<a>提交出现乱码的话,就用我之前发的那个转乱码的工具类转一下就好了。可以支持中文
可以了。以上就这些,希望可以对大家有些帮助。

哎呀。。发现servlet忘了写进去了。现在加上,第二步的servlet:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import util.*;

public class HtmlDecode extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
   this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
   response.setCharacterEncoding("GBK");
   request.setCharacterEncoding("GBK");
   //取出URL
   String url=request.getRequestURI();
   //对URL进行解码
   String newUrl=HtmlUtil.getRealityUrl(url);
   System.out.println(newUrl);
   newUrl=newUrl.replaceAll(request.getContextPath()+"/", "");
   //跳转到解码后的页面
   request.getRequestDispatcher(newUrl).forward(request, response);
}
}

OK。就是这些。






分享到:
评论
1 楼 sublun 2012-06-04  
看起来不错。谢谢啦。

相关推荐

    jsp静态化和伪静态化

    jsp静态化和伪静态化

    jsp实现URL伪静态.rar

    jsp实现URL伪静态 jsp实现URL伪静态

    jsp静态化,jsp静态化

    有兴趣的可以研究一下。方法有很多种实现!

    JSP伪静态实现

    JSP伪静态技术实现网站静态化和RUL映射。

    jsp静态化总结(jsp2html)

    jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结jsp静态化总结

    jsp伪静态化

    /jsp-rewrite/WebRoot/WEB-INF/urlrewrite.xml sql文件: DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL, `userpwd` varchar(20)...

    jsp伪静态,javaweb实现伪静态

    jsp伪静态,javaweb实现伪静态实例,完整实例,说明文档

    jsp web 实现伪静态源码

    jsp 实现伪静态源码,请求时的参数不是name=aa&age=18,伪静态后为:aa/18/ 这样可以看不到请求的参数,这样既安全又使地址简单

    伪静态网页配置

    伪静态网页配置 首先新建一个应用程序池,名称任意,比如:nettest,托管管道模式先暂时设置为集成模式,等下面的一系列设置完成之后再设置成经典模式;

    JSP页面静态化

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

    java/jsp网站实现伪静态

    java/jsp网站实现伪静态,把.jsp伪装成.html,资源包含Demo和jar包

    jsp页面静态化

    jsp页面静态化介绍,首先说说为什么要静态化。 对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。

    动态JSP页面静态化,html输出

    把你的JSP动态页面静态化。把你的JSP动态页面静态化。把你的JSP动态页面静态化。把你的JSP动态页面静态化。

    JSP页面静态化最普遍用的三种

    JSP生成静态HTML页面的最为普遍的三种方法: 前两种比较好理解,看多自然明白,这第三种需对Filter对象进一步理解。

    Jsp页面静态化(freemarker)教程及源码

    前台页面的静态化就有利于SEO,所以这个问题摆在了我的面前,在网上一搜,关于这方面的资料不是很多,又很杂,关于这方面的知识,越来或多的程序员将会碰到,原来项目中这部分静态化的功能主要由我来做的,现在我将...

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

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

    JSP静态化(已测试)

    【资源介绍】:JSP静态化(已测试),多种方法 【备注】: 亲爱的下载用户: 谢谢您光临CSDN阿Q资源中心! 本中心发布的资源均是经过本人测试通过后才发布的,请放心下载。如果您有不清楚的问题或者建议,...

    JSP使用URLRewirte实现url地址伪静态化

    JSP使用URLRewirte实现url地址伪静态化

    动态Jsp页面转换成静态Html页面

    动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html页面动态Jsp页面转换成静态Html...

    Url Rewrite 实现jsp页面伪静态化_凌风_.doc

    Url Rewrite 实现jsp页面伪静态化_凌风_.doc

Global site tag (gtag.js) - Google Analytics