该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。
: F7 m0 m V' C' u' c; }5 b6 |* ]& S/ D, [6 ]- v( ^
下面就来看一下Request的相关方法:2 I$ V. [* C" S2 Z: R
getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo
8 N: Q/ z) R. }0 C) A$ IgetCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解( k: ?2 R/ i& Z R
getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的. \$ m/ U4 ]9 H4 V9 u" a3 v
getHeaderNames():这个方法是获取所有请求头的字段名称8 A7 }$ D4 c+ L% ?9 g0 e
getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的
0 N) v0 O) ?( k# n1 ngetMethod():这个方法是获取客户机的请求方法
$ u* |/ n$ ?) u7 c+ ggetQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456; n. s9 X7 _8 u. e# a# b" z
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
* o. p& Q1 I. E* W5 j2 mgetRequestURL():这个方法是获取客户机请求的url
( ^( u2 B1 P$ E; ~getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest
( w+ g4 H. n9 ~3 U3 C$ Y: rgetServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080
5 \, z3 B4 c+ IgetSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到
" C! }8 M! R9 f8 m5 NgetAttribute(String name):这个方法是从Request域中获取值. a3 g! W c' J' Y# A% w
getAttributeNames():这个方法是获取Request域中获取所有的字段名称
& B+ M/ k; W1 C+ E! V+ ngetParameter(String name):这个方法是获取用户使用get/post方式携带的参数值6 k) `) v! t7 H7 D a
getParameterNames():这个方法是获取用户请求时携带的所有参数名称
5 L* h5 t: h2 \" `# f. wgetParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象
# g3 F) g* t3 Q' X4 J$ {' HgetParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值
$ D. K- {( n+ } B1 `* y8 dsetAttribute(String name,Object value):这个方法是设置Request域中的属性值
6 f6 W# Y" U- n6 F2 {removeAttribute(String name):这个方法是删除Request域中的属性值
' H/ O. H# b. O& G# T( qgetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流/ x% ?- F3 x% _& l0 z) Z; l
setCharacterEncoding(String name):这个方法是设置Request容器的编码
9 J7 W, v$ L' l6 u8 kgetRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名
7 p& i7 F: i, m; s* BgetProctocol():获取协议名称
+ B5 S/ B3 H0 Z0 T0 f$ v' agetRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作/ W- B% x2 M+ P, s
* Y$ }3 z) T. T* q, K下面就通过实例来看一下上面方法的使用:( ~2 B: ^! m7 b% K$ h) Z( Q
- public void test1(HttpServletRequest request) throws Exception{% z" l" P! e% s
- //有时候可能有多个name
2 [8 D0 v( H, o5 h- e - String[] nameAry = request.getParameterValues("username");
' l$ Y. H) \* g' {2 g - //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性: h7 y i: d; R1 ^# v
- if(nameAry != null){
0 o3 j* A( K8 h- v* f2 P: y - System.out.println("getParameterValues方法");
/ @/ A& k4 \6 d1 Q6 O& { - System.out.println("---------------------");
# }7 Z. [# f9 J: X - System.out.println("参数名称:username");
0 I2 A2 p- Q8 M) W7 k - for(int i=0;i<nameAry.length;i++){) N9 Z6 Q) g3 m+ p7 U ?
- System.out.println(nameAry[i]+",");
3 o" m$ j2 m7 E - }) x- D+ w% V. n6 L, Q. a# W# U
- System.out.println();6 k. C) j5 k4 `7 A- ]
- }
: C8 {/ b( M0 a0 O7 } - & t$ X5 L+ R: |; s' o
- System.out.println("getParameterMap方法");
, a f" t, y( e" K) j3 {$ ] - System.out.println("------------------");6 z# Z' V6 `5 r
- Map<String,String[]> map = request.getParameterMap();+ m7 Y+ b3 F/ b, G# f
- if(map != null){
9 F- R3 \( c3 R: @; d7 ? - Set<Entry<String,String[]>> set = map.entrySet();
! A/ t$ C1 x5 q% o+ k s - Iterator<Entry<String,String[]>> iterator = set.iterator();- F1 A( d7 R Y6 {7 |8 t% C0 g0 U4 q
- while(iterator.hasNext()){: F8 ^5 v/ K- L" C, G) a1 P) Z
- Entry<String,String[]> entry = iterator.next();
5 Q% m# Q5 g8 [: d5 \* u, G - System.out.println("参数名:"+entry.getKey());8 a- p/ @) d9 t. W$ E
- String[] values = entry.getValue();# I/ w# U F D( e& X: x0 c
- if(values != null){. Y' ~9 {* m! k' n: V+ G# J
- for(int i=0;i<values.length;i++){+ J$ d8 c$ R2 h' c) i# h
- System.out.print(values[i]+",");$ ?: K+ ]& m# L: G# B
- }6 ?5 u2 C6 a: L; |+ T
- System.out.println();5 X7 u8 Q8 d# \( H
- }
/ ~; h O0 }% \8 k; ?- F: l - }
" H1 b) `; l* x2 e% o- ` - }
9 g, K3 q0 v! I( P; N; A7 d. w - System.out.println();) T1 G% D" ?+ C* b$ d3 d4 o* `) O
- 4 Y+ g3 T6 c- f% _6 X) O
- System.out.println("getParameterNames()方法");. h- _9 w) s; C. f( L: o ~
- System.out.println("----------------------");
# r- T9 p) M0 T% D6 M - Enumeration names = request.getParameterNames();
/ I: b6 C; _0 K% f0 V+ R7 P - if(names != null){
! ~9 s$ L; |+ z/ j _. e9 X0 S - while(names.hasMoreElements()){' R1 e4 y8 O$ O, h, K8 d- Z1 C0 C
- String name = (String) names.nextElement();
+ c) e; z* K% D2 x8 x - System.out.println("参数名:"+name);
1 I# I; R7 L4 P# B - System.out.println("参数值:"+request.getParameter(name));
+ }; w6 M. T. I - }
" f v& j$ _. K( W' F - }1 T) i: u |; @1 w* I" \ y: K" J
- 7 F: \4 W3 r. ]. w7 V
- }
复制代码
8 O$ O9 F/ `/ Y% O; `/ {1 s E% e这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:4 I& U# B; H$ m( s
- <form action="/ServletDemo/ServletRequest" method="post">9 A- H ]& q9 a' w, Z* \- H) M
- 用户名1:<input type="text" name="username"/><br/>) L7 C+ `9 a2 C u8 R4 Y+ Y8 \/ G
- 用户名2:<input type="text" name="username"/><br/> R% J+ g( z1 s# a5 P5 W
- 密码:<input type="text" name="password"/><br/>( h% i9 u) q% |2 ?9 h
- <input type="submit" value="提交"/>
' {* f9 e% j# l, ^ - </form>
复制代码
1 p) V; O- P3 m我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:) A7 w) Y& n y8 C8 i* K
getParameterValues方法4 J' t& G1 Q3 A* v7 R+ e
---------------------
/ ]' u! e' u' e% K参数名称:username* L/ a; o6 b/ t! P0 @! C
aaa,$ u! J& j+ }6 c* T L$ h1 j
bbb,* P9 s+ Q. B2 w0 Q: X
' d: P# v% b, X8 j/ N
" x$ _# }! r( H. T$ J
5 p2 P2 \2 P: F7 F: v! z# _: O
) {% E1 a* i0 c6 `( d$ RgetParameterMap方法
2 `3 H2 @2 h# S( [9 f4 [------------------! c- s, H9 Y6 t7 Q) U" S
参数名:username1 `- l$ z& G8 T5 F- @6 W R
aaa,bbb,
5 V" _6 @+ F9 `( x参数名:password
% _* L* I+ v; ^+ P5 A123,& S0 j$ `4 J& l. A+ \2 |* O4 h
! M3 f, |7 c' o9 `4 k: P
/ l9 D" I' a5 Q6 A) ]& _. R
1 i4 d; v% w6 t* q6 N8 ]+ W6 |9 H8 z, k$ ]
getParameterNames()方法
' G- m+ @2 G. ?1 [) Q----------------------
: i8 f4 L/ r5 j% u; P, |参数名:username
) _# l+ F' {# H+ S参数值:aaa
0 K- }/ R" {' j: c4 d; a' G参数名:password
9 a) `6 u1 r* B. t参数值:123, R, U, C$ j8 F3 X- U" A( G% Q6 R' A
8 ^' }( I% j$ H- E9 w7 R) c# [. l2 `' Q$ {# d+ U
下面我们再来看一下request的乱码问题:6 O. f. N$ \% E* G0 G8 J
我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"! z6 C: c3 \! H/ d9 m9 m
在控制台中打印获取到的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)数据4 z# N; x9 S- x0 ~/ ~/ n6 m" P
- request.setCharacterEncoding("utf-8");
' S& R [' x. ~$ R6 ]; P$ o - String name = request.getParameter("username");
' q! v# L' B( h) q8 W- n2 m8 a - System.out.println("username:"+name);
复制代码
' E/ W6 Z2 l; c+ f- {& K这时候就可以了,就能够正常显示了。
' q$ J! { O3 |8 D2 k X H但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,
7 g: S, A: B1 a, X) b3 O& D昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。 8 U3 r0 z' H/ m/ @* H% f- {7 F# f
那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效? 7 B4 o& H) I! m/ P( A/ @1 I
做了一些测试之后总结出了一点规律: 0 s) e6 g6 p1 c7 o
1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上 1 m1 G' }* E% e# B( K7 ?
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> " `) T- H' ^& d V" B8 ^, r
这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。+ u! {" W9 A4 i1 ]
所以,当请求的URL如下时: 4 t) ^0 W! B B* ]1 {( B# X
http://localhost:8080/test/TestServlet?name=中国 ' I7 c4 v! ^: S L
其实真实内容是这样: $ E- q% f, e( w5 L# k+ E
http://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD 9 A" b- e0 v! y% F" Z
其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。 7 n g2 x9 y) k1 R# { J2 X# V, Z
2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串? 0 c# |3 u: C }: Y$ o$ m
3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码
* A6 o; m# N \4 u
* L1 _# J3 I" n s% U8 T5 S返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
5 e7 k- c. q$ L. I" P& l4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。 9 f( {. L* ~) O* V( E, w
5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的:
% C4 y9 ]6 q: B+ pURLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1");
& b( H4 n- z% U2 r- S+ A因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
0 H! Z; r* u$ }6 J6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
' p) R7 d' W4 B! G1 J; R, A
) i, N3 c# g. N& L& R那么如何获得正确编码的字符串?可以采用以下的方式:
( V' b0 X6 Q+ U- j& g) ?- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码 4 O7 J* X/ _& r+ F
[/ n6 B+ B G2 b- z( K+ ?总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8")
" p$ Q; y) `# w1 _所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!
/ C3 p& k$ E/ p R ]+ t这里的解决方式有两种,4 I4 E# ]% w" X! R8 _3 j R
# j$ i2 P$ F4 s# I
一种:是通过String类的getBytes方法进行编码转换,具体java代码是:0 Q1 `. R& Z* P, C% `" P! G
- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码 4 H: T* m3 F* D, E, _2 t
: }7 `* |% O; k6 ^5 h. J& |9 T这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8+ n4 O4 C5 K0 X' |1 P! u
/ i# A8 S: F% s. q' H# z
/ K6 [7 W( I6 _' n' @( i7 _
# H# J5 C5 {* {第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
# ~! J+ V. h, B* l! D) p6 ? F% H - <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码 / ]1 m* @7 V$ P$ b* O% U- }
这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集! I* w3 z# S& o# Y
当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。
4 w# J- n0 O3 Y" O! K; U) a: T% ]7 H9 ^上面我们就讲述了如何解决request的乱码问题
s( e- z: z% G. {5 }4 j8 s8 |% ^* B# N; @1 b/ d3 \* w2 Y
$ M$ M) ] G! y1 u0 E9 ^" I
下面我们再来看一下请求转发的问题:
) o+ @3 T$ w2 A! ?% G& s对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:2 x1 q. p* \8 j9 S: B
) r$ G; ]" E' r' N" q
, w+ s1 M& c7 I. t5 j! [/ A
% L- v5 O* z) h1 h b* @. S
Servlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
' V0 N7 j, P1 C9 S9 \, ^0 L% a - //在request域中存入一个属性值,然后转发到Servlet2中进行读取% o7 a% n J+ I$ p) k! l, Y1 X3 l8 x& o
- request.setAttribute("data", "Hello Servlet2");
# q. g! |( s0 L7 @2 y H9 B3 `: u& ` - request.getRequestDispatcher("/Servlet2").forward(request, response);
& F* ~1 C% i2 b ^' t I - }
复制代码
( r, u, L6 q$ H8 }# e9 F. z我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:# @$ O$ Z0 x9 q: K9 e
- J$ `1 X( s4 @Servlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
4 ]) A1 ?8 e% N( c - //获取属性值5 ~" R% {4 n* H5 T& @+ I# _
- String data = (String) request.getAttribute("data");
& e _: H% h6 t) S3 ^; B( f - //打印9 t2 p) J* l6 `
- response.getWriter().write(data);5 a. \# y9 d; w6 Q
- }
复制代码
$ ~6 k3 `2 o& Z" A7 D9 _" j! @9 {% a7 Y0 `% r
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。; a9 h7 p; s; p$ C0 K g' P* l
7 v+ K" h2 C2 `$ ~0 i0 ~5 [4 F7 q
3 Y" v: k/ D5 x& s2 Q3 @; d/ c+ w* d下面在来看一下使用转发技术的时候我们需要注意的问题:
# {* Q5 m6 ]- R9 X- O) G% d( L1 }8 h
当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。* L6 z) \- L" D- f$ ]) ]# ]& }! B
- //关闭流
" f% V9 f5 Z) f c0 K8 J# ~- \6 O' K - response.getOutputStream().close();2 }) i+ ^- |% t8 E: {3 q) {
- //进行转发
; `' B; W& I2 `1 L7 }# ]' j - RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的% o4 n* a- C" }! T& a- s+ K, |1 J
- rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:1 \ C. E y% N, T# a& t' ]
- request.getRequestDispatcher("/demo.jsp").forward(request, response);; h% r4 ^& Y" e) G. P: }
- //转发完之后再去转发
; W7 D+ u$ x4 Y# x - request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码
4 f& B' J( F: S$ l7 d2 y; ]从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:
/ F$ a/ h; q* z! J ?在每次调用转发代码之后一定要记得添加一句代码:return;
@3 ~1 ]3 I p: q: b这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;
* E, ]& S5 u7 ]- h+ _" ~: y0 g( W# p, X1 W
! s/ f, a; T, }" P2 g' k0 L
关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉, _, e6 e" }8 q7 Y+ m
- String data = "aaaaaa";
) c6 }6 R( A9 j$ C5 D - response.getWriter().write(data);5 \& U9 j- l! R/ V* f+ {9 @- B
- request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码
" U1 [+ U; E/ Y5 b6 R: u
" @* E1 Q) ]. C) @% D: Q这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。
8 ?7 q0 I% W, h8 Z1 p* _" u( k B2 ^7 q! s) w# B+ ^) i2 H
3 i; f, M+ I# v4 n2 n9 {, d最后我们在看一下在web应用中怎么书写各种路径:
( q" E4 P. ]' I" u4 h1 n规则:
`$ P& c5 ^! r写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站
) K; e* l! b2 R6 d m# H浏览器用的:客户机需要这个地址去请求服务器6 T# J7 I i$ Z) C3 U, C
服务器用的:服务器本身用的 Y! l& T* M, {4 M. D
实例:# l) O- J+ A4 Q4 s4 I
- //1:写给服务器用的0 i+ Q- l8 d# B
- request.getRequestDispatcher("/form1.html").forward(request, response);9 z( A# ^+ ^, f+ l
-
% s! i6 g) f+ z - //2:写给浏览器的7 ^7 L% V# C/ t. P* |2 F
- response.sendRedirect("/ServletDemo/form1.html");: @$ Y, R# w1 H$ B" b+ f2 f
- / U# _4 l7 W/ U
- //3:写给服务器用的
7 I, P$ J; R+ I+ ~ - this.getServletContext().getRealPath("/WEB-INF/form1.html");
: C# ~: H* d* u# T9 v -
6 c; S" p; ~, W$ R - //4:写给服务器用的
5 Z9 d3 L6 w5 [( R/ z. L - this.getServletContext().getResourceAsStream("/form1.html");
* l' v3 w$ e- T& V - ) W5 i- I5 o& Y6 Q( K1 X
- //5:写给浏览器用的& y ]- P8 N, q, [
- /**
" ]0 c8 t- t* ?* s. t% e- q6 Z - * <a href="/ServletDemo/form1.html">点点</a>
& Q7 W2 z; a: r. l/ U! v1 T - */
9 | L( _ t' k -
2 X- x6 d6 O( v& s# }7 | - //6:写给浏览器用的
; I: ~1 Y$ q3 {6 N3 @6 f - /**9 u* u. h' M; i0 {7 o
- * <form action="/ServletDemo/form1.html">
& ~7 \0 Y% W% }) H - * </form>* H0 t# d( X) K, V/ C/ r
- */
复制代码
1 j' I& L* \2 S P" u7 l+ @: n- v1 A; a8 s
7 I1 o$ S) c& G2 X4 ]0 h z8 C) L6 @' e6 F& V2 o/ a8 B
' g; i! ~* V9 P; G' g/ w4 W
9 c& p/ I( m+ \, ? |
|