该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。/ ~) S1 b! @: X0 O6 p( y' x7 r
5 _+ b1 `# r* }" q
下面就来看一下Request的相关方法:( ~# m7 G4 }5 y# R
getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo
: W1 j+ Y' r% F9 _$ T7 a; lgetCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解# J( {1 D* p) ~6 j D
getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的9 e$ S+ N9 X9 @3 ]6 ]
getHeaderNames():这个方法是获取所有请求头的字段名称- @' Y4 f9 ~: ?; N
getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的
! Q# s9 U6 _1 r+ S/ l/ ogetMethod():这个方法是获取客户机的请求方法
6 m- W; S- u E" x9 u) YgetQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456
# o+ R- G& p( C" |$ P: s, OgetRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解0 x5 z* y- }9 H. Q% @2 g$ v
getRequestURL():这个方法是获取客户机请求的url
0 S' N9 _4 ~8 [, S# Y* F% Q6 [getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest4 `+ @7 z \2 T5 i1 V
getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,80805 c+ z0 L0 ]3 _, p$ C$ O+ l
getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到/ o: U" R% j. ^; f* N' C
getAttribute(String name):这个方法是从Request域中获取值
: @- v1 i! E+ g7 k5 FgetAttributeNames():这个方法是获取Request域中获取所有的字段名称
7 i, F9 `+ S) Q8 Z3 dgetParameter(String name):这个方法是获取用户使用get/post方式携带的参数值1 S4 H7 _# q& ]2 p* P6 t( V
getParameterNames():这个方法是获取用户请求时携带的所有参数名称
1 n+ f9 T" r+ ggetParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象) @9 q- g! _( G9 ^& @. B
getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值
( a- m i/ V/ J; J( ^setAttribute(String name,Object value):这个方法是设置Request域中的属性值( ?1 D9 `+ z5 M4 M- R' ~, K. `
removeAttribute(String name):这个方法是删除Request域中的属性值
& k; i) n `. g5 O4 |# pgetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
& r! Q g- t4 g% j& usetCharacterEncoding(String name):这个方法是设置Request容器的编码
6 D3 @/ _( @. l5 @: ngetRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名- C* w3 A- Y2 q( _* m% |! @* L
getProctocol():获取协议名称9 J0 D9 z: K* P' ]4 C
getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作! m* x F- @9 {3 U6 B! p! H5 H- p
) }8 x- J, I' u1 |9 F* U; ~6 f# L
下面就通过实例来看一下上面方法的使用:
- X2 T" |! \& c" V- public void test1(HttpServletRequest request) throws Exception{
5 [7 Z5 n8 ^7 H( w- l, _' c - //有时候可能有多个name
2 H/ j( H7 j2 G, V/ P6 ~/ F - String[] nameAry = request.getParameterValues("username");: l& @7 s$ H# _" n( \
- //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性0 x4 Q: B- D5 k! o" C H9 q4 w% |
- if(nameAry != null){/ Z+ c7 H9 I1 Y5 p( Q
- System.out.println("getParameterValues方法");8 l7 t- Y( b5 K$ b* z/ F b; x
- System.out.println("---------------------");
. Z' ]2 V* v1 E% d$ ]% R - System.out.println("参数名称:username");* ?: {; E$ C+ f9 K
- for(int i=0;i<nameAry.length;i++){
* |! S0 W4 C; E7 a - System.out.println(nameAry[i]+",");
. P* B7 | m) m0 b* i - }/ U" m0 K% o: `' j3 V; k7 t
- System.out.println();2 J2 U; i+ Q% C! F
- }
+ O- b+ [, I" {- Y& X: { V6 s -
! [; r" y c+ T1 X9 O/ C! U - System.out.println("getParameterMap方法");( Q- Q2 y9 }+ R6 n6 c, W
- System.out.println("------------------");5 C/ A5 S: Z: _1 W
- Map<String,String[]> map = request.getParameterMap();
- k Q9 B7 u, r3 M - if(map != null){
3 d: H) B( i. z( c6 o% J4 G' d$ d - Set<Entry<String,String[]>> set = map.entrySet();
* z3 l: `+ U6 F; e. @& | T - Iterator<Entry<String,String[]>> iterator = set.iterator();
4 t. X. P# U2 P) j& c4 I - while(iterator.hasNext()){; u, r: e9 y' H+ }3 y* ?: C
- Entry<String,String[]> entry = iterator.next();( X$ h/ D) D: d
- System.out.println("参数名:"+entry.getKey());7 M# r0 J) `; g; V' h
- String[] values = entry.getValue();) H D) ?& L- B6 h( C! h- K
- if(values != null){
# F1 Z% R8 j* \) Z$ T - for(int i=0;i<values.length;i++){
0 ]9 a7 u! w# o" c - System.out.print(values[i]+",");$ {1 T/ Y! q. k6 z' Z% R
- }, L/ `! H4 w; j) Q% ~# a9 Q7 e$ G
- System.out.println();& h4 }. @, K8 N' e0 `4 I: W
- }
1 w" \! m. o4 a: L# \: e - }6 J" p5 |, B; z
- }# ^2 t5 d& y( h
- System.out.println();( w7 T# A: Q4 G. e, ^) @
-
# X5 W* N z" U3 \ - System.out.println("getParameterNames()方法");
, H3 z/ {% P9 j; R, ? - System.out.println("----------------------");
1 X; {3 K- O6 L- F - Enumeration names = request.getParameterNames();$ n, e$ c# A7 b$ N& P- d
- if(names != null){
; P v# `5 r* R" q: Q5 B, Q - while(names.hasMoreElements()){
5 Y1 f9 J6 D, i5 n. A6 d4 { y: [ - String name = (String) names.nextElement();9 {4 X+ Z4 W; {) u
- System.out.println("参数名:"+name);
' A9 }5 Y& R0 a3 N; c& v; u- N - System.out.println("参数值:"+request.getParameter(name));
% D! g/ Q* o% y, Y0 o$ q - }
6 |6 a. j) { G) W3 a! y' _ - }
: N( P6 y; |; A7 }, V) H - " X" a" l' c3 J
- }
复制代码
6 z1 h3 q. m+ H2 Z7 O8 O. H- B这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:
" y7 p1 G @1 q, E- <form action="/ServletDemo/ServletRequest" method="post">6 T1 j5 N& k$ F& _1 M+ O, z
- 用户名1:<input type="text" name="username"/><br/>
9 _% F9 @! z% ~$ B1 v& Y7 {- O - 用户名2:<input type="text" name="username"/><br/>
; A3 o2 E) M, Y - 密码:<input type="text" name="password"/><br/>
, u0 p: N9 z4 J( T - <input type="submit" value="提交"/>
3 }2 J- H3 {+ ?- N& q, [. ~8 F - </form>
复制代码
% I" I/ Q7 \' @3 l0 h我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:- G; [* \$ K. c! z/ w
getParameterValues方法
+ L6 P3 R( ?/ l! s3 Z---------------------
: ~* B. @' G% m( y$ \+ l参数名称:username$ `' r ?3 q5 F8 Y' p5 ?4 r
aaa,
) X) P# {0 e; @* q+ w, |. Zbbb,
# N0 b/ a* y) x4 z- S$ @
8 p. A' h" Z/ S2 |( h$ ^; |4 L& V6 B8 X7 ~0 T8 o
, E* z1 x& d& |$ S0 w
- i0 h0 b) }- j
getParameterMap方法( O9 i" `; |! p. p: o9 ]/ @& i
------------------/ |7 J1 E6 D" R) f6 M
参数名:username1 z1 g% m0 u; C$ R$ a
aaa,bbb,
8 R0 _1 S% |; G+ d3 c参数名:password1 J6 S7 c, Z2 o5 B2 a% X
123,
; i2 M; Z" K. j3 J; w j. `1 i7 r8 p( Z j' ~' O
: K! r& ?- u+ Z) x) m" C! P0 B, n! t+ X$ g# S" C2 b+ K# X
H* r0 G! m! r6 m* }% M8 ]getParameterNames()方法
- N o% g9 u; p" H6 G5 U$ S----------------------1 Q2 Z: V: a" w* l" \$ r
参数名:username0 g4 m- }6 o; c. {' r ^
参数值:aaa
* `1 G' S- O7 o参数名:password
5 D9 u* D1 u H8 N3 @参数值:123
+ ] g1 ~7 I2 _% M4 a& {, l5 g6 I0 r+ g0 V1 W
9 s# S$ s- W+ h* H+ E: B ]4 q" ~# j' o$ k下面我们再来看一下request的乱码问题:& L7 G, L) P" h# Z5 d, Q
我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"
& b% z k7 J: F( Z在控制台中打印获取到的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)数据: t& g3 i$ c) {/ s- P8 X
- request.setCharacterEncoding("utf-8");
& s( L$ V$ ?1 j( K6 h, A) C8 v# a - String name = request.getParameter("username");/ {" U" ]: }4 Z8 a7 E4 R
- System.out.println("username:"+name);
复制代码 8 W/ G1 ?6 Y9 `! V' d- o
这时候就可以了,就能够正常显示了。9 {! U& X, l! Z- F* e
但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,; i: L3 @- s0 Q* H- S
昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。 1 P/ y" X( ^4 Y( o2 f7 s/ D
那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?
. ]+ L, S6 W! B9 z Z- S: K4 ^做了一些测试之后总结出了一点规律:
- s# n) q5 j1 F8 G1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上 0 @# z( a) y0 ?9 Q5 W. N) X. l. y
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
0 L5 d* \% R d- B这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。
4 p- ^5 X& k2 e' J- d! b所以,当请求的URL如下时:
4 s7 E5 e4 _) B3 lhttp://localhost:8080/test/TestServlet?name=中国 3 E# `2 P, ~4 F/ K. O
其实真实内容是这样:
8 L8 |% t$ J7 ?: Jhttp://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD - p2 B7 j p4 ]7 b
其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。
: M" G/ F/ K* {) X( N) U0 G, {2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串?
) ^* \6 t2 @/ A% a6 G8 M w |3 j 3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码 0 X0 ], G q( w* r
5 R: C# z1 t s, f7 l
返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
) R4 N8 y3 ^8 V( u1 l' F4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。
+ q. u( r/ a! E7 w' G5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的: 2 h4 {/ p* Y) s) x' w
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1");
6 l& s7 p5 U, J8 w因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。 $ Y: Q: q" Z# j' h7 Z
6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了! 8 o. |) s8 Z: E& _
" Q' @) Z% L H: {
那么如何获得正确编码的字符串?可以采用以下的方式: / D+ W& p1 X; p' L
- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码
0 j' Q0 W6 W8 a7 t! p' d' X m7 a# N2 _0 D$ \+ _; B
总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8") / b4 a& g, m! I3 o
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!
4 m' f6 Z) j; s2 x' X# y) P8 `3 I这里的解决方式有两种,6 Q$ T2 m2 ?( n% S% s7 n2 q
+ }4 y* Y( |7 m一种:是通过String类的getBytes方法进行编码转换,具体java代码是:
A( O! i: `# I& r' c' h- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码 * F: S/ k, `7 L& d* u
1 l, W9 Z5 M% s5 E: s0 n. o+ M D( N* W
这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-86 D, H/ T+ e( J: C; X
6 k5 ]% o7 }3 I; r( k/ |3 }
! S, U$ E& z ^5 b/ x; A: r4 \9 u% M0 l1 W8 N
第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
) V" F e/ t" J5 u+ S8 b9 C, k% U* q - <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码 & h4 E. O% w2 Z2 h; u
这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集: U) O/ b0 I" t$ a
当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。
, R- o! W Y) z. V上面我们就讲述了如何解决request的乱码问题- T; k; |, z) D" R& g) M' z
1 w( y! P) t9 \6 C/ j6 C5 q- Q6 g0 x# i1 I0 U! ?3 J' m/ s9 O& O& X
下面我们再来看一下请求转发的问题:9 [# Y5 `2 u, Q9 |# L
对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:& g7 A: b6 l k8 u% E) g
& O0 a9 X0 O7 {1 S! l
+ h* H) [( Z$ k: [# v1 r
W+ R; L; E. R' V) r5 [Servlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {9 j/ V2 c1 g6 R: t# c
- //在request域中存入一个属性值,然后转发到Servlet2中进行读取
4 _/ r. h. n9 [ - request.setAttribute("data", "Hello Servlet2");
7 Q: w6 v2 A' B8 X7 w - request.getRequestDispatcher("/Servlet2").forward(request, response);
5 _2 x1 r( V5 ]8 M. K. ^ - }
复制代码
- J z1 p4 n; i8 J我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:& E, D, H/ L; U: B3 k. d% Z9 U6 z
* j* q$ u! z7 B0 hServlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {- b; D7 o$ A, ?. Q: O6 {
- //获取属性值0 q2 w' `, X9 g- T2 R) Q& ~4 H# _
- String data = (String) request.getAttribute("data");
: |7 o4 u& z8 V# p( B - //打印! G- ^. @" R0 d1 a0 G- Z6 U9 g) T7 O
- response.getWriter().write(data);4 W8 ]- \4 G7 A8 X
- }
复制代码
" X* r$ y1 S. P5 L0 z1 L$ w& O9 Z6 ]1 J* H2 k2 C( X5 \
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。* t$ z" ^6 b* ~3 R! j
3 c/ W! x4 S% W# S: _9 n F
( ~( i& c! T2 Y2 _下面在来看一下使用转发技术的时候我们需要注意的问题:
2 v* O, I4 H+ l- W$ Z! b0 U) R: M) p0 f9 C. `
当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。
5 b0 C. ?, a( C& z- //关闭流
. f: R9 c) L/ B6 S; J) l" y2 x - response.getOutputStream().close();
" R M f: G* \6 s9 E8 \ - //进行转发- m8 l- }0 a- W9 o. x
- RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的) _8 E( \. h7 L( c) f) ]/ S
- rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:
$ o* ]3 O( e2 b- request.getRequestDispatcher("/demo.jsp").forward(request, response);
5 y( J+ [3 p8 t, ~' r - //转发完之后再去转发
* F# G( I% L- M* [$ w# U* a& E - request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码 " N) q% j9 F7 r. n; [
从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:
+ v% u5 a1 F; d) x. ?在每次调用转发代码之后一定要记得添加一句代码:return; b; M; |& A0 s! h V' ~
这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;' B% Q7 x: d% \; d
2 w: ^3 t; Q/ R! r# d& I
/ a/ k' ?& l* `; ?; e, p
关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉) O6 H. |% F6 y- J, M" L
- String data = "aaaaaa";" O- P+ h3 H- M, Z! Z
- response.getWriter().write(data);" L$ D9 R6 i: P
- request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码 ! \3 ^7 a4 J5 R% x' ?; }# i0 y
3 c4 f1 B) k$ [( u1 z这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。7 Q2 u0 Q* o9 ~8 X0 G2 U
* D0 `9 w, u$ C) Y# k. ] F% A9 l2 z( I4 C; ^" o% Z# B9 U
最后我们在看一下在web应用中怎么书写各种路径:3 p; T, C, D% i4 o' K3 ]( r1 d
规则:
* b$ ^' m) m& \( v/ g' P写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站 ?& D0 V) [& D4 P) e$ I
浏览器用的:客户机需要这个地址去请求服务器
: L3 c) a; U2 y2 l* \- K/ s C服务器用的:服务器本身用的. v% p4 u" b6 E: ?
实例:9 r# t: B4 k. K M
- //1:写给服务器用的2 m; C) `! h% d. R
- request.getRequestDispatcher("/form1.html").forward(request, response);
+ p/ T/ X, ]# x -
& a5 [7 F& D V - //2:写给浏览器的
5 \9 W/ C0 d% C% `7 @ - response.sendRedirect("/ServletDemo/form1.html");
. p3 o9 q7 e/ e* G5 h, { - ; B2 A7 q$ }. V n- b# e" p- A' N
- //3:写给服务器用的
~- ] r3 I! F0 j" ` - this.getServletContext().getRealPath("/WEB-INF/form1.html");
+ A; f" g, w& L, c4 f( T! O1 ]6 O -
# a6 @% n; M) T6 U1 h m - //4:写给服务器用的+ `7 ~& b' g: ~. J
- this.getServletContext().getResourceAsStream("/form1.html");
4 a( }: }$ I+ {1 d8 z1 | - 6 [9 h. R7 [/ ^" ^
- //5:写给浏览器用的1 U6 h8 l4 {, S% c# ~" X
- /**+ T5 \1 z+ @! _* r1 p
- * <a href="/ServletDemo/form1.html">点点</a>: p8 q5 ~: l/ N# d
- */4 \- k# j2 g5 p6 t* I4 b6 g& f
- " d. r9 Y7 U; l9 F) x8 s
- //6:写给浏览器用的% O+ a, }+ F( ^' `8 `! }
- /**
1 U- G, P1 _3 D! L! G6 g$ ^) t) V - * <form action="/ServletDemo/form1.html">
" M- F( M6 \: w5 T3 X - * </form>* v# z0 a8 k5 b# g7 e
- */
复制代码 q B! z+ }1 E1 K! y. U* o
2 F4 e9 Y& u. T" p v' T
# v' o) [0 }5 ^6 {, |1 I5 D" n4 W$ P' C( l
8 r% p' M: Z, }5 K6 o
* @% Z/ e0 E+ }3 u; O/ }8 f% l* v |
|