该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。9 H4 {& X! Y# P- Y; F* x( s
% Y9 t) k6 g3 ~- \0 H4 B
下面就来看一下Request的相关方法:- ^( S$ @* M( a# |3 {' h- |
getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo; l, d8 p- t- ^" x" s2 H6 q% I
getCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解
4 Y. F$ c. i2 l: Q0 s4 y5 S% s/ `, o" XgetHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的7 ?* x$ g0 p2 B# I7 W$ Z" }( x
getHeaderNames():这个方法是获取所有请求头的字段名称
5 u M( a3 f4 [, m0 j" o9 TgetHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的4 v; t' {2 W% U3 P3 t2 N, v2 P% E
getMethod():这个方法是获取客户机的请求方法; D9 b2 N" e- F$ ?) C
getQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456, s, a9 w+ Z; p6 [
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
# j8 J0 f! g' n: _. Z, b7 f. k" fgetRequestURL():这个方法是获取客户机请求的url
! t! t' V9 A, z' L! ]' U" y) ]getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest
5 Z5 @& `- l/ z6 rgetServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080
" X& G* Q! Y3 I9 q9 IgetSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到5 f9 k, v& ^9 B
getAttribute(String name):这个方法是从Request域中获取值
3 H# `3 N9 q' m/ R) A% _: P0 PgetAttributeNames():这个方法是获取Request域中获取所有的字段名称( h3 H/ _( @: B* o$ M$ ~
getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值% N6 s4 Y: g& s
getParameterNames():这个方法是获取用户请求时携带的所有参数名称
1 h% a9 _% w1 ^5 _1 W* p8 OgetParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象
4 D. ]+ c2 G) _getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值
2 P, k; S( n" a/ _) UsetAttribute(String name,Object value):这个方法是设置Request域中的属性值
! y# z: s! k- B& Q+ YremoveAttribute(String name):这个方法是删除Request域中的属性值
4 R6 K; P" f/ r CgetInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
$ y1 `, E+ q" }. M, wsetCharacterEncoding(String name):这个方法是设置Request容器的编码! Q+ {3 R# S. y# B7 P7 ~
getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名
: a" b h) X- U" o. g+ DgetProctocol():获取协议名称4 H6 r- g0 ]' E) W( c2 t" h" V7 q5 U. l
getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作
6 g$ M1 x+ @% U$ {+ a1 L% s" p( P
+ I5 z8 {* x5 }, j$ J# X下面就通过实例来看一下上面方法的使用:
' u/ `" h+ p5 K" g5 H- public void test1(HttpServletRequest request) throws Exception{
- Q5 ^, V& N' \$ m7 x4 @ - //有时候可能有多个name- g# W' G1 z9 M Z( M
- String[] nameAry = request.getParameterValues("username");
6 o9 }9 U o! z2 r' U3 g - //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性) w6 {# w, k N: v# n- ^7 T
- if(nameAry != null){
$ ^$ m( f9 Y' t! c8 o3 \- M$ o - System.out.println("getParameterValues方法");
; T3 a, j! N( t+ \ - System.out.println("---------------------");
9 M9 F6 ^ j4 c+ Y( H* K - System.out.println("参数名称:username");
5 e8 d9 n) `5 X6 R {$ @8 U* H- S - for(int i=0;i<nameAry.length;i++){
5 B7 ^, G; z' {5 c5 H# v - System.out.println(nameAry[i]+",");
: |9 N& W2 @ T& f" T4 n - }1 w$ b3 w3 z. ~
- System.out.println();
( i+ g) y# d1 \% ]6 I; K5 t! x - }. [" _/ G* T* B' ~
- f5 U: q2 W& Z C, l9 E. O# D" _ k
- System.out.println("getParameterMap方法");2 J5 f% f! _# r* M4 v, ]$ t
- System.out.println("------------------");4 @6 T, T) f& w; R' z3 F
- Map<String,String[]> map = request.getParameterMap();
8 H6 ?0 I( G4 N& F. U, p - if(map != null){
6 j6 q0 m) p% D! y8 g' x+ z& b, m - Set<Entry<String,String[]>> set = map.entrySet();7 W" g4 y$ f; i. n2 {
- Iterator<Entry<String,String[]>> iterator = set.iterator();# J9 r9 @: y$ c" K
- while(iterator.hasNext()){
V* u# B3 B& G4 N2 N - Entry<String,String[]> entry = iterator.next();
& p! E/ ^3 A0 B4 n" O - System.out.println("参数名:"+entry.getKey());
; W" A8 o* v9 ]( K' @ - String[] values = entry.getValue();! Q& J7 }) j) Y0 W
- if(values != null){1 n$ n1 q. _( k) `; |
- for(int i=0;i<values.length;i++){
& P& S0 ?3 S+ Z O+ G% j - System.out.print(values[i]+",");1 J6 y2 e* T: w
- }
0 E! P" T( u" i5 K, i: G' l - System.out.println();
* T/ g Z1 H7 f2 c; u - }5 D$ m) N5 S7 p! o) ?1 K3 g
- }
% p0 b6 K8 \8 I& ~5 L - }
9 a. p/ Y ?4 G - System.out.println();
& S! j5 s$ i7 X8 r- L) X - ( ]$ X: ?- O+ N7 x; p) R! C
- System.out.println("getParameterNames()方法");
+ B, [% l, d7 R# _# ~ - System.out.println("----------------------");. B4 F i) T4 C1 F
- Enumeration names = request.getParameterNames();
c; R6 U1 d$ s - if(names != null){$ ?3 p! X4 c# f1 B9 s, G7 X5 O
- while(names.hasMoreElements()){! e* t t* A( k4 ?: x$ L3 x
- String name = (String) names.nextElement();: i# s2 Z% |; k) ~. _ W
- System.out.println("参数名:"+name);
: ?4 F/ e! _3 m( r: e8 q9 ` - System.out.println("参数值:"+request.getParameter(name));' S2 {& a0 X* W4 O
- }
' O- Y+ j# }$ @) R2 N1 F$ u |+ C - }
u' H8 d, N: h) ] -
8 g. t6 b% u) B. V7 B- f6 U" V - }
复制代码 ( W9 g9 g" m8 U) p. V/ b3 R7 R/ w
这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:
5 w4 A9 L, n& u- <form action="/ServletDemo/ServletRequest" method="post">; o- Y9 q f \' \
- 用户名1:<input type="text" name="username"/><br/>$ x1 F5 E( A) ~9 k6 @! ?
- 用户名2:<input type="text" name="username"/><br/>
% \3 e; S7 e: N* L0 \$ Z2 [# u - 密码:<input type="text" name="password"/><br/>! `; V+ |$ G d4 {
- <input type="submit" value="提交"/># T' a& i0 E4 p8 F3 p
- </form>
复制代码
5 F# @3 p3 d2 M& {. z( z$ b我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:
) A T- x O4 LgetParameterValues方法' U9 C9 [7 { ~
---------------------/ q: U, E9 {% B5 K B
参数名称:username% e9 R6 ^7 `5 \7 O- {; _6 G, M2 O
aaa,( p8 s" \& t" @! r
bbb,8 h: D# w% v4 ^
8 D/ M# V; x L4 F$ u& k+ E( E
x8 E/ {1 f, Z0 i+ D% Y+ w1 p3 t$ \( n3 G
) Q/ @6 Q& R. `$ b; u
getParameterMap方法! g, Z2 C( ?' _. ?
------------------# g1 G4 P* z- m
参数名:username6 J" d6 H \5 H* v; z4 A
aaa,bbb,) }8 `. o- G D8 N& E/ O {
参数名:password
, B: j. ~0 m: a5 {0 Y' }5 I123,
- @" x7 C' d3 ^
: F) f' E) z. |* c# C; j' J
) j& y6 a9 w( p' y9 t" {" ^
2 M3 y+ H# a" }# a K2 H, u2 J1 y( W2 b. e. P! x" Q! Q
getParameterNames()方法
# y5 Y+ O0 \# L8 G----------------------
( _; W2 h6 L5 g% Y* \参数名:username. y7 y d& J, V. j( R. L* K
参数值:aaa& ]: m$ J6 {) g" U$ n6 k& N
参数名:password' H! q) [; i. q) x7 R. ?
参数值:123
/ S6 d5 G# S+ M: ]' c% m a
; m+ y2 x+ P& T6 F) j: H7 f S
% T9 r( m1 n# E; C6 c( N下面我们再来看一下request的乱码问题:
# S W( F4 D+ U1 g- k我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"
; V! W$ u- P# f' S" i6 c- z S在控制台中打印获取到的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)数据) b! W- |2 b! @, s6 {, h* t5 _
- request.setCharacterEncoding("utf-8");
0 u ?% U( S2 |$ T8 A+ D - String name = request.getParameter("username");% y" `3 {9 h3 t9 `/ J9 r p
- System.out.println("username:"+name);
复制代码
H* J! H! B- V( G( Y' `这时候就可以了,就能够正常显示了。4 s P( x+ N4 |$ t. `4 W4 D' q7 R5 p M
但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,
, [3 [- _9 p8 x/ q9 G: t昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。
# ]0 S- n7 ~) o( H6 h- U4 W那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效? & k/ m2 W2 M: Z' s8 `. ~$ S( m5 r* B
做了一些测试之后总结出了一点规律:
; B8 V6 U. W* G" n" t7 n* b1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上
6 i; V5 d* U K- y" v& G<meta http-equiv="content-type" content="text/html; charset=UTF-8"> ]% j) m6 h. G
这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。
( s1 c3 ]+ a( K' C+ j所以,当请求的URL如下时: 6 R' K7 P: y/ g0 E; B! Z: |
http://localhost:8080/test/TestServlet?name=中国
; J+ s; Z5 A$ ?4 @4 |其实真实内容是这样:
5 _. v3 U8 e8 Z0 E' w% H" Ihttp://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD
, Z+ L- T% X. q" p2 L& j其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。 9 v3 j: [) F6 Z) Z$ ] _
2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串? $ n! l* c2 p. _5 {" H2 _
3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码
8 J4 C$ h8 @4 W: K5 I4 x: u" a) ^
( J3 B# U' d {( x. `- ^5 n返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
' F. `5 Z* \' u* N4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。
( F4 w0 `. b+ U+ }7 m8 b5 O7 l% j5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的: ' _8 q9 t( b- m8 E& x' p1 R
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1");
p X# [$ f. M$ k因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。
+ A; u7 [) U: q* h/ z- q- p6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了! " ^, D- F! z/ N# U% \% T% F# N+ e
7 @; c5 y) J) A& }. ?7 X6 P$ |7 \; q那么如何获得正确编码的字符串?可以采用以下的方式:
5 N( d K8 Q$ {- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码 " m; T6 a: x# Y# Y# J
2 y/ m8 Z' q. |7 P5 E2 G总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8")
& s I& m, V/ ]5 }所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的! $ N. E( }$ [$ z
这里的解决方式有两种,
1 J9 o" v) u8 ?2 O8 R, g: s
, l& [+ ?' s+ v! s; o6 `一种:是通过String类的getBytes方法进行编码转换,具体java代码是:
5 }3 ?$ `* T( Y) B" k3 P% W- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码 1 Z3 {& l* D! |. w7 P
2 y1 {7 y! s5 M8 T
这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8
; ^4 a1 u5 k9 K5 E) C. z
5 K$ L4 L& D0 s5 ]6 C3 O0 _: q3 m* g' k
# a! i3 k9 k% D3 x第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"2 N6 Q/ ^5 M$ B. Q" [& B
- <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码 ' b: p# R8 Q# _
这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集0 d! I* |% u/ u/ p5 U3 P5 M
当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。# B% G, b' o- |
上面我们就讲述了如何解决request的乱码问题5 x; V7 `! L* p5 s2 l
4 G# E) P8 {) n2 ^
M3 D7 d* L/ {1 Y
下面我们再来看一下请求转发的问题:# Y8 G: y& a/ e) }
对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:& p# s/ }+ i: a
& {* B! m R& `3 z+ }) V+ Y. N$ J3 p$ D8 c
1 P5 R) d5 ~, n# h2 w8 U3 kServlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
; J0 N1 b6 [7 C' D" P: X - //在request域中存入一个属性值,然后转发到Servlet2中进行读取
( U* U! s/ l: ]2 ? - request.setAttribute("data", "Hello Servlet2");5 j5 D; c" ]# C: S# e4 l+ u
- request.getRequestDispatcher("/Servlet2").forward(request, response);& z( L, C2 ^# B; X) [
- }
复制代码 , \: c$ U' ~5 R9 U1 S8 Q
我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:
- |$ _3 w' i$ h' U: x, o: E+ S3 M
Servlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {5 u9 C, a; J8 b" j, q
- //获取属性值# \' N# R# ]/ z$ q+ b
- String data = (String) request.getAttribute("data");8 R3 l' L, Q2 }7 j* [- i6 c
- //打印
* }' n% a5 f3 G) a/ b - response.getWriter().write(data);7 H% i) x% h% r2 F9 r
- }
复制代码 + n0 e- o( A' f7 j4 t
9 ~9 \% [" }6 C7 J8 u' I8 l
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。& ~, n2 V4 `5 k' `9 k, o# f% A
' k- o9 M4 w1 T8 U; P0 G4 T
# B/ g, a8 l- f3 g4 c3 s
下面在来看一下使用转发技术的时候我们需要注意的问题:4 T+ U9 R6 J/ N4 f1 _2 ~
6 T8 y( V) |: d6 ^0 _* |
当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。
# v( |2 {. B; t- P* b% N- //关闭流0 |4 ?" N3 Q3 H3 _$ Q5 e' Q$ A
- response.getOutputStream().close();2 f6 z' _3 p* {8 m0 f* D
- //进行转发
5 [; @6 f0 F: ^! s9 M, F; n1 h - RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的' o! X& I/ y+ @& C
- rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:+ S' L7 N! G6 L7 j5 z: U
- request.getRequestDispatcher("/demo.jsp").forward(request, response);/ J8 @: { A5 t6 |6 ~2 t* J; R
- //转发完之后再去转发
/ E7 p6 ~3 C) ` - request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码 ! c* W& N+ q3 w- R; f
从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:' |3 E5 U2 P) K
在每次调用转发代码之后一定要记得添加一句代码:return;
+ U) B' b6 z$ {8 P这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;6 g( \& K1 a" Y
& {8 ~9 I$ q# Z
% {( H6 L- _7 Y/ O' M+ c& r P! X关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉
/ `, ^1 b6 B* t5 o - String data = "aaaaaa";0 c$ }9 Q( k8 u& v; f
- response.getWriter().write(data);
$ K0 x# k* B9 R0 D9 N - request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码 ) e0 G. _) z- C1 Q
* V& y2 j+ d \: }! _
这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。
! ^3 F+ T( m1 W# `
; w1 J. Z6 P# o8 b$ V! {1 u. S5 z5 O/ {8 W7 B* r
最后我们在看一下在web应用中怎么书写各种路径:0 R1 S9 u) O0 z3 A/ n, c
规则:3 v- z: x- `% g+ Y
写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站
" _0 u7 f' ^9 C浏览器用的:客户机需要这个地址去请求服务器% k a* V' c- H/ D
服务器用的:服务器本身用的4 \) [9 _1 C- E. a3 l) {, e
实例:! N R6 [3 |" \8 l5 |1 K
- //1:写给服务器用的4 G$ V7 v" L% ^: ` I2 K
- request.getRequestDispatcher("/form1.html").forward(request, response);, A1 y T, F' z; I' Q/ a
-
9 M) b7 v1 _& N( e$ `% J - //2:写给浏览器的
$ a4 k( j X( W' X- o8 S - response.sendRedirect("/ServletDemo/form1.html");2 u( W, h' Y/ Z) \
- $ D( y2 E8 z9 a' H
- //3:写给服务器用的2 o, c) E% y5 s' w
- this.getServletContext().getRealPath("/WEB-INF/form1.html");
( X& `+ v7 d! }. Q4 b9 {( ` - . V, g: Y4 c2 a% h$ k
- //4:写给服务器用的& ]2 f( G$ ^: A5 p- W
- this.getServletContext().getResourceAsStream("/form1.html");' w$ x" u/ r3 ]% [4 H$ b. j/ S
-
" C# @0 l& P6 O7 J: i h& _ - //5:写给浏览器用的
9 V7 S; m3 S" [% s' ^ - /**
2 i1 Q% e" `4 O. f9 u - * <a href="/ServletDemo/form1.html">点点</a>; ^# A v* {& Q' s8 D* ?
- */* C% h/ O/ t2 `* D$ S- W
- % E; R8 e, h( Q4 U
- //6:写给浏览器用的
4 B, k. D$ R! U8 `9 D - /**
% a L) s5 N' B" ? - * <form action="/ServletDemo/form1.html">
/ q5 P" W( A' m; s' b/ c C q2 {. ? - * </form>" b7 N" I f; I: d; B$ M& v, A
- */
复制代码
1 n0 z9 Q6 ~4 Z) _
. d% u( j0 ^; |
) }0 u! Q0 F) I! n0 p$ o4 ^
) L& J: x/ [+ l5 h4 W) C7 X+ o! T! b' l) h6 j2 v! E
" K) B8 K7 q$ E0 _+ v
|
|