转发与重定向

请求转发导入部分:

生活中常常会遇到这样的例子,例如打电话找某个单位的某个人,一般电话会呼叫到单位的总台,然后总台会根据我们提供的分机号转接到对应的分机最后我们就能进行正常的通话,其实这就又一个电话先到总机,总机再到分机的过程,这个过程我们称之为电话的转接。


请求转发:

其实在互联网中也会遇到类似的情况:浏览器首先发请求发送到ServletA,ServletA进过处理之后把请求传递到ServletB,由ServletB进行继续处理最后输出响应,这个传递的过程称之为请求转发。


请求转发原理:

浏览器首先发请求发送到ServletA进行处理,由于ServletA由于某种原因无法进行处理,也可能是设计的需求,所以交给ServletB继续进行服务这个时候ServletA就会调用forward()将请求转发给ServletB进行处理。

请求转发定义:

将当前的request和response对象交给指定的web组件处理。

说明:

其实在ServletA在调用请求转发的过程中,对于浏览器来说是透明的,浏览器并不知道为其服务的ServletA已经转化为ServletB,对于浏览器来说只是发出了一个请求然后获得一次响应。

注意:

在请求转发的过程中,浏览器的URL地址是不会变的。

转发对象RequestDispatcher:

要做请求转发首先要获取转发对象,然后调用转发对象的forward()
*RequestDispatcher:转发对象,它是由Servlet容器自动创建的,主要封装一个由路径所标识的服务器资源
--forward():请求转发到对应的服务器资源进行请求处理
--include():把请求发送给另外的web组件之后,原有的组件与被转发的组件都可以输出响应信息

获取转发对象RequestDispatcher:

可以通过两种方式获取:
*通过HttpServletRequest获取,也就是说从当前的请求中获取转发对象;
*通过ServletContext获取。

实例:

准备了两个例子,ServletForward与ServletForwarExample,首先请求会发送到ServletForward这个Servlet,然后由ServletForward转发到ServletForwarExample处理
ServletForward:
public class ServletForward extends HttpServlet {
	public void init() throws ServletException {
		System.out.println("init method");
	}
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//1.创建转发对象:获取转发对象,这个转发对象的参数为需要转发到下个Servlet的路径,
		//可以填mapping元素的url-pattern对应的地址
		RequestDispatcher rd = req.getRequestDispatcher("/forwardExample");
		
		//ServletContext对象获取转发对象:1.getNamedDispatche()
		//getNamedDispatche()参数为对象Servlet的名称,即是mapping元素的Servlet-name的名称
		rd1 = this.getServletContext().getNamedDispatcher(
				"ServletForwardExample");
	
		//ServletContext对象获取转发对象:1.getRequestDispatcher()
		//getRequestDispatcher(),参数只能填绝对路径
		rd2 = this.getServletContext().getRequestDispatcher("/forwardExample");

		//2.进行转发,需要把当前的request对象与response对象转发出去,这样forwardExample才能获取到request与response对象
		rd.forward(req, resp);
	}
}
ServletForwardExample:
public class ServletForwardExample extends HttpServlet {
	public void init() throws ServletException {
		System.out.println("init method");
	}

	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		//获取一个user的参数
		String user = req.getParameter("user");
		//把对应的user打印
		PrintWriter writer = resp.getWriter();
		writer.println("<html>");
		writer.println("<head><title>转发示例</title></head>");
		writer.println("<body>");
		writer.println("<p>用户名:" + user + "</p>");
		writer.println("</body>");
		writer.println("</html>");
		writer.close();
	}
}
web.xml:
<servlet>
	<servlet-name>ServletForward</servlet-name>
	<servlet-class>类路径.ServletForward</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>ServletForward</servlet-name>
	<url-pattern>/forward</url-pattern>
</servlet-mapping>

<servlet>
	<servlet-name>ServletForwardExample</servlet-name>
	<servlet-class>类路径.ServletForwardExample</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>ServletForwardExample</servlet-name>
	<url-pattern>/forwardExample</url-pattern>
</servlet-mapping>
<h2>
请求重定向导入部分:</h2>

请求重定向导入部分:

用户登录例子:

平时上网的时候访问某些网站都有一个用户登录的流程,其实就是用户发送一个登陆请求,然后服务器端返回一个登陆响应,在登陆验证完成之后,浏览器通常会跳转到另外一个页面,并且浏览器的地址栏也改变了,我们只做了一次请求,会出现另外一个页面。


原因:
在我们登陆完成之后,服务器端向浏览器返回另外一个URL地址的响应信息,浏览器接收到该响应信息之后会自动的请求服务器端返回的URL地址,
最后服务器端返回对应的跳转结果,这样用户就进入了另外的一个页面。

请求重定向:

用户请求用于登陆请求的ServletA,服务器端想在用户登录成功之后直接进入到用户的页面,也就是说服务器端在ServletA处理完之后,ServletB继续为用户进行服务,
此时ServletA用了sendRedirect()将客户端的请求重定向到ServletB,这个过程就是请求重定向的过程。

请求重定向的定义:

*服务器的Servlet通过response对象发送给浏览器一个新URL地址,让其重新请求。
*两次请求,两次响应

实例:

准备了两个Servlet,ServletRedirect与ServletRedirectExample,首先请求会发送到ServletRedirect,然后ServletRedirect会把请求重定向到ServletRedirectExample
做请求重定向需要注意的一点:通过原请求对象的响应对象进行重定向

ServletRedirect:

public class ServletRedirect extends HttpServlet {
	public void init() throws ServletException {
		System.out.println("init method");
	}

	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//sendRedirect()参数需要注意,请求重定向可以定向到这个站点的其他web资源,使用绝对路径时,
		//要把当前web资源</span>加入进来,简单起见,使用相对路径(mapping元素下的相对路径)
		resp.sendRedirect("redirectExample");
	}
}
ServletRedirectExample:
public class ServletRedirectExample extends HttpServlet {
	public void init() throws ServletException {
		System.out.println("init method");
	}
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		//注意这里与请求转发的区别,请求转发是同一个请求和同一个响应的转发
		//请求重定向是两次请求,两次转发,这里的请求和响应不是同一个
		//下面将获取不到user对象的值,即为null
		String user = req.getParameter("user");

		PrintWriter writer = resp.getWriter();
		writer.println("<html>");
		writer.println("<head><title>转发示例</title></head>");
		writer.println("<body>");
		writer.println("<p>用户名:" + user + "</p>");
		writer.println("</body>");
		writer.println("</html>");
		writer.close();
	}
}


web.xml:

<servlet>
	<servlet-name>ServletRedirect</servlet-name>
	<servlet-class>com.netease.server.example.web.controller.ServletRedirect</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ServletRedirect</servlet-name>
	<url-pattern>/redirect</url-pattern>
</servlet-mapping>

<servlet>
	<servlet-name>ServletRedirectExample</servlet-name>
	<servlet-class>com.netease.server.example.web.controller.ServletRedirectExample</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>ServletRedirectExample</servlet-name>
	<url-pattern>/redirectExample</url-pattern>
</servlet-mapping>

注意:

如果想重定向到当前的web资源则填写相对路径,如果想重定向到其他web资源就填写绝对路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值