该用户从未签到
|
前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。
) ^4 f5 m. u% k+ i* y3 r0 J" C; B6 r5 s* P
下面就来看一下Request的相关方法:
9 O2 C+ n2 @1 q3 _) S( lgetContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo
0 V$ k8 I' r6 Y3 y$ T4 }: jgetCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解
' s' k4 G# o$ C7 O: F7 W# ]getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的
$ i- \' b" i% }" e7 NgetHeaderNames():这个方法是获取所有请求头的字段名称
6 g) {8 r) ^3 S- d& R( O1 ~getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的
+ Z; `0 @. W. N. Y P$ R- t: KgetMethod():这个方法是获取客户机的请求方法
( @0 h) i- o+ E SgetQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=1234567 {1 M# X/ W# y% w( X! z4 V% I
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
) v, A+ o' |# @$ s7 H; x# s( pgetRequestURL():这个方法是获取客户机请求的url
) _; z) N4 M7 g% l3 z8 E) rgetServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest
9 ]; x* ~# i) W+ V' ?, ^getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080
j5 q5 G) u/ D* V1 ?$ ?% IgetSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到/ C/ l) {* U0 ~
getAttribute(String name):这个方法是从Request域中获取值
' r: p( F* q! u+ T. ngetAttributeNames():这个方法是获取Request域中获取所有的字段名称3 J0 v4 E& C2 D
getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值
! z$ M% L4 Q" l! C( s; G0 P; S @" cgetParameterNames():这个方法是获取用户请求时携带的所有参数名称3 t+ |0 I# r& r* n
getParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象, ~& l; K: F4 T9 y$ _
getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值
" s( w$ ?: k0 w7 |setAttribute(String name,Object value):这个方法是设置Request域中的属性值
7 `9 n% h3 P# [5 b& V9 hremoveAttribute(String name):这个方法是删除Request域中的属性值2 c% v( J3 y- U& k
getInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
+ E2 G) w$ J6 E! j4 {1 csetCharacterEncoding(String name):这个方法是设置Request容器的编码
" d9 k! E/ S- K9 Y2 U3 m# SgetRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名
9 S: `6 v; f0 B1 S* B% c+ Z' UgetProctocol():获取协议名称; Z: X: c9 O" z( O
getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作 D% N1 W1 g* k* n* o/ i
/ J* g9 o( R0 A4 v; ^3 b/ u
下面就通过实例来看一下上面方法的使用:# W" W2 K, ]: K, p
- public void test1(HttpServletRequest request) throws Exception{
& E8 N6 r D9 T6 @ - //有时候可能有多个name
% `0 h( L/ B M - String[] nameAry = request.getParameterValues("username");
+ c9 h* q4 [# ]; t - //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性
/ E# y9 k2 n- B2 x6 s - if(nameAry != null){& b! |7 X( U3 e' A5 l- m
- System.out.println("getParameterValues方法");) S$ R/ r# N+ H( O5 c. M- F
- System.out.println("---------------------");
V- y, Y% [/ F2 H3 x4 j+ j - System.out.println("参数名称:username");& ]7 d) U; d. f9 Y7 G% [3 A
- for(int i=0;i<nameAry.length;i++){
+ Z! J" X) Y G( \% u! Z - System.out.println(nameAry[i]+",");
0 I- I/ q5 N& V& ?# O - }4 D5 |0 q9 w# d: D2 `' E
- System.out.println();! u( J" l, i5 t8 O7 f# p
- }' y1 G0 j3 ~# V! e
- " |( [8 i. q% K% o
- System.out.println("getParameterMap方法");
) [$ w% l0 _0 \8 N; J$ s - System.out.println("------------------");
8 l* S6 b% w+ ~ l( N - Map<String,String[]> map = request.getParameterMap();
& V0 y8 e6 `) g2 C4 \, u! D - if(map != null){
2 t% }8 A$ Q! z( z( j) |' @ - Set<Entry<String,String[]>> set = map.entrySet();
6 a6 S- h. S! q2 t - Iterator<Entry<String,String[]>> iterator = set.iterator();
, K; Q: i7 C, c9 z - while(iterator.hasNext()){) o" r3 C- Q" I' W0 e! N" Q4 M
- Entry<String,String[]> entry = iterator.next();5 Y- Z3 @ Z' g
- System.out.println("参数名:"+entry.getKey());
& c {' E8 A/ Z" k! _* x& l - String[] values = entry.getValue();- r8 k. t' ~3 ~0 |( B
- if(values != null){& Y6 j8 a" s, b) A" N m
- for(int i=0;i<values.length;i++){
4 ^7 x" E ]' F - System.out.print(values[i]+",");' |/ {1 j9 }1 M& V' W
- }9 g, p( m- W; C( n" H
- System.out.println();3 o: D2 ?( v F5 u" [' C
- }
" H* e4 F. z! n: ~& H- ]' j9 d - }0 E; A- l* T: I1 Q
- }5 Q' W) M" [- G" n7 ~: V8 d
- System.out.println();' t5 X, p, R5 v9 i! O& }
- & S1 v5 d! O" |$ `' }" g7 m8 `
- System.out.println("getParameterNames()方法"); b Y: c7 D; I, p* z( h) W
- System.out.println("----------------------");8 `, _- f2 |5 V
- Enumeration names = request.getParameterNames();
7 h( U5 v2 [5 J' T2 |6 X; P - if(names != null){5 R9 _, H, u5 J$ ?5 k
- while(names.hasMoreElements()){) E. r- H- r: P' V+ y) K
- String name = (String) names.nextElement();
8 |+ n- v: X* n* I - System.out.println("参数名:"+name);
5 b6 `+ k+ ]4 j - System.out.println("参数值:"+request.getParameter(name));/ b$ b! D/ k, }( H3 }
- }
- X- [! ?( o: } C - }" e9 E0 e8 _+ X: f; _: E$ p
-
) o, v8 P# u0 t6 B0 L - }
复制代码
/ K8 b; a. C0 c9 `* c4 I9 @这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:0 T* W* E/ h6 a
- <form action="/ServletDemo/ServletRequest" method="post">
, [1 O) K Y. ~! W) J2 ~6 d - 用户名1:<input type="text" name="username"/><br/>
* k7 ]8 s1 X- u9 b - 用户名2:<input type="text" name="username"/><br/>( ^! h) X9 A. N2 o+ O9 K
- 密码:<input type="text" name="password"/><br/>
9 V9 ]' T0 t; O( ]# K% s - <input type="submit" value="提交"/>
( X0 s6 z. ^# Z$ S+ e1 c8 l8 d - </form>
复制代码 1 p& e' r# k) i* ^ ?/ a6 z
我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:
8 X% {- V) T0 v A jgetParameterValues方法% x2 b, ` A2 A6 ?/ D* |$ r4 E/ V
---------------------- J) n4 o' {$ _3 ^( w& Y; ?
参数名称:username$ i" ?5 V) _1 }0 ]( w* p
aaa,6 c, J" N3 [. n: j4 ^, S: H
bbb,
# t1 O& _+ j6 E) H) X
7 P8 l8 Z+ `9 `' s: m
& }9 F" V1 h' [, O0 R* X/ ^- W3 d/ e3 _
8 i6 P9 F8 F+ X( i
getParameterMap方法
6 y5 y% m% v, }! ?4 O8 ?8 T------------------1 f( `) f p; i
参数名:username
P: i% j2 j/ @+ w- naaa,bbb,
$ W [' l- K5 Q+ q/ M5 P参数名:password
/ R) M+ o! [6 s5 K2 T. L/ N B123,6 ~/ h9 i" L6 Q/ h; m- U
4 ~- P/ a# s$ P8 M! V! u( {+ n- _6 f% P C
7 l% E! c( F# H, ~! }; K
# _/ t. d' Q, y, f8 g; r; fgetParameterNames()方法# Z7 e) a3 t2 `3 x
----------------------: L/ ^/ r$ n' |; f
参数名:username
' @9 _: c/ e, y% A' r% X参数值:aaa7 W' w: r2 p. r; L
参数名:password7 L# V. C9 i5 w4 W/ e7 Y
参数值:123
" h7 _1 I! v7 k# b" y6 j
2 N% {. {. ^ e* z
" E. A2 p8 H N下面我们再来看一下request的乱码问题:
" G3 B3 z; K8 Q( {. J$ t$ [; K我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"
1 v( O3 m* u! d t8 Y6 @: y在控制台中打印获取到的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)数据
& [# j: b3 n; }/ X6 A( [! w- request.setCharacterEncoding("utf-8");6 O: h8 L+ t- E+ J4 o1 H
- String name = request.getParameter("username");
$ v( W; U7 V6 @0 p; B5 P$ V - System.out.println("username:"+name);
复制代码 2 s j, W4 R/ j! r
这时候就可以了,就能够正常显示了。9 t) N9 ?" q/ Z/ d" S& u% { q+ C
但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,/ u/ D1 H8 i! N8 z& N, K1 H; |
昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的GET方式提交。 , U0 E& D9 V. [5 Z/ P4 A
那为什么GET方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?
# A7 j: L" H9 R7 X7 M做了一些测试之后总结出了一点规律: . t/ \) @& G N9 R& s
1、web浏览器对页面上通过GET方式提交的数据会进行URL编码,采用的编码方式通常由html页面上
, B4 b; T; ?" w. I0 c<meta http-equiv="content-type" content="text/html; charset=UTF-8">
4 a5 l. D; w& E O% C' [+ A$ o5 U0 X9 c这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。
- J: F) F2 v B所以,当请求的URL如下时: ) F1 W+ m6 s0 y" f3 a
http://localhost:8080/test/TestServlet?name=中国
7 Z) T1 U% T9 a. ^# i0 k其实真实内容是这样: - k; D3 \; h% N
http://localhost:8080/test/TestServlet?name=%E4%B8%AD%E5%9B%BD ; G8 v! k; p' R4 D% |
其中%E4%B8%AD%E5%9B%BD是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。 . ]5 }- A' s7 K
2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码%E4%B8%AD%E5%9B%BD这个字符串。那么如何解码这个字符串?
' s5 e8 Q* g: g8 R! H9 y 3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:- URLDecoder.decode("%E4%B8%AD%E5%9B%BD","UTF-8");
复制代码
. R1 ?2 Y4 g9 d8 }
! L/ e; ? G* l7 U& {7 i9 A返回解码之后的字符串,第二个参数是指采用何种字符集解码"%E4%B8%AD%E5%9B%BD"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!
" u! ^; g6 P `4、前面已经说过了:web服务器会自行解码%E4%B8%AD%E5%9B%BD这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4%B8%AD%E5%9B%BD这个字符串的时候采用的字符集不对。 / |' _( \$ X& L, M: l
5、经过测试发现,web服务器(只测试了tomcat6)对GET方式的数据提交采用的解码字符集是"ISO-8859-1",所以web服务器其实是这样解码的: ' M: ~& f7 {8 m% V7 w
URLDecoder.decode("%E4%B8%AD%E5%9B%BD","ISO-8859-1"); 2 p5 a" ]( ^/ m: E; X! Y, D
因此:明显服务器的解码方式是不对的,因为编码采用的是UTF-8,而解码却用的ISO-8859-1。 / I% G( @8 ?. U$ g
6、所以,request.getParameter("name")返回的是用ISO-8859-1解码的字符串,那么必然是乱码了!
$ F: Z7 K. ?+ z6 I# w# I. T% q1 H8 D/ s" M
那么如何获得正确编码的字符串?可以采用以下的方式: 3 c5 |6 E* p1 |
- String a = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
复制代码 . i; A$ J& F$ Z2 j
% I) H8 U+ H6 W# q* o9 G
总结:因为GET方式提交数据会被浏览器进行URL编码,而tomcat服务器会采用了错误的解码方式进行解码,所以得的是乱码。而POST方式提交的数据不会被浏览器进行URL编码,所以服务器直接按照request.setCharacterEncoding("UTF-8") & s$ k3 t; E7 R& h, W
所指定的编码方式解析字符串,因此在POST方式下request.setCharacterEncoding("UTF-8")是好用的!
' L! C& o& j: |2 Y这里的解决方式有两种,
& Q5 |, j3 I4 m' W# C& Z7 _8 U6 R: h( J4 _& V
一种:是通过String类的getBytes方法进行编码转换,具体java代码是:! @! I I% O, y# Q- A8 L3 Q. U
- new String(request.getParameter(“name”).getBytes(“iso-8859-1”),“客户端编码方式”)
复制代码 ) G" V8 A+ F9 o( Y. v
$ }4 w @& D. d' {# w! s; u) \
这里的客户端编码方式就是页面的编码,比如demo.jsp中使用的是utf-8
/ n* H G1 Y3 z$ Q$ @
8 X) j- S6 a0 g& U z- e
6 g3 k4 h2 j- _% t5 [
$ J4 z1 _+ r: ~" g! j第二种:在服务器server.xml代码中改配置信息:- <Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"( M5 b+ Z. P. R6 Q. o6 a" j' Y# N
- <span style="white-space:pre"> </span> redirectPort="8443"URIEncoding="客户端编码"/>
复制代码
; C) _# x9 _5 U7 ~这样我们就修改了Tomcat中的编码和解码字符集了。当tomcat获取客户机使用get方式带来的数据使用URL解码的字符集7 y0 ]3 n$ R% Z1 I. {
当然我们之后修改server.xml之后需要重启服务器的,所以第二种方式是不赞同使用的。% Q( P2 l8 Z) Q1 S! d0 U' n
上面我们就讲述了如何解决request的乱码问题- ^7 i- `3 o! [! T- S
3 I0 t5 i" N, c& D Q
e8 [; d3 a1 t0 u: e下面我们再来看一下请求转发的问题:
7 `( V3 c, d! Z对于重定向和转发我们这里就不做太多的介绍了,之前不知道说了好多遍了,我们之前说过ServeltContext也是可以得到一个转发对象RequestDispatch的,其实Request也是可以得到一个RequestDispatch对象的,我们还是来做个例子,通过一个servlet转发到另一个servlet:4 Z+ D6 [# ^$ z+ s$ }- d% N
' x w' a: N- Y5 |
9 P/ P; E6 c3 |6 u
" _0 ]' M/ _# j- |2 YServlet1代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {7 q1 ~+ B' q0 @8 F7 G: q9 G9 U
- //在request域中存入一个属性值,然后转发到Servlet2中进行读取 y8 U+ `' a: Z- y
- request.setAttribute("data", "Hello Servlet2");
3 e! i( ?* W6 z1 E - request.getRequestDispatcher("/Servlet2").forward(request, response);
; Q6 `! C- W2 T. k - }
复制代码
w/ w3 F# s/ L" w% |我们在request域中存入data属性,然后在Servlet2中读取出来进行显示:
0 U' g' g$ G8 Z' X+ J( o' ?" n. Q1 @% b: R& A
Servlet2代码:- public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
1 S8 B, ~) E; t - //获取属性值
" F- j" `5 c( c' ~) x o) }) |$ Y4 g - String data = (String) request.getAttribute("data");% a& e0 y) D8 D* e7 Y
- //打印; i' }4 U. `& k7 A
- response.getWriter().write(data);
% o& C8 v1 [, c$ w( w8 m - }
复制代码 B/ M# t" c Q- v+ e
5 l( }( ?0 w- J m( G
我们取出来了属性data的值,显示成功了,但是我们记得在之前说的ServletContext域中存入了data属性值,那个也是可以读取的,但是那时候我们说过那种方式是不可靠的,因为ServletContext是全局的,整个web应用都是有效的,所以可能发生数据错乱的情况,比如现在一个人去请求servlet1,就在要进行转发到servlet2的时候,这时候又来一个人去请求servlet1,这时候他也去设置data属性值,因为ServletContext是全局的,所以第一个人在servlet2中读取的可能是第一个人在servlet1中存入的属性值,那样数据就乱了,所以我们只能使用request域了,而且转发都是在一个request域中的,当多个用户来访问servlet1的时候,是有多个request域的,所以互相是不会干扰的,这样数据也是不会乱的,所以说在使用转发技术的时候使用request域存数据是可靠的,而不是用ServletContext域。
# [0 K2 O) |6 Z7 o# I* w7 o8 c- Y5 f6 b
1 |; H- j/ _, P下面在来看一下使用转发技术的时候我们需要注意的问题:' Q# H5 m# G5 `$ [6 h
" C/ F9 m2 ^' p7 R当我们在使用转发的时候不能将response流关闭了,不然会报错的,即在request.getRequestDispatcher("index.jsp").forward(request,response);这行代码前不能将response.getOutputStream流关闭。 M$ l: [% m3 I# m8 ^( g E4 w
- //关闭流
A5 G6 e5 B( v9 [! r - response.getOutputStream().close();# D+ ~- A% c% D/ S
- //进行转发# _& _- q! T& u2 q
- RequestDispatcher rd = request.getRequestDispatcher("/demo.jsp");//不是使用ServletContext的* o# W9 }5 y0 q6 k4 F# R
- rd.forward(request, response);
复制代码 这个关闭流操作是很明显的,下面我们在看一下一个不明显的,也是最容易犯错的:
T. G( @: D4 z- request.getRequestDispatcher("/demo.jsp").forward(request, response);% w3 D" w$ s5 C
- //转发完之后再去转发) ^ q0 X' a+ m. G: {/ j
- request.getRequestDispatcher("/index.jsp").forward(request, response);
复制代码
5 A" y6 |2 b1 j7 Y, `( y8 Y- M从代码中我们可以看到是在一次转发之后,在通过一次转发,这个报错的原因和上面的是一样的,因为当一个转发之后,response就是想浏览器输出数据了,当输出完数据之后,response就会自动的关闭流,所以会报和上面的错误,这种错误是经常犯的,因为我们有时候会在不同的页面或者servlet中进行转发,这样就可能造成这种错了,所以我们解决这种问题就是:
' S E% w, a" z在每次调用转发代码之后一定要记得添加一句代码:return;
: n0 N, S! N+ I+ [% e& x: _这样后续的代码就不会执行了,所以就不会有这种错误了,同样的前面说到的重定向也是这样的问题,为了我们在重定向之后,后续的代码不在执行,所以必须添加一句代码:return;$ _8 J [* J+ Z `5 J
0 _3 q, p& I- ^& A6 F( D! ^/ P# S+ A
关于转发还有一个问题就是,在使用转发技术的时候,会冲掉response中已写入的数据:实例代码如下:- //在调用转发之前向response中写入的数据,会被冲掉& n1 P) W! X2 k8 i% r8 l. a4 s
- String data = "aaaaaa"; c) k3 c9 q& W2 T1 d0 n
- response.getWriter().write(data);
0 N6 N' S5 V& E( D* I - request.getRequestDispatcher("/demo.jsp").forward(request, response);
复制代码 % Q6 D S3 z( G7 G5 P4 y- N
( ~! A& o8 H" I4 L
这样我们只能看到demo.jsp页面,而看不到"aaaaaa"数据了,因为他被冲掉了。8 G. H' T5 J% _1 m0 s
- v5 a: f/ @; P* D( {4 o
$ X) ]4 r7 k+ z) i6 I& W/ a5 Y最后我们在看一下在web应用中怎么书写各种路径:- A* ^8 [7 W# S1 p7 n; T
规则:. {% q8 {. l) ^& @2 A6 O
写任何地址都是使用斜杠开头:如果是写给服务器用的这个"/"就代表当前web应用,如果是写给浏览器用的:这个"/"是指当前网站& C* G3 m+ O7 A4 L" T! d: L" Y
浏览器用的:客户机需要这个地址去请求服务器
, x% Z# i. S0 h+ ` n& v+ B: `服务器用的:服务器本身用的
0 F9 l' L4 q3 O% L! }- ~. e" F$ r实例:$ R! J$ g' V8 R, p( w% B
- //1:写给服务器用的8 h0 S* q0 {+ L# w# n+ w
- request.getRequestDispatcher("/form1.html").forward(request, response);
+ G. O9 P7 N# U0 W0 k4 }& @& V - 5 Z6 F% H) U) A, U8 S% M( y
- //2:写给浏览器的
/ m' v5 c( M8 J2 V - response.sendRedirect("/ServletDemo/form1.html");4 m. H9 N- e! s4 F9 h
- " |- R3 ~3 w' F: m) i; h6 i1 ~
- //3:写给服务器用的
" U/ C( o/ B! f, O - this.getServletContext().getRealPath("/WEB-INF/form1.html");9 [& T1 T4 N% o8 I; d+ F, Q
-
! e6 C$ B2 q2 y/ `3 I - //4:写给服务器用的
# }6 I+ w6 S' W3 A. G1 i" q9 Z' l& x; b - this.getServletContext().getResourceAsStream("/form1.html");, n2 p+ V& Z. v: ^' W
- 1 J' z# \9 f8 W5 D
- //5:写给浏览器用的+ J4 F1 i* z% I( b. o/ {. W6 O
- /**
+ \ _, M) ~# R. k* |8 N - * <a href="/ServletDemo/form1.html">点点</a># p6 k5 T% w" r1 @* j! H' L5 k- t
- */* ]9 b3 ], s) ?5 W( I) b9 {( Y' F
- 1 I2 a! ^6 Q2 D- t: C2 m
- //6:写给浏览器用的
% y- B. Q; b: f, q. [- W* y - /**$ j2 `2 S8 g% g: F# J6 V( h; x
- * <form action="/ServletDemo/form1.html">7 x* v9 _4 p1 \6 d* o
- * </form>5 K4 A8 B) Q7 |# R! s' }/ M
- */
复制代码
- e7 q/ p) D& O& X* Q9 O/ I4 A/ u) n4 K
# y8 x ^& n6 n: Q$ I
# L! M! M# K. X
6 c+ H2 y0 i) j
; ^& r l' k" _" k% f. a
|
|