该用户从未签到
|
java server page(java服务器端页面技术)。/ z6 X/ m. p* u- b0 A( K4 V
是sun公司制订的一种服务器端动态页面生成技术的
% x3 `7 N' `& z+ E% j规范。& \, \: ^6 w2 ^: t
因为直接使用servlet生成页面,如果页面比较复杂,& V# V% A1 U, t9 n
则代码过于繁琐,并且难以维护。所以,对于比较复杂
& R0 N& O( p9 R4 }. ]的页面,使用jsp来编写,更容易编写和维护。
o$ n7 f) q& X! b 2)如何写一个jsp文件。
, }$ |& O: s% O. {: O* X8 ?5 K 写一个以.jsp为后缀的文件,然后,在该文件当中,
1 o0 Z* ]! |) J. |2 X# b [2 H# d# g添加html和java代码。编写完成之后,不需要编译,当
9 @: j0 D" G: I) S* L客户端请求访问某个.jsp文件,则服务器会自动将1 q1 f; a, c4 D- k0 J) O6 x
.jsp文件转换成一个.java文件(该.java文件其实是一个3 X( y' S$ E' k' a3 O7 w% [- x- J. p
servlet)。: d3 _2 ]1 S8 ^) w# ^3 g: ?
3)jsp文件的组成$ i( |9 {- r4 r3 `$ E( w
a,html(包括css,javascript):0 X/ U$ J3 q* b, }( S# v2 N
直接写在.jsp文件里即可。: W {+ @ _ M, s' x: i5 d" ^
b,java代码:
( J0 _1 G6 W: t' @1 }' s; z 第一种形式 java代码片断, ~. Z5 C, g7 C: W9 I3 F( c
语法:
0 U. Q( C, U& L <% java代码 %>' I+ w1 ?& h' A0 [5 r
第二种形式 jsp表达式- {+ Q; D4 P8 B- [ U: |; k
语法:
: W# y. y; U; ?! I: W8 T! E4 l <%= java表达式%>" G, {* c2 o5 T! q, b
c,指令:. F+ A+ l6 l+ I3 E2 n+ s
所谓指令,就是告诉jsp引擎(容器当中,负责
, d9 o9 O. e+ _' u& h 将.jsp文件转换成.java文件,并在运行时,
3 j7 _( i9 N4 Q u o! t: q 为jsp提供一些 辅助支持的模块),在将.jsp- v& a7 h6 E! e
文件转换成.java文件时,做一些额外的处理。4 {! c) N/ G% y3 C" y) k
语法:
7 T1 e$ L8 a ^+ I <%@ 指令名 属性名=属性值%>
6 g3 h1 j$ e! d- K+ F, d) f page指令
# O( K) D; E3 |* H/ B. z: [6 f6 B5 b$ } import属性:用于导包。
" m5 a0 W. v. F 比如
0 y& M- Q- I: u: J G+ r <%@page import="java.util.*,java.text.*"%>
4 i2 H8 K+ R* T, b contentType属性:等价于 @/ V8 ^1 y# h+ k9 ^- C, O8 y
response.setContentType();
' d6 C, e! \2 J" @5 q5 d6 R. p pageEncoding属性:告诉jsp引擎,.jsp文件/ I* l! X4 G9 L) J3 U" d/ l
保存时的编码。
: k+ C- a6 n& m' F# s7 O: h( N8 k, a( @ include指令
" g6 W8 {1 d" ?3 c' u( {0 H: `9 l file属性# k/ q+ {8 j, W& P. x
告诉jsp引擎,在将.jsp文件转换成: K8 e9 c+ ?6 Y2 n' e% |$ n8 o
.java文件时,在指令所在的位置,插入" g9 \% [( b1 _
file属性所指定的文件中的内容。, C c3 |$ J: K+ n' E
d,隐含对象
, y& W/ R# Q% K& b' o 所谓隐含对象,指的是在.jsp文件当中,不用
+ [& B! F) E J# J8 \* h8 s 声明和创建该对象,就可以直接使用的对象。原
. Y# E# a' V; t2 p) i5 h+ \+ E 因是,.jsp文件对应的.java文件当中,已经自动" H- F- {5 p: d4 [$ |
生成了该对象的代码。
8 R. a' _+ T3 A' g7 ~ out
0 L+ I! ^- i% R' L& _+ D5 M) J* p request, M+ c2 p* c5 u% r/ I/ X
response% F0 |/ \! T2 C' K& e
4).jsp文件如何转换成.java文件& _1 @/ U2 D5 H+ j8 ^# f
a,html ----> 放到service()方法里,使用- m( D0 g& i C$ i8 h% b
out.write()输出。' u) k/ n. W+ N$ u; |
b,java代码片断 -> 放到service()方法里,照搬。, D+ Y7 ~2 R/ s6 r3 F/ D$ g! J- M
c,jsp表达式 ----> 放到service()方法里,使用
! B* r! [8 ^% |2 i B- N; m out.print()输出。
' g4 K/ t. t# L & E$ b7 b) o9 R% Z+ V( Q# u
- h3 A1 ]' N. G- n& u+ N, Y2 @! l) X
1、转发9 a. T8 J( J5 D2 Q; z* r
1)什么是转发?' S% G7 j6 F. I+ [: n0 X2 Z( n0 b
一个web组件(jsp/servlet)将未完成的处理1 G/ s: z+ i% q k1 h' f
转交给另一个web组件继续处理。转发的各个组& x" @5 R$ z( p+ ^5 W/ S
件会共享request和response对象。+ u' ?- u: E8 w
2)如何转发?
( ~# h. y2 L. s step1 先绑订数据1 a( Q+ ^+ G5 s6 G7 P4 P( N; x
request.setAttribute(String name,0 r0 J1 `5 m3 {9 `4 r$ x
Object obj);: ^) W) |- i* p1 h
跟绑订相关的另外两个方法
$ K, S6 D6 c) ?; O //如果name对应的值不存在,返回null。
& ^8 X5 y5 [2 D% B% i& D2 B Object request.getAttribute(String name);3 S4 y) `" P3 p0 m5 K. i/ J1 N6 [
request.removeAttribute(String name);. G4 Q/ ?, d5 X1 q. @1 `
step2 获得转发器,转发。
' u7 `2 b$ w o1 `3 L: s9 q2 k! { RequestDispatcher rd = ! W& A4 j! ?8 R4 u0 K/ o9 X9 l: U
request.getRequestDispatcher(String uri);
0 L+ i* r# z- n8 B5 q% @% ?! c+ K& f rd.forward(request,response);9 |( s0 ~& H; f- K$ v
3)编程中要注意的问题
, J- ^1 k7 W# ~2 X3 f* e 转发之前,不能够执行out.close或者out.flush。1 M8 y |' q g& F$ W
转发之前,会将response中缓存的数据先清空。
: q, b2 P9 b+ X6 ?0 V! ` 4)转发的特点6 v1 l9 A" c$ X+ q! C
a,转发的目的地只能是同一个应用内部的某个组件。& k+ H/ i# \/ j0 t0 i2 J2 a9 a0 X: V
b,转发之后,浏览器地址栏的地址没有变化。
" H' m$ m/ A: D- }: R! | c,转发所涉及的各个组件可以共享同一个request,- E$ {7 O: L: K
response对象。
5 \: V4 Q _$ d; q" g- c 思考:
$ F% e$ M$ g& }& X/ ~" h 转发与重定向的区别。
% T) [, |; D% d$ {0 }2、表单中文问题
$ r& M) ^ k; [1 f6 b* ^ step1 jsp文件,要添加
m9 j5 b) G% }" [0 w <%@page pageEncoding="utf-8" , J8 }. W" ^3 q, S* ~) q% K
contentType="text/html;charset=utf-8"%>
9 f7 Y* v: M! x$ ~* X! `: I% g: l3 K 表单设置method="post"。
/ J7 }4 @; V: C1 G* C9 W step2 在servlet类当中,添加
6 H& \7 C* y" {' h8 L2 z8 V request.setCharacterEncoding("utf-8");
: E8 m8 W9 L1 ?
' O: b2 @6 P- c step3 如果要访问数据库:
* I* k; s _) W' G4 X5 D! l a,保证数据库能够正常地保存中文。6 n) ~. ~2 F2 I' E6 E5 Y* T
对于mysql
% m, n. C+ r; d# \3 Q create database dbname
' H x. }# w( e P" ~ default character set utf8;
# Z5 [; w8 ]* D0 I7 `$ j# F b,使用jdbc访问数据库时,必须要保证
# f& R) Y, X' z7 q jdbc驱动程序能够识别数据库中保存9 X/ z- r( o- p# Y
数据的编码。
( p) c0 }, B% e jdbc:mysql://localhost:3306/jd1109db2?
2 k, B0 ^" h6 M6 ]. o5 G, {0 B: ~ useUnicode=true&characterEncoding=utf8 i5 T$ z o3 j8 V6 W' z. e9 b
+ d7 E& z/ V& W3、路径问题
; t! A) B6 Z W2 y 链接地址、表单提交、重定向、转发的路径应该
! V, q( I/ d+ j% c如何写?
4 `0 T" C. R7 a/ F6 \ <a href=""></a>
6 Y4 i# q' S$ v9 i& h, o, g; n <form action="">
& i2 N* N! _, [3 s) ]9 V6 Z response.sendRedirect("");* y1 S9 C- L+ H: Y2 R
getRequestDispatcher("");# P7 v( Z( c6 ?" l; L2 N1 J
a,相对路径与绝对路径
& ?/ X. x2 ~& a- L- b6 K. d: p( ?8 a3 S 相对路径:不以"/"开头的路径,比如:4 X/ w, k; ]0 W) l
<a href="del.do"></a>
& } H% v0 X6 c0 W" X 绝对路径: 以"/"开头的路径,比如:7 d7 A8 Q: Z: |, K
<a href="/appname/del.do"></a>, I2 Z8 |6 G% g% v
b,怎样写绝对路径?* z2 e7 T1 |- O& |6 O* @1 `
链接、表单提交、重定向,绝对路径要从* n' {2 d6 f9 \# U* o; u- {+ z
应用名开始写。
3 B! _3 l* L% \. Z8 N: K. A 转发要从应用名之后开始写。
" U' T# d# I8 Y% Z; ]* G. L5 I2 O r //返回应用名,比如返回"/web05";$ e8 n3 U, E% y3 C; u8 [- t; C
String request.getContextPath();
6 d6 s i9 @. l. x/ l8 V& q8 c8 y8 w8 j" T+ Q
|
|