关于servlet中的请求转发与重定向的区别

/*关于servlet中的请求转发与重定向

请求转发是在一个Servlet需要请求其他servlet时,会将请求转发给其他的Servlet去处理

在Servlet中使用request.getRequestDispatcher(url)来处理的

所以就理解定义而言,是将请求转发,,将请求,在这里我们需要注意

所以他是在一个请求中的,当我们使用request.setAttribute();

在转发的servlet是可以通过request.getAttribute()来拿到的

但是如果使用重定向,就是通过对客户端进行相应,要求客户端重新定向新的地址

这是会生成新的request对象。http是没有记忆能力的,不会记得上一个请求有属性,如果再上一个界面

setAttribute(),你以为你会在下个界面通过request.getAttribute(),会发现什么也没有。

写个例子

先来客户端*/

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/test1/TestResponse?user=admin&password=123456">点击</a>
</body>
</html>


再看处理请求的servlet

package com.test1;

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

/**
 * Servlet implementation class TestResponse
 */
@WebServlet("/TestResponse")
public class TestResponse extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestResponse() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub


    String userString=request.getParameter("user");
    String passwordString=request.getParameter("password");
    System.out.println("转发前"+userString);
    System.out.println("转发前"+passwordString);
    request.setAttribute("user",userString);
    request.setAttribute("password",passwordString);
    //response.sendRedirect("/test1/Redirect");
    request.getRequestDispatcher("/Redirect").forward(request,response);

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}
/*
注意一下文章的注释部分,转发可以使用相对路径,不需要使用环境路径,因为就在服务器里面进行的
重定向就要写环境路径了,是对客户端进行相应,要求客户端进行重定向


接下来是转发或重定向的servlet
*/
package com.test1;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Redirect
 */
@WebServlet("/Redirect")
public class Redirect extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Redirect() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        String userString=(String) request.getAttribute("user");
        String passwordString=(String) request.getAttribute("password");

        System.out.println(userString);
        System.out.println(passwordString);

        response.setCharacterEncoding("utf-8");

           OutputStream outputStream=response.getOutputStream();

           outputStream.write(userString.getBytes());
           outputStream.write(passwordString.getBytes());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

/*
测试结果是会在浏览器输出admin和123456

但是当打开重定向,关闭转发,你这程序会崩溃

转发界面找不到属性。
*/

猜你喜欢

转载自blog.csdn.net/qq_37657081/article/details/78891098