转发与重定向自我总结

来源:互联网 发布:windows经典桌面壁纸 编辑:程序博客网 时间:2024/06/06 00:25

在jsp的学习中,转发与重定向的区别是一个难点。

//重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。 

上述内容通过搜索得知。重定向的过程中无法再使用request

代码

使用重定向跳转页面,用于重定向的request无法保存所以需要使用session

所以FirstServlet

package com.demo;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

/**

 * Servlet implementation class FirstServlet

 */

@WebServlet("/FirstServlet")

public class FirstServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public FirstServlet() {

        super();

     

    }

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//请求转发

//String sno=request.getParameter("sno");

//RequestDispatcher requestDispatcher=request.getRequestDispatcher("SecondServlet");

//requestDispatcher.forward(request, response);

//请求重定向

 //session中保存Student对象

//response.sendRedirect("SecondServlet");

response.setContentType("text/html;charset=utf-8");

    PrintWriter out = response.getWriter();

    HttpSession session = request.getSession();

    // 给该session放入属性

    String name=request.getParameter("name");

    String sno=request.getParameter("sno");

    Student student=new Student();

    student.setName(name);

    student.setSno(sno);

    session.setAttribute("name", name);

    session.setAttribute("sno", sno);

    response.sendRedirect("SecondServlet");

}

 

}

实现过程中发现程序必须在doGet中才能显示,所以使用了doPost(request,response);

SecondServlet

package com.demo;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

/**

 * Servlet implementation class SecondServlet

 */

@WebServlet("/SecondServlet")

public class SecondServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public SecondServlet() {

        super();

        // TODO Auto-generated constructor stub

    }

 

/**

 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

 */

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

response.setContentType("text/html;charset=utf-8");

PrintWriter out = response.getWriter();

    HttpSession session = request.getSession();

    String name = (String) session.getAttribute("name");

    String sno = (String) session.getAttribute("sno");

    out.println("name:"+name+"sno:"+sno);

  

}

 

/**

 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

 */

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//out.println("sno:"+request.getParameter("sno"));

    //out.println("name:"+request.getParameter("name"));

//out.println("dopost");

//response.setContentType("text/html;charset=utf-8");

    //PrintWriter out = response.getWriter();

   // HttpSession session = request.getSession();

   // String name = (String) session.getAttribute("name");

   // String sno = (String) session.getAttribute("sno");

    //out.println("name:"+name+"sno:"+sno);

doPost(request,response);

   

    

}

 

}

 

 

 

 

 

 

运行程序发现页面已跳转到servlet2

若不使用重定向使用转发的话页面会继续保持在servlet1