该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。0 t5 A; s6 x4 B: _2 Q
3 Q' t: ]% u- q8 q& P( |# j4 s/ W- E下面就来看一下Request的相关方法:
( C; ?! V+ a% t z% [8 ~) A3 z* {; KgetContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo
& `; g6 a; \" T5 K1 o7 E; AgetCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解1 f( |: H% n$ W: L$ ~5 h
getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的
7 E$ s; k1 c& s: a. d0 {1 R6 j8 D! HgetHeaderNames():这个方法是获取所有请求头的字段名称
$ u9 R0 p! w- _ q1 j4 ~getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的+ h6 C8 }7 i4 \& P2 s- F4 g
getMethod():这个方法是获取客户机的请求方法6 p: k; n) ^) ?1 Q
getQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456
8 T+ u& F0 Y$ T; rgetRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
1 Z- f( J( S7 o6 u$ i1 _4 ygetRequestURL():这个方法是获取客户机请求的url
. b; w1 w( e* B1 ~% l7 bgetServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest
7 }" i' p) i( {# {getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080
( T& A' Z8 ^& p2 ~! j+ JgetSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到: e |( O3 ~" U: }4 g) h$ m2 T
getAttribute(String name):这个方法是从Request域中获取值
& j) X2 ^- \& k% @, SgetAttributeNames():这个方法是获取Request域中获取所有的字段名称
' F [& [2 D) F3 bgetParameter(String name):这个方法是获取用户使用get/post方式携带的参数值
/ W% G# K* F) y& W, q6 H( PgetParameterNames():这个方法是获取用户请求时携带的所有参数名称
0 e" F' } k& D" A! V6 A" GgetParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象# s1 ^4 L6 O( j, c/ w
getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值
- b6 B% l% N7 V7 j3 A# [+ _2 ZsetAttribute(String name,Object value):这个方法是设置Request域中的属性值2 q9 k& A; t, R
removeAttribute(String name):这个方法是删除Request域中的属性值
. N. c; C3 A4 M. M! sgetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
5 b: a& U4 Q) j, ]; r3 O& d& ^setCharacterEncoding(String name):这个方法是设置Request容器的编码. t& w. D0 J1 I: @- p
getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名3 |; K4 P0 J2 d; ^8 k2 W5 P
getProctocol():获取协议名称
, }1 ?& ^$ k$ M1 X2 tgetRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作* z9 _6 H4 m2 B6 T4 X
5 R: T6 M3 p5 J. i1 e
下面就通过实例来看一下上面方法的使用:* Y6 O3 `" x% E8 Q
- public void test1(HttpServletRequest request) throws Exception{
* M* W5 L; \$ V2 {" T - //有时候可能有多个name6 ~7 X$ b2 t o2 f/ k
- String[] nameAry = request.getParameterValues("username");
' \* }! [6 I# [) _6 ^5 t - //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性
" t/ i6 ]. `, T - if(nameAry != null){
0 D1 E) h1 n, k; u u$ a - System.out.println("getParameterValues方法");$ f% |, J* q4 \: K8 W2 } F" U
- System.out.println("---------------------");' [) a8 O( R( |7 Z
- System.out.println("参数名称:username");
! e* }+ V% Y+ m: w: ^( } - for(int i=0;i<nameAry.length;i++){
3 P' c; X# T' {2 d - System.out.println(nameAry[i]+",");
* z0 S0 s1 c% ~. O% i - }( s* R& y3 Y6 H& P: L
- System.out.println();0 v7 R U/ \- d7 w3 w' F; b. m
- }
5 @$ W& \" S+ X+ T' @; K -
' t3 G- {1 N' o0 X( ~ - System.out.println("getParameterMap方法");$ k6 o3 [ \+ `8 X
- System.out.println("------------------");
$ b/ t, t0 i( [, R - Map<String,String[]> map = request.getParameterMap();; s5 l: B* ^, [/ ?! ?) f
- if(map != null){. }, M+ T) W( J1 J* e p" [
- Set<Entry<String,String[]>> set = map.entrySet();
3 I" y/ _3 @0 X& y1 `' e! i - Iterator<Entry<String,String[]>> iterator = set.iterator(); |+ z& H) F9 a: e( O! s' ]6 i, ~+ v
- while(iterator.hasNext()){1 |- M; h( Z& m9 n2 u
- Entry<String,String[]> entry = iterator.next();: G7 Z$ X* h z. r
- System.out.println("参数名:"+entry.getKey());
; D9 |* D: b- M. f$ [% A% ]$ R% X - String[] values = entry.getValue();; k9 i9 ^; {; n/ q) n% [% {
- if(values != null){# ~8 N1 i. p2 x6 I
- for(int i=0;i<values.length;i++){+ X# l6 i5 }2 ?
- System.out.print(values[i]+",");2 A: {- u7 K1 Q, \& x
- }9 |2 ^% i8 g; a9 j |
- System.out.println();
; P7 f1 X( ]' e/ w& X - }
# r( W4 S& ?0 w- K8 O& y H - }$ z: K' w+ T% Q/ V) r \
- }7 m- \4 t; {6 ]' f/ {: C
- System.out.println();
) l2 G/ y8 e( Z0 H% Y - 5 J# f4 O5 M4 @
- System.out.println("getParameterNames()方法");1 |) D( I# N0 r9 H- G4 `9 @
- System.out.println("----------------------");$ P. F* h/ b4 U y
- Enumeration names = request.getParameterNames();
& ^. i, m+ k3 ^/ }5 h. Q9 I; T" r - if(names != null){
9 D' O3 M% F8 s - while(names.hasMoreElements()){0 C) |( U. b) j- s7 q* [3 k. F
- String name = (String) names.nextElement();
1 `9 j n3 X7 L x. U - System.out.println("参数名:"+name);
! |4 ]1 C3 ^& [7 U8 j) l; H9 K - System.out.println("参数值:"+request.getParameter(name));* J$ f$ n4 q' V" b8 A
- }* ^+ U% D9 n; K: i# t
- }
+ }$ i1 ?- a8 K! `( F1 R: ]& x - 9 M9 o4 C4 E' t8 J* k
- }
复制代码
- f7 v) v3 @- Z这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:" R* R8 g1 z4 c/ Y/ g: I
- <form action="/ServletDemo/ServletRequest" method="post">
; K8 S9 t2 ~: W - 用户名1:<input type="text" name="username"/><br/>+ z3 `- [: ]3 F& u
- 用户名2:<input type="text" name="username"/><br/>9 H" L3 k# v0 I `$ T
- 密码:<input type="text" name="password"/><br/>
7 G1 i8 o7 E+ @1 A! k - <input type="submit" value="提交"/>
- r: Y6 h, u% `( @4 q- P - </form>
复制代码
4 z! P; P' d- f4 u. [+ g2 I4 i" E1 S我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:
" B0 o' K2 `8 T! a& V% sgetParameterValues方法' v' i) Z2 e+ U$ e" m9 ?% K4 K/ t) K
--------------------- r9 _! g2 ` f3 X' X
参数名称:username5 g2 a& W, R$ p
aaa,
7 S' s4 v1 T, g8 t0 @bbb,
' ]$ ]! {$ W7 ?* |: O& h1 ^/ z1 Q7 s9 |1 s% e8 U
$ A, @ X6 a9 g5 v
8 \) x6 ?$ L2 t5 \4 J6 `, p; s! x/ T$ q
getParameterMap方法
% ~. U3 E3 j9 q: n9 r------------------
+ `9 m9 W7 {) J. U* B% p8 p参数名:username
0 u% E5 ]/ v1 ~0 h- m* taaa,bbb,' {( C6 Z1 E, P3 n& \+ d
参数名:password$ m8 j/ }8 w' S* _" O
123,
$ u0 ?. w2 {, v, D" v9 I! J
9 h6 E) m6 T$ |8 W$ R! J" U4 t( }+ ~* c$ {2 V; `
( Y- X, |2 ^. M: B
7 `# y. ?* l# D. S1 l) KgetParameterNames()方法: c0 q4 w4 P! h% U3 [( }9 E! O
----------------------- B* _, w! ]; b0 k/ i3 K8 k9 u; n
参数名:username
; P) S' w& m, D Z参数值:aaa
5 s5 t8 ]# \+ T2 ~" f! x参数名:password
7 V" T' d# X8 _, @4 C参数值:123
; F7 P' |9 c" m: g* q* B& B& Y1 u% u3 h; A" A1 N8 [: O( M+ ^1 g
% |/ B! {/ H+ B" ?& e+ M9 ^下面我们再来看一下request的乱码问题:
! X `/ W; R% ]" V1 Y我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"5 V% A. |, [; T V5 p/ ~
在控制台中打印获取到的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)数据
" t8 C. S: }: Z# p0 [, ^7 w- request.setCharacterEncoding("utf-8");
2 m2 n8 B$ m7 E) j$ ~ - String name = request.getParameter("username");
- x8 F& \. z: o& R9 o - System.out.println("username:"+name);
复制代码 : `0 c* I2 c& N/ e5 b& d" t
这时候就可以了,就能够正常显示了。% y' n& @3 d u7 E7 B$ k
但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,
: @8 C9 p9 i8 r8 h: I9 m昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。
) S- _, f$ c, `: a/ d1 j2 P那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效? 2 m% m F, B& J% A" ^# R
做了一些测试之后总结出了一点规律:
0 D5 j; G0 [2 f1 g1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上 % c* U6 R% H' v7 q$ N! j3 U" d
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> * `3 `$ r3 m' u3 @' h" u
这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。
3 u! ?& ]5 l7 _2 |6 }& L" E所以,当请求的URL如下时:
; @( G( S# M* ohttp://localhost:8080/test/TestServlet?name=中国 ) |7 x) C. V2 H# O
其实真实内容是这样:
# Z- R, E- [% {5 whttp://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD ( ~) H2 E1 q& T
其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。 , e- G7 L% B! X$ O S
2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串? + T9 ^7 r" ?( q# i, @/ ~
3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码
( l$ W- s S; y' A0 s" n3 |7 q
9 X7 A8 L8 _; h) h' A! z返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
$ |# z- u; C& H) M6 S" O2 Y$ P5 p. @4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。
6 n F- n% Y/ x5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的:
' s6 R4 G f) p( J' h: d" E7 W4 ~URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1"); 7 W7 L. B$ J+ i) B
因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。 2 `4 _4 i% W8 G" s R
6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
7 `7 ?5 T* `& K' ]" t# i; m3 g5 ^* w4 J% t1 @+ I
那么如何获得正确编码的字符串?可以采用以下的方式:
. a7 G/ z+ o8 @: L- l0 {- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码 ( I8 V6 t& w0 r+ ?
' A* Q! c/ m* a( S总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8") # W, ^+ O' t3 a# v- e4 O/ T: L- u
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的! 4 `& w6 N$ y8 Q
这里的解决方式有两种,
v3 m; y0 F' d8 U
) z8 h$ H% }4 x+ t! f5 x: X一种:是通过String类的getBytes方法进行编码转换,具体java代码是:' F/ e0 w$ W% s, ]
- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码
; [' c' E; b. S) M' j4 W
" U: d) m# c0 Q$ f4 h8 h这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8' b8 Y- n1 d* a2 K- J
& Q, S$ E2 V% M7 E2 Y1 }5 h
& |% J2 x5 v, Z( {
. ~8 R- _1 x; K# ~( x2 R7 O第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
. f/ M0 E9 O, ?1 p+ ~# p0 x - <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码 $ C2 r0 H( \, X$ N, p
这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集! ~ |' h! n2 f4 c9 b! }1 t. ]% ]
当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。
8 F- @* L; O! z( h上面我们就讲述了如何解决request的乱码问题
; z* y3 e& _ q6 C, v; b7 A& t+ ~
+ _+ [8 \+ H: O" D5 }2 Y) ]+ _) _ C; u
下面我们再来看一下请求转发的问题:7 t8 I3 [, ]. r P
对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:" U k4 p/ V( H" I. \' V
! C: S* X( _7 g F) O" [ f& Y
: v/ l c" _0 @' O
, }1 M: h7 W2 _% ~Servlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { p& j" H: x9 T( E* b
- //在request域中存入一个属性值,然后转发到Servlet2中进行读取
: ?# C6 G/ n" _' f4 @ - request.setAttribute("data", "Hello Servlet2");
3 e3 a B( H6 j% W0 Y( z - request.getRequestDispatcher("/Servlet2").forward(request, response);
9 v' i* y2 V( q+ G! `+ p8 } - }
复制代码 ) K1 J! s P) Z# }( c Z
我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:
$ z' q% t4 ~* |+ D# V8 i, ^, K3 r2 n0 E
Servlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/ E6 z0 M) Q4 j, z/ z
- //获取属性值
" _4 s" A! b/ {3 U' ? - String data = (String) request.getAttribute("data");
8 S, c& ]( m' b7 { - //打印
6 d7 [7 r' b* V& \ - response.getWriter().write(data);" d* n9 b& c' a, m/ \
- }
复制代码
1 j$ f6 T, ^( r P9 Z# @% U6 e, T% i
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。
3 u' Q( P! s O/ g j
* o- L: k3 I; s1 H' |, x; m( w8 {% w: D6 ^; u" O
下面在来看一下使用转发技术的时候我们需要注意的问题:
8 a3 s t6 _ K$ Q J; l0 \# u6 ]5 x/ J) V
当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。
- w& [( n- ^1 f8 C$ d1 k# a* ^2 }7 [- //关闭流
# ]' W3 @+ `7 C: P - response.getOutputStream().close();
. D4 P4 ?6 ]: a" L - //进行转发+ b+ _# d( A, x8 y
- RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的: F/ x* ^9 a U( x% u2 ^! X0 I
- rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:
- O; H Y8 M6 _- request.getRequestDispatcher("/demo.jsp").forward(request, response);1 o! b5 w8 C1 w4 c; S
- //转发完之后再去转发
& c+ e1 E6 |* \3 A! V8 p5 j6 { - request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码 2 `; D0 u- g, x
从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:$ J" \* {' w6 P
在每次调用转发代码之后一定要记得添加一句代码:return;( \# {8 i2 \& E0 ?8 R9 [2 ?9 ^
这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;
# F( l4 G7 j( {: n2 I: h. j
2 ~$ @8 e, X8 p/ S/ E
) `' Y# t7 r; r! [$ T, k. W; N1 \关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉
. K' q( o. v Q+ Z! T5 z - String data = "aaaaaa";9 j2 h; G( T, J; G; Y: E9 ^/ t3 k
- response.getWriter().write(data);
* G( R* G ^, G4 C - request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码 . N( ]1 R5 i0 t5 e
" j$ q+ G; G; z* {1 N! U2 `6 d这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。$ g7 h6 W2 T6 | e. C% ^% d7 S
) j0 X9 ?7 q {$ i4 A2 Z+ C6 ]( [ w, g {7 r6 t
最后我们在看一下在web应用中怎么书写各种路径:6 O9 r/ U O$ v( G( [$ D
规则:3 G4 `6 C0 d! E- i" I- y) l
写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站9 f1 b+ l% ]6 l7 E
浏览器用的:客户机需要这个地址去请求服务器
* d$ g# Y, H U8 W+ o服务器用的:服务器本身用的
{( a. R$ O( {$ I6 |! M7 H实例:
' ~ |" }( Y0 w% i- //1:写给服务器用的
b" i8 @0 F1 e3 \( X - request.getRequestDispatcher("/form1.html").forward(request, response);
$ Q+ ?$ p: i" ]& K7 |3 z - # L7 p5 @# }2 l i: Y/ U; k* U
- //2:写给浏览器的4 u4 c3 f* j8 o# D( Q
- response.sendRedirect("/ServletDemo/form1.html");
2 p9 o, U. S( k1 t& m2 X h E: z -
' ^+ ~; E9 ^" l* j2 Q8 l, t - //3:写给服务器用的
: c# v0 Y1 ^5 M* ^8 ]* [- o! K - this.getServletContext().getRealPath("/WEB-INF/form1.html");3 p1 V4 D+ g) {6 [
- , ]" v. i8 b0 H, `8 C; J9 Q# G
- //4:写给服务器用的
! y8 K3 J9 V3 {% w- E - this.getServletContext().getResourceAsStream("/form1.html");+ v+ R( b. u# N7 Q; Z9 G/ W% \
- # N0 G/ ]7 q8 }- Q, v+ L _, a
- //5:写给浏览器用的" M, s! E: N S/ U P. Y# ~' X6 d
- /**' d0 A+ \& L9 ~2 Z6 d- h
- * <a href="/ServletDemo/form1.html">点点</a>
! b# E; z1 v* d. F u4 Z% K, g - */$ B: H# J- ]. ?; e
- ) {: P- p* E& v `( W7 G, G$ P
- //6:写给浏览器用的- v4 W+ T! q% G* v+ {3 ?5 S4 s
- /**
# }4 W: n r' l4 ~& j - * <form action="/ServletDemo/form1.html">
: h- d) D0 o! P( J( g - * </form>
2 G# b( y0 a8 M3 T u" k; U3 F( X; N - */
复制代码
; ?. i$ g; W: j8 m0 J) ^5 R E6 C
( Y# ~6 Y t, E0 n7 N( j7 I' H" m {' g; N; l& Z
, l1 d: Q- {' I6 V4 f# q
: a9 g1 W* B# F$ K o7 V# D( `4 j5 K3 x! a4 l" g4 J ~( }) S
|
|