|
该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。; F1 B1 I; |( Y
/ B# M8 ~9 Y! L5 q/ L
下面就来看一下Request的相关方法:
! K/ i/ m: L* q( x: |4 f/ W9 igetContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo% T* e P( V' i3 t: c0 I
getCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解
! R- [7 Y2 q9 I3 w: T$ X6 u, kgetHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的/ T; e+ \5 l- @! X& Z, Q+ r2 r
getHeaderNames():这个方法是获取所有请求头的字段名称* m4 [4 N9 S, D7 Z' W
getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的
/ W) C" d4 y, {, c% J9 N6 kgetMethod():这个方法是获取客户机的请求方法
# l% i1 I8 X0 q9 r; W1 @0 wgetQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=1234567 V, a% t. w8 V
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
) J8 a8 T; |4 Y# p% I- }- k. T) XgetRequestURL():这个方法是获取客户机请求的url
% a/ `4 f6 Z* E% UgetServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest5 p0 D7 g# E1 y+ P& H: t% L
getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080; ?' `+ i8 d, f% t3 Z
getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到
# I8 Q& D, w4 T0 R L" ^getAttribute(String name):这个方法是从Request域中获取值
3 s! P" w# Q3 l" RgetAttributeNames():这个方法是获取Request域中获取所有的字段名称8 C' Z5 N9 ^9 @+ |, ~
getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值
2 R1 Q/ [' ]6 z9 }6 xgetParameterNames():这个方法是获取用户请求时携带的所有参数名称
2 C9 c% G4 F( E: U( LgetParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象
4 ~# i7 i) y/ n6 c4 HgetParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值3 z) g: s$ n& p! x% J5 x2 o' w3 Z
setAttribute(String name,Object value):这个方法是设置Request域中的属性值4 q7 d. m* A, U$ Z/ ?
removeAttribute(String name):这个方法是删除Request域中的属性值
* A4 z2 V4 Y) Q% t3 mgetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流8 x1 K; b5 M# \$ p+ I2 A- n5 W5 D
setCharacterEncoding(String name):这个方法是设置Request容器的编码
2 J2 N4 c% q9 e/ K* P. c# ^; LgetRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名
5 [6 g" S8 X, h% k" i1 a8 RgetProctocol():获取协议名称& e+ U/ w, D2 J) u# D7 z! j" H+ q
getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作# I4 `3 K$ I, B3 P" ]3 j0 w6 N
3 a- E1 Q$ y' P下面就通过实例来看一下上面方法的使用:
* D+ O0 U& T/ _ l1 V- j, j9 k- public void test1(HttpServletRequest request) throws Exception{
. N' I7 |/ X# W! s* t x) @8 B8 P# B - //有时候可能有多个name. P& S$ {; o, E$ v0 v$ H
- String[] nameAry = request.getParameterValues("username");+ d& ?* a: S7 U3 |( ?
- //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性. S3 w+ J9 D6 y" Y. t& Y; U
- if(nameAry != null){9 Q( {' L8 Q7 F) D! v. ?0 K2 A& i
- System.out.println("getParameterValues方法");
+ `' h# @; V* U* [' ]4 M8 O5 R H - System.out.println("---------------------");
3 J5 L9 D3 W4 x. _$ P' y - System.out.println("参数名称:username");- y+ j% s( E$ w0 T* c* G
- for(int i=0;i<nameAry.length;i++){
' d0 g- x" r9 j4 f! Q - System.out.println(nameAry[i]+",");$ Y/ H5 N1 I j W# E- v
- } w! U- z$ W& T1 i
- System.out.println();
2 G% l9 i7 [2 J& h8 O: P: h - } W9 A, O6 j, R- L' T; c
-
/ r1 q! T7 [" B1 z - System.out.println("getParameterMap方法");
0 N8 X+ c! l( x6 P% S t2 t - System.out.println("------------------");
' Z/ f+ ?' u; T; `. v7 p - Map<String,String[]> map = request.getParameterMap();
" |" I( @* P) r0 H. p. e. n - if(map != null){7 W, K2 d9 U9 B" z
- Set<Entry<String,String[]>> set = map.entrySet();
5 K7 T, L' y3 o; U4 s' z4 T4 d - Iterator<Entry<String,String[]>> iterator = set.iterator();
+ S. p% a7 n* K/ R4 Q9 s. I. M - while(iterator.hasNext()){
! O5 t/ X! i- s! x4 C: i9 x - Entry<String,String[]> entry = iterator.next();% A* g' d8 w* w% |4 Y. X& g
- System.out.println("参数名:"+entry.getKey());
$ {( F x9 T T q. @ - String[] values = entry.getValue();
, X$ O8 s1 N6 H% ~, F4 B1 P - if(values != null){0 L" M; P$ v. V( M
- for(int i=0;i<values.length;i++){
* z, S" W4 z2 n" h( k9 r - System.out.print(values[i]+",");& s) R4 `! c# ?5 S0 G, ~
- }9 J8 p) c/ c; ?2 H+ z3 C
- System.out.println();
" W* H) a4 b6 b: M" D3 G* i, o - }+ T& N7 V2 ^ l" q0 w7 o5 I6 Y/ `
- }3 |# l6 B, u, l0 y, u* y
- }# ]1 m: }1 P3 l+ E3 K
- System.out.println();
5 n. i/ F$ B6 v7 T3 E - 9 l7 ?/ V0 \; M) z6 N$ i
- System.out.println("getParameterNames()方法");
' U& }. T6 A1 d z) z2 W - System.out.println("----------------------");
) e, S$ v, A. l& ?5 P& z - Enumeration names = request.getParameterNames(); L+ o! ? z2 C6 w4 j) C
- if(names != null){
& D. Y8 A: j$ T/ ]" b$ g - while(names.hasMoreElements()){" d6 Q# W* [! y/ Q( ?
- String name = (String) names.nextElement();
" t+ e! b! i, p - System.out.println("参数名:"+name);: h K+ |* L, f6 G
- System.out.println("参数值:"+request.getParameter(name));
1 t/ R- ]( H5 `. L$ t$ q - }( S% k A2 M* I+ X/ _+ Z9 y
- }
' K. w8 B; Y( ^- z$ o - # v/ j' L* t# y) t$ q7 l. ?4 U
- }
复制代码 / y$ \: M) ~$ J M3 Y# F
这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:7 ^; E2 r$ p" ~* u6 X9 k# h; z/ E! K
- <form action="/ServletDemo/ServletRequest" method="post">: P5 o I; g ~9 Z+ p' u( h
- 用户名1:<input type="text" name="username"/><br/>+ T6 T6 N% S( h
- 用户名2:<input type="text" name="username"/><br/>
$ _, ^" f% \* J0 m9 f$ u, u# U - 密码:<input type="text" name="password"/><br/>
4 @+ M, m' B f* b F6 H4 C - <input type="submit" value="提交"/>7 v. H5 v. C9 C* e2 d- \
- </form>
复制代码
$ L6 p" x4 c) j: e) \! u" W我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:
! A3 Z6 x+ V7 Y$ cgetParameterValues方法
# n9 e, X% C4 O: p6 }---------------------2 c; Q( f( ` q4 `, B$ Y2 n) Z
参数名称:username
4 g; }! A, ?' b& ^0 O( b: y2 J8 Maaa," _9 [" B+ z0 y! z# a
bbb,
7 |& ^9 U K0 w
' @- Y* f, K* B1 k' S7 Z3 H& t0 l9 Q
# `, a; u% E- e7 @6 U
+ Z4 F" P4 T0 f8 L# g4 ?6 E+ O$ j
getParameterMap方法
5 k& v' R1 U# ?% m+ ^2 l* t' R------------------2 K2 [# |9 [) `% B% b! ^; I% w
参数名:username" G \! X6 k; B* [! m' ^
aaa,bbb,
& e8 Q" ]3 t4 [' r. z, r" `参数名:password, W# {# N7 C& c7 a1 {! K! J, \" N
123,
{9 J o* w: R7 Y+ ]. C4 m5 {; X8 r/ s
. P6 L/ @+ z6 w( G, J1 e& q5 c! N: K$ Y0 A5 ^
4 f; L- H# J1 D* `; N4 X6 t7 g( a
getParameterNames()方法5 d5 G0 ?0 q4 h d
----------------------* ~7 [' M6 [6 G% p
参数名:username$ k7 R9 O- c5 F, c; P. S z
参数值:aaa
1 G/ @6 `9 ^, X参数名:password
1 \' b6 `- t: E" Q# l( p参数值:123 D, e1 K9 E( L* N3 J$ M
. ?5 O r! a) z
4 E' U6 V# d A' b+ k下面我们再来看一下request的乱码问题:! {* Y( ? L1 b( l+ ?+ y- [
我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"' T$ X$ q& q# e- G9 s+ |
在控制台中打印获取到的username的值,显示的是??,这个是因为Request域中的采用的是ISO8859-1码表的,而我们的demo.jsp使用的是utf-8编码的,所以当我们点击提交的时候,浏览器会将"中国"使用utf-8码表编码,然后web容器创建一对request/response容器对象,数据传入到request容器中,因为request容器使用的是iso8859-1编码的,所以当我们在Servlet中从request容器中读取数据,使用的是iso8859-1进行解码的,所以会出现乱码了,所以我们只需要将request的容器码表设置成和我们页面显示的码表一样就可以了。这样我们在getParameter的时候得到正确的解码(utf-8)数据
9 I/ C5 R/ j( Z7 O$ V" J- request.setCharacterEncoding("utf-8");& Z( \1 Y5 x- F- a- f
- String name = request.getParameter("username");
b2 h) o4 F) L+ `! s: K8 C - System.out.println("username:"+name);
复制代码
7 L0 P- i; J6 t& |+ P4 R这时候就可以了,就能够正常显示了。9 ]& r3 p, ]8 u" a1 r) _
但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,4 ~* L4 K" u" C; m
昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。
; i, f* x! l3 P8 C0 c2 ~# M: P那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?
; g& y: o3 S6 D5 R! y0 M9 G* F做了一些测试之后总结出了一点规律:
- G3 n/ d, s9 l% B1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上 ( L7 L8 W( m( a; D% P/ W. }$ P
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
. A2 U3 |( S4 L& w这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。; ]5 g3 J" Q1 i! L+ Z
所以,当请求的URL如下时: - Q1 `+ N3 A2 W& G- h
http://localhost:8080/test/TestServlet?name=中国
0 l' ]$ z* ?& W( k+ c3 `其实真实内容是这样:
" p5 p2 z1 Z) B* O9 u+ {; v9 ~http://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD
+ Y5 J/ x0 L3 O0 B其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。 ( ?* g4 s. {; V
2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串? : Q7 o! G! I$ u1 I3 R/ z
3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码 6 s3 W4 T# |, F) z
5 y; i$ l( b+ C2 M: F$ F7 X
返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确! @4 h& Q) M7 Y2 j' y
4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。
( n: P: l# u9 t# O' ^% V5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的: : `6 V! t( d' ], R8 {4 _
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1");
7 b4 ~* S% u# T因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
9 p G9 m- q5 P" _# k& N9 F6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
6 h4 y8 U2 `5 q" A/ G+ m
9 a- _9 ]/ G+ `: n那么如何获得正确编码的字符串?可以采用以下的方式:
' q( U% s4 h8 V5 V, E- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码
1 G3 Q" W! N% R% t$ R2 H: t, m3 Z, G0 y* b W2 i8 H
总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8") * A5 z2 l& y: m8 n
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的! ' T5 D( |) L2 P6 O4 c0 K: k9 V
这里的解决方式有两种,8 Q, X% r7 U3 l0 `( | D. T; U3 h
7 u# i6 q2 g6 {9 |: @8 P1 i一种:是通过String类的getBytes方法进行编码转换,具体java代码是:
! C# Q( Y1 _& c6 }, b- s7 a- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码
; H. K1 X1 o, h" J; S' e4 r
6 m0 O6 `& f( I这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8* ]: K! w% W9 [3 z8 M/ O( l
. {2 o* b+ L T. }8 n4 e. e/ B L8 O. }: a: |. s2 P0 k
8 _, @, a" d; u: y
第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"* L2 I* I1 L6 h: o- t6 J1 R2 R
- <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码
7 n4 b0 Y2 l2 f2 ]5 Q& x* [) h这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集
: b! L$ ~9 | M9 o8 r当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。
. x1 G4 r( s! X6 q上面我们就讲述了如何解决request的乱码问题
; r2 A! u; O+ N8 K- @ O7 V: {0 P+ g! c' Q2 g, [
2 F: r$ }* Z. M/ R6 b# @1 |' Y5 }下面我们再来看一下请求转发的问题: N; z+ H' e, Q7 M- m: q, {
对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:
. q; w( ~) Q6 Q9 B$ b5 j( E* z X% Y4 Z2 Z4 R5 U5 Z. e+ y
, U, ]7 g$ ?& C& u! Q+ M2 ~4 V X6 @" k7 v( M2 W
Servlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {- w) @' y; P( x6 h+ p( T8 T
- //在request域中存入一个属性值,然后转发到Servlet2中进行读取" W3 J, H2 \) S8 P0 i7 p9 M8 T8 x8 q
- request.setAttribute("data", "Hello Servlet2");) i( K" E9 p/ l: l5 V
- request.getRequestDispatcher("/Servlet2").forward(request, response);
% n1 ~1 ?2 U' O0 q$ K) m+ p - }
复制代码 + n" q3 _5 N/ i8 x- }
我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:
+ |/ t- h5 {& J% W' r- r& ]
( p! w( `+ V! {Servlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {; ?3 Z8 n/ ~8 f8 s1 i- E
- //获取属性值
! D0 g( ~2 S! R* k - String data = (String) request.getAttribute("data");5 {4 r" h. f! \0 M+ J4 N; q6 o
- //打印- f3 e5 ^; y. @2 x5 C* ?% V3 O$ z+ \: Q
- response.getWriter().write(data);
( h3 d k1 V; `9 W/ ^; W - }
复制代码
9 Q9 S1 R5 I2 x- k# M& a2 t4 P% u6 Q4 f
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。7 l1 p9 n! ^% U! \: \" K' u
8 _6 ?8 [0 e- Y4 D' Y0 _# ?
! y- ^8 y5 z( |
下面在来看一下使用转发技术的时候我们需要注意的问题:
( d8 p6 b( P# f* e0 w; l+ s* T7 _
当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。; E3 b/ t& \4 ?; C
- //关闭流
6 [8 I) n3 V! E# |" T4 W% _ - response.getOutputStream().close();
- {0 A) D" s: ^5 d2 R - //进行转发
& L. f+ o7 j6 O! q - RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的 W) z+ [! t7 J
- rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:* }0 {- ^; S/ R1 b: @: j, n3 ?- t
- request.getRequestDispatcher("/demo.jsp").forward(request, response);0 `6 _2 o( u- E) F& P: W- H
- //转发完之后再去转发# X% w. a8 @ p( L
- request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码 ! ^+ K* l* @( R
从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:: r% H G* m% h& w3 }; t" F4 }
在每次调用转发代码之后一定要记得添加一句代码:return;
& x) j! p) U4 v+ k这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;3 c4 h* n R( p8 N/ B
! E6 o1 n/ u& d9 M1 d0 i& J* G
, v4 E! ~7 K/ p k: h0 A$ ]# e: U6 D关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉
& U! ]: m. x' I1 n+ O+ t1 c( _ - String data = "aaaaaa";
( F1 s! L7 |5 O" F& S9 H r - response.getWriter().write(data);% L5 u; x5 C. n# S8 k9 R! ~* x+ a p
- request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码
# z5 j4 D! y/ [. L0 X G4 w" a+ Y2 _8 ~" Y
这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。
9 h( _, K: A2 E7 B6 K& y7 X* y5 e" Y) }. A
1 A- @) Q, {# ~最后我们在看一下在web应用中怎么书写各种路径:6 |/ H4 {. A8 ]3 N! a
规则:: L/ i/ ^7 x* t( s5 H/ Q. `* [
写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站( _7 \& s5 \* q: b/ u
浏览器用的:客户机需要这个地址去请求服务器& U4 i3 b+ H4 g
服务器用的:服务器本身用的+ m3 f# f: L+ l: K
实例:
0 H' @% o$ P8 m0 \4 _- //1:写给服务器用的+ }+ }2 ]/ Z, j s
- request.getRequestDispatcher("/form1.html").forward(request, response);. ~1 b- \& i0 Y1 G$ d2 T3 I
- 0 c6 O6 Z3 [! d3 R' E
- //2:写给浏览器的* p# k. z: n% k; B
- response.sendRedirect("/ServletDemo/form1.html");" j" Z- _$ T. `5 l6 ~# J L
- 2 u3 n2 }" l3 D
- //3:写给服务器用的
* M& C& i8 w4 ^9 L6 z r - this.getServletContext().getRealPath("/WEB-INF/form1.html");
% N$ n8 }8 B! p' G5 }9 h - & O: p$ S1 A% b0 l- `- m5 b7 o! n) y
- //4:写给服务器用的! A9 m. h# {/ h" P
- this.getServletContext().getResourceAsStream("/form1.html");" b2 ?8 b+ J4 f8 n" V0 P) [
- 8 L( ?4 B8 G' {" \4 H; ` a \' `& T; o
- //5:写给浏览器用的
2 y+ y1 }# F$ ~6 Q; x0 k3 M7 j9 t - /**# Y4 J, L5 R! i E- ^
- * <a href="/ServletDemo/form1.html">点点</a>
% \: `- a7 C2 N8 a' ] - */
' n- R8 `# k# X -
% P$ u0 W) E0 W8 i. d - //6:写给浏览器用的9 h9 J0 u- e: ~ J; x1 g# K
- /**% H/ I% ^" j9 W5 X3 O
- * <form action="/ServletDemo/form1.html">7 W) z9 m+ G& d- h6 D
- * </form>+ Q3 y6 T0 ?5 H8 Z2 A: M* a2 p( ~
- */
复制代码
' k/ i5 w9 y" ^& g0 Y/ L& R, N2 I$ H' @
: _; E6 \! J4 Z6 I3 q( L0 `8 z
0 X a& n' \8 g$ k# n3 }; X0 \% y) V8 V, C2 @3 p \
% s4 [' e% g* e$ @! r- ]4 o) \
|
|