该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。$ T1 V* e5 z+ T) ~9 _9 F
1 I8 S' R1 z' x7 G/ G! Y2 b* j9 R
下面就来看一下Request的相关方法:8 B5 M# d- K) k o- z5 b
getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo, x( D7 T, ]. U$ J
getCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解3 m- ~% R5 J& y
getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的9 N1 Q4 m8 K/ x6 U
getHeaderNames():这个方法是获取所有请求头的字段名称+ M# @, f8 B/ y7 }+ } @
getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的
6 h6 \" t5 k6 }# [! \ J" xgetMethod():这个方法是获取客户机的请求方法
( s. {% \6 Y. u8 T# C% l1 |getQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456# O1 F$ n4 S2 e" _
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
) [9 V$ h* F3 v- p$ D; q& B. OgetRequestURL():这个方法是获取客户机请求的url
$ i: b! X# b. e$ ?7 |$ ?7 NgetServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest
3 d5 M) U( Q& YgetServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,80806 ]. I3 _* X9 |
getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到9 H' U9 w1 z Z9 r7 p
getAttribute(String name):这个方法是从Request域中获取值
. g ?2 u8 O2 p' @/ E! i" y/ fgetAttributeNames():这个方法是获取Request域中获取所有的字段名称& h# Z! a |' D0 U+ x
getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值
3 {, _5 H( c* e( _9 `getParameterNames():这个方法是获取用户请求时携带的所有参数名称& S9 \3 B: [, x& Y
getParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象& _" m# \, _. \% s2 H' j" { H
getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值. p/ }; g+ X! Z3 m: E
setAttribute(String name,Object value):这个方法是设置Request域中的属性值2 [! l5 S5 e) s
removeAttribute(String name):这个方法是删除Request域中的属性值
% k9 x, g( ~# |: H: P; c# m$ ogetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
w1 Y# {0 w% y4 o; G: p; lsetCharacterEncoding(String name):这个方法是设置Request容器的编码/ K Q4 H8 F4 B: l
getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名% ?- n8 Y8 X, O( l/ ?
getProctocol():获取协议名称
5 D1 {4 X+ } ZgetRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作 c9 K; `' N. ]2 T
$ U! R* Q# P, B- |* O- G2 u
下面就通过实例来看一下上面方法的使用:
$ b' n$ Z: h6 T- h( q h, [3 | n% C- public void test1(HttpServletRequest request) throws Exception{' x; Z6 ?7 D9 ?% p
- //有时候可能有多个name, U- U- P8 w1 q) ^. D
- String[] nameAry = request.getParameterValues("username");
, t- F: U, X3 x! W+ A+ K - //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性: S+ \( c' X$ E) _
- if(nameAry != null){
( U7 s' K; ~( G; X/ t0 z6 [ - System.out.println("getParameterValues方法");
' _. ?2 G9 s, d& a' K- j! P9 J. A0 g - System.out.println("---------------------");4 f, a' H/ @; E2 @, z
- System.out.println("参数名称:username");. M6 l! h7 [. A* N' m
- for(int i=0;i<nameAry.length;i++){
( G& Z+ Z6 H: p0 K( X! I$ r - System.out.println(nameAry[i]+",");
: h" g6 H$ \( s3 K: }9 l - }0 O$ ?( H2 u6 {; C
- System.out.println();0 W% }2 S9 X1 G; c% h1 I% _ G
- }
/ X! j' M' ~2 j6 a- z - 7 a# x4 y& @) H) ?
- System.out.println("getParameterMap方法");/ g0 x ^) E( y6 O$ I
- System.out.println("------------------");
( l, J+ F% o$ w, Y& R! F - Map<String,String[]> map = request.getParameterMap();
* a0 _9 c4 A7 m - if(map != null){
" f& p3 }1 n# Y: p; ^2 \ - Set<Entry<String,String[]>> set = map.entrySet();/ t$ m, O5 @6 d X
- Iterator<Entry<String,String[]>> iterator = set.iterator();
' J# o0 P( `: I$ @ - while(iterator.hasNext()){" O5 [' P) z" u, l
- Entry<String,String[]> entry = iterator.next();" {# j6 ~! e# o
- System.out.println("参数名:"+entry.getKey());
' ]5 f! n3 T2 ^" V. a; v: G - String[] values = entry.getValue();
8 t h G- z- R/ }5 b$ o! Z - if(values != null){
% F" \9 _! x% W/ t* f9 g" y - for(int i=0;i<values.length;i++){8 F/ `; w0 |: y! \( r
- System.out.print(values[i]+",");6 O3 E9 p6 j5 N' d, o$ x
- }
4 }& {+ T5 a7 u7 i* c - System.out.println();
* l7 I8 ~( H3 G$ Q8 R - }
6 x7 [, H: I9 P; j; k - }5 j6 s: C' m/ D' _
- }
" z% e9 _: ~# p6 j - System.out.println();
% w- N6 n, ?& W* d8 X -
& `3 S i" ~$ `6 b' F) b - System.out.println("getParameterNames()方法");
7 z# _& T7 \% C) A - System.out.println("----------------------");
1 J8 V k% I& y1 y6 t - Enumeration names = request.getParameterNames();
5 Z7 d6 |& C2 E( g$ F9 | - if(names != null){3 b4 |- g" O% U* J! Z
- while(names.hasMoreElements()){$ P3 |4 P, w& x+ R5 K7 J
- String name = (String) names.nextElement();
; X! ]7 C/ r/ G: v- Z, u2 c! y) i! M - System.out.println("参数名:"+name);
- }1 C2 t, p/ D2 g( c0 ~% u' r* B - System.out.println("参数值:"+request.getParameter(name));
" I w* @. K: {( B - }
" J0 ]7 W1 O* C8 G2 `( T' ^$ f - }
+ e% w- @, y5 I% I+ I* x k2 F -
( Q# e* z8 R1 k# H - }
复制代码 , z+ H; b+ r" Q1 x
这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:6 ]4 Z) {% |0 P+ w% B
- <form action="/ServletDemo/ServletRequest" method="post">0 s1 N* j3 K7 h h0 ^) Q6 ^
- 用户名1:<input type="text" name="username"/><br/>
% j9 H8 F: Z n* Y, T' c - 用户名2:<input type="text" name="username"/><br/>
2 a2 ? \& G1 q+ Q* h- ] - 密码:<input type="text" name="password"/><br/>
# v; F2 F/ s( g% ~, x% ]. h: P - <input type="submit" value="提交"/>% _0 ?7 X8 D. O: L1 B6 i0 [6 n3 }
- </form>
复制代码 6 j2 J- e% u1 k8 Z; d5 X
我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:6 ?7 f) H9 m$ Q- [% p# o8 l
getParameterValues方法
) M' N/ ]& x: r---------------------( x5 o: M6 o9 P. B8 O; g+ [# e3 P5 b
参数名称:username; c( ^8 D3 k p. z
aaa,% x2 ?* d0 X$ {5 W8 x/ i
bbb,4 I- G: j; ]( q h( ~
$ G0 d. c* {9 ^: p! J
- T# Q& K6 t V3 n
! z" L7 Q3 G$ j8 p+ q4 w
, Q# W9 E1 r' T; X# }4 cgetParameterMap方法
4 ?$ Q& I) h4 K" i y------------------
* o! o( p) V2 k参数名:username8 {6 @* ~" y8 o* V& ~, S4 K( O
aaa,bbb,
3 |- @ m3 C4 _# @. L; R8 X' p$ M参数名:password
' M, m1 W, G# w0 {' m+ J$ l3 \/ ^123,
1 f: `/ y k/ i6 f2 O, }, O0 b# N9 R9 F# Z9 h! N
8 t1 w: H0 f7 I; b
% I* t$ B0 ]. L% n
+ ^8 q! y8 b% _5 w2 jgetParameterNames()方法/ E7 W' G1 \& h
----------------------5 }. Z2 S$ S/ u" u' i$ J
参数名:username
3 r8 E7 [ o; E% L& _# n7 l参数值:aaa9 e5 s( L$ E# i! ~
参数名:password- N6 L* ]$ Q, x! f: h: J5 r4 e
参数值:1239 w/ t9 d3 t" E& F
I2 [" q. E- b6 S* C" w9 ^
- I. Q6 J3 ?* \5 {下面我们再来看一下request的乱码问题:
! r4 m' u! x- V1 w- Y# Z我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"
8 z5 ~+ @7 _6 }3 a5 Z `9 f在控制台中打印获取到的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)数据- D. \$ w, T1 y* f# Z
- request.setCharacterEncoding("utf-8");: ?& X# g9 p( K$ w/ h1 @* \: F& A6 G
- String name = request.getParameter("username");
/ J1 B$ u1 r0 ^# ^1 s - System.out.println("username:"+name);
复制代码
2 Q1 G* o3 v0 x+ I( D6 W# v这时候就可以了,就能够正常显示了。
7 X" @' P& [5 h$ P% O9 g$ o但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,
: T" p& w" f5 W5 N2 C y昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。
: H4 b( g0 R% @) e8 K; ]* Y那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效? 4 g2 A; z1 `' u6 d( H
做了一些测试之后总结出了一点规律: 4 X1 ~' o! U3 e$ Q1 b
1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上
! s% r/ o; p) |8 y+ b( S2 T9 d<meta http-equiv="content-type" content="text/html; charset=UTF-8"> / O$ P; U- w5 d
这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。4 C* i0 ~7 c) y r, O0 ~
所以,当请求的URL如下时: 1 V" F! J1 C! _) u6 p4 K
http://localhost:8080/test/TestServlet?name=中国 V+ q- w$ E& i5 E" t! Y; `% x$ w
其实真实内容是这样:
' h& M' G4 T# X/ j( A: Mhttp://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD
1 ?/ Y r b2 `/ t- j( G其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。
+ F/ `; B+ k) _6 \6 c2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串?
8 N; p- [# x/ M' M3 b 3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码
+ x3 ]8 Q5 C5 P- Z2 B) Y+ O! j3 z
返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
, A% e8 l! `' k5 T* A+ ] e4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。 9 E1 O7 @% a# e8 R1 k8 ~; _7 \
5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的: 7 ]7 \) q# w( a( W+ u/ ?, o' ?# n
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1"); ! D0 n9 ~( L0 T# b( z6 I
因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
# F1 Y7 `1 K: Z6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
( g9 X! ?5 W+ Z2 A: C9 D/ s4 Y
$ P8 y2 V2 A e% F/ R那么如何获得正确编码的字符串?可以采用以下的方式: + T& W+ }4 u8 x; t
- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码
1 g; a9 p5 k, O4 F* u: D# R2 {) i- U2 O x* U
总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8") 3 \8 Z2 ?, W# s1 w* @
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!
- @2 E S$ T) x这里的解决方式有两种,
. T1 A1 q$ C+ J1 d9 B
$ ~) W1 t k0 k/ V# B/ k# ?* ?一种:是通过String类的getBytes方法进行编码转换,具体java代码是:
; T6 O5 Z4 x1 e- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码
2 m1 s; U. Y- b* e. Z" \7 P0 T- O+ b3 |5 W u. M
这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8: I" _/ Z; z( K# ~' L
( Y) u4 R) W/ I% W! q* ~
0 R$ Y+ A3 m7 Z5 O1 D0 s
- | h3 r6 ~6 G第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
) d% ]& ~) `+ w( G. |3 ^) T - <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码 5 b# ?1 j5 R7 T, Z; v4 h
这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集+ [5 w" P0 S- f- ]6 ?
当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。
* k6 j5 N% L0 M& j上面我们就讲述了如何解决request的乱码问题+ b. f# j4 a/ W5 ^) E* ]! A m2 q
# {: e+ ~0 }: a2 w# }4 c ?2 s
" I% y5 R* v6 c+ Z4 Z" m1 a; ?' S9 L
下面我们再来看一下请求转发的问题:
4 H" ^' z% Q2 B' [/ ~, S1 T对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:
/ i- A5 I; }! H5 l# a$ C. s" B, }$ o- p
- @" H0 M/ [. @( ]) U4 ^/ k. ?$ L0 O" i6 U' l/ F
$ Y/ E. [& m& T
Servlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
7 Q: ]' N c& ]! i0 C: f; F3 _ - //在request域中存入一个属性值,然后转发到Servlet2中进行读取
1 x! z) _3 d% O% t7 p - request.setAttribute("data", "Hello Servlet2");
, p, Z D7 V2 ^# c1 y - request.getRequestDispatcher("/Servlet2").forward(request, response);
% ]$ k$ i' y3 [5 l6 j - }
复制代码 : q6 \( \+ V! `7 a/ w2 e
我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:
" H" q7 {9 M3 d& E- [* \
; R. x* h, L- c; A6 L% g$ pServlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {5 B) i Y, x$ T4 G! G/ V
- //获取属性值4 X# k3 \( g/ L8 r: P, ~
- String data = (String) request.getAttribute("data");
( w4 ^8 U9 M# _) x' R& z - //打印) o7 L- a* W( O- B% s
- response.getWriter().write(data);
3 S) a1 y& x6 \ - }
复制代码
' ^3 r: ` m* z) P- {3 k' B
( r+ ^0 v1 V; |6 X# g7 V: e我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。8 u0 J. }. T& Q4 M- j6 q' ]
1 l- C* J9 b2 y
9 Z1 E/ u8 u7 U- A下面在来看一下使用转发技术的时候我们需要注意的问题:
* y) F8 Y: C( E3 N' z, I( r% i8 G
/ R( l* J5 T4 u7 U+ Z! k" F当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。
5 `. J/ M1 O; b' ]$ i" I9 a- //关闭流" ]$ ?2 ^& Q4 i' ~" O2 o* {
- response.getOutputStream().close();) T: t1 r4 y6 f- `+ `/ j
- //进行转发
! N2 C L; U) ]5 L6 G4 l& H# I - RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的
3 x! F% E8 {5 w$ G: T5 { - rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:/ [, T! l* F! h% l
- request.getRequestDispatcher("/demo.jsp").forward(request, response);
/ a0 C9 d6 S2 w/ a% a - //转发完之后再去转发; y% _: M. I. X' k1 x
- request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码 ( G- W( s1 b$ F2 Y+ h
从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:
; m6 E& F) ^! k在每次调用转发代码之后一定要记得添加一句代码:return;
$ i- Y! ~ X Z& o6 T* u这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;3 y1 [7 H- }, G8 K% v0 i
$ @& }- \% k' Z/ a& A2 d/ A" M" j0 r, y# b+ y" }9 {
关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉
: }1 Z! q$ m7 a1 h - String data = "aaaaaa";8 o9 U. Q2 p# ], D
- response.getWriter().write(data);: V: J: O' m/ W$ }8 y* f$ x
- request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码 , o# X0 R( k" `+ F' ?
. j4 p F) y' {( _+ @
这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。
" k9 _/ A5 T, O+ ]2 r% O/ o: Q' e8 b
" l |4 C! w, q3 T. \7 j
最后我们在看一下在web应用中怎么书写各种路径:" u5 E# R$ z* t
规则:
; V+ ~, M+ ? s1 `% g) p9 `写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站
1 u- b* e) |; ?& u浏览器用的:客户机需要这个地址去请求服务器
8 u+ `) S. e. w+ S9 _服务器用的:服务器本身用的
) x; y$ G& \* @$ F" j1 E- i实例:: H2 F5 y& K$ K% F3 t9 s
- //1:写给服务器用的
1 n3 P3 D$ b( r0 Y - request.getRequestDispatcher("/form1.html").forward(request, response);
; f) ?# h$ P% n* S1 A( K -
# O# V- C8 _0 O' |. C) S: H: B - //2:写给浏览器的 B: D9 j2 }: }7 _% G8 N4 G
- response.sendRedirect("/ServletDemo/form1.html");
% x) T$ O1 L' m& E7 b: H3 q4 N2 F -
# Z; w$ V0 j3 ^6 W - //3:写给服务器用的 u4 k0 g8 O" m P1 m
- this.getServletContext().getRealPath("/WEB-INF/form1.html");- e& h6 z' e3 P. e
- 4 K. \2 M1 t( @& z, a
- //4:写给服务器用的7 V3 d$ x# }2 K6 u
- this.getServletContext().getResourceAsStream("/form1.html");
1 O. t3 W# _% }- `/ N -
) l1 u5 S. R3 w, u% ^ - //5:写给浏览器用的
6 ?- Z7 P# \5 Z5 I5 R - /**0 Q" N- o# N) ?: P( M
- * <a href="/ServletDemo/form1.html">点点</a>
4 T L5 ?9 z( h3 i0 O O - */4 ~# i( J# d! T: r! t
- * w7 ? [9 D3 O+ Q
- //6:写给浏览器用的4 ?! I) |: q" ?# P* ~( z) F
- /**
. P2 L) P+ T8 n9 f$ j" w. P - * <form action="/ServletDemo/form1.html">
+ B+ _( n( [: ` - * </form>9 ^$ k" Y% k. h# x2 `, i
- */
复制代码
# h- i4 f4 e* ]: s; ^" x/ N/ q& W0 w0 \( H- s% w6 v @
$ t; _# `) o0 |; \. @ ]6 `% Q( z Q' j" y( D8 ]
. q/ i" A" |; m
; r: g1 R; D2 I9 }. u" c. l |
|