该用户从未签到
|
java server page(java服务器端页面技术)。
0 d2 ?5 x f" Z1 F& k 是sun公司制订的一种服务器端动态页面生成技术的. \; {1 N0 ^: I6 C6 \; [; H* K: r
规范。
) m1 I% r$ W3 t* Y 因为直接使用servlet生成页面,如果页面比较复杂,3 s- t" V0 Q9 J4 }. Y
则代码过于繁琐,并且难以维护。所以,对于比较复杂
' g5 N: |- Y: C4 `* X& X的页面,使用jsp来编写,更容易编写和维护。0 Y5 O7 l3 l6 y& {
2)如何写一个jsp文件。
- C+ L9 a( a# T6 w 写一个以.jsp为后缀的文件,然后,在该文件当中,
2 s" Q% c" ]" b" `8 ` r添加html和java代码。编写完成之后,不需要编译,当
* [$ i' f4 \3 |$ g! F' U* L) b' X客户端请求访问某个.jsp文件,则服务器会自动将+ s( @+ ~: k0 Y
.jsp文件转换成一个.java文件(该.java文件其实是一个# ?: l7 P) G0 B3 E
servlet)。
0 v. m+ L5 h: K9 s5 M 3)jsp文件的组成
+ c! W; f! C. \; i a,html(包括css,javascript):
1 F+ ~4 Q/ A6 X. f& [( S/ \9 S 直接写在.jsp文件里即可。% a( n/ |; n+ d/ q
b,java代码:
; {$ N$ x& ^9 j! s3 L 第一种形式 java代码片断
+ n T; I3 d3 F% `0 F. b 语法:
* z0 p9 B. }$ K, j <% java代码 %>$ K7 w4 J! g6 U5 L+ n
第二种形式 jsp表达式0 s* f: C) a) @. H4 p. }
语法:7 Y' L. i9 b. c1 @8 a
<%= java表达式%>0 ?7 M4 r( p0 N0 B3 b* t
c,指令: m8 T/ a E X7 M% S7 Z" a- f
所谓指令,就是告诉jsp引擎(容器当中,负责- G* q. g" u$ G0 h8 k
将.jsp文件转换成.java文件,并在运行时,. x6 Y/ E: H* @3 u1 P
为jsp提供一些 辅助支持的模块),在将.jsp
3 ~$ |+ I" d, E( R! E& J 文件转换成.java文件时,做一些额外的处理。
+ `' M4 R) K) ~ 语法:/ k/ p l; z3 g O
<%@ 指令名 属性名=属性值%>
" n3 n7 [. H5 d* Z page指令! T0 F/ _3 c9 U. ^* U
import属性:用于导包。5 _) }2 ^! N8 Z& G6 k5 V
比如$ a; S) z* v2 m/ ^2 I$ ]0 ~
<%@page import="java.util.*,java.text.*"%>) I9 b% c# c2 s
contentType属性:等价于
" ~& i9 b8 C6 Q9 r2 p1 O response.setContentType();) C6 \! p- }& \9 T8 b. }8 ^
pageEncoding属性:告诉jsp引擎,.jsp文件3 e$ B+ u- B" m6 P
保存时的编码。) M1 c0 [6 k$ @7 k& y
include指令( {6 u. D; ~ m$ \9 l$ Z! M; y
file属性
' ~$ j( s( ^+ h+ l( \& X* B8 r 告诉jsp引擎,在将.jsp文件转换成6 h: b' D0 D* T1 A& _
.java文件时,在指令所在的位置,插入4 ^6 K, m7 {2 A1 _% a2 z) y: G) K& w
file属性所指定的文件中的内容。
; b2 Z( e( N5 L* T v% E d,隐含对象
/ D* ?; P& Y7 S 所谓隐含对象,指的是在.jsp文件当中,不用 `9 j T% B6 ^
声明和创建该对象,就可以直接使用的对象。原# g9 h- [# f9 S6 F8 E6 }; N/ \
因是,.jsp文件对应的.java文件当中,已经自动8 S! \3 d- L/ f/ o; k0 |
生成了该对象的代码。' _" x" q* e+ |) r4 I! J; M$ i$ M
out
% p) B: w0 G& b; Z2 @: E request
- i' W9 \+ N. Y% K \% E response' H& E0 `$ @8 s* }
4).jsp文件如何转换成.java文件" o" u7 b5 r+ t0 Y' D4 s% O
a,html ----> 放到service()方法里,使用: y3 l5 x1 d |: @
out.write()输出。7 ^: S8 N0 d5 M* P0 f" [& X3 D# r4 x7 A! I
b,java代码片断 -> 放到service()方法里,照搬。
9 Q- ]) c- k S0 o B c,jsp表达式 ----> 放到service()方法里,使用
g7 C4 Z Y/ V! s out.print()输出。
4 h6 G: o) V7 q6 p2 G/ p 3 `$ a, V( w5 W3 q. i
' D9 K* ?: w& ?( [& j: _$ Z1、转发! ?/ [: d4 [5 |$ k5 F2 d. i
1)什么是转发?& y$ q( z7 ~1 X: ?) D
一个web组件(jsp/servlet)将未完成的处理, J1 N% j, l5 ]+ n$ R: a
转交给另一个web组件继续处理。转发的各个组# P. @& X: g5 u7 a
件会共享request和response对象。7 W. t0 Z2 z1 }9 \
2)如何转发?' W; f( z+ }+ F$ [
step1 先绑订数据* A3 I0 g/ }2 A' {9 `3 h& `
request.setAttribute(String name,# W+ r; i; |* O3 a% ?5 J5 g
Object obj);
& m9 P3 d( B$ r& \# |; x1 M" L 跟绑订相关的另外两个方法8 F1 g' J- U/ e: G
//如果name对应的值不存在,返回null。
/ n$ p& S$ x/ b Object request.getAttribute(String name);
1 w, n3 |: o+ `$ a6 A1 Q: a6 [ request.removeAttribute(String name);$ E- Y3 E, u' A' o
step2 获得转发器,转发。& c1 t7 | o& B
RequestDispatcher rd = : l' I0 W a; E9 [% Q* I1 x; {9 z$ `
request.getRequestDispatcher(String uri);
( b; J3 K5 |& A6 s/ B rd.forward(request,response);+ @# }; @+ o% x* Z
3)编程中要注意的问题
" y$ u P! T" H3 D! | 转发之前,不能够执行out.close或者out.flush。: V4 K- z* ^7 i! x. I9 s) U
转发之前,会将response中缓存的数据先清空。
* x! M# h5 c, I, ?) U9 c 4)转发的特点0 c2 T, Q. F$ Y' T
a,转发的目的地只能是同一个应用内部的某个组件。
2 m6 N6 r" P. X) H b,转发之后,浏览器地址栏的地址没有变化。5 D8 `# K. ^9 K, p! K, E
c,转发所涉及的各个组件可以共享同一个request,
5 x; j5 E( n# V% H$ a: o response对象。! S, u- H0 e" J9 \ s: m5 z
思考:
/ F7 Y5 A9 b5 `( F 转发与重定向的区别。% y4 ^ b6 R7 g' m5 j/ v6 a3 h
2、表单中文问题
) k, C; D7 z- u4 p7 w step1 jsp文件,要添加* z! T& N1 U3 A+ f3 J2 Y! b6 u
<%@page pageEncoding="utf-8" ! G1 `% Y& T' n1 s8 v& w8 k
contentType="text/html;charset=utf-8"%>6 Q: p# ^( n5 ]0 v
表单设置method="post"。
( O( Y5 B0 h2 k7 g1 V- ~ step2 在servlet类当中,添加
' R f8 s0 {2 `; o request.setCharacterEncoding("utf-8");
2 F5 s6 M& M. d( K7 Q8 n" n 2 @: i! G8 E0 O6 a
step3 如果要访问数据库:
3 B! X; {! K5 W% p% ]: j a,保证数据库能够正常地保存中文。
% w: i, P) o6 _ 对于mysql
- A- y* Y+ z( f9 Y' Q0 ` create database dbname
% d; k5 `( S- B7 v3 j3 z$ S. V) h. G default character set utf8;( k' @( c4 s, T0 n$ J
b,使用jdbc访问数据库时,必须要保证
$ u2 o8 I8 ` O8 Y, J! l; v3 m jdbc驱动程序能够识别数据库中保存
$ B" c. O! \$ N( E& m9 ]4 v5 q. R: } 数据的编码。, V6 K. h' S( n1 s+ \9 W
jdbc:mysql://localhost:3306/jd1109db2?6 k/ g/ w0 H/ Z" G6 ]# ^5 W6 S
useUnicode=true&characterEncoding=utf8
, ~! h8 A( M% r( G7 g
# a* y+ k+ o H' M' i4 A3、路径问题2 y! ^# \- N2 O% L
链接地址、表单提交、重定向、转发的路径应该% c' Z, ^$ w: n, e9 m% |* |% `. U
如何写?
. R0 _+ ?/ E0 ~' d g <a href=""></a>/ P( q5 X" I" _; o
<form action="">2 E# w' Y X( w& y8 v% `7 o& h
response.sendRedirect("");
- S9 h9 Z9 K k9 j: m getRequestDispatcher("");
: f) |. f& C# M6 b. y' H. | a,相对路径与绝对路径
- X M# [6 G) i+ y3 o 相对路径:不以"/"开头的路径,比如:
( c& ~" j4 [1 D- U <a href="del.do"></a>1 h6 I. z$ Z$ k' z6 O0 {5 N6 d) G
绝对路径: 以"/"开头的路径,比如:. M! y- l+ [$ H+ |
<a href="/appname/del.do"></a>8 Z5 Z" |6 J, l0 ~# G9 A) H
b,怎样写绝对路径?
2 Y# V( ^, U0 c6 ]. S 链接、表单提交、重定向,绝对路径要从7 ~! S% K( h" `# s# k8 c) _. e, k
应用名开始写。$ r( A4 z- z* ^( V% D, c0 s$ W
转发要从应用名之后开始写。
6 p$ M* v; x/ s$ y7 ^$ L //返回应用名,比如返回"/web05";
- [, E; I5 }2 z4 \ String request.getContextPath();
! \2 ^+ J+ y' r3 j4 Y9 f+ Q+ |- |% A0 m
|
|