该用户从未签到
|
java server page(java服务器端页面技术)。6 G9 i. j/ d& v- \* s& J) n2 Z8 T
是sun公司制订的一种服务器端动态页面生成技术的
# n) L' c2 n3 M) _3 O: R# h: P, o规范。* P, [, f8 r; L& y, ?) H$ M! G1 y
因为直接使用servlet生成页面,如果页面比较复杂,
9 v8 S c. k" m3 Y, ~5 Z则代码过于繁琐,并且难以维护。所以,对于比较复杂
5 |) ^" c) |: ~4 t7 k的页面,使用jsp来编写,更容易编写和维护。9 Z) B! p0 q7 V* g. j: Y, S
2)如何写一个jsp文件。 f' I. I, ^9 j; s2 ?
写一个以.jsp为后缀的文件,然后,在该文件当中,1 ^. b" }3 t# C5 u( a
添加html和java代码。编写完成之后,不需要编译,当
7 T2 X1 q$ R: ?( v8 o客户端请求访问某个.jsp文件,则服务器会自动将
. L: ?0 ?" n2 P& |: ?.jsp文件转换成一个.java文件(该.java文件其实是一个7 d \* _" L- {- w5 c
servlet)。
1 i! a3 S+ u( B. {! ` 3)jsp文件的组成+ H+ X, S5 x) y* @
a,html(包括css,javascript):8 h" a) g; E" n. m9 L
直接写在.jsp文件里即可。8 H% t+ y) H* `( N( s
b,java代码:
0 W0 c3 a5 Z t B 第一种形式 java代码片断
i- F% o- t3 M! z" b/ a* z 语法:
9 ?; C- M% ]/ }5 q <% java代码 %>" T# Q' E/ z8 Q. Z
第二种形式 jsp表达式! n# w, u; B- o3 n9 y. J
语法:
Z# \' O! k# R/ ^! ` <%= java表达式%>
# H0 s1 A9 z0 J+ o3 e! z c,指令:
C9 A1 Q3 v6 a. Z% a. G 所谓指令,就是告诉jsp引擎(容器当中,负责
' h+ T$ l- }& Q* {5 k8 M# c, J 将.jsp文件转换成.java文件,并在运行时," j! `- [2 c% z8 F5 c" b
为jsp提供一些 辅助支持的模块),在将.jsp
& K5 T" b7 N8 ?9 q- C" Q 文件转换成.java文件时,做一些额外的处理。
: V6 K) s9 K& h- o& P( s+ b8 b 语法: v/ f' B; H; u& M, F8 S ~6 o
<%@ 指令名 属性名=属性值%>
( n) v, q/ X% B& v' J7 S2 E1 b page指令$ b3 f( l7 j6 \1 a& }$ o$ m
import属性:用于导包。
; _& G% Z* A0 `* O* M3 P9 c4 T 比如/ ]( N, P- [ s/ V. z
<%@page import="java.util.*,java.text.*"%>' [# C2 {# F+ S a6 C
contentType属性:等价于% R" b9 s" W. h
response.setContentType();: R0 I* P" ]" f+ ?
pageEncoding属性:告诉jsp引擎,.jsp文件8 c3 j6 O- {! E9 a ~! o2 m
保存时的编码。# k8 L% R/ J8 S4 z9 v, i0 \& z
include指令
6 M3 f( ^& F8 o# Z4 y4 T* t file属性: E. I0 }7 o" V# h0 T. u
告诉jsp引擎,在将.jsp文件转换成
! O" `" o. D- d% m8 h% |( Q .java文件时,在指令所在的位置,插入
& S$ ?1 ~- c! w7 M0 V0 Z file属性所指定的文件中的内容。, @7 ~) G3 o1 g3 }1 r( d
d,隐含对象( U& h1 p/ T( A" H6 `. U2 f0 E7 B$ E
所谓隐含对象,指的是在.jsp文件当中,不用
& E8 S/ G' }* ?# F; a 声明和创建该对象,就可以直接使用的对象。原3 W4 ~( p- A% |6 k9 v7 Q# ?
因是,.jsp文件对应的.java文件当中,已经自动- G Z2 b4 J, w# P5 J& i' |6 R. _
生成了该对象的代码。
8 j- `" ^$ A, z+ t) E7 T out
8 l0 T/ {# V! i% M' u1 Y request( D/ f! P9 i1 T' W2 [# l7 Z
response" O( j7 A- v" O
4).jsp文件如何转换成.java文件8 v8 |; N, y+ e: ^5 ?& p7 J
a,html ----> 放到service()方法里,使用: n/ a* ^, U9 ?( l2 M2 x- r& A9 x5 T
out.write()输出。" V2 N9 D, F! _' k/ x5 g0 W. i% F4 J
b,java代码片断 -> 放到service()方法里,照搬。
# o( U4 O h1 t4 d0 `3 W c,jsp表达式 ----> 放到service()方法里,使用$ P! K1 f& ~0 \1 w* ~* a; Z
out.print()输出。
( u' r' r1 C: `% ~% f( U - z; e s! @7 w+ H/ `8 |
9 D" b! \2 u# G# j+ k
1、转发+ a' h1 H) V: O/ E& \7 \3 F& C
1)什么是转发?" c9 I& A+ n/ w+ {+ E9 E
一个web组件(jsp/servlet)将未完成的处理 ^2 b$ U1 A, x1 G F, [* D
转交给另一个web组件继续处理。转发的各个组" P. D) p; a. `7 ]% ^: E
件会共享request和response对象。0 P& u0 X1 `8 m, S- n
2)如何转发?
$ B! p8 @# w$ F0 ]* N step1 先绑订数据
* R' W( d1 y2 W request.setAttribute(String name, O7 ]. G, \8 V) C$ L' i7 u
Object obj);
1 N5 D' ~( T& D2 G$ G 跟绑订相关的另外两个方法; B0 q8 B3 A" _1 i7 m {1 V* z
//如果name对应的值不存在,返回null。9 f& \. U, p! I4 P! j
Object request.getAttribute(String name);
3 V- d1 g" k/ L' i# w; ?' r; u request.removeAttribute(String name);) u, g& K8 V8 w/ T7 m. b. p
step2 获得转发器,转发。
" {: A) X) i0 ] RequestDispatcher rd = ' c! H9 {. I. X
request.getRequestDispatcher(String uri);
0 V6 C$ @9 L9 c7 K5 E. U rd.forward(request,response);4 n7 y' A/ C. m, G4 h$ g0 G( t
3)编程中要注意的问题
9 ?' \1 g5 S& K0 P, ~2 h, ? 转发之前,不能够执行out.close或者out.flush。
5 ^: C" \9 f, {( N5 p4 } 转发之前,会将response中缓存的数据先清空。 . U$ ^: h& u- l# I* C
4)转发的特点
/ g+ Q5 j7 u; [2 Q" ]/ w6 Z a,转发的目的地只能是同一个应用内部的某个组件。
6 v( E2 N% v8 _4 c7 Q( p S b,转发之后,浏览器地址栏的地址没有变化。
( t `. E% ?3 z6 \1 V: Q c,转发所涉及的各个组件可以共享同一个request,% H1 s# [# M5 \8 A$ [0 N
response对象。3 u# ?# c0 t" }
思考:
: p6 g8 O8 f7 T1 j. {0 K5 R 转发与重定向的区别。7 s- G9 h, `% G, j) Y. \" Y4 o: X, \* T
2、表单中文问题
5 @# n9 O' v0 |) ^ step1 jsp文件,要添加
k3 R8 a. U% Y* b4 O' E <%@page pageEncoding="utf-8" , D; b6 a3 A3 F
contentType="text/html;charset=utf-8"%>' _0 b: h- C3 i, K/ N$ s
表单设置method="post"。 E2 T" k: G" Y: f) J' G5 [
step2 在servlet类当中,添加
4 l: \* u% r" a4 s. f$ a) X) H% b request.setCharacterEncoding("utf-8");
0 P8 O. z) F+ s % o6 n# r, n) J* |; U0 X" j
step3 如果要访问数据库:% a$ q& |8 u3 j8 M/ P+ v: R
a,保证数据库能够正常地保存中文。
# A2 ]) T* [6 C- z$ |: Z 对于mysql
) I7 a$ k8 S2 S create database dbname 4 E: \+ X$ b V- s& N4 h8 V5 H U+ T1 \
default character set utf8;
! W9 ~; o" C" ^9 j( _2 K b,使用jdbc访问数据库时,必须要保证) V) l( |* R. x- M
jdbc驱动程序能够识别数据库中保存
1 W f7 m0 t- [+ J/ g2 [1 [ 数据的编码。7 ^4 Z) h1 W$ k/ q9 b" Q+ l* b
jdbc:mysql://localhost:3306/jd1109db2?
/ g" M3 |4 @6 D* e% Q useUnicode=true&characterEncoding=utf8; p% z, @2 O# U+ |- ? n
9 D- U5 q0 R" E) U0 \
3、路径问题
4 L7 P2 m! y8 C9 k 链接地址、表单提交、重定向、转发的路径应该
1 Z: b7 N- v; Y& D' _' T如何写?2 M( d7 {& @8 `7 x+ \
<a href=""></a>
) K$ t* f7 A1 f) O6 A <form action="">. `7 t# f2 D) Y l
response.sendRedirect("");$ l: N& C5 R o7 x! B$ b
getRequestDispatcher("");) L/ l8 W t% X5 j& b. Y
a,相对路径与绝对路径7 M8 {0 f! @# P9 }, b: q4 b7 T! l% h
相对路径:不以"/"开头的路径,比如:
( r8 ]# J$ m5 C" |# _# c7 e <a href="del.do"></a>. l# b7 Y* }. u( Y' {' H: Q8 e
绝对路径: 以"/"开头的路径,比如:9 R* w) T; o4 I
<a href="/appname/del.do"></a>* \+ L9 b) a9 K. T( v
b,怎样写绝对路径?
7 |2 K2 X9 C* L6 C1 l" i 链接、表单提交、重定向,绝对路径要从
+ K6 T( ]- O3 a$ J, z# P 应用名开始写。
1 g# d2 Q' Y4 b; C$ S: E 转发要从应用名之后开始写。1 c( h1 P2 X5 j6 \
//返回应用名,比如返回"/web05";; T2 @9 v0 G6 ~. T- U) a0 d) F6 t
String request.getContextPath();3 C2 f- t! s1 V
' N! g+ l9 j3 `; b |
|