转发和重定向和request域对象

利用请求域传递对象(request域对象)
重定向和转发的区别(转发)(*****)
	
* 域对象
	ServletContext:服务器一启动,为每个web应用创建一个ServletContext对象,所有servlet实例共享对象。	
	request:一次请求的范围。
	
* setAttribute("","");
* getAttribute("");
* removeAttribute("");


* getRequestDispatcher(String path) ,返回是RequestDispatcher:对象
* RequestDispatcher:
	* forward(ServletRequest request, ServletResponse response)(经常使用) 转发的方法
	* include(ServletRequest request, ServletResponse response)(了解) 包含

request利用请求域传递对象

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理

setAttribute方法

getAttribute方法 

removeAttribute方法

getAttributeNames方法

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,从而共享请求中的数据

请求重定向和请求转发的区别

RequestDispatcher.forward 方法只能将请求转发给同一个 WEB 应用中的组件;而 HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对 URL 重定向到其他站点的资源。
 
如果传递给 HttpServletResponse. sendRedirect 方法的相对 URL 以“ / 开头,它是相对于 服务器的根目录 ;如果创建 RequestDispatcher 对象时指定的相对 URL 以“ / 开头,它是相对于 当前 WEB 应用程序的根目录
 
调用 HttpServletResponse. sendRedirect 方法重定向的访问过程结束后, 浏览器地址栏中显示的 URL 会发生改变 ,由初始的 URL 地址变成重定向的目标 URL ;调用 RequestDispatcher .forward 方法的请求转发过程结束后, 浏览器地址栏保持初始的 URL 地址不变
 
HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个 URL 的访问请求; RequestDispatcher.forward 方法在服务器端内部将请求转发给另外一个资源, 浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为
 
RequestDispatcher.forward 方法的调用者与被调用者之间 共享相同的 request 对象和 response 对象 ,它们属于同一个访问请求和响应过程;而 HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的 request 对象和 response 对象,它们属于两个独立的访问请求和响应过程。
 
 
package cn.learn.request;

import java.io.IOException;

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

/**
 * 重定向和转发
 * @author Administrator
 *
 */
public class RequestDemo3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// request域设置内容
		request.setAttribute("name", "凤姐");
		
		// 完成重定向的工作(客户端端绝对路径)
		// response.sendRedirect("/day10/request4");
		
		// 转发(路径服务器的绝对路径)
		request.getRequestDispatcher("/request4").forward(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package cn.learn.request;

import java.io.IOException;

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

public class RequestDemo4 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 获取
		String value = (String) request.getAttribute("name");
		// 输出中文
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("访问到了demo4... "+value);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

URL特殊字符转义规则

常用转义规则

空格换成加号(+)

+换成%2B

正斜杠(/)分隔目录和子目录 换成%2F

问号(?)分隔URL和查询 换成%3F

百分号(%)制定特殊字符 换成%25

#号指定书签  换成%23

&号分隔参数  换成%26

java.net.URLEncoderjava.net.URLDecoder

Request的开发细节

使用转发的方法后,response的缓冲区会被清空。

response.getWriter().write("aaa");

request.getRequestDispatcher("/demo2").forward(request, response);

response.getWriter().write("bbb");

 

RequestDispatcher

include方法:

RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能

被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略

底层使用的是子节流,所以输出内容只能使用字节流。

include在程序执行上效果类似forward,但是使用forward只有一个程序可以生成响应,include可以由多个程序一同生成响应 ----- 常用来页面布局

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值