该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。 P" e) [% @: {% }7 j7 @' W
7 Z& u, B1 ~: Q$ X9 I$ }$ @下面就来看一下Request的相关方法:
5 y) y4 g1 a& }! F: F, wgetContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo+ ?4 |2 \9 X! `& g
getCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解9 P8 C V0 c( Y) e
getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的
6 b+ Y1 ]/ p! S% l, T. {getHeaderNames():这个方法是获取所有请求头的字段名称
2 g1 z. N8 J/ a$ x3 l+ IgetHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的* S; B' D6 s; _7 e2 m
getMethod():这个方法是获取客户机的请求方法
7 h& J% b6 u, I p! ngetQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456" {6 W: T$ u+ q2 M+ w+ |1 u
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解& M# k4 {2 w- }& M+ l
getRequestURL():这个方法是获取客户机请求的url+ x; H4 q4 V8 Q
getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest) `2 f$ N# Q: A
getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080( E8 u. E4 @+ p/ O9 N1 x
getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到
, J2 P0 Y$ a+ O/ w; \4 R8 d5 Q/ V: [getAttribute(String name):这个方法是从Request域中获取值# u5 c$ J w; {( {7 }$ j) {" X
getAttributeNames():这个方法是获取Request域中获取所有的字段名称1 x" s8 d7 X9 @: H" @
getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值! M) v9 r9 j6 q% X7 A' b( o0 ^1 M
getParameterNames():这个方法是获取用户请求时携带的所有参数名称
0 ~: Z$ l9 I {- lgetParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象% q" U) i, u. `( g
getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值* F& |) p- q/ F" x* a7 P* ?
setAttribute(String name,Object value):这个方法是设置Request域中的属性值5 c( v& k4 L) H& x h* U2 \
removeAttribute(String name):这个方法是删除Request域中的属性值
' M5 Q% H7 l- \* X# ?4 e8 ?/ pgetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
% n0 p9 ?1 H2 }. Y5 W+ q1 ~; x. zsetCharacterEncoding(String name):这个方法是设置Request容器的编码) N: w3 N) r: h& n( M) Y9 z! M
getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名# C( Q5 r8 N( N+ }5 q! m1 D* G
getProctocol():获取协议名称
) Y9 ~* t! ], U% ?& zgetRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作
3 u0 `* N. o' _, U( A; ?% n1 L2 ~! ], ^$ w# K$ ]6 R- |- V6 K/ S
下面就通过实例来看一下上面方法的使用:
9 \! W. a. ?% _/ I- public void test1(HttpServletRequest request) throws Exception{
& B4 B4 ]# t$ v7 t - //有时候可能有多个name
9 `' F; M [% H; L - String[] nameAry = request.getParameterValues("username");. P+ H4 p+ a: m. y V8 G5 {
- //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性1 [6 G4 a+ h; n
- if(nameAry != null){
/ g7 K8 y" ]3 L - System.out.println("getParameterValues方法");3 X$ R, ~4 o1 k0 c$ {) L& i
- System.out.println("---------------------");
. v8 @% z6 ]) f& B: h - System.out.println("参数名称:username");
+ w0 \, |7 e/ R' r" _ - for(int i=0;i<nameAry.length;i++){
% Q3 N! K+ B, N' t! Q, d+ ^ - System.out.println(nameAry[i]+",");) J* A* r. l1 e# Y: v5 r3 V8 a$ }# g
- }
3 @/ k! S6 o4 g' C6 ~# a - System.out.println();
3 R) R3 G1 k4 @ - }. p( A, ?& z: ~9 u7 I4 @
-
& Y; Z' a# i- x; n% X$ s8 h& P - System.out.println("getParameterMap方法");
1 m; `* d* `5 c) V2 t5 ~ - System.out.println("------------------");
) b! g( U( c8 w7 ~- H5 _# b - Map<String,String[]> map = request.getParameterMap();$ H! W9 V; V9 V/ U7 C/ Z
- if(map != null){1 i$ L9 H& e& J8 G& Q
- Set<Entry<String,String[]>> set = map.entrySet();
# c. S0 x- a) B! q9 e$ V - Iterator<Entry<String,String[]>> iterator = set.iterator();
" u6 B$ z* ?1 ]! M - while(iterator.hasNext()){
' @4 C- J6 j9 ?8 j v - Entry<String,String[]> entry = iterator.next();) P$ E; v5 ^- |$ Z
- System.out.println("参数名:"+entry.getKey());) U6 d/ H! x/ |/ A; e1 _3 w% P
- String[] values = entry.getValue();
" }. u7 D2 r8 p$ U - if(values != null){
6 p5 D8 ?# B, k- b. }2 E - for(int i=0;i<values.length;i++){
9 i0 `& d% t4 w6 F5 o' K% E - System.out.print(values[i]+",");9 w2 B) m+ n9 U8 b
- }& P& b6 b& T7 Q* v' l
- System.out.println();
5 W. Z3 i' ]4 R" y1 g0 O: T - }0 Q/ U+ d& [( `3 S) D, H1 m- J
- }
: j& j K6 d7 b9 P- Z3 B2 E6 t - }9 k9 N8 t \, K' Z g& v
- System.out.println();
" x3 v1 X' N5 W: O5 i - 9 G; I" T" J) c; @: {
- System.out.println("getParameterNames()方法");1 ^9 P0 p/ K/ b' u
- System.out.println("----------------------"); U6 Y1 o6 n! O
- Enumeration names = request.getParameterNames();; d5 z' U0 i6 J9 F
- if(names != null){
8 m& D* Z1 s1 |( l - while(names.hasMoreElements()){4 C! W) X( e2 f' M
- String name = (String) names.nextElement();, w( D0 M) _/ s2 \" L# w1 m
- System.out.println("参数名:"+name);
! [2 C( w, C ]. i, p ] - System.out.println("参数值:"+request.getParameter(name));: c0 u/ a& y! W( b! S3 R1 |
- }, E* u# ?5 x0 Y3 w2 K
- }+ v7 G) K6 ^. Q3 X
- - | A* g& j1 w) L* |( _
- }
复制代码 X7 A, ]9 s3 Q7 {' U
这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:
|/ a: `9 q5 n+ N$ a+ ?3 ^- <form action="/ServletDemo/ServletRequest" method="post">
7 P7 Y! y$ F" E, L- ^" | - 用户名1:<input type="text" name="username"/><br/>
; z7 f4 m3 A% g9 L6 \5 [ - 用户名2:<input type="text" name="username"/><br/>
4 f/ P" L$ B5 x - 密码:<input type="text" name="password"/><br/>" j8 E6 ^8 Q9 A
- <input type="submit" value="提交"/>9 h" F" ]; n, l5 R, L' B# E/ e+ c
- </form>
复制代码
4 |: I* i: G1 u: h- M8 ^$ S* ?我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:% u! ?- A* U' K* O! U+ g- s7 c
getParameterValues方法6 Z( f& v( e5 s O2 P- a
---------------------
3 H* |) ]1 C& X" K2 l0 ~4 l! D/ B参数名称:username
; W( p4 [; N. E9 t# Q" L9 z N; qaaa,
2 i9 V# p, P6 n# v6 I8 F8 Rbbb,6 y' K. w7 K) s8 C2 j# C% o
- d8 R3 k O/ ~$ r% B
' l: g; r2 S* z- P5 }$ e+ @' e" {+ \/ r/ L4 t; N; Z6 }
) B0 O7 ]* z/ QgetParameterMap方法) K( U3 q% Z$ Q4 v; a4 U
------------------
7 l L- U+ s& _) g+ F4 J+ l参数名:username
6 h3 A* F) y3 t9 c( A3 G5 O+ Iaaa,bbb,
3 @: `- _/ o, u% z" }( V参数名:password
4 {/ U+ |3 d* j5 F3 U T$ P- h123,' p2 v& c2 M5 t. k4 L
) [: C0 [- r, |1 {, `
1 d1 A* p0 G9 i" C* q1 {( z) O9 |- F7 E! y4 e; B3 d9 u
& E3 |7 H/ B: V% Z7 v- |
getParameterNames()方法# t, t; w% L4 k& m( e+ w
----------------------) k/ C2 |, I7 N1 n* l1 |& D0 ^
参数名:username
% x) z7 x' U* ^4 ^参数值:aaa
( S1 o( d- x" ]' }! `参数名:password
' Q1 R* J1 R, z% o参数值:123
& @) n" I+ a J3 U4 y
% Q# F2 b) \9 c' W6 F+ ~- c) P$ b* b) N; d
下面我们再来看一下request的乱码问题: S, c8 ^, X' q/ ^1 [5 P9 n
我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"4 _9 o/ z: N5 ^. B- Y9 i& A6 O
在控制台中打印获取到的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)数据
1 A3 |. h" w' r7 f- request.setCharacterEncoding("utf-8");, Q; a& j/ Q! l/ s
- String name = request.getParameter("username");
+ D2 @3 m' i+ E+ I* A/ A0 r) V0 [ - System.out.println("username:"+name);
复制代码 - {' Z! R5 w8 \( N" r% C
这时候就可以了,就能够正常显示了。' m$ U3 \8 H- `( M. q. \
但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,6 n4 e6 {2 B1 q+ }
昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。
" K# Q' M6 D. p; |6 q2 v7 c$ f那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?
. q* N; t8 @* Z) H- O0 u9 E做了一些测试之后总结出了一点规律: ) {) d _. A, k/ x1 A) c, l
1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上 2 F' D" N4 Y% D. @+ @' o R
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
) b" {0 k& P3 `) v这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。, Q6 C$ ^8 ]- K7 {! ~9 Z, H
所以,当请求的URL如下时: ; O( i- T5 f) D+ |/ {! n- N6 B& g* o
http://localhost:8080/test/TestServlet?name=中国 : R; Y4 b6 U( s- g* l# |
其实真实内容是这样:
( T4 W8 L( G: I/ A7 uhttp://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD
* `! A9 x. ]0 E3 }7 Y) R$ o其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。
9 ^8 S! c. c% _2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串? , e2 ^2 y% i9 f7 X; k
3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码 5 f3 j2 | w6 T; M
1 m ?1 E2 `" E4 M9 D8 g返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
5 S& h; T f3 j- O! @1 c# x9 G4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。 % ?+ a5 V2 C5 U- g# j2 I& t
5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的:
; a3 m$ @$ ]5 _" f: TURLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1"); ( |! |+ H6 e# j$ Y" i9 Z5 u
因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
1 v: L3 h/ D! g* t( D* ~6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
, z$ k$ W- [) U# K6 k8 l; Q m
! [$ a) }+ ?+ _) y那么如何获得正确编码的字符串?可以采用以下的方式: 2 A) X% E2 h0 z9 f( ~. |
- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码 ' |7 B" h: h+ k2 f+ o6 P+ w
/ y" _) w) F3 Z( t( Z总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8")
0 c; }" l: M& \2 o2 X所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!
. S4 y- V4 F8 D4 N) ]# D这里的解决方式有两种,# {$ v8 {5 \( x8 t) C' @1 B
7 M' z8 U1 o% v, L5 s& t8 n一种:是通过String类的getBytes方法进行编码转换,具体java代码是:. v% o1 O3 V$ l0 r
- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码
% Z' {" |& A# p' ]! r5 f7 P
3 e7 }. X! y# {这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8' I3 R8 ~) H6 ~
) W( J' U% s) n. l, H" ?. x
2 F: b# w% @( O, Z8 u
0 p+ n& J S) A
第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"- t3 W( s- ]& U1 o# T0 s
- <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码
J$ ?, ^: H' L$ Q3 n3 f, j* R这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集
1 O0 p$ F$ @6 A7 X9 N4 l' `当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。4 k& ?+ d1 v" T/ A/ v7 D/ P
上面我们就讲述了如何解决request的乱码问题
# D8 }' y2 ]" M h: n) k5 O( ?3 Y% H, I6 |+ u s
& p( u! ~( X. s, f" U( {9 [下面我们再来看一下请求转发的问题:5 R3 J: M8 ]/ x5 u5 m0 z$ E$ o, Q
对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:( P% K/ ^* @# V% Y* R
% I$ H+ [; ]5 Y/ F* i* P
5 E, }0 d8 m8 g7 ?( T+ _
9 D* J/ D* `% w+ ?7 y4 z( kServlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
9 F6 ~$ B" Y( \/ m9 U3 } - //在request域中存入一个属性值,然后转发到Servlet2中进行读取
" ~/ @3 Z. k' [& e$ b# ^- p - request.setAttribute("data", "Hello Servlet2");
" [, ?# \% x2 Y: Q f" _: q - request.getRequestDispatcher("/Servlet2").forward(request, response);
$ Z% ^ [$ {. [5 O8 O - }
复制代码
1 H3 S6 V, F9 C6 r2 F7 k6 m" H; i, L9 W我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:
& Y' D- A* o! ? S; ~! V7 O) A; ~9 M, E
Servlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {% S- ?% ]9 _. p" ^! x/ z8 g8 C7 r& n
- //获取属性值9 l9 C) |) M {& o9 N d& n
- String data = (String) request.getAttribute("data");
7 n0 X: H% X \1 G4 ? - //打印' x7 O$ u8 o2 e, }- d$ K
- response.getWriter().write(data);, N6 S0 ^4 y% K1 L7 L
- }
复制代码 1 p J! R( S$ D& O5 q
' U& y, h2 F, l& W0 P- g
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。/ d; w( a# D: B; K# M, x
8 D/ L) @9 `$ H! U/ a0 Y6 u R! I, h1 \* y: j/ V$ o) l; ~
下面在来看一下使用转发技术的时候我们需要注意的问题:: N2 l. Y% I+ A# x
- l& j7 G! v' g9 |% s
当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。
( Q$ w8 j0 j( }' G# ~0 R5 @+ S- //关闭流
' Z6 R' A* }9 n# [+ z9 P* O. M - response.getOutputStream().close();: G. E9 g* p' S& N/ ]7 h; [! _1 E/ u
- //进行转发8 k6 {! D. K% t( E% i
- RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的
1 P+ D2 J) D: E0 n: X% W4 m4 M: I - rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:
& q$ B# n- s8 p- request.getRequestDispatcher("/demo.jsp").forward(request, response);" Y; I% X3 J2 I) }6 F1 i9 f- ~
- //转发完之后再去转发
0 r3 L% y( I& ^7 ^8 T& A+ \ - request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码
; L1 N4 I/ a- X4 [从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:- N" G! q" R; w
在每次调用转发代码之后一定要记得添加一句代码:return;
9 V. |/ s6 @+ m" ]$ S1 T( u+ s这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;
; N' b/ m: N0 g) q$ i
4 B5 a: F4 P/ O& G6 L7 x/ Y/ u) \& J+ ~5 V& y" y
关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉
2 F! N8 _% x- Y5 X7 l - String data = "aaaaaa";
/ s! M5 @9 `# @8 C - response.getWriter().write(data);
3 |7 Q! L: J' h - request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码 % y) j- n4 C2 {+ I. b5 _
6 S# k+ V8 B X3 ]这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。
/ \' m9 b3 ?. b7 Z" | M z
: @6 W0 P5 g. @$ `; n+ A
; S9 v3 S% Q7 N# _最后我们在看一下在web应用中怎么书写各种路径:
8 \: ~# B0 A# S4 G规则:* K# Y5 n+ l$ k- b6 l2 S" ~) b
写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站- T* Q6 S, b K/ w* L/ G" ]8 s& {
浏览器用的:客户机需要这个地址去请求服务器
]$ s; i" U& U0 c' T服务器用的:服务器本身用的# ]- }: [" @, O+ o
实例:
1 [, {7 ]% ^8 A# c3 T- //1:写给服务器用的
% T" r# _: n9 k$ I3 o0 L' x* r7 |8 ] - request.getRequestDispatcher("/form1.html").forward(request, response);
& p% r1 j7 Z; u+ P - ) s" ?0 t: g/ d2 Y, N8 k
- //2:写给浏览器的% Q$ D+ r% [$ f, Y
- response.sendRedirect("/ServletDemo/form1.html");& n S- G! b# n$ z5 u% u
- ! s! d$ n' v( W6 h
- //3:写给服务器用的
0 l6 B4 v# m! a" D | ]6 P" i" W - this.getServletContext().getRealPath("/WEB-INF/form1.html");! x3 g! J$ c+ r2 d9 M2 E
-
0 j: v6 Q* B$ _/ \, Q8 [8 ?$ I - //4:写给服务器用的 {! r8 r$ f+ W/ K! ]. b: Y
- this.getServletContext().getResourceAsStream("/form1.html");1 t! q# @& j. z! Q3 c: v( p3 \8 D
-
" p( @3 W- p+ k0 N+ W; |1 l8 k" T& [ - //5:写给浏览器用的6 t( K e' j3 h9 @! p8 \9 y
- /**
0 i6 f: m- j! [# J1 _/ n - * <a href="/ServletDemo/form1.html">点点</a>1 u. v' p7 T2 ^# i
- */4 |( Z1 P+ y! `5 f
- 3 z* o4 a$ ~2 P/ s9 K
- //6:写给浏览器用的8 E' G) ]7 W% @! f5 L2 y) s
- /*** |# h! C3 d* I; S4 F
- * <form action="/ServletDemo/form1.html">" {2 x- J2 b0 X& C2 s: m9 r
- * </form>7 {1 L2 R! x+ U' `4 G. o
- */
复制代码
2 H: k; ?$ T" c! i) R" l$ B9 a* O) N+ P" V g2 h1 ?
5 [3 \/ p' W0 \0 f' \3 K3 { e
G) C5 P/ R5 d* V+ ]" H" \$ m
( N- }5 U0 O ~( |0 U( _+ A! R0 Z# O2 D% T# b6 N% l( K6 a( }7 u
|
|