该用户从未签到
|
java server page(java服务器端页面技术)。
( L* n5 z* ^ N) h+ s5 j( F2 g 是sun公司制订的一种服务器端动态页面生成技术的
J: H: y4 _- ?5 Q! K: R; W1 b: w! U! K规范。+ e# E5 I. n2 d( N+ j5 U+ Q
因为直接使用servlet生成页面,如果页面比较复杂,6 l- B3 [. |) [" `+ v% m0 c
则代码过于繁琐,并且难以维护。所以,对于比较复杂' N2 Y M! N2 H1 G% D
的页面,使用jsp来编写,更容易编写和维护。9 }: `/ f% [9 f$ B0 k
2)如何写一个jsp文件。! o: v$ W; j0 v' X( T5 V: C6 K
写一个以.jsp为后缀的文件,然后,在该文件当中,! z8 a( b3 _3 F0 D
添加html和java代码。编写完成之后,不需要编译,当
O' X g, }, L# y% D客户端请求访问某个.jsp文件,则服务器会自动将
# [2 |+ U/ \7 @+ i.jsp文件转换成一个.java文件(该.java文件其实是一个
& v3 u6 h7 n7 g+ w$ ~servlet)。
* W. v8 q5 ^1 ^/ Z+ ?/ b3 _* j 3)jsp文件的组成( D, J2 N2 e- i- c
a,html(包括css,javascript):9 a& E# y- F; p$ P& j/ Z
直接写在.jsp文件里即可。' I0 y% `7 N; r( t5 Z) ]' \; j, S5 Q
b,java代码:
2 e3 Y' x3 J5 R+ E- e 第一种形式 java代码片断
9 j) I2 {7 j# h8 z1 V- o/ V 语法:" I' E* d0 h( G5 L$ u% W! w+ g
<% java代码 %>
8 V( |8 V4 U& z* k 第二种形式 jsp表达式
6 m4 r" {8 F! |0 _ 语法:2 y4 j+ c' p3 F+ H
<%= java表达式%>
+ y8 ]9 H( U8 `- D0 ^, |8 p c,指令:5 @4 G/ C5 U, d9 w
所谓指令,就是告诉jsp引擎(容器当中,负责
" g: w* c; c$ u 将.jsp文件转换成.java文件,并在运行时,
3 m, h- b5 }# @ P3 p' B5 {2 C8 x 为jsp提供一些 辅助支持的模块),在将.jsp% w2 C" X$ E/ e. T9 y) X
文件转换成.java文件时,做一些额外的处理。6 ?8 D9 g4 [$ b; w) i
语法:- ~8 E: D. k- ]) r1 _9 Z: ?6 W
<%@ 指令名 属性名=属性值%>7 H/ e' n# B/ R
page指令
' R4 V. I0 j; U% r import属性:用于导包。# h$ s* d9 @' _8 Z8 P. b- E
比如- |6 Q% p1 Y- Y4 y. Z8 z
<%@page import="java.util.*,java.text.*"%>
4 v- C7 V I/ Y% Y4 G contentType属性:等价于
9 ]# A1 D: V+ K6 Q0 b response.setContentType();
% f9 i6 s; P9 Z* J- [1 A- y pageEncoding属性:告诉jsp引擎,.jsp文件
# v) Q* b5 r9 f$ ^0 W+ x4 p 保存时的编码。4 J J! ]/ n' o
include指令
" Y+ `0 Z& A3 x; L+ N2 b file属性
4 h# o2 |7 d' k7 E% y0 k 告诉jsp引擎,在将.jsp文件转换成
1 _! X3 k4 h8 |6 I4 u! H6 C4 G& D .java文件时,在指令所在的位置,插入/ K& k9 p% Z" u; l
file属性所指定的文件中的内容。
- M1 y2 y9 B7 g: q O' ^ d,隐含对象
1 H. V) |9 K+ }+ F4 l 所谓隐含对象,指的是在.jsp文件当中,不用: @. ^4 h- B* y g( _8 b" }1 M
声明和创建该对象,就可以直接使用的对象。原
+ ^! Y% m7 M4 f. P2 a$ ` 因是,.jsp文件对应的.java文件当中,已经自动2 I3 J! V/ _. A
生成了该对象的代码。" V% k+ u6 J. D3 l$ G+ H
out 5 d6 l; `# F8 L( p* X
request5 f$ n9 n. y4 B/ Z, L
response
9 ^8 A9 T) i6 b' ~0 j 4).jsp文件如何转换成.java文件$ ~/ F( F* |' h2 B b
a,html ----> 放到service()方法里,使用0 c5 l# R" n# c0 e- ]6 Z% ]4 j
out.write()输出。% T: r- x- r# ~+ p1 `, W
b,java代码片断 -> 放到service()方法里,照搬。
# Y# ]4 ?% L. s c,jsp表达式 ----> 放到service()方法里,使用
2 t$ P0 {6 v' r6 c out.print()输出。2 X# u) ~9 C0 T* m9 P! c
" V& _$ @+ C: P: p' g8 C v
K) ~, _# _% {8 [7 l1、转发5 A4 A" h9 @) y# @- l6 ?
1)什么是转发?
: m, w; x Q. @5 @) j" }! D 一个web组件(jsp/servlet)将未完成的处理
. a, T8 l# r2 c, D5 `3 o 转交给另一个web组件继续处理。转发的各个组
8 @6 M4 j, `8 D: @5 u 件会共享request和response对象。9 ~/ \0 E' y) r: ?$ v! E; G
2)如何转发?
7 g3 h, P$ s( f9 [ step1 先绑订数据" I) I) P6 b9 T+ w/ p2 o1 D
request.setAttribute(String name,
' q/ {) M [7 L* E9 \! V Object obj);
' }% H) g p6 B' b 跟绑订相关的另外两个方法& D2 u1 L0 d8 Z# X% X" I$ u
//如果name对应的值不存在,返回null。. r7 Z3 n0 z* }) x X& i Q
Object request.getAttribute(String name);( [2 H$ G _5 F4 U/ ? A9 q
request.removeAttribute(String name);
8 t: h1 T8 Q* W1 T; Z step2 获得转发器,转发。) z- C# y" Y* ^8 y' d+ c5 B C
RequestDispatcher rd = 3 Z" U; y3 I4 |8 r) d5 E0 e& Q
request.getRequestDispatcher(String uri);0 b1 G, b2 Y, ?# a
rd.forward(request,response);
' m; ~' v$ Z3 W9 K8 @ x9 z2 [ 3)编程中要注意的问题5 b l& L" @. c+ \6 r! B
转发之前,不能够执行out.close或者out.flush。
) m V" \# _ R4 V1 P) T4 m9 L9 M 转发之前,会将response中缓存的数据先清空。
& v9 H# B) C1 P* Y 4)转发的特点' q0 z. _. r2 u+ @4 u
a,转发的目的地只能是同一个应用内部的某个组件。$ G; Q- @6 Y% ]+ j0 {$ l
b,转发之后,浏览器地址栏的地址没有变化。
T) ]: Q1 U. J. A8 V& l* }- b2 a6 m3 i c,转发所涉及的各个组件可以共享同一个request,( T; b1 K c# r8 d3 b7 x7 |: p
response对象。
: @& R' H* w! f3 @( T. { 思考:2 Q. a% y$ \2 @+ _. U
转发与重定向的区别。$ R) K4 N# A* N! P
2、表单中文问题
4 ^2 q& C( V _! x step1 jsp文件,要添加
1 v4 S& J% h" L u8 ?4 _7 L <%@page pageEncoding="utf-8" 1 \$ A4 \ ^. o. ]' v" k
contentType="text/html;charset=utf-8"%>
. r, `2 s' i/ a: w 表单设置method="post"。
% ~& |6 Y" R" F6 \! I step2 在servlet类当中,添加
: H& W' q. {$ k% u request.setCharacterEncoding("utf-8");
7 _! p9 w5 s8 W' Y9 n5 R
p# Y8 g7 s1 O \& C2 A step3 如果要访问数据库:& [1 d' |9 V G
a,保证数据库能够正常地保存中文。; g# m2 j; E) U W& [0 c- X4 ?
对于mysql
$ z: S7 G$ O# C4 C create database dbname
# j' U5 J2 K& J: O* z8 l+ \ default character set utf8;: r2 @ w2 t& b, i! {& |( B
b,使用jdbc访问数据库时,必须要保证
. M) G, J7 D6 a5 `2 _- [ jdbc驱动程序能够识别数据库中保存
& o) p( \" q* S/ d+ H c! ^ 数据的编码。& m4 o4 x; c- v
jdbc:mysql://localhost:3306/jd1109db2?
) t$ _& Y! Q9 a. S9 g! \! B useUnicode=true&characterEncoding=utf8
8 T8 |& b" w' P; Z7 q3 S9 `) J$ z' P! M
3、路径问题$ G L$ h. T) o" Q
链接地址、表单提交、重定向、转发的路径应该
" x5 s% u; f: o! r3 s. d如何写?0 o8 D6 F) W& x n* n$ \0 g
<a href=""></a>
1 q3 x" l2 O3 r+ a3 b! y, q- v <form action="">& n2 r5 n+ c4 o! c" J H/ @
response.sendRedirect("");1 ~6 K5 D3 g6 m1 o; P/ A0 b7 K
getRequestDispatcher("");" @3 k* g4 b" p
a,相对路径与绝对路径
" J" |# |1 O% Z. c, X9 v2 y) l 相对路径:不以"/"开头的路径,比如:
! f- x ?/ ^4 }5 Q6 W: w% s: _ <a href="del.do"></a>
! _5 h5 P1 P8 V" J& ^ 绝对路径: 以"/"开头的路径,比如:
6 l7 w" w. D$ _/ H3 i <a href="/appname/del.do"></a>
& V( Y, D! ~' u* x4 j6 _( i b,怎样写绝对路径?# X& _. N: Y% Z; D) Q
链接、表单提交、重定向,绝对路径要从 S5 M+ P8 i; z
应用名开始写。
2 J6 v% n8 ?* [7 S. f+ T& M, e$ t 转发要从应用名之后开始写。
. l1 D# n# i+ L: U) u //返回应用名,比如返回"/web05";% G, h: P0 A' Q2 ]8 K8 T
String request.getContextPath();/ ~0 P0 o- I3 C
) h( U" @* X+ x
|
|