forward转发 和 和 redirect重定向 的区别

forward:

是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.例如:(forwardservelt向forward.jsp跳转:

    public class forwardservelt extends HttpServlet {  
      
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
      
            String destination = request.getParameter("destination");  
              
            if("file".equals(destination)){                 // 跳转到 /WEB-INF/web.xml  
                RequestDispatcher d = request.getRequestDispatcher("/WEB-INF/web.xml");  
                d.forward(request, response);  
            }         
            else if("jsp".equals(destination)){             // 跳转到 /forward.jsp  
                request.setAttribute("date", new Date());   //向JSP页面传递一个Date 对象  
                RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp");  
                dispatcher.forward(request, response);  
            }         
              
            else{  
                response.setCharacterEncoding("GBK");  
                response.getWriter().println("缺少参数。用法:" + request.getRequestURL() + "?destination=jsp 或者 file 或者 servlet ");  
            }  
        }  
    }  


forward.jsp页面代码

    <%@ page language="java" contentType="text/html; charset=GBK" %>  
    <jsp:directive.page import="java.util.Date"/>  
    <jsp:directive.page import="java.text.SimpleDateFormat"/>  
      
    <%  
        Date date = (Date)request.getAttribute("date");  
    %>  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <HTML>  
    <HEAD>  
    <TITLE>Forward 跳转</TITLE>  
      
    <link rel='stylesheet' type='text/css' href='<%= request.getContextPath() %>/css/style.css'>  
    </HEAD>  
    <BODY>  
    <div align='center'><br/><fieldset style=width:90%><legend>Forward 跳转</legend><br/>  
    <div style='line'>  
        <div>从 ForwardServlet 中取到的 Date 为</div>  
        <div><%= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(date) %></div>  
    </div>  
    <br/>  
      
    </div>  
    </BODY>  
    </HTML>  


redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.例如:

    Map<String, Integer> map = new HashMap<String, Integer>();  
          
        @Override  
        public void init() throws ServletException {  
            map.put("/download/1.txt", 0);  
            map.put("/download/2.txt", 0);  
            map.put("/download/3.txt", 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.sendRedirect(request.getContextPath() + filename); // 重定向到文件  
                System.out.println("dizhi"+request.getContextPath());  
            }  
            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("<fieldset 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.getRequestURI() + "?filename=" + entry.getKey() + "' target='_blank' οnclick='location=location; '>下载</a></td>");  
                    out.println("</tr>");  
                }  
                System.out.println( "地址为:"+request.getRequestURI());  
                out.println("</table>");  
                out.println("   </legend>");  
                out.println("  </BODY>");  
                out.println("</HTML>");  
                out.flush();  
                out.close();  
            }         
        }  
        @Override  
        public void destroy() {  
            map = null;  
        }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值