该用户从未签到
|
java server page(java服务器端页面技术)。
N; @; Z: F1 W) u5 g 是sun公司制订的一种服务器端动态页面生成技术的
+ w5 f3 V% U9 X! e4 i4 K) ^+ Z, W( z规范。2 x% A0 c3 k9 Y( o, K3 a/ Y
因为直接使用servlet生成页面,如果页面比较复杂,
( T! }' _- s4 r* `# T则代码过于繁琐,并且难以维护。所以,对于比较复杂
) I* A; I6 y% \. g2 F的页面,使用jsp来编写,更容易编写和维护。
& [. |% M o0 W 2)如何写一个jsp文件。
: z: f: X H" N# w 写一个以.jsp为后缀的文件,然后,在该文件当中,
) [' K5 ~5 ?. j* ?$ V2 p( i9 z添加html和java代码。编写完成之后,不需要编译,当; w3 L) A' ?( \ }1 z( E! O6 L8 X
客户端请求访问某个.jsp文件,则服务器会自动将# q! ]( ^3 N& J2 O* @/ w
.jsp文件转换成一个.java文件(该.java文件其实是一个; g" T/ Y8 i# @& w
servlet)。
; w1 c6 [5 Y; Y* o) V% R4 S9 }9 r 3)jsp文件的组成3 ~0 `9 L0 y% I- \4 k9 u# j& X# X
a,html(包括css,javascript):6 {- W% r: m& _, _' |8 M$ d; D0 }
直接写在.jsp文件里即可。) s- K2 [; O5 ?4 t
b,java代码:
( V8 l, f' j/ R& I( l) C: j4 z 第一种形式 java代码片断2 l) K( C- n/ q% T+ L- U
语法:! O0 G* n1 T/ w& N. G
<% java代码 %>
! m5 T- R7 Y5 S F+ h4 j: t9 y8 p 第二种形式 jsp表达式6 h( ~4 `4 A, L% I
语法:
) b- Q& m* C7 D. f- ]6 M4 C <%= java表达式%>
5 Q. I9 D8 q5 O" i f c,指令:
, y* Y6 m2 C- u5 _* H5 \5 @ 所谓指令,就是告诉jsp引擎(容器当中,负责 z1 H+ B8 [9 M2 H/ e4 ~3 G
将.jsp文件转换成.java文件,并在运行时,% i- B/ a: G: a) M
为jsp提供一些 辅助支持的模块),在将.jsp
$ x; a5 O; r. W; O0 i 文件转换成.java文件时,做一些额外的处理。9 q5 N* Y' n6 M
语法:
5 z- D. `% s( f# _ <%@ 指令名 属性名=属性值%>
% L) p2 r$ w8 Y h' j page指令
$ N( G" E9 v+ O% N6 s5 i4 [ u5 S import属性:用于导包。
5 h3 s$ |8 ?. r 比如' m5 ?1 C! R% u z8 G3 g1 Q
<%@page import="java.util.*,java.text.*"%>
# h8 [' D! _8 V% W7 a7 M contentType属性:等价于3 N7 }8 S4 \- B; D d
response.setContentType();. t1 M: g" M, f5 P- X/ Z- d
pageEncoding属性:告诉jsp引擎,.jsp文件. h, _$ j: G1 E. B; |8 u, `+ d _
保存时的编码。
! T7 P0 D. f$ H6 e1 v" {, R include指令5 K% G- l5 u, Z+ [" x0 E& V
file属性
' ^4 T$ h( N* U3 ]" r d 告诉jsp引擎,在将.jsp文件转换成
+ }4 E# V4 P* ^; T7 m .java文件时,在指令所在的位置,插入
8 W5 X$ c+ w3 D; r file属性所指定的文件中的内容。( Y, Z% x8 i4 R" x
d,隐含对象
0 M6 a3 c( C; h9 A% M' H 所谓隐含对象,指的是在.jsp文件当中,不用3 C9 q# e" p: B# N$ h
声明和创建该对象,就可以直接使用的对象。原: c& Y8 K" F. _) k1 K
因是,.jsp文件对应的.java文件当中,已经自动' q- | q4 }8 {! u) [# E
生成了该对象的代码。, E, [9 d* u- D. m; }
out
2 R+ M5 n/ \4 b5 W7 r request. {/ _3 H0 B+ d
response
! q! {2 N3 S0 F N2 V# y* V; K 4).jsp文件如何转换成.java文件
0 u: d% N- X% L/ M6 @$ h. Z a,html ----> 放到service()方法里,使用3 l; Y$ B l) Z6 W% ?
out.write()输出。/ M: p) I* M9 K
b,java代码片断 -> 放到service()方法里,照搬。
+ t( a# Y. V/ f4 Q Z c,jsp表达式 ----> 放到service()方法里,使用
/ o, R4 F7 W8 |! z. g out.print()输出。
) G: v; `# \- j 7 E+ o0 P% ^* q: C
; F0 D: z* U7 k& H6 y( D! x
1、转发
6 Z6 P: h- }& h f 1)什么是转发?
7 H* B5 b) V3 [, f; h+ E5 t8 w 一个web组件(jsp/servlet)将未完成的处理
5 N! h& q' F" {2 X 转交给另一个web组件继续处理。转发的各个组
* P4 i! N" Q& J6 }( Q7 G 件会共享request和response对象。
# h, A& {. r! l. R8 Y S+ \ 2)如何转发?+ v* p- B1 |6 C+ b
step1 先绑订数据
6 W [+ @9 }" ^% N& T6 o9 F0 @ request.setAttribute(String name,
5 f& z# I& v/ n6 U, P9 F3 C4 j3 L Object obj);3 S2 q: k8 }( J7 Z" }) P
跟绑订相关的另外两个方法; f$ O# F, z% y* e: | k
//如果name对应的值不存在,返回null。7 v: [) I, R1 R P2 y
Object request.getAttribute(String name);
- ^- f& F! I7 q; h' V& K request.removeAttribute(String name);3 W2 w: l! o' p/ ^+ d7 b) b
step2 获得转发器,转发。
8 x4 C0 l0 D* B9 A/ @0 j RequestDispatcher rd = / e' [# w2 I0 G/ \' k
request.getRequestDispatcher(String uri);
- T% R$ k. w: {" i, o rd.forward(request,response);- Z- D6 x3 J' P, a
3)编程中要注意的问题
& F& Z0 ], j2 D* p$ Q0 a- A 转发之前,不能够执行out.close或者out.flush。
6 z" ~- I1 W. B. ^' S9 N 转发之前,会将response中缓存的数据先清空。
z' Z, |4 ?6 t) n5 E, \ 4)转发的特点
4 R: I# q# p7 ^7 Q3 d) T- j a,转发的目的地只能是同一个应用内部的某个组件。2 g- @: c# e8 k. I* K. x9 @
b,转发之后,浏览器地址栏的地址没有变化。
8 [- b. h' x; v2 D c,转发所涉及的各个组件可以共享同一个request,
& P7 @2 o4 r; N/ ^# T5 i0 a6 A response对象。
, R5 p1 T) e6 A) H6 O% h2 _# ^ 思考:
; k) h& R! t1 g2 a 转发与重定向的区别。, o) {8 q b* N$ B5 x
2、表单中文问题/ q- X! }) K2 |- }4 |: R h
step1 jsp文件,要添加
7 I* |+ M8 V& l; i# z <%@page pageEncoding="utf-8"
) Z2 I& i( C$ ?! R" s contentType="text/html;charset=utf-8"%>
5 R9 m; |6 d R% y( J+ l 表单设置method="post"。8 S9 h/ L; B) j7 [
step2 在servlet类当中,添加
" H! @. ^% z# T/ Q7 h request.setCharacterEncoding("utf-8");. r- ~# b, E$ R, {2 r& c: i
8 E; @8 {$ `$ n9 `7 S3 h/ T step3 如果要访问数据库:
/ ~4 b" _+ h. y) g0 I a,保证数据库能够正常地保存中文。
0 `! ]* B3 b0 c; [% U) r 对于mysql
4 T, E9 W9 B% w+ Y; z0 ? create database dbname
! _3 S" r/ g' t/ n0 N, w default character set utf8;
1 g" C( u4 m# I3 g! m b,使用jdbc访问数据库时,必须要保证
4 p+ i2 P0 z6 G% V+ ?) v7 o jdbc驱动程序能够识别数据库中保存
- X" I8 c' K; _5 [$ l 数据的编码。
9 j% S+ }; @* X1 X jdbc:mysql://localhost:3306/jd1109db2?5 w" }5 Q! \+ D; [ e
useUnicode=true&characterEncoding=utf8
% k- l3 C) t7 E! d) v* k K5 D6 q5 h+ r2 q* {6 K; g
3、路径问题5 g' v) S4 y+ K" j! ~- _
链接地址、表单提交、重定向、转发的路径应该- r' N8 i% B4 l% m- b
如何写?
0 q* _" ~8 E6 {) X! u <a href=""></a>: n' n( |' u% _
<form action="">
: \; R3 u: O0 b( G: O- J response.sendRedirect("");4 N! a5 ]- A, E6 W6 C# Y9 g$ ^: K
getRequestDispatcher("");4 m; r& Z5 R( k1 _' {
a,相对路径与绝对路径
, T% |* ^) b1 m* S 相对路径:不以"/"开头的路径,比如:
6 z% D: \0 J# a) G% i4 x* e <a href="del.do"></a>
2 r a; C7 t' W! E; P8 L: ] D 绝对路径: 以"/"开头的路径,比如:7 R' t o1 `# w2 Z0 {2 d d
<a href="/appname/del.do"></a>
% ^& N" f4 A* u* G5 Z. | b,怎样写绝对路径?
1 R" w# ?" z+ c! U0 o7 ? 链接、表单提交、重定向,绝对路径要从
6 n! T' c7 l1 b4 w 应用名开始写。
( P* r& J7 z6 m0 a 转发要从应用名之后开始写。% \4 e; }& z4 j# d5 |/ A
//返回应用名,比如返回"/web05";" [( g0 J6 @2 R/ j2 B* E8 W
String request.getContextPath();" {* L/ l/ P8 D* b4 h) |
) N" | j1 J% i+ j' w
|
|