该用户从未签到
|
java server page(java服务器端页面技术)。4 U O5 _2 w; N$ ]
是sun公司制订的一种服务器端动态页面生成技术的
H9 K8 B' x: A1 \6 F规范。1 j3 p* N6 @$ h8 B
因为直接使用servlet生成页面,如果页面比较复杂,# I) z; \( @% Y, G& z
则代码过于繁琐,并且难以维护。所以,对于比较复杂
% z) Y' }# K8 W. i的页面,使用jsp来编写,更容易编写和维护。5 o S3 ~+ O0 m% u+ Q0 I: a6 h
2)如何写一个jsp文件。
% n7 g* e0 o, y! ^6 { 写一个以.jsp为后缀的文件,然后,在该文件当中,
0 t# C# d$ u- K+ x添加html和java代码。编写完成之后,不需要编译,当
' s" s- \7 i- P! z7 E. e客户端请求访问某个.jsp文件,则服务器会自动将
* E J2 @9 E. s0 P2 s3 ?/ w.jsp文件转换成一个.java文件(该.java文件其实是一个& Y0 g/ [1 t+ @# m. Y8 L/ R; h
servlet)。+ M8 p6 Q$ e5 j* X* e' K$ c% y
3)jsp文件的组成
0 C9 e+ o1 B$ v, Q a,html(包括css,javascript):
, k( A4 |6 o, B ] 直接写在.jsp文件里即可。1 o, `% r% {: R* U
b,java代码:
2 k* @8 S) S$ a# v* i. y: u3 b- [ 第一种形式 java代码片断
. S. W3 `8 B: b; M: J2 f* j 语法:
2 v( Q5 m, @# L5 @. D0 G- _ <% java代码 %>
' r7 P: S3 j4 ~ S9 T" c5 | 第二种形式 jsp表达式7 w2 j1 K0 \7 x4 C+ k
语法:
2 T/ _6 ?* |' e6 E <%= java表达式%>+ N+ N: t! [4 W* h- p) |
c,指令:
2 P" ?! q3 x, c+ y5 D- i 所谓指令,就是告诉jsp引擎(容器当中,负责/ H% y- F' [2 V! {% N
将.jsp文件转换成.java文件,并在运行时,
Q- n# y! v' g 为jsp提供一些 辅助支持的模块),在将.jsp; _) T& x6 }0 d# e+ L
文件转换成.java文件时,做一些额外的处理。
' ?* Z6 K$ [! l# B# A( W 语法:
3 d3 G' D6 g+ o2 a8 p+ L <%@ 指令名 属性名=属性值%>
. A q3 a" Q; L4 S# g6 j/ P page指令 A/ d* o3 \' z: H3 D4 F
import属性:用于导包。
* P2 o3 n4 c& ~: ~ 比如; L- J" J0 T6 U( t5 A, b$ ]
<%@page import="java.util.*,java.text.*"%>/ D5 A2 x f; n! N) E
contentType属性:等价于9 ?' L9 {7 U. }8 x" T
response.setContentType();
7 {- s4 M0 a: m. g) V# W* Y) ]1 [- t pageEncoding属性:告诉jsp引擎,.jsp文件
4 w2 s2 c1 X4 h: m1 D 保存时的编码。
" o& \* ~" ?. s. g- x" | include指令
. a" o3 n( N& n) z i file属性
6 A( ?3 K& F* @* A. j" v 告诉jsp引擎,在将.jsp文件转换成1 d ~, f( h6 e, |" n/ ]
.java文件时,在指令所在的位置,插入
" E. _. L( ^( U; K file属性所指定的文件中的内容。
' b5 f9 E3 r$ ~1 F" I d,隐含对象9 O; q6 t( i( d, f6 `) f# |
所谓隐含对象,指的是在.jsp文件当中,不用: r) l! d" X/ Q" ^) X1 u- Q
声明和创建该对象,就可以直接使用的对象。原; t- e6 ~, `) N+ J
因是,.jsp文件对应的.java文件当中,已经自动
9 u" ^& w' H$ `5 V1 \7 q" ?/ b 生成了该对象的代码。 C m/ G6 K8 {: Q9 t1 Z. e
out 1 n+ p: w. l( l2 M! S
request
0 _$ V; u; d8 b/ M response( ^2 v6 j" ]3 q1 u2 ^
4).jsp文件如何转换成.java文件
( j- l; w% E: ^ a,html ----> 放到service()方法里,使用
2 E* L. U. C3 a. U4 y% X/ H6 | out.write()输出。
1 h4 S- a6 U' l b,java代码片断 -> 放到service()方法里,照搬。/ F( R- G; `- Q: k
c,jsp表达式 ----> 放到service()方法里,使用
P+ K, A8 v; H+ n+ t out.print()输出。6 K& t4 N$ D; F% r) F& b0 N
, G; }. J7 R" Q : S" q' c* i" V: P1 g! H |4 G
1、转发
4 F- G& i$ s" S' h1 s- x/ w 1)什么是转发?
1 M" @) q8 A: Z! t3 X 一个web组件(jsp/servlet)将未完成的处理
; X' u9 G1 q3 t# y 转交给另一个web组件继续处理。转发的各个组: s- X6 k' w; }- x
件会共享request和response对象。2 E) o& n) w! z
2)如何转发?$ J+ s% b2 B: W3 N& G/ b) O
step1 先绑订数据$ z. x( r" g, |
request.setAttribute(String name,/ H- \8 T9 z+ z9 @5 d+ H
Object obj);
. q/ ^! A( S }0 @0 f 跟绑订相关的另外两个方法/ n3 ]- l( @) P7 ^9 z
//如果name对应的值不存在,返回null。
' f' B) k$ f3 I" ?5 M Object request.getAttribute(String name);3 O9 m- V; m) m" l* y
request.removeAttribute(String name);
0 j% t5 U! d, E) m: k( O+ D, ?( @ step2 获得转发器,转发。/ r2 d2 h2 K% K4 a
RequestDispatcher rd =
' y4 Q! P/ B) D6 j1 u- c [0 c* g request.getRequestDispatcher(String uri);8 o+ G7 c) K, S: u1 B; @
rd.forward(request,response);
9 a e( ~+ z3 e4 D+ a. I 3)编程中要注意的问题. Q9 P/ t. S/ J7 N4 Q( Z8 t$ J
转发之前,不能够执行out.close或者out.flush。+ a$ j# Q' T) @) I$ R: r9 j
转发之前,会将response中缓存的数据先清空。 . l/ [$ d1 g- x8 t
4)转发的特点
* ~+ p+ r2 w8 X7 j) ^ a,转发的目的地只能是同一个应用内部的某个组件。' p5 o, O8 z! A4 K# R
b,转发之后,浏览器地址栏的地址没有变化。
: F& Q. \. y& S3 X, t+ V7 c$ c c,转发所涉及的各个组件可以共享同一个request,& u' Z+ L' J, t5 J4 F$ I
response对象。
! G0 E" T& w9 n/ e% H- y8 i4 Y 思考:5 p. v0 ^! R/ ~8 E
转发与重定向的区别。+ H6 T# [7 b. X0 C% D
2、表单中文问题1 {- [+ z) g) C; B: a! O( X5 J
step1 jsp文件,要添加9 S( L% _" I+ W: [
<%@page pageEncoding="utf-8"
1 H2 a& J1 E/ l3 Y contentType="text/html;charset=utf-8"%>7 K2 x4 P# m( J3 `$ o7 p2 b
表单设置method="post"。
: i7 E( R0 l# g, s5 b& a step2 在servlet类当中,添加9 K( L7 \# ~: D6 y& X9 x7 }
request.setCharacterEncoding("utf-8");
) a+ W! L7 v- n# k2 a7 q : x9 B3 a. s6 L9 X# t
step3 如果要访问数据库:
. [: E! |5 A; m a,保证数据库能够正常地保存中文。
8 v5 T+ Y( M; v9 a, k. E5 e 对于mysql
- }7 ~" R; D& }8 ?, q# m create database dbname
+ Y5 h+ ~; z7 p# [- r default character set utf8;& I% C5 e/ x, {& `4 p9 C
b,使用jdbc访问数据库时,必须要保证
, @& A' y A6 B% ~1 H |' i jdbc驱动程序能够识别数据库中保存
; I* D- q1 ]6 Z2 s9 I& A 数据的编码。2 z! U1 t2 i/ H3 P+ y0 ^ B
jdbc:mysql://localhost:3306/jd1109db2?0 n- ^! F X- q) }3 w$ Q) Z* K
useUnicode=true&characterEncoding=utf8
8 V2 j" ?5 C) M+ X- | E% {; t0 U. }1 k! ?* g) {* D5 ^! D
3、路径问题
8 U5 o, a/ D- M- _1 Y2 c 链接地址、表单提交、重定向、转发的路径应该
* L' c/ s& T8 V$ R: V: i, C5 X如何写?
; M) _. l1 j( K; r <a href=""></a>
Y+ N- {) }9 b9 `% W <form action="">, n% O) ?2 l) w$ Z, z- K
response.sendRedirect("");
# P' V' s; {7 `8 \ getRequestDispatcher("");, M e' O+ Z6 g2 Z C( v
a,相对路径与绝对路径5 c# }, i0 M- w3 E1 T6 _
相对路径:不以"/"开头的路径,比如:+ M6 b! u) s# A# X2 n
<a href="del.do"></a>& X% x: |# h. G. O' ^( d/ X
绝对路径: 以"/"开头的路径,比如:
0 s/ O1 S# ]1 V( {7 Q1 p; T <a href="/appname/del.do"></a>- p+ s; M! g; @* ~% c( k/ L( d
b,怎样写绝对路径?
+ X/ N" {, c0 F9 k* S 链接、表单提交、重定向,绝对路径要从
1 ~1 Y+ c' }& Q! P3 H 应用名开始写。
f; Y( H7 R4 X( C" r! o P 转发要从应用名之后开始写。' J" h2 H p: @5 C, g
//返回应用名,比如返回"/web05";
3 D" U, \& B6 k. C: ^ String request.getContextPath();' s& A1 C* T; \+ F. H
' @$ c& |4 n4 x0 ]& G
|
|