该用户从未签到
|
java server page(java服务器端页面技术)。
2 {/ Y) j; n/ A6 C0 i: w 是sun公司制订的一种服务器端动态页面生成技术的
, K. s8 S9 T. d- o5 h8 T规范。$ s' h5 s2 S. D! {5 [
因为直接使用servlet生成页面,如果页面比较复杂," ]- Y! p5 u4 T/ y
则代码过于繁琐,并且难以维护。所以,对于比较复杂; ] B/ p* l: ^9 r
的页面,使用jsp来编写,更容易编写和维护。
% ]$ o6 X" F" A1 N! r 2)如何写一个jsp文件。" r% [ Q2 E+ |9 U2 V
写一个以.jsp为后缀的文件,然后,在该文件当中,) E0 m; z" }/ g1 U: j: s# T& f
添加html和java代码。编写完成之后,不需要编译,当+ U5 C+ b# ~. ?
客户端请求访问某个.jsp文件,则服务器会自动将
2 y( F: z, v4 Q8 I$ A6 w.jsp文件转换成一个.java文件(该.java文件其实是一个
) B3 ?2 D5 W% Vservlet)。, }8 {; I( ?* f. A
3)jsp文件的组成6 Z7 ?6 j; _6 W+ a# |( Z" L9 y' M
a,html(包括css,javascript):
. H J# j, g ? 直接写在.jsp文件里即可。
% L# g: \2 Y$ B! b b,java代码:& Z) e6 Z( h8 U5 c5 Y. q
第一种形式 java代码片断
2 q* ]* Q3 g9 ]$ T8 \9 W 语法: z: f+ U! _6 ~( L2 U6 m/ J" w
<% java代码 %>& t5 \# c ^( W( v6 N
第二种形式 jsp表达式, C' o9 i: A- u" N4 v& L+ T" Z
语法:
6 b3 f7 }$ w$ o3 h1 K | <%= java表达式%>( c4 p$ J5 x; o, P
c,指令:9 h& P: K$ f- V
所谓指令,就是告诉jsp引擎(容器当中,负责" p+ |* ^* n' X+ A7 N8 q6 T. _, K
将.jsp文件转换成.java文件,并在运行时,
* F) a/ z! h0 ]& J% h 为jsp提供一些 辅助支持的模块),在将.jsp ^' p" K+ z8 q" _7 ]
文件转换成.java文件时,做一些额外的处理。( B- j( P) Z! V. ^9 K
语法:
5 i( s: Q8 u$ Z7 o <%@ 指令名 属性名=属性值%>% J" W' |0 v& u' F( y X- f0 `+ ]
page指令
# N2 Q: C) M" p import属性:用于导包。
3 s$ B. x$ g% y/ A" ] 比如4 W" _4 ^1 l+ K# y
<%@page import="java.util.*,java.text.*"%>0 R7 n* I4 e' a9 w) R, }+ u
contentType属性:等价于
3 K! h# e% c1 p response.setContentType();* b9 C! o [- }, L
pageEncoding属性:告诉jsp引擎,.jsp文件6 D! h4 P7 E, V0 l# H1 @/ z
保存时的编码。
4 m% H1 s. T9 Y& N5 u% R include指令: R6 t$ c5 J4 X/ o9 h$ c9 E
file属性
; C; I5 ?( t& H0 z0 q 告诉jsp引擎,在将.jsp文件转换成; Q. @/ A% [' V6 M U
.java文件时,在指令所在的位置,插入, |5 ?5 H* V+ u: H
file属性所指定的文件中的内容。5 f- C# G, a4 {- V6 s2 W
d,隐含对象
+ R7 ]0 z# s" j) v% n% B( s 所谓隐含对象,指的是在.jsp文件当中,不用8 ~1 W: l" S( w! f6 ?
声明和创建该对象,就可以直接使用的对象。原2 P/ d! s1 K1 |0 A& n; U9 Q
因是,.jsp文件对应的.java文件当中,已经自动
; N( ^5 ]( H$ M. S' `4 K 生成了该对象的代码。
- G3 M$ ~6 o# b out
- k n' r( q( v8 k- t- r request
# S4 W; K$ g1 L* c response: Y; S* V0 Z# l3 G( D
4).jsp文件如何转换成.java文件
' H9 d0 I/ h7 S0 B" V7 r/ { a,html ----> 放到service()方法里,使用
! u0 j; d- i4 G. C( c! k% \0 q out.write()输出。
n7 k% F9 ]3 D) i b,java代码片断 -> 放到service()方法里,照搬。
! U& ?& W: M, c2 _1 N/ ~3 w c,jsp表达式 ----> 放到service()方法里,使用6 J* |% ]: a# T! S* f
out.print()输出。- ]" p& X( w" a/ K) [& U2 a( m
& W3 H/ r4 m' x) s/ }7 s + P" @; {8 D& o2 V; f
1、转发& G# [9 ]4 ?4 Q# ?2 S
1)什么是转发?9 `$ x" W! d/ {/ d( }& f
一个web组件(jsp/servlet)将未完成的处理1 ?/ F0 @) j+ j& o0 Y4 D. q4 P. F
转交给另一个web组件继续处理。转发的各个组
; g. l6 Y/ ~* j7 C 件会共享request和response对象。9 J* I) I+ G! q9 f/ z
2)如何转发?) V$ {. e2 r3 ~) u
step1 先绑订数据0 J* P; ]. g4 s- ~1 F0 o& T
request.setAttribute(String name,
6 F5 ]# ?' y1 c+ V, m, | Object obj);
( N1 G% H9 j! T" c4 X 跟绑订相关的另外两个方法
# t/ y i) g- G+ R9 Q' K2 C //如果name对应的值不存在,返回null。1 T/ J" f! j& p, K
Object request.getAttribute(String name);
. S4 N2 Z0 W, B, C/ Q request.removeAttribute(String name);: D2 N0 k) q: d: n& Y
step2 获得转发器,转发。4 g; ~) r& c1 H
RequestDispatcher rd = 7 k% _$ m# [0 p3 k
request.getRequestDispatcher(String uri);% j4 b' @# Y+ v
rd.forward(request,response);( B' _" A2 }7 V7 ~1 e3 p
3)编程中要注意的问题4 l9 I+ [4 ]$ r% F& P/ r
转发之前,不能够执行out.close或者out.flush。
/ w: H/ K8 S, g2 P! s 转发之前,会将response中缓存的数据先清空。
1 o. n. Z& R) B+ O8 A 4)转发的特点
' I5 t, x) L ^: B a,转发的目的地只能是同一个应用内部的某个组件。
y/ D$ B! \9 k) ~6 M+ O2 |9 \$ k; p4 G b,转发之后,浏览器地址栏的地址没有变化。
+ B \% o# a% X8 q0 X c,转发所涉及的各个组件可以共享同一个request,
/ H" g* {3 ~4 Q: E response对象。& Q* o' h8 N! h" v% J
思考:2 L; w* Q) `! B& e7 _
转发与重定向的区别。1 B/ o5 p$ E) `4 ]
2、表单中文问题5 d! t8 J" E/ U6 L8 a2 z
step1 jsp文件,要添加
% z( Z2 p* @) Q B <%@page pageEncoding="utf-8" * Y, h; i3 ~$ A8 `2 [
contentType="text/html;charset=utf-8"%>4 J9 M8 }! }: h3 o
表单设置method="post"。
$ e& o, s. Q7 K% D step2 在servlet类当中,添加
h! s4 q9 s, H: s4 R request.setCharacterEncoding("utf-8");2 L$ P& \. ?1 l; m7 i
5 r4 a! c$ _! ?2 q" s7 k9 m step3 如果要访问数据库:" O" h& m/ ]/ S I
a,保证数据库能够正常地保存中文。
' [. M+ |* m7 W. b" q/ E* E 对于mysql
6 F$ F% b- ]' J& l$ n& L1 q% g% G create database dbname 1 k' f, X( h: l0 L0 l# A5 d
default character set utf8;; ]* E6 t* d, I& W' Q9 h! ~
b,使用jdbc访问数据库时,必须要保证
B2 h. H7 B1 P jdbc驱动程序能够识别数据库中保存. o( T( }$ D& \. K2 N
数据的编码。9 g5 E! ?6 e8 l. ?
jdbc:mysql://localhost:3306/jd1109db2? c) X& M" [3 j( N1 K$ i
useUnicode=true&characterEncoding=utf8
4 p/ z( v8 P2 R1 A+ s, `3 ]% d- R8 \$ J7 L6 p4 }
3、路径问题
5 U' U! x# Q9 v0 Z; s: Q 链接地址、表单提交、重定向、转发的路径应该
. ~ n7 E9 Z5 F% v) q! V如何写?
+ B) l# d! u! r* z$ O; z2 u: H <a href=""></a>' P( F f9 v4 u: N) N8 b
<form action="">- W% F( A2 A4 V( |
response.sendRedirect("");
* ]. \2 N2 X" g6 A0 ? getRequestDispatcher("");4 k- Z7 W& `4 W: @- K' e! Z% s. C
a,相对路径与绝对路径
. {" `" a& M5 I 相对路径:不以"/"开头的路径,比如:
% c1 E5 Z. e; U# c <a href="del.do"></a>
( V7 G9 `( p2 T6 [: D6 E$ K. i 绝对路径: 以"/"开头的路径,比如:
9 [4 W; L7 _* s6 R <a href="/appname/del.do"></a>% o" d( S) r- _# m; O9 C3 ^
b,怎样写绝对路径?9 A4 a4 b* B W' c3 N
链接、表单提交、重定向,绝对路径要从
7 V+ V- H( L: U0 v) F* p0 ?) x9 p; } 应用名开始写。% [% A, m9 L9 ^& f8 ]7 C
转发要从应用名之后开始写。( D, J+ ?& ] U$ F
//返回应用名,比如返回"/web05";* O) e' w8 ]8 ]; b) h
String request.getContextPath();
9 a" w @- U9 t8 ^9 T- |: s/ n, V" f+ z' z
|
|