重定向

重定向
重定向是利用服务器返回的状态码来实现的。客户游览器请求服务器的时候,服务器端会返回一个状态
码。服务器通过HttpServletResponse的setStatus(int statuss)方法设置状态码。如果服务器返回301或者302
,则游览器会到新的网址重新请求该资源。状态码代表的意义如下所示
1xx信息状态码。表示请求已被接受,正在被处理
2xx正确状态码。表示该请求已被正确接受处理,没有错误等发生。例如,200表示一切正确
3xx重定向状态码。例如301,302表示该资源已经不存在或者换了地址,客户端需要重新定向到一个新的资源。
服务器响应中会附带这个新资源地址
4xx请求错。例如401表示没有权限访问404表示资源不存在,405表示访问方式错误
5xx服务器错误。例如500表示程序出现异常而中途停止运行
301,302都表示重定向,区别是301是永久重定向,302是临时性重定向。下面的代码访问Servlet
的请求重定向到另一个网址
responsesetStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
reSponse.setHeader("Location","http://www.helloweenvsfei.com")
在HttpServletResponse类中把常用的状态代码封装成了静态的常量。吧setStatus与setHeader方法封装成另一个方法
sendRedirect(String location),只需要调用sendRedirextion就能实现重定向。
举例利用一个Servlet来统计下载文件的下载次数。要下载的文件以及下载次数都保持在一个map中。当单击下载的时候
,doget获取到文件名,更新下载的次数,并重定向到要下载的文件,达到统计下载letE数的目的
public class RedirectServlet extends HttpServlet{
          Map<String, integer>map=new HeashMap<String,integer>();
         @Override
          public void init()theows ServletException{
          map.put("/download/setup.exe,0");
          map.put("/download/application.zip",0);
          map.put("/dpwnload/01.mp3",0);
}

public void doget(HttpServletRequest request,HttpServletResponse response)throws ServletException
,IOException{
             String filename=request.getparameter("filename");
             
             if(filename!=null){
              int hit=map.get(filename);       统计下载的次数,取得下载的次数
             map.put(filename,++ hit);下载次数+1后保存
            
           response.senRedirect(request.getContextpath()+filename);

}
else{
      response.setCharacterEncoding("utf-8");
      response.setContentType("text/html");
 
      printWriter out =response.getWriter();
      out.println("<!DOCTYPE HTML PUBLIC\"-W3C//DTD HTML 4.01 TRANSITIONAL//EN\">");
      out.println("<HTML>");
      out.println("<HEAD><TITLE>文件下载<TITLE></HEAD>");
      out.println("<link rel='stylesheet' type='text/css' href='../css/style.css'>");
      out.println("<BODY><br/>");
    
      out.println("<fueldset align=center style=width:90%><legend>文件下载<legend>");
       out.println("<table width=100%>");
       out.println("<tr>");
       out.println("  <td><b>文件名</b></td>");
       out.println("<td><b>下载次数</b></td>");
       out.println("<td><b>下载</b></td>");
      out.println("</tr>");

      for(Entry<String,Integer>entry:map.entrySet()){
      out.println("<tr>");
      out.println("<td>"+entry.getkey()+"</td>");
      out.println("<td>"+entry.getValue()+"</td>");
      out.println("<td><a href='"+request.getRequestURl()+"?filename="+entry.getKey()+"'target='biank' onclick='
location=location;'>下载</a></td>");
       out.println("</tr>");

}
out.println("<table>");
out.println("</legend>");
out.println("</BODY>");
out.println("<HTML>");
out.flush();
out.close();
}

}
@Override
public void Destroy(){
   map =null;
}
}

posted @ 2013-02-05 17:33  南海问天  阅读(358)  评论(0)    收藏  举报