该用户从未签到
|
java server page(java服务器端页面技术)。
/ }0 w7 {( [5 E" ?& G u( _ 是sun公司制订的一种服务器端动态页面生成技术的, Q; M& m9 b7 h8 C- d: }% |' O0 S
规范。
+ Y- w1 o8 I! v7 A2 d+ t3 |( h9 l. b 因为直接使用servlet生成页面,如果页面比较复杂,) D. K7 u- n$ z2 y0 c9 J# D
则代码过于繁琐,并且难以维护。所以,对于比较复杂; K {: o/ e& F9 a5 O
的页面,使用jsp来编写,更容易编写和维护。
" J. | Q9 L- P 2)如何写一个jsp文件。
+ Z0 Y( L8 e7 C8 b8 n% B5 L 写一个以.jsp为后缀的文件,然后,在该文件当中,0 @- [& i% O6 w6 T1 C6 M+ b
添加html和java代码。编写完成之后,不需要编译,当
6 `" W1 [- F' _* i3 O( H客户端请求访问某个.jsp文件,则服务器会自动将, A. ^4 i' Q9 e: ~- j
.jsp文件转换成一个.java文件(该.java文件其实是一个, C! D. u: P0 f* ?
servlet)。7 V" I' |2 D7 K& X' D1 c. T
3)jsp文件的组成
7 }& J' ]# V) [! k$ z) W a,html(包括css,javascript):
e7 \( X! L8 h+ D8 D5 Y5 U 直接写在.jsp文件里即可。
6 W6 N; ^# T) H- B- I& m9 j' K0 l b,java代码:
" z1 D, [* s1 z) i# a 第一种形式 java代码片断
! G" ^/ [0 q% H7 c 语法:
0 V; {/ J! r O" Y0 C# | <% java代码 %>
% k6 ^ r7 f W 第二种形式 jsp表达式
/ y) x! D* d! p- Y0 q2 M 语法:
: l/ V$ I3 h1 t X* U. x. J <%= java表达式%>
/ o$ h8 ?! U1 |4 q P& ? c,指令:
& S5 Y! g z3 v! j9 q( W$ u 所谓指令,就是告诉jsp引擎(容器当中,负责
. ?) A; O7 C* }# W! t! Y/ N; y8 H4 R 将.jsp文件转换成.java文件,并在运行时,
9 C0 J8 S7 p* E5 f4 }! h1 g" Z 为jsp提供一些 辅助支持的模块),在将.jsp) T- Y% f! Z1 k
文件转换成.java文件时,做一些额外的处理。( h. i/ G; E! U! G& t/ k) a8 M
语法:
1 f, \5 ]. D, U# [ <%@ 指令名 属性名=属性值%>) ^; w! X7 C) q2 `7 [
page指令1 ]0 n# M+ ~$ k( g6 ?& B
import属性:用于导包。
5 Z9 `- u4 m/ V; A5 y( ] 比如
/ c: Y% j/ F0 O: {3 D, S8 G <%@page import="java.util.*,java.text.*"%>
\ |* W" D- Y0 z. x contentType属性:等价于! v- z. c: r2 [+ y# h/ I
response.setContentType();9 a/ B5 ~9 b3 k2 G- R/ Z
pageEncoding属性:告诉jsp引擎,.jsp文件* {, Y3 S* J7 f$ i
保存时的编码。0 \) d- G3 w, G& u% l" g
include指令
`7 }2 y r3 o4 J6 q file属性
) c: [6 Z9 Y }% O" N 告诉jsp引擎,在将.jsp文件转换成
* u% u3 S8 ^8 S W .java文件时,在指令所在的位置,插入
# R3 n1 B+ N1 x- a8 _" C file属性所指定的文件中的内容。+ B# X5 t# w7 e+ g" f! w
d,隐含对象& u! [7 ]/ Z9 v
所谓隐含对象,指的是在.jsp文件当中,不用: {9 n# U7 I! S- N5 D
声明和创建该对象,就可以直接使用的对象。原
, K+ z9 A1 e! Y 因是,.jsp文件对应的.java文件当中,已经自动
3 W8 Q7 S# z: O; P! ]; \- b, w" L2 Z 生成了该对象的代码。1 B. K8 ^+ g2 C3 D# x
out " c' i* L( y* h/ U- q
request; k* p+ {# |1 w; S) l: O- d
response
2 J6 M5 ^4 x) c A a3 n 4).jsp文件如何转换成.java文件4 G3 Z% a! s( C2 ~
a,html ----> 放到service()方法里,使用" j3 E. b0 [, F) I9 R
out.write()输出。' n4 u& g4 c" x, Z
b,java代码片断 -> 放到service()方法里,照搬。8 n H' R. V9 j- N8 A
c,jsp表达式 ----> 放到service()方法里,使用! t( f3 ^. R, n
out.print()输出。- }0 d) C+ b$ d7 |( V
( S7 u- K7 Z0 v( o2 e+ b# R5 ?
" v* \4 h3 _3 @1、转发: \7 U+ s3 e( \" L! \7 x
1)什么是转发?4 B+ d# J; @! e5 T' k! ^6 }: D
一个web组件(jsp/servlet)将未完成的处理. ?1 C' X, u, {5 B# z: R
转交给另一个web组件继续处理。转发的各个组
; K; [6 c/ S K9 f% p- e% q 件会共享request和response对象。9 g. { _+ O6 f( }6 h, ~ a
2)如何转发?
) J- g0 m! c: v; R" e, B$ i step1 先绑订数据2 x! P. z! U) \9 w
request.setAttribute(String name,- @+ w( `: r% U3 ?' X
Object obj);- t- I3 p9 P$ q. U" [1 \. _' K
跟绑订相关的另外两个方法
0 t, l a; o7 v. y //如果name对应的值不存在,返回null。, Q9 n/ M% N: H. d
Object request.getAttribute(String name);: i( M& a- V" |
request.removeAttribute(String name);
* F/ O4 B3 E( h' w4 V$ b& Y step2 获得转发器,转发。
$ C/ r! W$ M3 Y' T. U1 e RequestDispatcher rd =
( C0 r" C& ^8 _+ h request.getRequestDispatcher(String uri);9 m; X# D5 @2 T7 v8 A$ R
rd.forward(request,response);
1 }+ k( j2 b/ x0 A* d6 J0 `9 Z 3)编程中要注意的问题
! f2 e4 A/ m8 y 转发之前,不能够执行out.close或者out.flush。; ?% `7 c j1 l" K' U& m- Q
转发之前,会将response中缓存的数据先清空。
: h8 z f- g) y; t* F. c 4)转发的特点3 p1 x) K9 {' K1 i, \- g* o
a,转发的目的地只能是同一个应用内部的某个组件。" R3 G0 W1 i- R2 O* @& f/ W% b
b,转发之后,浏览器地址栏的地址没有变化。, r% s. s' e3 e
c,转发所涉及的各个组件可以共享同一个request,7 k2 k% ^' I: ?& l+ R
response对象。
( u& p3 Z9 t; \" I 思考:8 n7 e% W3 J) X, \( ~
转发与重定向的区别。& D+ L6 Q. Z+ ?' C7 x! x- _4 L! I
2、表单中文问题
3 Q- D0 w8 f4 f. x9 K( q step1 jsp文件,要添加- u4 X; f. I) e9 h' p+ Q. g
<%@page pageEncoding="utf-8"
" c6 C& W" Y) _ contentType="text/html;charset=utf-8"%>
3 w5 `3 a) u. Z6 D& H# q! N; }5 [ 表单设置method="post"。
2 y ^5 U8 n- Q; M2 E- b step2 在servlet类当中,添加
! K% H/ I- v4 j& E request.setCharacterEncoding("utf-8");
* P1 O8 Z' ]/ Y - N+ F* R3 N3 ^' e* K7 S
step3 如果要访问数据库:
: J" K9 D5 t: K4 j. G" ~ a,保证数据库能够正常地保存中文。
- z$ \- r5 ]# R$ y5 F 对于mysql
3 [- D* y6 p: p create database dbname
" ?' B$ c) \. u+ q5 m* E P6 H& e default character set utf8;
6 @; k3 k8 c0 M( t. i7 f0 ^$ G b,使用jdbc访问数据库时,必须要保证4 N1 B# F1 J$ E- `/ f9 t
jdbc驱动程序能够识别数据库中保存
$ g7 D. Z( z, P) T5 N# N& ?; K: j. O 数据的编码。9 w) X$ z' R' d( S4 Y
jdbc:mysql://localhost:3306/jd1109db2?8 O( K6 a# ]+ y4 I5 z
useUnicode=true&characterEncoding=utf8
2 ~3 I) W6 y y' r& O
1 ?8 I. o4 X4 s$ o, N8 ?4 c7 v3、路径问题
9 I7 N" O0 `9 L( W* ? 链接地址、表单提交、重定向、转发的路径应该/ {" i# U5 O4 z# U* Q; J% ?
如何写?& m! Z/ C% a5 @3 K' `6 Y% m! ]! {
<a href=""></a>
8 X, p6 j7 Y$ ~ p <form action="">" h* t' Y$ n- c3 f. |
response.sendRedirect("");+ u3 W: Q0 H9 t* F% k
getRequestDispatcher("");. ?# s$ Z+ g: b
a,相对路径与绝对路径* R |1 O: k; {* L# R) a+ Q4 S
相对路径:不以"/"开头的路径,比如:7 B/ X/ {! H! U' S* o/ ~) F9 m
<a href="del.do"></a>: `" e5 z h( O' C
绝对路径: 以"/"开头的路径,比如:0 Z! R0 G0 c' l* x' u/ I1 p; e- M
<a href="/appname/del.do"></a># G5 L; s% P$ q A, r
b,怎样写绝对路径?
# y7 F. }4 i8 a* c/ Q 链接、表单提交、重定向,绝对路径要从
# J+ {4 o' R4 s x7 | 应用名开始写。- `( |- L# p5 o2 x( H* }
转发要从应用名之后开始写。- [' _; d/ s& l) I# N' `1 R9 w+ z
//返回应用名,比如返回"/web05";) q. B1 i! c3 m+ {7 N) E. K6 X
String request.getContextPath();! F1 W) z9 E0 ^
- |8 s, x: R1 \; r5 @
|
|