该用户从未签到
|
java server page(java服务器端页面技术)。
+ |3 I* z" Q/ E& R5 P$ I 是sun公司制订的一种服务器端动态页面生成技术的) m+ p' F9 |/ g
规范。
4 I3 E0 ?- P3 G 因为直接使用servlet生成页面,如果页面比较复杂,
0 | t+ H5 z, E" _则代码过于繁琐,并且难以维护。所以,对于比较复杂+ C4 y1 l" w: V: E
的页面,使用jsp来编写,更容易编写和维护。
7 K6 X1 L/ G4 d 2)如何写一个jsp文件。
/ o: j, y/ d+ y1 U# w 写一个以.jsp为后缀的文件,然后,在该文件当中,' K# z- A9 T: n5 \$ |
添加html和java代码。编写完成之后,不需要编译,当
2 K: O% o7 z' |1 ]% k5 j/ H; q客户端请求访问某个.jsp文件,则服务器会自动将8 U2 O& ?# b: F2 G2 u
.jsp文件转换成一个.java文件(该.java文件其实是一个; ^0 T$ t2 p' [1 _/ U. r, ^6 Z
servlet)。
0 ]- e, I7 r5 H$ I7 y1 W' b1 {1 `1 i 3)jsp文件的组成$ E! n/ M5 {: _; b7 G8 h |
a,html(包括css,javascript): Q1 D) E9 g0 n
直接写在.jsp文件里即可。5 r E3 v! e) h6 N
b,java代码:
3 T9 Q- a$ J: y u, O& z$ y# Q 第一种形式 java代码片断; u. H- \8 {' R+ W) N* Z3 I
语法:( \8 s k( R9 h4 V
<% java代码 %>! a, j6 N2 w" ~& e
第二种形式 jsp表达式) S W5 h" Q9 _) l# x
语法:
& O: F \8 ]8 d0 _7 @! T! V! u# X <%= java表达式%>
" E2 H, n( @7 }8 ?9 ^5 b5 {7 c c,指令:
8 D1 I4 O+ o* q/ F 所谓指令,就是告诉jsp引擎(容器当中,负责) Y/ q' R# c1 t) X9 Q% d9 [
将.jsp文件转换成.java文件,并在运行时,
@; s: [3 ]' e. X9 s6 m 为jsp提供一些 辅助支持的模块),在将.jsp. k& C6 M9 {0 Y, q/ E$ Z
文件转换成.java文件时,做一些额外的处理。# `% w f& ]) i+ s
语法:' |4 I) o2 q- x+ P( `* [5 O4 P
<%@ 指令名 属性名=属性值%>0 o3 I+ @# t) i7 d; V
page指令' Y: ]" Y0 q7 }" Z8 p
import属性:用于导包。
3 V: I6 Z: r+ j2 d: W; M* ?% d 比如( M- e# b% j8 e1 S, u2 M
<%@page import="java.util.*,java.text.*"%>
( r, p) c4 U, M% e" c contentType属性:等价于+ [; m/ m I5 x. ~3 c
response.setContentType();
3 x, m: f# m8 O8 V pageEncoding属性:告诉jsp引擎,.jsp文件
4 w. p+ ^: G1 U 保存时的编码。
, h) S2 M Z1 ^4 e7 I W+ O include指令4 v0 k4 J" N( l4 [4 ~1 Q
file属性
4 B' s. w2 a% K9 G2 K" C 告诉jsp引擎,在将.jsp文件转换成
z8 z) d2 j" u- [' }6 }9 Y .java文件时,在指令所在的位置,插入
5 P2 F4 T6 P. X file属性所指定的文件中的内容。! {" {. V: M3 p% r
d,隐含对象4 \( L8 N1 `6 v- g% `7 \
所谓隐含对象,指的是在.jsp文件当中,不用7 }2 I" p% h3 j; `. _) h; q
声明和创建该对象,就可以直接使用的对象。原
6 s3 [- ^9 @' R, g. n 因是,.jsp文件对应的.java文件当中,已经自动4 ~# Z7 r0 w. j8 f6 D" S. h8 T
生成了该对象的代码。
: o5 u0 ]: |8 t! ?* K6 b, g out
: d- W7 k" f5 }+ n1 m* S& V request1 c; Q' [6 L5 ?& f
response
8 i% I8 s! I& u P. C& ] 4).jsp文件如何转换成.java文件
8 J/ m) J$ H7 L7 z; b9 d a,html ----> 放到service()方法里,使用" [0 A. t, A% a s" H
out.write()输出。6 }; e* ^0 F+ R$ k
b,java代码片断 -> 放到service()方法里,照搬。
+ u8 V: D0 t6 S) F5 @ c,jsp表达式 ----> 放到service()方法里,使用
7 x. ?, |+ ]( {' g1 D out.print()输出。' g4 e" A: j# v
' U) m: ?3 g" A5 T2 _5 R
8 K; t4 _; j& B" a3 k W( F& N$ {0 f
1、转发
( w) F! @ @9 l+ R3 h 1)什么是转发?
( y+ |2 Z9 M# H5 p4 R 一个web组件(jsp/servlet)将未完成的处理
. I+ L( L, u3 F2 e6 ^$ T& z5 H- i 转交给另一个web组件继续处理。转发的各个组3 z1 g% D, |! Q7 [
件会共享request和response对象。
* D8 T a {7 a' n b* W) P" p 2)如何转发?
" o) u9 O) }, E2 S4 S+ E" y% [ step1 先绑订数据* V! [2 h/ E' R
request.setAttribute(String name,
7 _% u9 u$ z2 x, A5 Q* n Object obj);
" [+ e. ]/ J" P) Y, i8 a 跟绑订相关的另外两个方法# k: V. {1 @; L& {! ]
//如果name对应的值不存在,返回null。2 X" |6 i1 E! y# j5 o
Object request.getAttribute(String name);! r) J- f3 [2 G: o0 `7 f: s/ [" P7 V
request.removeAttribute(String name);( m F9 b/ r; K; |& n7 C
step2 获得转发器,转发。
$ [, z* w0 y6 \" i1 X1 M1 U RequestDispatcher rd = 6 F0 p( N, R6 E) R# c, M
request.getRequestDispatcher(String uri);. D. a* `# s5 o: m! ~& n
rd.forward(request,response);" s& Z5 J: o% L+ V% {# X+ {
3)编程中要注意的问题6 c+ _# e" b S& f) ]
转发之前,不能够执行out.close或者out.flush。
2 D m, ^: |5 c5 @) l& U 转发之前,会将response中缓存的数据先清空。 / W6 b& T3 x8 x8 w' j% [* f
4)转发的特点
" a& v2 Z( G5 H9 P; c4 D a,转发的目的地只能是同一个应用内部的某个组件。3 t$ d( D1 M( J4 g7 I b3 l
b,转发之后,浏览器地址栏的地址没有变化。
; g3 w O' m% q( H' T y! d- a c,转发所涉及的各个组件可以共享同一个request,
: N) Y" P. X& F9 J8 M response对象。3 z) }9 i1 B3 G9 j' r- e
思考:& _/ [5 G. g7 |2 r: |) A
转发与重定向的区别。
, e/ @; l/ S$ r( g; S/ o) r" X7 s2、表单中文问题
' C$ f6 Z; ~$ O, h( | step1 jsp文件,要添加
7 B1 S2 _! S: [( O0 u0 n; a# T3 S <%@page pageEncoding="utf-8" 3 i1 S' R% j( @
contentType="text/html;charset=utf-8"%>
$ z4 b- Y4 G3 S* z7 F8 N 表单设置method="post"。' v$ ]2 h4 g: m- x6 f* L
step2 在servlet类当中,添加! t8 G* { \/ R
request.setCharacterEncoding("utf-8");
0 r: k' a* P! _( {5 o0 `* A
! ]1 i$ v+ ?0 b1 j5 ^) }, E7 r T step3 如果要访问数据库:
! r4 Y) n3 a! m7 J a,保证数据库能够正常地保存中文。. F) v3 ?4 {' `+ N
对于mysql1 _/ }6 i$ c/ _ N# O4 \
create database dbname 8 V# [. y7 \5 X X
default character set utf8;
: A7 [ t9 e4 e6 M v b,使用jdbc访问数据库时,必须要保证
" `% {( U: d. [% e. n9 V jdbc驱动程序能够识别数据库中保存
2 L1 m9 |' d) F) ~( k2 \ 数据的编码。
+ n: I) X+ v5 f' O0 u$ H jdbc:mysql://localhost:3306/jd1109db2?
5 Q& I( X; L" a- o: J useUnicode=true&characterEncoding=utf8* y1 c% W% B* L3 ?
" p2 @1 A/ Q5 Y! K! t% \; C3、路径问题
/ K, E% b/ l+ C- X7 R) P- G 链接地址、表单提交、重定向、转发的路径应该* U6 Z. ?+ Q3 i
如何写?
D* O3 }7 d2 t D# V <a href=""></a>" M8 t" I5 h, n9 q; z. \% f
<form action="">- @0 Q3 i+ A+ J4 m6 q
response.sendRedirect("");; P1 f0 L) E0 `- V
getRequestDispatcher("");( u8 h9 I) P) c5 O" B" y
a,相对路径与绝对路径
& u+ r" M& h0 @7 U( R+ f) L J 相对路径:不以"/"开头的路径,比如:+ a, I: U# _8 \
<a href="del.do"></a>
; \6 u1 j5 M/ p; |, n1 r1 H 绝对路径: 以"/"开头的路径,比如:5 Q- D: L# A' \1 I! b
<a href="/appname/del.do"></a>( v( [* ~- M# {4 b- D9 \# Q. k
b,怎样写绝对路径?
3 R7 x* a& T. E" c' i- a* F 链接、表单提交、重定向,绝对路径要从
" R$ z+ S, u% l7 [7 V* W1 ?8 B 应用名开始写。$ V8 S E4 h7 J5 }/ e9 U
转发要从应用名之后开始写。) _, j) v- [! _( G
//返回应用名,比如返回"/web05";
4 R; S$ {* ^: `! x D' m' M String request.getContextPath();% N$ s9 V! g+ P; \
. G8 e8 K! ]/ l+ d4 D |
|