该用户从未签到
|
java server page(java服务器端页面技术)。) \+ E3 x, V8 O" N% V
是sun公司制订的一种服务器端动态页面生成技术的" H5 \6 G3 V5 u2 h- K9 T6 Y
规范。
% U0 w' c- P; Q! }' W2 x6 @0 } 因为直接使用servlet生成页面,如果页面比较复杂,
( f2 r# M7 _7 v; R则代码过于繁琐,并且难以维护。所以,对于比较复杂' u1 C0 H6 @/ {
的页面,使用jsp来编写,更容易编写和维护。
+ C4 n/ Y3 k( _3 J 2)如何写一个jsp文件。
9 \9 Y7 p- E2 m# x% Y 写一个以.jsp为后缀的文件,然后,在该文件当中,3 o' ^& b+ q: U& `+ v
添加html和java代码。编写完成之后,不需要编译,当
9 e# ^8 \2 Y% T+ T1 K客户端请求访问某个.jsp文件,则服务器会自动将0 I5 c6 E, B* ]# ?1 {* _
.jsp文件转换成一个.java文件(该.java文件其实是一个/ N+ ~& O% H( t
servlet)。
{( X% F$ U6 V' @ 3)jsp文件的组成
6 }' g1 T: Z& @/ {0 |5 F) l) C6 @, \ a,html(包括css,javascript):
5 i$ X7 Z8 M( j# P* }" D0 ~. e 直接写在.jsp文件里即可。
- `8 T2 C* I! b) j* N% g& X- @ b,java代码:$ n0 v" m' |& `! W
第一种形式 java代码片断 ?; o0 b5 `9 G$ n! J3 c7 a
语法:
# w1 S- [, h/ f& R+ E! H <% java代码 %>
& d' E6 q! h$ Z' j 第二种形式 jsp表达式
4 b8 [7 T. X; w2 k6 V! f 语法:0 N5 U; I) R$ m, B
<%= java表达式%>$ V% ^: _/ N! ~2 w; S
c,指令:/ n+ }, O, T. y: ~) n
所谓指令,就是告诉jsp引擎(容器当中,负责
* C& \& a5 G0 d" n& c 将.jsp文件转换成.java文件,并在运行时,
O4 G: O2 N1 T4 W: j6 { 为jsp提供一些 辅助支持的模块),在将.jsp5 _$ M* O6 ]1 x8 C! ^0 T; D
文件转换成.java文件时,做一些额外的处理。
( v: ]% t! W# \4 b 语法:/ ?; [% g$ a3 r+ N* e$ r
<%@ 指令名 属性名=属性值%>
$ @4 ^% s$ `8 f8 Q7 Z7 S; ?1 x page指令
9 ]8 |: F! V) n. v0 k% y- W% i# q import属性:用于导包。
& u9 `" Q# l7 B 比如
+ a3 ^2 r- w8 U3 x3 w1 I, T <%@page import="java.util.*,java.text.*"%>, h; [, N, w6 g
contentType属性:等价于, S3 G+ p* X3 G8 Y
response.setContentType();: m9 L* ]! ] G" } r6 p
pageEncoding属性:告诉jsp引擎,.jsp文件+ D# k' F4 u$ ?4 x9 H7 m
保存时的编码。/ x1 k3 a2 b- F* t9 D& z; h# n- {
include指令1 ^, ^4 `5 D; d6 [
file属性
+ Z7 D N9 X7 b' m0 y2 F( X 告诉jsp引擎,在将.jsp文件转换成# ?/ o$ V o3 @% A% f# x1 j3 A
.java文件时,在指令所在的位置,插入7 x% d- u1 O0 v6 S6 v( N# T2 q
file属性所指定的文件中的内容。2 n5 _( H+ j$ E# z8 B6 U+ {1 s
d,隐含对象
Z. p2 ~4 g/ R8 @/ r) C 所谓隐含对象,指的是在.jsp文件当中,不用
3 V" C& w# e" c: U! G( A- z9 C6 P7 H 声明和创建该对象,就可以直接使用的对象。原! A' u1 R5 Y7 Z7 C
因是,.jsp文件对应的.java文件当中,已经自动
! ]2 ]3 ]- X8 p+ @0 L2 b 生成了该对象的代码。
2 X/ F8 @: j+ S) z: } out 7 O7 ?' r7 `/ k' G( z# v+ f
request. d% F4 ~, }! S) K6 T
response/ j2 ~' a: f( p: G# t1 \" }% q! Y. p
4).jsp文件如何转换成.java文件
: K7 f/ C. t6 h% d& @- m% R a,html ----> 放到service()方法里,使用- ]4 V& p) a$ T/ u, T X; Y
out.write()输出。$ P6 A K4 z( m: _" B$ { U! T# Q
b,java代码片断 -> 放到service()方法里,照搬。: L& ?3 K! m2 V1 C5 u _; m
c,jsp表达式 ----> 放到service()方法里,使用
( J# G2 C5 F8 u4 s out.print()输出。
2 r8 h; U( [2 C1 c- L
6 o1 x6 p3 v* P- s6 J6 { 4 R. ]2 q; u1 C( e
1、转发& Y' f _' Q% R. P: y6 H
1)什么是转发?+ r. Y$ p2 a: W/ X! U
一个web组件(jsp/servlet)将未完成的处理
; ]' S, s2 q) z) G0 r! r 转交给另一个web组件继续处理。转发的各个组- v& t, Y3 J2 ~2 L: S7 I. d' [; Y. i
件会共享request和response对象。) N3 _- k p% b4 b: m& U
2)如何转发?
8 C- |/ A9 _4 ~ W' s+ s0 U step1 先绑订数据' K7 i. E. G! U, o v
request.setAttribute(String name,
) t$ _/ @9 o5 o2 h& N. z5 _2 Y Object obj);* @' P* _5 s( p* n) E$ C& l
跟绑订相关的另外两个方法6 g$ b3 i6 _ U
//如果name对应的值不存在,返回null。5 Z5 F- A0 j& _" ?1 A; Z! p* n2 `: d
Object request.getAttribute(String name);
4 a' O' {. F5 |1 d e9 p$ } request.removeAttribute(String name);
0 f. v! b. q8 ]' e1 z+ L. N" t step2 获得转发器,转发。
x: a& N9 x. Y RequestDispatcher rd =
0 h7 r7 J6 v2 G0 t1 I7 Z/ ^ request.getRequestDispatcher(String uri);8 o+ l# g$ S/ z. \" l: n3 [ Z
rd.forward(request,response);
" O1 f$ c/ Y7 e6 U) {' h& x 3)编程中要注意的问题
, U) f. X& b' t$ ^* u8 R9 b 转发之前,不能够执行out.close或者out.flush。
; o' x9 k' N* h2 P0 x' Y1 G 转发之前,会将response中缓存的数据先清空。 ! }8 i4 }( p) z1 r9 V5 _; f% O
4)转发的特点, D& J/ T, V0 S( d
a,转发的目的地只能是同一个应用内部的某个组件。6 M$ f) y# ?# A( e7 @- |% N
b,转发之后,浏览器地址栏的地址没有变化。; a) X7 o7 j. A+ O
c,转发所涉及的各个组件可以共享同一个request,
1 \6 E7 p* r5 j# G! T response对象。2 e4 C; R7 _$ g0 ]7 ]! j% f
思考:
: c( O( f& n9 Z! k+ B: R 转发与重定向的区别。: j) Q( }/ |! Z: R" K E) z
2、表单中文问题
9 b; C+ g5 ^0 N step1 jsp文件,要添加
* L. ^9 T! b* a- S7 Y2 @ <%@page pageEncoding="utf-8" : O6 \% b- e$ t* Z& Z4 h
contentType="text/html;charset=utf-8"%>" b5 A/ f3 e( H( o" G' a6 j
表单设置method="post"。" c: t7 S! D. l' d6 U
step2 在servlet类当中,添加
7 P9 O; F* [) Z) r2 ]7 m9 v+ Y request.setCharacterEncoding("utf-8");
! b/ u( r3 G8 z
; o m8 F, \, j# _( q step3 如果要访问数据库:& `* N4 J; i1 B1 T) g w* F1 M4 e
a,保证数据库能够正常地保存中文。9 p3 ]' `3 {9 }, e; B
对于mysql
% A9 z1 C: T6 _8 ~9 k, M create database dbname
# G5 d+ Y7 r. Q default character set utf8;. p0 Y* Z; n$ G, r! F+ ^
b,使用jdbc访问数据库时,必须要保证
2 l. k+ c0 E3 r9 N8 X5 V5 ] jdbc驱动程序能够识别数据库中保存
" d* x$ F; r3 c3 } 数据的编码。
( ~5 @5 j- K4 y9 b" T9 b Y jdbc:mysql://localhost:3306/jd1109db2?
4 r/ N0 ?! t! v5 b% Q useUnicode=true&characterEncoding=utf8
6 s! |1 o' u7 E& S+ W7 _- E; |! E7 c, m: J1 E
3、路径问题1 a) C1 l0 H8 c1 o% y1 A* j! y& @7 ~
链接地址、表单提交、重定向、转发的路径应该
3 r* o' Q5 }8 ?' u. Y. |如何写?
& g; U M4 w# i* U <a href=""></a>$ @3 Z. B$ ^) c5 V9 z& U
<form action="">1 {& x) \7 t% k) W9 z- O9 |
response.sendRedirect("");
) ]5 R) C+ |3 m/ E* p- w getRequestDispatcher("");
6 E3 }( X; A, s+ {, b# |( ? a,相对路径与绝对路径9 `9 C9 A; `6 I9 a9 H1 M7 q2 r
相对路径:不以"/"开头的路径,比如:
# Q( p+ R; r* |1 b. s8 T <a href="del.do"></a>
. K2 i4 A$ m3 x2 M2 X 绝对路径: 以"/"开头的路径,比如:
) [$ g0 V& B7 H8 r! y" g <a href="/appname/del.do"></a>
7 s# X* e* F/ W2 F0 \; U. D b,怎样写绝对路径?4 z2 f( c L. O
链接、表单提交、重定向,绝对路径要从! a# W- p" N8 g( u- L
应用名开始写。
' `+ _- T" `0 S* J3 Z 转发要从应用名之后开始写。
: l0 ]0 s! H2 k! d$ g //返回应用名,比如返回"/web05";
/ K( B/ E9 v9 t r String request.getContextPath();, D4 U1 N; Q& ?1 L2 A: i
Z a, ?, g {* m" z6 t' |
|
|