该用户从未签到
|
java server page(java服务器端页面技术)。
% \, I! n9 E+ O4 u( i8 J' y0 ] 是sun公司制订的一种服务器端动态页面生成技术的
7 e* A4 y& ~+ \: t规范。0 S* W* @& ~8 ^) Z
因为直接使用servlet生成页面,如果页面比较复杂,& P; z4 R) G5 @0 A6 k
则代码过于繁琐,并且难以维护。所以,对于比较复杂
@# m! v1 M0 D" ]+ H( D2 Q的页面,使用jsp来编写,更容易编写和维护。# o5 S1 b/ z4 P4 Q1 Z% N- }( l
2)如何写一个jsp文件。* z6 X. q" ] E% v# N
写一个以.jsp为后缀的文件,然后,在该文件当中,6 O" H; }% y% r
添加html和java代码。编写完成之后,不需要编译,当6 S, G M3 J0 B& P5 L2 ?: P( L3 m
客户端请求访问某个.jsp文件,则服务器会自动将% E) y' Q& G$ l" K( F6 q7 a
.jsp文件转换成一个.java文件(该.java文件其实是一个
& _3 f. h/ r" W" hservlet)。- a% v( g% {) T2 [7 L2 K2 L
3)jsp文件的组成, {3 z* I8 Y4 O( `* u# R7 m3 W
a,html(包括css,javascript):/ y, @" Q+ P4 t( N- |
直接写在.jsp文件里即可。
: V% z1 n t* h' { c b,java代码:
' j) P; c1 _3 d+ M 第一种形式 java代码片断
7 G" D: w3 X& Q 语法:
8 D1 E3 J- D5 Z) U2 b <% java代码 %>. O2 w; m4 |* Q4 m
第二种形式 jsp表达式
% w# t* ?/ z6 a+ _ 语法:
7 X7 k. p$ n* K" Y: Z7 @1 L <%= java表达式%>
6 ], q8 e% B9 \ c,指令:9 t1 d8 R6 z6 x; C: Y
所谓指令,就是告诉jsp引擎(容器当中,负责/ u3 ]4 [; D: F
将.jsp文件转换成.java文件,并在运行时,* @, M1 z6 b* z3 T
为jsp提供一些 辅助支持的模块),在将.jsp2 L7 w% @3 m6 K$ H
文件转换成.java文件时,做一些额外的处理。
- A* \1 W4 s, a* j 语法:
' n; i" O' W8 c2 O <%@ 指令名 属性名=属性值%>5 q& F8 z4 @9 d$ C) d$ \
page指令
2 G) H- q! A( F) S import属性:用于导包。9 E$ w9 d8 V/ }6 [1 A# I
比如; Q2 S9 U/ l* b" n2 {* [; w
<%@page import="java.util.*,java.text.*"%>& N& a- F" z* l8 b2 X1 _
contentType属性:等价于
) v5 @/ i+ h+ V4 a$ z response.setContentType();; |* m+ D- V+ B6 \0 ^
pageEncoding属性:告诉jsp引擎,.jsp文件5 E* t8 I) ?% b. f* [# w5 j" I
保存时的编码。$ J/ y9 Y% `4 b9 e8 ?' K, y( ]
include指令
. j4 Q8 M- d7 z; N file属性
4 y h& m4 ?- a0 `6 j, z 告诉jsp引擎,在将.jsp文件转换成
# Y1 Y* M5 I9 _( L .java文件时,在指令所在的位置,插入" U2 G# ]+ H3 A0 {
file属性所指定的文件中的内容。
( p5 c# c. n5 u d,隐含对象
x* I5 {0 r% t1 O 所谓隐含对象,指的是在.jsp文件当中,不用4 |8 ~& d* a$ y, ?1 I
声明和创建该对象,就可以直接使用的对象。原# d: i% n3 J, {- d6 u. D$ L
因是,.jsp文件对应的.java文件当中,已经自动
1 p4 P3 Y/ j) g' A2 ~7 i7 T2 C 生成了该对象的代码。
' d; Y4 T N: U( S" w( Q/ U9 O out
0 v }: Q5 R% x! W: ?4 {) x, P request
* Z, H: k3 F/ |; k0 ?* p response
" `2 w! E( V8 H/ U 4).jsp文件如何转换成.java文件 W# i# J7 a9 U5 P, e; R9 u
a,html ----> 放到service()方法里,使用, X( K! h# h" {3 z
out.write()输出。6 ?# [: r$ ~3 ^$ Y! l
b,java代码片断 -> 放到service()方法里,照搬。, y4 X6 f; c8 f6 ~" L
c,jsp表达式 ----> 放到service()方法里,使用
3 V7 u# Q7 ~ _. E; m out.print()输出。
2 q# N8 f$ w, x: G N1 o
$ |- @1 ~5 r; @3 B- z2 _& I( l0 j + V+ m2 J) F4 e4 B9 ]
1、转发
% E0 P! P- r) [" [: q7 o8 X1 T 1)什么是转发?& P8 a- W( V" ~' ]& W' p
一个web组件(jsp/servlet)将未完成的处理
4 \0 ~# j, J9 S' e2 l$ f 转交给另一个web组件继续处理。转发的各个组
0 f7 u. F$ v" B1 G& J$ s6 c. Z 件会共享request和response对象。6 M6 W" F! i/ W' m
2)如何转发?' u9 x* ^9 I" D0 V" q$ \4 I+ U3 W
step1 先绑订数据1 w# k9 o5 B1 k4 ~5 P/ D% r
request.setAttribute(String name,
- {- i- R8 T% ?: ?. k Object obj);' D8 m' F Y# X: O, H' w
跟绑订相关的另外两个方法5 ?2 j) j$ P5 @; L' E" L* q6 R
//如果name对应的值不存在,返回null。5 S3 t5 P# ?/ l! s) U' O% R4 U
Object request.getAttribute(String name);
" H' H& h a; ~ request.removeAttribute(String name);
1 d5 Y% }" o: a step2 获得转发器,转发。
6 @* }$ ~2 v! L% a# | RequestDispatcher rd = 3 k; n% ?3 \8 j5 i) G% H
request.getRequestDispatcher(String uri);
) b$ ]7 ` b" g$ t7 n2 q: _( _/ t0 A rd.forward(request,response);' {4 r1 A5 u) N1 u$ C$ s: C
3)编程中要注意的问题( X; f6 |4 K8 U- s" w W8 L- e
转发之前,不能够执行out.close或者out.flush。0 _4 A: M* C' i3 T1 P f
转发之前,会将response中缓存的数据先清空。
: I$ l2 `) h9 J% g 4)转发的特点/ o; R$ X. l2 ~* A* m" } A
a,转发的目的地只能是同一个应用内部的某个组件。
1 o3 l, ~; E5 y( e) r( s, J b,转发之后,浏览器地址栏的地址没有变化。
3 `' G% }9 w! m6 L8 i/ R) N( i c,转发所涉及的各个组件可以共享同一个request,
& L, D, e# p5 \7 ]- A response对象。
+ C( p/ l4 P4 P; @8 f* t: _: W 思考:' A' e% t# s% y" D2 r) l
转发与重定向的区别。
+ I# W8 v; N6 w3 M/ M2、表单中文问题& C) K: D- c6 [8 G6 j9 G
step1 jsp文件,要添加7 X5 j5 _' K2 R. ?* d* s6 P
<%@page pageEncoding="utf-8"
) y& K6 F0 q, o. n+ `, z contentType="text/html;charset=utf-8"%>* q2 V5 N \5 R! w/ F
表单设置method="post"。$ E: Q2 v) E8 n- m0 K' E5 i
step2 在servlet类当中,添加3 Q9 l p( D G$ h
request.setCharacterEncoding("utf-8");
' y) V/ _3 Z* I/ H8 B+ e" O 9 l, y- P' o. z3 G( J/ X
step3 如果要访问数据库:
0 d! z2 n- ^; ?9 j' ?3 k! V( d a,保证数据库能够正常地保存中文。1 U3 b E0 X/ h, ?7 g* ]
对于mysql
, V9 O, d. I- v create database dbname 8 c+ t9 m& v, z I% a1 X
default character set utf8;. p* t4 p4 p5 f3 X8 d0 ?" H; Y# T
b,使用jdbc访问数据库时,必须要保证
; {$ H/ k: ?0 o# R+ n jdbc驱动程序能够识别数据库中保存& f0 m, u z$ H& D' _
数据的编码。+ b$ [4 ^; l7 P3 a$ P# D" T
jdbc:mysql://localhost:3306/jd1109db2?
2 p+ H; Y w! Q5 S useUnicode=true&characterEncoding=utf8
6 b: @1 S1 \$ y6 q z9 ~8 i9 N: h
3、路径问题- L ^0 v9 F) c; G, d1 Q1 y
链接地址、表单提交、重定向、转发的路径应该' F2 L( e- G+ h8 z: b; M, l
如何写?- i- `) f$ M# h/ V/ r& r( m. R4 [
<a href=""></a>
+ v0 T; V8 z0 y5 s, S <form action="">
, ]9 m3 Z: ^! J& D response.sendRedirect("");* m/ b2 r( Z# d
getRequestDispatcher("");# d' \5 P, [" T: ?+ i4 X
a,相对路径与绝对路径: V$ b, |7 l9 L6 R5 J. F
相对路径:不以"/"开头的路径,比如:
' L, |" G" t; j/ [% |- \/ M <a href="del.do"></a>% C) b- A, \ U1 K0 @
绝对路径: 以"/"开头的路径,比如:
2 R9 Z! ^9 \" d' k) C& C8 Y <a href="/appname/del.do"></a>: J9 y+ P' ]+ m& f
b,怎样写绝对路径?
: }+ c% f8 u9 B 链接、表单提交、重定向,绝对路径要从( [8 I$ G: R+ e* R
应用名开始写。3 s) H! `8 d7 f% m1 i
转发要从应用名之后开始写。/ G- y) q9 e$ W" U, O7 ~; B& K
//返回应用名,比如返回"/web05";- K; g: ]" x2 V9 i+ I
String request.getContextPath();
. N6 Q, h# O- j+ C
! [( s% Y. k/ V3 h$ { |
|