该用户从未签到
|
java server page(java服务器端页面技术)。; h' u& G9 t: o5 U% r
是sun公司制订的一种服务器端动态页面生成技术的
6 w5 ?5 Y3 l( y1 j规范。, i M2 ]8 C8 |0 v7 T
因为直接使用servlet生成页面,如果页面比较复杂,
+ b w) d! N$ Z' H, d则代码过于繁琐,并且难以维护。所以,对于比较复杂
- z! n5 ~! B" {) s的页面,使用jsp来编写,更容易编写和维护。6 a& f0 l- j8 M% @
2)如何写一个jsp文件。1 `& q- S- U0 F1 }3 ~ R; z g
写一个以.jsp为后缀的文件,然后,在该文件当中,: w2 [. \8 R1 u, C
添加html和java代码。编写完成之后,不需要编译,当
- o1 e/ u1 _: X' ^* z* e0 y, N客户端请求访问某个.jsp文件,则服务器会自动将/ M0 @" Q& t) e: u
.jsp文件转换成一个.java文件(该.java文件其实是一个
5 H- O2 d/ Q% q+ a8 Jservlet)。
+ j/ U) `7 M8 b m$ t R 3)jsp文件的组成$ ?& K$ m9 w1 }/ q$ V* H% G
a,html(包括css,javascript):( }# P5 O- X* r6 `5 h; _9 j$ p
直接写在.jsp文件里即可。
2 W( z t; ^# S1 _! U b,java代码:7 ?: y+ {( z0 [8 j2 E) n
第一种形式 java代码片断
( w- m/ T. p5 S1 U7 ` 语法:, Q9 u: l" q( l
<% java代码 %>' I8 T4 [$ ]1 [. l9 X' e$ H
第二种形式 jsp表达式: B/ C; r* U% G0 w- k5 V$ U
语法:
9 N1 o2 s) y, L+ i d$ w0 Q4 q+ { <%= java表达式%>, M0 ^5 X5 m$ V, Q, u0 t' [" \
c,指令:: A/ i& A" y2 C4 N
所谓指令,就是告诉jsp引擎(容器当中,负责
0 S+ z3 y; _- s/ n# i: b9 U5 m 将.jsp文件转换成.java文件,并在运行时,
8 L$ ^; [7 _- c 为jsp提供一些 辅助支持的模块),在将.jsp
3 Y1 r5 @1 z1 D 文件转换成.java文件时,做一些额外的处理。! @: L L7 {& F9 F2 _; B3 K3 h
语法:
6 L4 G3 Z9 x/ ~( ]- n <%@ 指令名 属性名=属性值%>* a, m! H) D$ _9 p
page指令
- O1 q" g c5 [* u import属性:用于导包。. G6 W! Z8 d7 `3 R" e$ E z! ^ K
比如
/ o; p( N% r% t+ R- e# u6 g) g <%@page import="java.util.*,java.text.*"%># q K! E% [0 T2 n* p
contentType属性:等价于, b# L3 O5 ^4 l4 K& {; y* G; u
response.setContentType();
4 x+ y+ n5 J" r pageEncoding属性:告诉jsp引擎,.jsp文件) ?: H; h7 `2 m
保存时的编码。
8 e' |! f3 c: @7 X) h1 s include指令
+ Y. x4 W( E9 m2 O2 @! c file属性2 v, ^. ~0 h( N- O- V( T
告诉jsp引擎,在将.jsp文件转换成
6 {* Q& c0 Q9 Y+ C. E6 u9 F .java文件时,在指令所在的位置,插入/ U. b# o& x0 M3 A
file属性所指定的文件中的内容。
* g- n* S# O0 k; V8 z6 o: e- [ d,隐含对象& m$ @) k6 m* m$ g0 x$ l+ x
所谓隐含对象,指的是在.jsp文件当中,不用
' E: x4 |. ?+ t9 Q 声明和创建该对象,就可以直接使用的对象。原4 j* H$ V* ?# J* `1 p
因是,.jsp文件对应的.java文件当中,已经自动8 v* A0 S1 [( j4 d
生成了该对象的代码。' J5 T& ?+ ]2 l/ S# y1 d- Z
out
8 E6 J- I& a9 B% I request6 y% y2 L- B1 W# W" s+ F7 v
response
; P2 ^% D' @' i' h 4).jsp文件如何转换成.java文件
& f+ t1 x+ g1 U0 Y+ V6 d' d* B; n4 p a,html ----> 放到service()方法里,使用
$ d, [/ A+ t5 `( M; s4 V out.write()输出。* m' g4 N$ D7 p3 N; `6 ]
b,java代码片断 -> 放到service()方法里,照搬。
0 p: |' u# V) o) X c,jsp表达式 ----> 放到service()方法里,使用# V1 W7 [8 K1 ?, C; N9 C3 Z
out.print()输出。3 y8 \+ L( P4 ^% f- D# G
" a$ X& G+ u/ k- W- E6 W # z) v }8 r" J/ Z/ i3 k" x" v8 ^3 O
1、转发+ ?6 S4 Z* y$ P8 C/ J H6 Q( p
1)什么是转发?
" Z9 c4 K; Y" T h& i# | n" s' Y' p 一个web组件(jsp/servlet)将未完成的处理* V$ s* c; B7 @, s: R
转交给另一个web组件继续处理。转发的各个组
) b1 v. \- g1 W2 m7 T: m 件会共享request和response对象。
: n1 v0 m& J: m3 W/ W, e 2)如何转发?
' M l4 N3 Z7 J step1 先绑订数据3 _$ g5 x5 q* N
request.setAttribute(String name," X }7 q" ^% b0 x4 \$ h9 i
Object obj);( T# d+ Z* z* k+ K2 |! s4 L
跟绑订相关的另外两个方法* B) u0 h( Y6 l' a4 E1 }
//如果name对应的值不存在,返回null。
7 o7 e5 y) r* S+ V' w Object request.getAttribute(String name);4 C* z" Q+ D$ L% a5 D+ h
request.removeAttribute(String name);; I Q8 v3 T( A7 |
step2 获得转发器,转发。
( M* a2 U0 y6 I7 T; S RequestDispatcher rd =
& t ~# Y0 X. l: \1 k5 ]0 I& P+ V request.getRequestDispatcher(String uri);; g0 _6 {" o" V( W6 `0 e( x
rd.forward(request,response);
6 Y& o/ }# z! G/ G" N* U 3)编程中要注意的问题/ C8 E7 L+ z; p5 z, G% X* J: k7 K1 e. P% F
转发之前,不能够执行out.close或者out.flush。% w" E8 r; q) @) w
转发之前,会将response中缓存的数据先清空。 + R' V) J, r% {7 V
4)转发的特点* y9 G7 I" ^+ b- m1 ~
a,转发的目的地只能是同一个应用内部的某个组件。; k2 D6 l' k$ _& K" j
b,转发之后,浏览器地址栏的地址没有变化。 N+ _7 h; K2 U) K) O. }2 R
c,转发所涉及的各个组件可以共享同一个request,, @1 t) B+ u3 K& d/ O
response对象。
4 O* {9 i6 u8 w0 I- u0 h 思考:+ s8 W: [1 Q8 K; O6 ^
转发与重定向的区别。
# e( s7 U j2 x" ~2、表单中文问题! S9 J9 N" m, N3 ^5 e
step1 jsp文件,要添加
6 y+ U, Q/ D e/ ` <%@page pageEncoding="utf-8" 1 E) P( g& Y$ Z& A( o( T# a0 U
contentType="text/html;charset=utf-8"%>9 a+ c6 Y% Z" Y! c$ C
表单设置method="post"。
& {6 ?. P- h3 U( w7 F step2 在servlet类当中,添加+ R3 n, |+ g, W3 B
request.setCharacterEncoding("utf-8");
9 s0 z1 o T. y! t" L, F, a
2 n2 J' x- p: p step3 如果要访问数据库:! A( E) l0 K9 y: U0 j
a,保证数据库能够正常地保存中文。( F2 X- x2 U( Y+ J1 v
对于mysql
3 f# A% ]8 w1 C5 m! v( Y create database dbname $ H2 g# z, T0 G8 R; u
default character set utf8;& e9 Y) ?" R3 I3 r$ m2 a6 u
b,使用jdbc访问数据库时,必须要保证: p3 F- N) F* ?( o P `
jdbc驱动程序能够识别数据库中保存
6 G7 ?4 v% S) J8 K 数据的编码。
- l. V1 ]+ c; Q5 A0 W, \ jdbc:mysql://localhost:3306/jd1109db2?
/ g7 V3 ~5 A" K0 _8 l8 O useUnicode=true&characterEncoding=utf8* Y2 O1 X3 q @: o C3 p
7 T8 j' F [% p) P3、路径问题
+ h. {* E( u6 m4 B' ?0 ^ 链接地址、表单提交、重定向、转发的路径应该
& {7 {2 z- A+ l1 y* o& b如何写?3 q; T' j: d9 K+ u$ N0 m
<a href=""></a>
/ x/ t! x) \. w; I9 `' @ <form action="">9 J$ a7 Q6 [7 F1 G6 Z/ I0 h
response.sendRedirect("");2 R2 \+ o3 W2 W8 \) Z# H6 g4 A
getRequestDispatcher("");
/ p/ y+ x, c, ~ B1 ?+ E1 P+ M a,相对路径与绝对路径; s5 V0 N6 P) B+ r! p
相对路径:不以"/"开头的路径,比如:. k! L, [( f' T- c5 b& A/ O: P( q
<a href="del.do"></a>; x. k. k8 Y! O- ~
绝对路径: 以"/"开头的路径,比如:0 z( J# r& I7 V& l
<a href="/appname/del.do"></a>! U" ?/ P- [) W7 B0 \- X
b,怎样写绝对路径?
" B2 S" K3 v3 N) c# A 链接、表单提交、重定向,绝对路径要从
/ ?# T) ^6 j" _. g, |3 U) ?% G& |: [ 应用名开始写。
3 z$ ~. @: Y1 p# G4 H% S 转发要从应用名之后开始写。5 n: Z1 K# `) D$ h [ G/ G$ [* ^
//返回应用名,比如返回"/web05";& n5 d' c. ~' n% n
String request.getContextPath();% J6 m- }9 {% b5 w& e$ s6 N9 s2 f
4 N6 k( ~0 Q1 I0 c6 Z8 i |
|