httpservletrequest-httpservletrequest request.getLocalName返回为空是什么问题

JavaWeb【Servlet】(5)
1. 获得客户机信息
&&& getRequestURL方法返回客户端发出请求时的完整URL。
&&& getRequestURI方法返回请求行中的资源名部分。
&&& getQueryString 方法返回请求行中的参数部分。
&&& getRemoteAddr方法返回发出请求的客户机的IP地址&
&&& getRemoteHost方法返回发出请求的客户机的完整主机名
&&& getRemotePort方法返回客户机所使用的网络端口号
& & getLocalAddr方法返回WEB服务器的IP地址。
&&& getLocalName方法返回WEB服务器的主机名&
&&& getMethod得到客户机请求方式
&2.获得客户机请求头&
&&& getHeader(string name)方法&
&&& getHeaders(String name)方法&
&&& getHeaderNames方法&
&3. 获得客户机请求参数(客户端提交的数据)
& & getParameter(name)方法
&&& getParameterValues(String name)方法
&&& getParameterNames方法&
&&& getParameterMap方法
浏览器上地址栏:http://localhost:8080/RequestAndResponse/requestmethod?name=sunjob&password=123456&password=haha
控制台输出:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:166391次
积分:3534
积分:3534
排名:第9646名
原创:183篇
转载:45篇
评论:24条
文章:41篇
阅读:26881
(1)(1)(3)(1)(1)(3)(7)(24)(51)(26)(9)(7)(5)(50)(19)(7)(1)(2)(10)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'Servlet详解一(配置及request和response)
一、线程安全问题:
当多个客户端并发访问一个Servlet时,Web服务器会为每一个客户端请求创建一个线程,并在线程上调用servlet的service方法,而当service方法访问共享数据时,就存在线程安全问题了。
在早期的处理此线程安全问题的一种思路是让Servlet实现SingleThreadModel接口,此接口是一个标识接口,各web服务器对此的解释不同,一般分为每个请求创建一个实例对象与调用service方法同步。Tomcat是采取了方式一为每个请求都创建一个实例。但这两种方式都不合适,因为servlet2.4规范中已将SingleThreadModel接口过时了。而真正的处理此线程安全的合理方式时,应该尽量避免使用共享数据,尽量定义局部变量。
二、Servlet可配置参数及读取参数信息
1.在web.xml中,需要配置&servlet&及&servlet-mapping&标签,还可以在&servlet&标签下面定义子元素&init-param&,在此子元素下面配置&param-name&与&param-value&子元素。而读取&servlet&子元素&init-param&中配置的信息,可以用ServletConfig对象的getInitParameter方法。因为ServletConfig对象是,Web容器在创建Servlet后,调用servlet的init方法时传进去的,所以各种servlet的ServletConfig对象各不一样。同一servlet中可以配置多个init-param元素,同一param-name为被后面的覆盖。
举例如下:
&&& &servlet-name&ServletConfigD1&/servlet-name&
&& &servlet-class&com.itheima.servlet.ServletConfigD1&/servlet-class&
&&& &init-param&
&&& &param-name&url&/param-name&
&&& &param-value&jdbc:mysql&/param-value&
&&& &/init-param&
&&&& &init-param&
&&& &param-name&url&/param-name&&&!--
允许有重复的,有重复的时最终读取的最后一个url --&
&&& &param-value&jdbc:oracle&/param-value&
&&& &/init-param&
&&& &init-param&
&&& &param-name&username&/param-name&
&&& &param-value&scott&/param-value&
&&& &/init-param&
&&& &init-param&
&/servlet&
&&& 而具体读取代码示例:getServletConfig().getInitParameter(“url”)。
2.在servlet中另一种方式读取配置信息,就是将param配置在整个应用级中,为所有servlet共享,则定义在servlet元素的外面,与servlet元素同一层级。而读取应用级的读取信息,要用到应用级的对象ServletContext对象,ServletContext对象一个应用只有一个对象,在应用被web服务器加载时被加载初始化创建对象,而在应用被web服务器停用或卸载时消亡。是随着整个应用的加载而加载,随着整个应用的消亡而消亡的。具体举例如下:
&context-param&
&&&&&& &param-name&encoding&/param-name&&!--注意context-param中不允许有重复的param
&&&&&& &param-value&utf-8&/param-value&
&/context-param&
读取配置信息encoding,只需要在servlet中使用getServletContext().getInitParameter(“encoding”)即可。
三、三种读取配置文件的方式,另详细。见三种读取文件方式。
四、HttpServletResponse对象详解
1.&&&&&&输出中文内容
在response对象中,输出流可以有response.getOutputStream的字节流输出与response.getWriter字符流输出。而对中文的输出,若没有进行输出的编码说明时,直接输出中文,OutputStream没有乱码问题,而Writer会有乱码问题。
原因:response.getOutputStream采用的是默认的编码GBK,而response.getWriter采用的是ISO-8859-1编码的。而客户端浏览器也采用默认的编码GBK,所以字节流没有问题,而字符流出现了乱码。
解决向:客户端输出中文乱码文件,
对于字节流OutputStream来说:可以用合适的str.getBytes(“utf-8”)编码后输出。但输出前要告诉浏览器用了什么编码了,这个信息一般放在响应头中,如response.setHeader(“content-type”,”text/charset=utf-8”),当然也可以用response.setContentType(”text/charset=utf-8”),或者write(&&meta
http-equiv='Content-Type'content='text/ charset=utf-8' /&&.getBytes());
对于字符流Writer来说,可以直接用response.setContentType(”text/charset=utf-8”)来搞定即可,它相当于
response.setCharacterEncoding(“UTF-8”);response.setHeader(“content-type”,”text/charset=utf-8”);两句。
2.&&&&&&中文文件名下载乱码问题:
在下载前的response.setHeader(“content-disposition”,”filename=strNam”);需要注意,不能直接将strName输出,要用URLEncoder进行encode(strNam,”utf-8”)进行编码后,再输入。因为这种中文名下载会像在百度输入关键字,采用get请求输入中文参数一样,会经过http的URL编码的。
3.&&&&&&控制浏览器缓存一页面时间为1小时(不常变的页面,为了减轻服务器的压力,而设置缓存时间长点)
response.setDateHeader(“Expires”, System.currentTimeMillis()+);
4.&&&&&&生成随机图片思路:
就是用BuffedImage,得到Graphics画笔后,先设置color后,画个边框drawRet..,再设置另一clor接着在框中填充前景fillRet…,接着画些干扰线如drawLine,接着生成随便几个数字用drawString画出来,最后将画在内容中的数据,输出在response.getOutputStream中,用ImageIO.write即可了。
5.&&&&&&请求重定向
前遍http入门中讲到在响应状态码中包括302与307状态码即是请求重定向了。它是http请求一组件时,此组件告诉浏览器不要向它请求,告诉了另一个地址,让浏览器重写向新的资源地址请求。所以这个过程发生了两个http请求。则表现在url地址会变化,且是两次http请求增加了服务器的负担。
代码示例:
Response.setState(302)
与response.setHeader(“Location”,”/demo5/servlet/SD1.do”)也可以用一句搞定response.sendRedirect(”/demo5/servlet/SD1.do”)
6.&&&&&&Response输出流的一些细节:
6.1&&&在servlet中不能同时使用getOutputStream与getWriter方法,两者是互斥着。
6.2&&&&在servlet中输出的内容只是缓存进了response的输出流中,而Web容器会根据输出流缓存内容进行组织下加些响应头输出来。
6.3&&&Web容器会在调用servlet的service方法后,检查response的输出流是否已经关闭了,若没有关闭则web容器会关闭输出流。
五、HttpServletRequest详细:
1.&&&&&&常用的一些获取客户端信息方法:
a)&&&&&&&&getRequestURL方法返回客户端发出请求时的完整URL。http://.../ServletReLine
b)&&&&&&&&getRequestURI方法返回请求行中的资源名部分。如/servlet/ServletRequestLine
c)&&&&&&&&getQueryString方法返回请求行中的参数部分。
d)&&&&&&&&getRemoteAddr方法返回发出请求的客户机的IP地址
e)&&&&&&&&getRemoteHost方法返回发出请求的客户机的完整主机名
f)&&&&&&&&&getRemotePort方法返回客户机所使用的网络端口号
g)&&&&&&&&getLocalAddr方法返回WEB服务器的IP地址。
h)&&&&&&&&getLocalName方法返回WEB服务器的主机名
i)&&&&&&&&&&getMethod得到客户机请求方式 GET或者POST
j)&&&&&&&&&&getContextPath方法返回应用上下文地址:如 /demo5
2.&&&&&&获取请求头信息
a)&&&&&&&&getHead(name)方法返回指定name的值的头信息
b)&&&&&&&&getHeaders(String name)方法&返回同一name多个值的头信息,指Warning头信息。
c)&&&&&&&&getHeaderNames方法所以头的name信息
3.&&&&&&获取客户端请求参数(客户端提交的值):
a)&&&&&&&&getParameter(name)方法&用在一个name一个值
b)&&&&&&&&getParameterValues(String name)方法&&用在一个name多个值
c)&&&&&&&&getParameterNames方法&&将所有请求参数名返回
d)&&&&&&&&getParameterMap方法& //做框架用,非常实用,包含请求参数名与值
注意这里有个BeanUtils.populate(Obj,request. getParameterMap)可设值到obj.
e)&&&&&&&&getInputStream
4.&&&&&&解决请求参数乱码问题:
GET方式的乱码:
如&a href=”/demo5/servlet/RD2?name=中国”&CN&/a&,直接用request.getParameter得到的字符串strCN将会乱码,这也是因为GET方式是用http的url传过来的默认用iso-8859-1编码的,所以首先得到的strCn要再用iso-8859-1编码得到原文后,再进行用utf-8(看具体页面的charset是什么utf-8或gbk)进行解码即可。new
String(strCn.getBytes(“ISO-8859-1”),“UTF-8”);
POST方式的乱码:只需要request.setCharacterEncoding(&UTF-8&):即可。
5.&&&&&&表单数据的获取:
Checkbox、input、select等等,因checkbox一般是复选代表一组通常name属性是一值的,有多个值。所以要用request.getParameterValues(name)
6.&&&&&&request域对象与请求转发
request也是一域对象,可以用request.setAttribute(“name”,”value”)。在用在请求转发时,在另一servlet中,可以用request.getAttribute(“name”)得到值。当然不能用在response.sendRedirect中(这个是请求重定向两个http请求,两个不同的request)。而请求转发是指请求一组件时,此组件将请求request对象与去掉响应体的response对象原样传到另一servlet组件中,由另一servlet组件来处理请求。所以此时表现在:是一个http请求,URL地址没有变化。同一request对象,源response对象去掉响应体传到目标servlet中。
具体代码如下:
RequestDispatcher rd = request.getRequestDispatcher(path);
rd.forward(request,response);//在forward前,窗口将把response中的响应体去掉,因为在源组件servlet中out.write的任何内容将丢失了。注意在源组件servlet中不能flush输出流或关闭输出流。
7.&&&&&&得到RequestDispatcher的方式,有以下两种:
7.1 Request.getRequestDispatcher(path)可用绝对路径/开关也可用相对路径,建议用绝对路径来搞定。
7.2 getServletContext().getRequestDispatcher(path),path只能是以/开头
8.&&&&&&包含
可以在一组件servlet中用请求分派器RequestDispatcher的include方法,将目标组件servlet中的响应结果包含进源组件中,两种响应体输出结果一起输出出来。注意:目标组件中的servlet响应头将会被丢失:
具体代码如下:
RequestDispatcher rd = request.getRequestDispatcher(path);
rd.include(request,response);//目标中的响应头将会丢失。
9.&&&&&&各种相对路径与绝对路径的写法
若路径地址是给服务器用的,则不需要加应用名。直接以/开头代表应用路径/servlet…
若路径地址是给客户端用的,则需要加应用名。要用/demo5/servlet…
具体应用场景:
9.1 请求转发与包含是服务器行为可以用Request.getRequestDispatcher(“/servlet/SD2.do”)
9.2 请求重定向,用可以reqeust.sendRedirect(“/demo5/servlet/SD2.do”)
&ahref/&& 客户端用的/demo5
&scriptsrc=&&/&&& 客户端用的/demo5
&imgsrc=&&/&&& 客户端用的/demo5
&linktype=&text/css& href=&&/&&客户端用的/demo5
&&&&&&&&&& &formaction=&&/&&&客户端用的/demo5
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&1. 获得客户机信息
&&& getRequestURL方法返回客户端发出请求时的完整URL。
&&& getRequestURI方法返回请求行中的资源名部分。
&&& getQueryString 方法返回请求行中的参数部分。
&&& getRemoteAddr方法返回发出请求的客户机的IP地址
&&& getRemoteHost方法返回发出请求的客户机的完整主机名
&&& getRemotePort方法返回客户机所使用的网络端口号
& & getLocalAddr方法返回WEB服务器的IP地址。
&&& getLocalName方法返回WEB服务器的主机名
&&& getMethod得到客户机请求方式
&2.获得客户机请求头
&&& getHeader(string name)方法
&&& getHeaders(String name)方法
&&& getHeaderNames方法&
&3. 获得客户机请求参数(客户端提交的数据)
& & getParameter(name)方法
&&& getParameterValues(String name)方法
&&& getParameterNames方法
&&& getParameterMap方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(&getRequestURL: &+request.getRequestURL());
System.out.println(&getRequestURI: &+request.getRequestURI());
System.out.println(&getQueryString: &+request.getQueryString());
System.out.println(&getRemoteAddr: &+request.getRemoteAddr());
System.out.println(&getRemoteHost: &+request.getRemoteHost());
System.out.println(&getRemotePort: &+request.getRemotePort());
System.out.println(&getRemoteUser: &+request.getRemoteUser());
System.out.println(&getLocalAddr: &+request.getLocalAddr());
System.out.println(&getLocalName: &+request.getLocalName());
System.out.println(&getLocalPort: &+request.getLocalPort());
System.out.println(&getMethod: &+request.getMethod());
System.out.println(&-------request.getParamterMap()-------&);
//得到请求的参数Map,注意map的value是String数组类型
Map map = request.getParameterMap();
Set&String& keySet = map.keySet();
for (String key : keySet) {
String[] values = (String[]) map.get(key);
for (String value : values) {
System.out.println(key+&=&+value);
System.out.println(&--------request.getHeader()--------&);
//得到请求头的name集合
Enumeration&String& em = request.getHeaderNames();
while (em.hasMoreElements()) {
String name = (String) em.nextElement();
String value = request.getHeader(name);
System.out.println(name+&=&+value);
浏览器上地址栏:http://localhost:8080/RequestAndResponse/requestmethod?name=sunjob&password=123456&password=haha
控制台输出:
getRequestURL: http://localhost:8080/RequestAndResponse/requestmethod
getRequestURI: /RequestAndResponse/requestmethod
getQueryString: name=sunjob&password=123456&password=haha
getRemoteAddr: 127.0.0.1
getRemoteHost: 127.0.0.1
getRemotePort: 2374
getRemoteUser: null
getLocalAddr: 127.0.0.1
getLocalName: localhost
getLocalPort: 8080
getMethod: GET
-------request.getParamterMap()-------
name=sunjob
password=123456
password=haha
--------request.getHeader()--------
host=localhost:8080
user-agent=Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/ Firefox/17.0
accept=text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8
accept-language=zh-cn,en-q=0.8,q=0.5,q=0.3
accept-encoding=gzip, deflate
connection=keep-alive
cache-control=max-age=0
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3294次
排名:千里之外
(3)(1)(1)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'Servlet——HttpServletRequest对象详解
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户的这些信息。
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户的这些信息。
======================================================================================
HttpServletRequest常用方法
getRequestURL方法返回客户端发出请求时的完整URL
getRequestURI方法返回请求行中的资源名部分
getQueryString方法返回请求行中的参数部分(参数名+值)
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回web服务器所使用的网络端口号
getLocalPort方法返回web服务器所使用的网络端口号
getLocalAddr方法返回web服务器的IP地址
getLocalName方法返回web服务器的主机名
在Servlet中作如下测试:
// 得到URL
String url = request.getRequestURL().toString();
System.out.println("URL:"+url);
out.println("URL:"+url+"
// 得到URI
String uri = request.getRequestURI();
System.out.println("URI:"+uri);
out.println("URI:"+uri+"
// 得到参数字符串
String query_string = request.getQueryString();
System.out.println("QueryString:"+query_string);
out.println("QueryString:"+query_string+"
// 得到请求方的IP地址
// 可以以此来封杀某些IP
String remote_addr = request.getRemoteAddr();
System.out.println("RemoteAddr:"+remote_addr);
out.println("RemoteAddr:"+remote_addr+"
// 得到请求方的完整主机名
String remote_host = request.getRemoteHost();
System.out.println("RemoteHost:"+remote_host);
out.println("RemoteHost:"+remote_host+"
//得到请求方的网络端口号
int remote_port = request.getRemotePort();
System.out.println("RemotePort:"+remote_port);
out.println("RemotePort:"+remote_port+"
//得到服务器本机使用的网络端口号
int local_port = request.getLocalPort();
System.out.println("LocalPort:"+local_port);
out.println("LocalPort:"+local_port+"
//得到服务器本机的IP地址
String local_addr = request.getLocalAddr();
System.out.println("LocalAddr:"+local_addr);
out.println("LocalAddr:"+local_addr+"
// 得到服务器本机的主机名
String local_name = request.getLocalName();
System.out.println("LocalName:"+local_name);
out.println("LocalName:"+local_name+"
运行结果:
======================================================================================
HttpServletRequest的常见应用
----------------------------------------------------------------------------------------------------------------------------------------------------
1.获取客户机请求头
getHeader方法获取某一个header的内容
getHeaders方法(如果头名字相同,返回Enumeration,用得比较少)
getHeaderNames方法获取所有的http消息头
//getHeader 通过消息头,来获取信息
// 比如要获取http请求的Host
String host = request.getHeader("Host");
System.out.println("Host:"+host);
System.out.println("-----------------");
//getHeaderNames方法获取所有的消息头
// 需求:请把整个http请求的消息全部获取
Enumeration headers= request.getHeaderNames();
while(headers.hasMoreElements()){
// 取出消息头的名字
String headername = headers.nextElement();
System.out.println(headername+":"+ request.getHeader(headername));
服务器输出结果:
Host:localhost:8080
-----------------
host:localhost:8080
connection:keep-alive
cache-control:max-age=0
accept:text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0. Safari/537.36
accept-encoding:gzip, deflate, sdch
accept-language:zh-CN,q=0.8
----------------------------------------------------------------------------------------------------------------------------------------------------
2.获取客户机请求参数
getParameter方法
getParameterValues(String name)
getParameterNames()方法
在这里,getParameter方法返回一个只有一个值的参数,getParameterValues方法返回一个可以有多个值的参数,比如用于获取复选框的选项。
案例:获取用户通过表单提交的内容。
界面部分:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/charset=utf-8");
PrintWriter out = response.getWriter();
out.println("");
out.println("
"); out.println("
"); out.println(""); out.println("
"); out.println(" 用户名:
"); out.println(" 密 码:
"); out.println(" 性 别:男女
"); out.println(" 爱 好:音乐篮球电影
"); out.println(" 所在城市:北京重庆
"); out.println(" 你的介绍:请输入介绍...
"); out.println(" 提交照片:
"); // hidden表单 // 什么时候使用hidden传数据:1.不希望用户看到该数据 2.不希望影响界面,同时业务逻辑又要使用该数据 out.println(" "); out.println(" "); out.println(" "); out.println(""); out.flush(); out.close(); }
接收信息的Servlet代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/charset=utf-8");
PrintWriter out = response.getWriter();
String u = request.getParameter("username");
String p = request.getParameter("pwd");
String sex = request.getParameter("sex");
// 如果接收复选框的内容,则应该使用getParameterValues
// 如果复选框一个都没有选择,则会返回null,所以下面要进行判断
String hobbies[] = request.getParameterValues("hobby");
String city = request.getParameter("city");
String intro = request.getParameter("intro");
String hidden1 = request.getParameter("hidden1");
out.println("用户名:"+u+"
out.println("密 码:"+p+"
out.println("性 别:"+sex+"
if(hobbies == null){
out.println("你没有爱好
out.println("你的爱好有:
out.println("
"); for(int i=0;i运行结果:
提交之后:
3.实现请求转发
请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
请求转发一定要和HttpServletResponse.sendRedirect所表示的请求重定向区别开来!
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。
HttpServletRequest对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forword方法可以实现请求转发。
那么什么叫做请求转发呢?假如我们此时要通过request请求转发的方式将数据带到下一个页面该怎么做?看下面一个案例:
假如我们的项目有三个Servlet,分别是Login、Servlet1和Servlet2,Servlet1接收Login表单post过来的数据,然后请求转发到Servlet2进行处理。
Login的代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/charset=utf-8");
PrintWriter out = response.getWriter();
//返回一个界面
out.println("");
out.println("
"); out.println("
"); out.println(""); out.println("
"); //action 应该这样写 /web应用名称/Servlet的url out.println(""); out.println("用户名:
"); out.println("密 码:
"); out.println("
"); out.println(""); out.println(""); out.println(""); out.flush(); out.close(); }Servlet1的代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/charset=utf-8");
request.setCharacterEncoding("utf-8");
// 接收用户名
String u = request.getParameter("username");
// 把u放入request域对象
request.setAttribute("username", u);
// 表示使用转发的方法把request和response对象传递给下一个Servlet
// 这里不用带web应用名称
request.getRequestDispatcher("/Servlet2").forward(
request, response);
Servlet2的代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/charset=utf-8");
PrintWriter out = response.getWriter();
String u = request.getAttribute("username").toString();
out.println("接收到的用户名是:"+u);
可以看到,Servlet1接收Login传递过来的数据,然后将数据放入了request域对象,然后将request对象和response对象使用转发的方法传递给了Servlet2,也就是说,Servlet2中的request对象和response对象其实就是Servlet1中的。
可以通过下述时序图了解这个交互过程:
从时序图中可以看到,浏览器只发出了一次请求,接收到了一次结果。而从Servlet1到Servlet2的转发过程只是发生在服务器内部的,浏览器并不知道。所以说,浏览器的地址栏此时应该停留在http://localhost:8080/RequestTest/Servlet1,其实不管服务器内部转发多少次,浏览器都不会知道,它的地址栏也就不会发生变化,这一切都是发生在服务器内部的。
而sendRedirect请求重定向与此不同,请求重定向是服务器告诉浏览器接下来应该访问的WEB资源,浏览器收到这个通知之后会去请求这个资源,这是发生在浏览器的两次不同的请求,所以地址栏也会发生变化。
这里要注意的是:
1、使用forward不能转发到该web应用之外的url。
2、因为forward是发生在web服务器的,不是浏览器,所以Servlet1和Servlet2使用的是同一个request和response对象。
3、使用sendRedirect()方法不能够通过request.setAttribute()方法把属性传递给下一个Servlet。很显然,这是两次不同的请求,request对象都不一样,怎么可能通过request传递数据。
----------------------------------------------------------------------------------------------------------------------------------------------------
下面总结一下请求重定向(sendRedirect)和请求转发的区别:
【1】RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
【2】如果传递给HttpServletResponse.sendRedirect方法的相对URL以”/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以”/”开头,它是相对于当前WEB应用程序的根目录。
【3】调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生变化,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
【4】HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
【5】RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。}

我要回帖

更多关于 httpservletrequest类 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信