该用户从未签到
|
java server page(java服务器端页面技术)。
( Q6 h8 j9 C6 y& J 是sun公司制订的一种服务器端动态页面生成技术的/ r7 \' y, M) i) l
规范。
4 ^. D+ D8 A" M+ j, b& G4 B 因为直接使用servlet生成页面,如果页面比较复杂,! t& |& U+ E' M8 i7 g0 {# k5 @
则代码过于繁琐,并且难以维护。所以,对于比较复杂3 ^" f1 `3 n. j7 K( f! P
的页面,使用jsp来编写,更容易编写和维护。
) E X0 L' W, _5 w4 J; _ k 2)如何写一个jsp文件。$ N) ?( ~9 V% J4 n x. J1 u
写一个以.jsp为后缀的文件,然后,在该文件当中,) H+ Q/ V2 G8 c9 M' Z# o L0 {. A
添加html和java代码。编写完成之后,不需要编译,当
+ s, g* D9 k F客户端请求访问某个.jsp文件,则服务器会自动将
9 d; f1 }0 `/ G+ S9 K.jsp文件转换成一个.java文件(该.java文件其实是一个
* o3 k& P! U: y: c& B6 Pservlet)。3 w0 p2 O$ F" m7 _ K5 o* M
3)jsp文件的组成
/ x: ~4 C/ L1 P a,html(包括css,javascript):
4 ?, T$ y: L3 b' L 直接写在.jsp文件里即可。
. C/ ~- a# G) A0 V, @- T6 L b,java代码:
$ Z! ^ k8 T# o% N+ Z$ b8 ` 第一种形式 java代码片断6 A2 O" x% y* M8 v. _6 x
语法:( \ T2 m9 b, V$ }( p
<% java代码 %>9 d7 i: Y7 j$ }( t7 X* C$ b1 G
第二种形式 jsp表达式
4 Y+ x. F2 }! a 语法: c2 s5 W. m; J3 Y. p# s
<%= java表达式%>- ]; @% {$ A: Y Q5 K! q
c,指令:
' R7 X' M a2 r) u. }& F* ]5 m 所谓指令,就是告诉jsp引擎(容器当中,负责
& _6 e, F g$ F# p0 r/ Q' e9 o 将.jsp文件转换成.java文件,并在运行时,
( W& N5 u% B8 e# F5 X 为jsp提供一些 辅助支持的模块),在将.jsp
# c3 Y) C' K2 M1 Z9 V: |, h 文件转换成.java文件时,做一些额外的处理。
7 f, a, W3 h& ?# [ 语法:2 b- k; Q6 R+ X- s& E" L/ _
<%@ 指令名 属性名=属性值%>1 d! G7 K. {+ s
page指令& f3 L. F( N2 C, o) E
import属性:用于导包。" T% i% g; G4 u* `' y
比如 c1 O, ~4 z, y9 m
<%@page import="java.util.*,java.text.*"%>
9 u8 A, B! g: e contentType属性:等价于
. P M4 D% |6 l" }# ]0 _$ Z response.setContentType();
- M; u1 G4 v% W" j2 H! k3 F pageEncoding属性:告诉jsp引擎,.jsp文件
C) J/ j9 n4 O" b: {8 I! D% V. w# @ 保存时的编码。
3 F+ d' w; o2 a+ e1 u! o include指令
y5 W! ]! }3 r file属性
2 c1 J/ x2 Z6 [. H% H. y 告诉jsp引擎,在将.jsp文件转换成
" R: a& n, l( c6 a9 ~" }! Q' Z .java文件时,在指令所在的位置,插入9 q" W0 E3 } v' n
file属性所指定的文件中的内容。% S- Z$ n& d5 |) R* U% y
d,隐含对象% a! ^) W* X% Y: _7 A; \& w
所谓隐含对象,指的是在.jsp文件当中,不用
) B/ s! J" x6 Y0 V& l+ N9 M 声明和创建该对象,就可以直接使用的对象。原' S9 y" K) v. ?1 G* x
因是,.jsp文件对应的.java文件当中,已经自动5 R% `9 M8 ~# _
生成了该对象的代码。
0 L( F; V9 S$ Z9 H, o0 u out
% p2 f @+ x4 F$ I( ^ request2 h; b! b% \4 ^' |
response. `; u5 E" @8 a0 R$ S2 z6 s! T; X4 N
4).jsp文件如何转换成.java文件0 W# ~4 o m* H$ N% q
a,html ----> 放到service()方法里,使用% t. ^1 a& `# v0 l
out.write()输出。6 b* ]' H- C( P: `
b,java代码片断 -> 放到service()方法里,照搬。
+ C4 ^4 l& Z& y( t% K7 Z3 o$ ?$ D0 ? c,jsp表达式 ----> 放到service()方法里,使用9 z( o! o+ z: V- a6 T! h" |8 [
out.print()输出。
4 Y2 U2 L# B. X% s$ i
^8 a; u/ y5 U3 F( y& m0 y $ }5 Q/ b0 v/ W2 t
1、转发
, x: S: H& s; R2 r5 Q3 E( o 1)什么是转发?
8 t) z& Z a) W8 R 一个web组件(jsp/servlet)将未完成的处理
3 ]* v2 a& L1 \5 f! O% r 转交给另一个web组件继续处理。转发的各个组% u. S* D1 q4 }, C
件会共享request和response对象。- T1 }, ]& C# I$ n
2)如何转发?
5 X* ~* C6 V$ S; e step1 先绑订数据8 Y) C h! c) [1 f1 L7 {/ [+ \
request.setAttribute(String name,
5 z% n+ @ z! M) j2 ]$ S! c4 f Object obj);
* `5 \( {: I7 l9 f5 Q0 S 跟绑订相关的另外两个方法 X+ R+ y+ v+ W7 K; s, Q
//如果name对应的值不存在,返回null。& L j- H% P. T+ n) M
Object request.getAttribute(String name);: z; ]2 n9 J' v3 q4 `: }9 h
request.removeAttribute(String name);
: ^/ i& L* |6 T- `# H/ _ step2 获得转发器,转发。6 x; W, M5 ^0 m% ~
RequestDispatcher rd =
, j) z7 A/ x+ j# g1 D request.getRequestDispatcher(String uri);
$ ]6 x" i. V! j$ d! ] rd.forward(request,response);, C, m# \3 V* r) H$ Y9 m# J
3)编程中要注意的问题
" y# L2 j( U, f+ r7 Q" \1 D5 _9 C: z. v 转发之前,不能够执行out.close或者out.flush。
% k. o3 i0 }9 t 转发之前,会将response中缓存的数据先清空。
2 n$ ^) m5 q: j0 _( Y 4)转发的特点% ]/ X3 Q) A- k0 v* o/ E
a,转发的目的地只能是同一个应用内部的某个组件。, B! M/ n/ l* D0 z; H
b,转发之后,浏览器地址栏的地址没有变化。
6 X6 x- |+ F, r s c,转发所涉及的各个组件可以共享同一个request,2 ~# ]# u8 }9 p$ f
response对象。
0 R& @* D6 v! E0 \; R7 ~* z 思考:
& Q" o: D: |' u, n) D x 转发与重定向的区别。& F4 s# O3 b$ O* Q6 N
2、表单中文问题
) K; X& L7 h7 a+ @ S step1 jsp文件,要添加9 [! Z, R, ^, E7 y9 @
<%@page pageEncoding="utf-8"
, d' G ~) ~5 r: Z6 G9 Y1 M contentType="text/html;charset=utf-8"%>' L+ M9 }# n, G6 U1 C
表单设置method="post"。0 u- T+ ?* [6 d7 [
step2 在servlet类当中,添加
j7 ]5 T. V& ]+ W5 C+ v request.setCharacterEncoding("utf-8");
9 y9 [* O6 C) R9 |' {( ^& |+ [
r8 f0 n9 D3 B. N2 _ step3 如果要访问数据库:- D; X: d' K, ?! T* Q. ?; l5 U
a,保证数据库能够正常地保存中文。7 H6 o( V0 {& \# {
对于mysql$ a. ^3 h+ ^$ M( C+ j- o" n! Y% _
create database dbname
6 Y6 G7 P3 Z8 S5 f3 P default character set utf8;
: R- A, s% G5 r: ]* `8 T b,使用jdbc访问数据库时,必须要保证4 Z! |4 _' B0 c- O& i
jdbc驱动程序能够识别数据库中保存
# G' ?3 o7 |! J6 J1 t. u 数据的编码。
+ Y9 | Q) |* O. x jdbc:mysql://localhost:3306/jd1109db2?1 c: g9 X! v9 T: K# y8 n
useUnicode=true&characterEncoding=utf8& U' r. }0 p1 {" U0 Q9 C
8 a; I7 F! a$ S; ~5 O% i3、路径问题
7 I0 z) o. j4 c$ }8 a 链接地址、表单提交、重定向、转发的路径应该
% ~9 v! f$ ?' P7 \, C如何写?& t g/ l( N, X8 M: U
<a href=""></a>4 j9 d( f% a2 @/ t) v* U+ Q5 h) `
<form action="">. y, P; z( N# O
response.sendRedirect("");
+ K6 r% \* y/ w7 s4 O8 j1 S getRequestDispatcher("");
1 ]3 I& Q8 m8 k% f7 M2 o a,相对路径与绝对路径
/ H4 U7 v. J4 }9 X 相对路径:不以"/"开头的路径,比如:
0 r& t4 i4 y8 w& U <a href="del.do"></a># c1 v9 d/ W$ g; \
绝对路径: 以"/"开头的路径,比如:
7 b, x4 C" @9 F# I <a href="/appname/del.do"></a>
+ B6 g; H0 n4 S& g b,怎样写绝对路径?9 c( w# B% _- O9 p
链接、表单提交、重定向,绝对路径要从$ h+ @& n! V8 n* J! b
应用名开始写。* Z/ O* V/ G1 }5 \: k! j
转发要从应用名之后开始写。
4 m6 b% W6 S6 m8 F& v, y! k9 j; n( r //返回应用名,比如返回"/web05";
" _+ w, w/ Z5 M) `% Y1 m String request.getContextPath();
$ L9 [2 w$ N3 O" {/ @
! q9 R3 p4 {: t5 s7 W! E& X2 ] |
|