JavaWeb入门—请求转发与响应重定向

版权声明:. https://blog.csdn.net/WildestDeram/article/details/87702704

请求转发与响应重定向

在实际开发中是多个Servlet组合和调用,如a servlet到 b servlet之间如何进行通信和跳转呢?

多个Servlet(JSP)之间跳转有两种方式:

  • request.getRequestDispatcher().forward()——请求转发
  • response.sendRedirect()——重定向

CheckLoginServlet.java

package com.imooc.servletjdk;

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 CheckLoginServlet
 */
@WebServlet("/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckLoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		System.out.println("用户已经登陆!");
		request.getRequestDispatcher("/index").forward(request, response);
	}

}

IndexPage.java

package com.imooc.servletjdk;

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 IndexPage
 */
@WebServlet("/index")
public class IndexPage extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public IndexPage() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.getWriter().println("<h1>This is page</h1>");
	}

}

 接下来使用响应重定向

package com.imooc.servletjdk;

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 CheckLoginServlet
 */
@WebServlet("/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckLoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		System.out.println("用户已经登陆!");
		//请求转发
		//request.getRequestDispatcher("/index").forward(request, response);
		
		//响应重定向	需要加contextPath
		response.sendRedirect("/rquest-struc/index");
	}

}

总结:

请求转发:请求转发是服务器跳转,只会产生一次请求。

首先浏览器发送请求给Tomcat,Tomcat接收到请求后根据对应的映射找到Servlet1,Servlet1执行到"request.getRequestDispatcher("/Servlet2").forward(request, response);"时,就会在Tomcat服务器内部进行自动请求,请求的地址是Servlet2,Servlet2经过程序之后会把结构响应给Tomcat,Tomcat再把响应结果返回给浏览器。

响应重定向:重定向是浏览器跳转,会产生两次请求。首先浏览器发送请求1给Tomcat,Tomcat把请求1转发给Servlet1,Servlet1经过处理后发现有response.sendRedirect("/rquest-struc/index");这句话,就让Tomcat把响应1发送给浏览器,这个响应1就告知浏览器,要求重新生成一个新请求并且跳转到新的地址(Servlet2)上,浏览器就会遵循请求原则,当Servlet2处理后就根据响应规则让浏览器呈现用户所需要的东西。所以当使用response.sendRedirect()时,URL的地址会显示Servlet2的映射地址,这也说明浏览器是经过了两次请求。

 

设置请求自定义属性: 

请求允许创建自定义属性

设置请求属性:request.setAttribute(属性名,属性值)       属性名为String,属性值为任意Java对象

获取请求属性:Object attr = request.getAttribute(属性名)

CheckLoginServlet.java

package com.imooc.servletjdk;

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 CheckLoginServlet
 */
@WebServlet("/CheckLoginServlet")
public class CheckLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckLoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		System.out.println("用户已经登陆!");
		//自定义属性
		request.setAttribute("username", "admin");
		//请求转发
		request.getRequestDispatcher("/index").forward(request, response);
	}

}

IndexPage.java

package com.imooc.servletjdk;

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 IndexPage
 */
@WebServlet("/index")
public class IndexPage extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public IndexPage() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String name = (String)request.getAttribute("username");
		response.getWriter().println("<h1>This is page "+name+"</h1>");
	}

}

猜你喜欢

转载自blog.csdn.net/WildestDeram/article/details/87702704