|
该用户从未签到
|
java server page(java服务器端页面技术)。; M: J+ s+ G. p1 W: V2 v, q
是sun公司制订的一种服务器端动态页面生成技术的
; b; z, s4 i( e! {规范。! z# G3 l6 F" z7 {" {4 `
因为直接使用servlet生成页面,如果页面比较复杂,
3 @ |. l" `8 z7 Z则代码过于繁琐,并且难以维护。所以,对于比较复杂
. ~8 P% Z+ B" L- A, s5 ^的页面,使用jsp来编写,更容易编写和维护。
6 d7 @ T7 \+ T7 s7 S 2)如何写一个jsp文件。
3 h% d5 ~) z3 r* } E% s7 ~ v2 `4 Q 写一个以.jsp为后缀的文件,然后,在该文件当中,/ U3 L3 N! F9 v9 ~9 A4 Z# O8 ~
添加html和java代码。编写完成之后,不需要编译,当/ K$ c. s- T( R8 I" L/ e
客户端请求访问某个.jsp文件,则服务器会自动将
& d, W) a* t v. ?.jsp文件转换成一个.java文件(该.java文件其实是一个. K" q; Z8 W. J4 n9 n
servlet)。3 b8 l+ j' D% D/ E2 K5 u$ b
3)jsp文件的组成
7 W% Z E, D/ w6 G/ M ~' ] a,html(包括css,javascript):
) Q s& d, h, ^! v* z; K ~ 直接写在.jsp文件里即可。! Z( f: @5 u0 P
b,java代码:
: }$ F& \2 Y; n5 a, P' m7 a+ r! ~* B 第一种形式 java代码片断
- Q# }$ \& P+ v 语法:
: d2 z( q, W" ^% j5 v <% java代码 %>
* v+ J" ^+ D9 d. F. l# K 第二种形式 jsp表达式: Q6 X- b5 E: Z' L$ e8 ^
语法:% p X& ?8 R) _% j! c
<%= java表达式%>
+ u. ^! a& x+ Q/ F! Q1 ~: E c,指令:
5 W- K/ z [ I+ S 所谓指令,就是告诉jsp引擎(容器当中,负责2 Y, I& {# M$ P# A+ _8 I S/ j
将.jsp文件转换成.java文件,并在运行时,
$ p3 \' ?' f6 m 为jsp提供一些 辅助支持的模块),在将.jsp T% }* ~/ X. K( K: G Z: Y
文件转换成.java文件时,做一些额外的处理。
# P Z0 Q$ y# _: m! e0 f: T 语法:. | l& c/ r& D/ R/ A1 G1 ?4 U# T
<%@ 指令名 属性名=属性值%>8 K& W$ b) u x; [
page指令! m2 n, B' f6 K7 k, V
import属性:用于导包。
) I! g9 r6 S, [# ? 比如0 t; G2 [8 r/ i! Z
<%@page import="java.util.*,java.text.*"%>4 K+ ]( ^5 H# P1 a
contentType属性:等价于
3 _) U! }' J: d. f" c/ ^: _ response.setContentType();
1 F: [4 a# @6 v! ?' ~( n pageEncoding属性:告诉jsp引擎,.jsp文件
% g, M2 n$ Q9 m 保存时的编码。
+ q+ A# T, O b7 J include指令7 |! b8 _. t% X; O
file属性! n4 s' ~3 g' W) Y
告诉jsp引擎,在将.jsp文件转换成. x7 T6 f5 X/ H( x% M. Z
.java文件时,在指令所在的位置,插入
4 |9 e% `! {% R7 _! ^ file属性所指定的文件中的内容。: G" a7 n4 a$ J; L3 j4 N* [
d,隐含对象3 G9 c. t* U9 _# g
所谓隐含对象,指的是在.jsp文件当中,不用
4 X7 U1 R: i% Y' R6 ` 声明和创建该对象,就可以直接使用的对象。原% U4 g0 g- p+ t: [9 T" z1 @/ ]
因是,.jsp文件对应的.java文件当中,已经自动
: w# G9 X# r8 Q h& m$ j 生成了该对象的代码。
, m$ ^5 s/ t( [$ I) W out 6 f( J6 y2 R( A& _( ]3 H/ ]
request; f2 {2 k! B% S( @; V X9 {8 _
response: ?9 O- Y0 P* o( f
4).jsp文件如何转换成.java文件% J9 f2 ]! q; O: J* h9 f
a,html ----> 放到service()方法里,使用
! E; d6 |# e) C& p0 `: ]8 _! f out.write()输出。4 U( s9 b4 a7 B# H6 ]
b,java代码片断 -> 放到service()方法里,照搬。
* `/ [( C Q) {$ f1 T* d c,jsp表达式 ----> 放到service()方法里,使用- U+ i# |! E! F
out.print()输出。
: x- F* \0 y# E/ Q0 T7 z7 z
8 X/ D, C5 v; c
! E }# M8 ]# E1、转发
0 v! U, n! a" U0 T; x 1)什么是转发?
- q5 W* ]( p) j% v/ i* u 一个web组件(jsp/servlet)将未完成的处理
* O8 c1 A% R6 d ]: o% R* b 转交给另一个web组件继续处理。转发的各个组7 H. Z' B& n9 f$ i
件会共享request和response对象。. O9 `3 p3 }+ S* P c8 U( d- r2 [6 j$ D
2)如何转发? S: {) f, N5 `6 ^1 y1 t
step1 先绑订数据
I. Y2 `( D, B* J7 p. V" r ] request.setAttribute(String name,6 c& u* l/ A- q/ x- L1 J1 c
Object obj);9 Z- ]( R, J5 A
跟绑订相关的另外两个方法/ t) t5 p8 `( x! U: s4 G( `8 ]
//如果name对应的值不存在,返回null。
8 y! O( l, z4 P, \) W- Z0 P Object request.getAttribute(String name);
. |2 s% r' o) V" R, x request.removeAttribute(String name);5 G8 R, Y# W; L# I K$ {8 T
step2 获得转发器,转发。+ ]7 v( F1 O/ c- M6 N+ g
RequestDispatcher rd = 7 Y6 \; ~0 \5 J. M
request.getRequestDispatcher(String uri);. _7 X6 V& O: ?) g+ ^
rd.forward(request,response);
" o6 P) S8 a& L' E 3)编程中要注意的问题; S3 o2 o$ }( W3 o I+ c
转发之前,不能够执行out.close或者out.flush。7 T& |/ g% m7 V" Z1 s
转发之前,会将response中缓存的数据先清空。
; f# X% {' h7 V/ ^! B4 J 4)转发的特点
9 Q/ f" j! k" ^6 u x a,转发的目的地只能是同一个应用内部的某个组件。
" t: u; V( O0 ?9 @, i b,转发之后,浏览器地址栏的地址没有变化。$ S' z3 ?$ t X; i8 s
c,转发所涉及的各个组件可以共享同一个request,6 w7 f2 o! w y/ v
response对象。
. D6 g. f) J, N( P 思考:
0 t$ l) I- O8 ~% }! _ 转发与重定向的区别。8 Q: M5 y+ S$ ~, Z) u, B; a
2、表单中文问题
# I/ ?7 \4 {* \% E, Y3 P! x step1 jsp文件,要添加9 ]7 _) {/ |0 \; \
<%@page pageEncoding="utf-8"
6 z+ ~) ~6 d8 h o contentType="text/html;charset=utf-8"%>
8 t' ?2 ?) ^' l 表单设置method="post"。. d: X( D" k! o6 _; ]
step2 在servlet类当中,添加
3 q C* O' \& H. ^; @, o/ J request.setCharacterEncoding("utf-8");
9 k T( k+ M$ x& w : z4 g/ c4 A) w; v7 q/ r4 P) ^& K2 p
step3 如果要访问数据库:
" t! c" O g- }! l! I4 @) j a,保证数据库能够正常地保存中文。) N2 h( q k; ^* ~+ e3 @
对于mysql
& M+ _" T2 q% ~2 u/ i" P create database dbname
. l* V4 ]( G( A' w) w g default character set utf8;% O2 v7 n4 L% G4 v, k$ o j* n7 Y( }' O
b,使用jdbc访问数据库时,必须要保证
3 E* W# l3 Z) f. r2 S4 } jdbc驱动程序能够识别数据库中保存
& E( M. p6 [9 g J9 B. u 数据的编码。
2 r8 M- I1 u5 Z" [7 P1 F jdbc:mysql://localhost:3306/jd1109db2?7 l1 D( |' L- t# F$ ~; |; h- A
useUnicode=true&characterEncoding=utf8
3 v! L+ w e: I) C4 a
4 ^& p8 t& h) X6 j/ w3、路径问题
* R' J9 B- |+ g) U c 链接地址、表单提交、重定向、转发的路径应该
1 x, i- t- g) N5 ^如何写?$ h$ B) U/ {* _6 e( G
<a href=""></a>
& l$ ^8 A9 d8 j# L; ?$ B <form action="">
2 L# }! Y6 a8 [0 e$ K s response.sendRedirect("");/ j6 ~. m; s ]. m7 ^7 Q$ E
getRequestDispatcher("");/ |0 V, s& Z) G G- `' C
a,相对路径与绝对路径# @! q* @: F- Z
相对路径:不以"/"开头的路径,比如:4 n6 o% t# }! T: G% S
<a href="del.do"></a>
3 I8 \6 l7 k8 T9 u3 x0 y 绝对路径: 以"/"开头的路径,比如:9 ?" F2 V& N! g S' j/ n
<a href="/appname/del.do"></a>
+ o# {0 ?5 O/ z/ l% G I* ~6 r y b,怎样写绝对路径?
$ m. S" H5 M* f 链接、表单提交、重定向,绝对路径要从8 p* d6 d% K# U) M$ n& o: L9 N
应用名开始写。# {1 X7 U$ Z2 V4 p D @4 b
转发要从应用名之后开始写。- D' ]2 j( Y; C! j' I7 U$ H5 S
//返回应用名,比如返回"/web05";" q* r7 k, v. a
String request.getContextPath();3 J {- i* _! A3 O& s3 `
3 \) K- A U+ m |
|