|
该用户从未签到
|
java server page(java服务器端页面技术)。+ s& N9 ~% x5 I* \& y" _
是sun公司制订的一种服务器端动态页面生成技术的
: U. q0 ^4 k- f% n) y4 H- _规范。
/ j6 q6 V, |7 l x9 h 因为直接使用servlet生成页面,如果页面比较复杂,5 a, w% K* ]- H7 G! w
则代码过于繁琐,并且难以维护。所以,对于比较复杂& h6 c) p) d: S
的页面,使用jsp来编写,更容易编写和维护。
4 d9 `9 p7 S1 c0 O/ d0 J 2)如何写一个jsp文件。* S! H, \3 ?" v
写一个以.jsp为后缀的文件,然后,在该文件当中,
0 Q# [" x( O/ |5 ]9 y3 q9 ?添加html和java代码。编写完成之后,不需要编译,当
' d) E* b ^" g客户端请求访问某个.jsp文件,则服务器会自动将6 w8 _- n0 u: f+ N% ?
.jsp文件转换成一个.java文件(该.java文件其实是一个4 W d" ]' g7 f0 c0 T) @
servlet)。" b7 C6 A. i+ l# c4 c# Y
3)jsp文件的组成; W9 P# w3 \$ m8 z- k
a,html(包括css,javascript):1 ?2 c/ F C1 H9 [! i# `- p( X; P
直接写在.jsp文件里即可。$ Y2 L/ ^4 }/ C
b,java代码:# a" G0 A( l3 ] m! V% d4 L
第一种形式 java代码片断
& N" U2 ]( K' E& t! @ 语法:9 Z# x! L+ [+ I/ H
<% java代码 %>5 d, n1 g. t9 x) D3 f! x
第二种形式 jsp表达式
8 a* J* D; B* P5 b. q, c 语法:# @' n" d9 z4 B* `) N/ o' ]9 D) w, {
<%= java表达式%>9 }4 S/ E0 ?8 d" [& h m
c,指令:
" q3 m5 Q8 j* {9 H, y" G 所谓指令,就是告诉jsp引擎(容器当中,负责
1 S' i% U$ m0 T 将.jsp文件转换成.java文件,并在运行时,: {4 v1 E1 c; E" ?. Y9 {0 R
为jsp提供一些 辅助支持的模块),在将.jsp
2 q0 i9 W+ V( w. K7 S- r3 h 文件转换成.java文件时,做一些额外的处理。
% [+ _8 t. t8 c8 H! U 语法:
1 ]* H3 ~ l5 d <%@ 指令名 属性名=属性值%>& B9 j- q' B/ C' s( D) U
page指令
3 y% w, [( m) {9 t6 A- X import属性:用于导包。
0 ^ |, @% k* y: O% f Z 比如3 f( y) r* l0 t& O4 h
<%@page import="java.util.*,java.text.*"%>
|$ l( n: |1 e1 y- D contentType属性:等价于% H5 [* p% u9 h+ u% O
response.setContentType();
6 L- _& B0 s0 y% \" x pageEncoding属性:告诉jsp引擎,.jsp文件
" K$ f5 Y" K9 r: R 保存时的编码。% m5 }1 k; T- E3 p1 I0 [
include指令7 ~/ {/ j: x# N
file属性
8 m+ @- e$ p2 h4 C+ _4 |! t4 k 告诉jsp引擎,在将.jsp文件转换成
8 h" }" s- y6 M4 N9 o .java文件时,在指令所在的位置,插入! @8 g3 f( y6 G+ V7 Q7 F
file属性所指定的文件中的内容。# k' c& P4 y* F. C l
d,隐含对象# v2 {) `8 ^7 F# G4 M+ k! Q
所谓隐含对象,指的是在.jsp文件当中,不用
: `, I8 _- A, I* G4 g 声明和创建该对象,就可以直接使用的对象。原
9 N1 U$ E6 s. k/ s 因是,.jsp文件对应的.java文件当中,已经自动
, S( j, x2 e* P3 w) _ 生成了该对象的代码。
0 l% g: g3 U9 K& V) K" { out
7 T0 ]$ v7 k: M: u* N request! q6 W) t! C. ~
response8 Q& }$ {0 V, B# H
4).jsp文件如何转换成.java文件1 |2 i, ]: Q% x9 l0 _" z
a,html ----> 放到service()方法里,使用
! l* K6 j/ J) w: F8 Y1 X6 \) ? out.write()输出。0 \! O# m2 ]) {7 \" R
b,java代码片断 -> 放到service()方法里,照搬。
; m O% ]( z) I) F6 ` c,jsp表达式 ----> 放到service()方法里,使用
0 `, @* d- C4 p' w8 G/ g* I' M out.print()输出。; L) A2 {/ W# b! V. z# s* t! B
q, o* i( {* s
( E4 B2 y- W \3 e1、转发
. L% v j& n" _* r- p) b8 u' q 1)什么是转发?% f* ^1 r6 B+ }: r1 k1 A( `9 V
一个web组件(jsp/servlet)将未完成的处理, `% T' o/ @1 h% h. V
转交给另一个web组件继续处理。转发的各个组1 B3 g3 K) `& J1 j6 \5 f, L8 }
件会共享request和response对象。& g, x$ r5 n- j8 z+ M% l
2)如何转发?$ M$ i) h# l% ?% S
step1 先绑订数据4 O+ ?- t E; N' V! W# i* A1 f8 m
request.setAttribute(String name,5 Q( {6 W% ^3 J& M0 N9 N
Object obj);3 b. [3 k* c: M% C. I( @( D+ N9 h0 w
跟绑订相关的另外两个方法+ j) c: c$ W1 N$ z- d" H- o
//如果name对应的值不存在,返回null。/ j) a! t4 A" P+ }2 B6 V6 ?# Q
Object request.getAttribute(String name);. N: ^$ l% Z9 e) x
request.removeAttribute(String name);' u- A5 I3 p2 z; ^4 ` ~& [
step2 获得转发器,转发。
; v9 v' l+ G3 X0 n1 w1 _ RequestDispatcher rd =
0 m R* F. u2 L3 o$ T7 V$ ^ request.getRequestDispatcher(String uri);
1 D7 S- B( [* a1 } rd.forward(request,response);
0 g8 z: k: A7 H2 H0 L 3)编程中要注意的问题" g! m4 P6 l |6 K8 w% S- q
转发之前,不能够执行out.close或者out.flush。% z3 I3 r% I3 j0 e8 ~. ?" Z. I
转发之前,会将response中缓存的数据先清空。
' f# g8 c; z. V" Z" @0 { 4)转发的特点
" X7 A( [; B4 V* y. P" h a,转发的目的地只能是同一个应用内部的某个组件。
, x! e4 f/ R* Q, V0 R. c b,转发之后,浏览器地址栏的地址没有变化。
2 r& S2 e+ b8 K c,转发所涉及的各个组件可以共享同一个request,+ ^3 _% Z( Y/ u3 }4 X( [. ~
response对象。
* i/ _1 @! c6 w( M 思考:
) o& K' m$ h* @ [; _" f 转发与重定向的区别。
* y7 z* A' e" ?4 v8 }0 h2、表单中文问题
' Q" H$ a: g" L* V+ I" b+ F0 ?6 z step1 jsp文件,要添加) q& B! _! n" V# u T
<%@page pageEncoding="utf-8" - R' g3 w$ U8 K* d# z
contentType="text/html;charset=utf-8"%>6 E. T6 X+ |/ O$ f
表单设置method="post"。4 w: I4 E7 i" a# W* z/ X9 B
step2 在servlet类当中,添加0 l% v. A7 `+ a& X$ u; r1 G
request.setCharacterEncoding("utf-8");
- o% q! `$ f# u6 E
$ h2 }4 O, Y4 ~, s step3 如果要访问数据库:; g' o$ z( b- i! l
a,保证数据库能够正常地保存中文。
" T2 b7 `# z% B& ]# f 对于mysql; i6 W, w" ?: Z; P
create database dbname
& ~& \$ q' s5 Y+ ]: z' ~5 A default character set utf8;1 j) i9 o, j# C
b,使用jdbc访问数据库时,必须要保证
. E- \' ?8 s. V. w0 a- ^+ Z% @ jdbc驱动程序能够识别数据库中保存% V: Q& a$ t" N2 P( O
数据的编码。4 P# w& T' u0 H- L, K. |" s; q( u
jdbc:mysql://localhost:3306/jd1109db2?6 F- @5 T+ V" b
useUnicode=true&characterEncoding=utf80 Y5 @1 B2 v4 \7 |- p
' y" N: @ B% U# i2 L4 E/ T2 r
3、路径问题6 P% b/ ^+ r* a
链接地址、表单提交、重定向、转发的路径应该
9 T6 G- }% a' O8 [如何写?. \& z7 O! e7 ]: Y( O
<a href=""></a>3 E/ M( C/ X: i# s
<form action="">$ h. ^& ?2 v- A. d1 d. x( } m# X
response.sendRedirect("");1 l2 X- L: `9 ]6 f& y; }9 j/ v
getRequestDispatcher("");
. o5 _, f6 c- v9 a9 o3 J a,相对路径与绝对路径4 J9 |8 u9 s" F) h( V) ]
相对路径:不以"/"开头的路径,比如:
5 B- o- P* z z0 b% x& r <a href="del.do"></a>5 v( M6 t+ a( w. a
绝对路径: 以"/"开头的路径,比如:# G9 h1 q. T' |2 o4 |! c# F
<a href="/appname/del.do"></a>
, V6 N& B/ V9 ~( N b,怎样写绝对路径?6 w' w7 h6 R( h5 Q# \, [# Q
链接、表单提交、重定向,绝对路径要从4 E+ n& o( V7 m. b
应用名开始写。/ j$ |* Q1 u* f+ _0 j
转发要从应用名之后开始写。
, F/ J/ t8 e3 c2 X //返回应用名,比如返回"/web05";
' d# o4 F. u- U- ^" e7 H String request.getContextPath();+ b- T9 c4 j5 t+ k8 ~. h8 z6 K5 V" A
" t# H" Z8 P% r
|
|