该用户从未签到
|
java server page(java服务器端页面技术)。+ F; K' |6 e' e% F* d3 a# B
是sun公司制订的一种服务器端动态页面生成技术的
: a6 Q, a5 k/ x ^+ Y! D规范。
" S7 \1 z2 f) E# F2 k/ y 因为直接使用servlet生成页面,如果页面比较复杂,
+ d1 v1 d" f4 C! w则代码过于繁琐,并且难以维护。所以,对于比较复杂' i5 o" U; I' X: U0 z
的页面,使用jsp来编写,更容易编写和维护。
/ e2 R8 M9 L/ G1 B0 V& B0 j, Q 2)如何写一个jsp文件。
7 u, j2 { c8 T# I3 ?+ A ^ 写一个以.jsp为后缀的文件,然后,在该文件当中, p& q# w7 i7 L/ s( h1 k
添加html和java代码。编写完成之后,不需要编译,当
7 r8 R w- }) J2 g4 t4 ]客户端请求访问某个.jsp文件,则服务器会自动将, I+ I% W# ?9 ^. M. L$ j
.jsp文件转换成一个.java文件(该.java文件其实是一个& K1 Q2 B. D1 c6 b9 M
servlet)。
* a+ D! d \. ?( \. m 3)jsp文件的组成
4 A$ v" X2 y( o/ j; ? a,html(包括css,javascript):
- v1 }- ~* i k# J 直接写在.jsp文件里即可。
6 `0 [2 k8 D. q3 w' y5 Y b,java代码:+ }% k5 w. p9 A
第一种形式 java代码片断2 R# S: x5 J& g/ c( l P
语法:# @% `# w& O% Q- A
<% java代码 %>
9 N8 Y- K* V( ~# g: |; {7 j 第二种形式 jsp表达式
) n( e& W/ {8 K) n( {$ n$ Q 语法:) H3 A2 Z, }; Z; T5 @. R5 z* q
<%= java表达式%>0 p, Q/ n( A2 |% b8 G. ?
c,指令:, D. x( j2 I) `8 L' v; @( j! ~0 x4 X
所谓指令,就是告诉jsp引擎(容器当中,负责 G! E& @: X- g0 h% W0 s& E
将.jsp文件转换成.java文件,并在运行时,
w0 w! N* e% m( f+ s$ G 为jsp提供一些 辅助支持的模块),在将.jsp! q; v% n5 q! i- q+ R
文件转换成.java文件时,做一些额外的处理。: _8 y Z( y- {, L7 J9 `: }
语法:/ @% X' e; a7 }! i
<%@ 指令名 属性名=属性值%>+ w! Y8 F6 f. ?/ Q; ]. h5 y
page指令( ?9 N" v5 l& L) Z% X1 Y
import属性:用于导包。, b, M* o; T" m
比如% X3 N$ ?$ b' r8 l
<%@page import="java.util.*,java.text.*"%>
( S, u+ n( t5 J4 o( d9 T R contentType属性:等价于
I2 r5 h6 w- G response.setContentType();) c# b; i1 O% V( m3 X
pageEncoding属性:告诉jsp引擎,.jsp文件5 ~+ V/ u7 K& K' l) R, T+ ?! y( [
保存时的编码。% Z, g* z7 l+ c3 P; s# `1 }, a
include指令
4 L5 }2 `$ ?) g4 i& D, V file属性
1 @/ R j5 C) V: D* c 告诉jsp引擎,在将.jsp文件转换成' F3 D0 A& Y( [/ @& j
.java文件时,在指令所在的位置,插入! T9 I0 R: w& K: ~7 j
file属性所指定的文件中的内容。' p& U# a5 r) J. K
d,隐含对象
/ c1 X7 \% P' @ J9 {+ j1 { 所谓隐含对象,指的是在.jsp文件当中,不用
5 I. ~4 m( r& P 声明和创建该对象,就可以直接使用的对象。原
6 F, E5 t+ H; e: s8 h/ f9 s+ ?, l 因是,.jsp文件对应的.java文件当中,已经自动
' w7 w' |. N! r* h8 s 生成了该对象的代码。
, o( y* |& I" b F0 | out
$ k1 k! |4 H, E* z- V# U/ Z request, |5 T& J7 B) h& O% H' b: X
response
) f7 y# P" l. v 4).jsp文件如何转换成.java文件, J6 {( ?9 _* R5 a, J0 g
a,html ----> 放到service()方法里,使用
" |6 l. g5 K5 o( q- f' K out.write()输出。
3 @' J; y7 T% e6 ?" H! Y b,java代码片断 -> 放到service()方法里,照搬。
0 H1 A# M- n1 I6 R c,jsp表达式 ----> 放到service()方法里,使用0 k, d4 ~, ^; G8 \
out.print()输出。
' |" F* Z$ W8 \( ?
+ j: P* @6 w9 T4 i, _
- R5 ]8 n! j1 ?, t) D1、转发3 L/ K, n' [, w& B7 I9 Q
1)什么是转发?4 E" |" |$ g3 g. Q, R' Y5 i
一个web组件(jsp/servlet)将未完成的处理
4 D0 J# @5 K% ?$ M, d 转交给另一个web组件继续处理。转发的各个组$ d4 k5 `& U2 {& D- R
件会共享request和response对象。. ?+ g q+ b, V7 m7 C r/ B
2)如何转发?/ H5 ^2 ?$ L+ Q
step1 先绑订数据$ ~$ ^7 }0 l" a+ h2 q* W0 F
request.setAttribute(String name,
4 d0 G6 \, s. e Object obj);
) w' M b+ a m+ ~+ Q+ I 跟绑订相关的另外两个方法
" u1 X7 H( Q0 \! ]8 O) E" Y //如果name对应的值不存在,返回null。
' Y9 `2 R$ B1 Z3 P Object request.getAttribute(String name);
; p6 ]9 ]$ F/ y: O1 p# V' \ request.removeAttribute(String name);
- Q, } J; D* V0 o step2 获得转发器,转发。
; A: @! r9 r; {; g0 C" \ RequestDispatcher rd =
1 Q Z5 x# X( c4 m, k4 a/ C request.getRequestDispatcher(String uri);
7 W9 e4 \' b! c# ?7 k' H rd.forward(request,response);
1 S3 }' @! B2 ]+ z k 3)编程中要注意的问题6 W5 ^, N4 h7 l9 e
转发之前,不能够执行out.close或者out.flush。# e- M, _4 ^; K4 B- z* ]) E
转发之前,会将response中缓存的数据先清空。 1 o0 f! I* R" v8 \
4)转发的特点
& }& I5 j& n _ a,转发的目的地只能是同一个应用内部的某个组件。1 s/ q: m3 ?$ z, B9 h1 r, ]
b,转发之后,浏览器地址栏的地址没有变化。9 g! t0 t# q) s. v
c,转发所涉及的各个组件可以共享同一个request,
3 k3 Y$ R) f1 u8 M0 K9 v response对象。
1 P; B" \. k- P' d: R3 F: U 思考:
& L% t3 r1 B; P9 g; [5 O# S1 h+ E 转发与重定向的区别。5 Y" ? [3 t1 w7 ^; u
2、表单中文问题
+ i: a. N7 U1 ~4 _) H0 R. V step1 jsp文件,要添加& ?2 b+ J" H. J( ~$ l+ b9 I0 H8 t0 Y
<%@page pageEncoding="utf-8"
8 P% T$ N( A; x6 W2 l8 F! U contentType="text/html;charset=utf-8"%>9 I/ X. r- n3 r; h; \" Z7 y
表单设置method="post"。
* `- E6 _/ f/ {3 `- F: X' A step2 在servlet类当中,添加
2 j% N2 l# @1 u" c' z+ B. g( F request.setCharacterEncoding("utf-8");6 L' h& `) }) M' k& @1 {
' Y: g1 u' r# k+ f step3 如果要访问数据库:2 ~; T) R5 `1 p" {/ G
a,保证数据库能够正常地保存中文。
6 ?, T' [$ _8 M1 `5 Y6 g6 ? 对于mysql
3 j5 u' e1 R/ m" ^/ ~) l create database dbname
6 g6 i4 Y7 H& ?6 h4 O( C' j default character set utf8;8 ^- d0 B$ p+ G. b- Y
b,使用jdbc访问数据库时,必须要保证
- ]: I, `" _2 ], m/ c jdbc驱动程序能够识别数据库中保存
! N1 K% d, p3 a+ B0 l 数据的编码。! W" q) R* `/ s4 a8 g/ n3 |
jdbc:mysql://localhost:3306/jd1109db2?
G [0 D% f9 ^9 O8 r( f, y- E useUnicode=true&characterEncoding=utf8$ o0 k% D3 h, S# o
& k# p8 D6 M) }6 H7 B) d3、路径问题8 p& u2 u1 M2 `" K* x/ `- b1 f
链接地址、表单提交、重定向、转发的路径应该
% ~; B, @2 k. t! z1 }# E: ^8 _$ D4 f如何写?/ z+ Q, d+ D! n8 H
<a href=""></a>
. ` i6 k# O8 |% e1 j% G D <form action="">
1 N" L0 t5 C( a4 V- s response.sendRedirect("");% |; `- k a8 I5 @2 ^+ {
getRequestDispatcher("");2 r2 Z* p S/ }/ J5 V
a,相对路径与绝对路径1 M$ d" a& }7 u7 S* V' V+ H
相对路径:不以"/"开头的路径,比如:$ b7 n# D# K% a2 K
<a href="del.do"></a>. m4 F* h8 s" ^1 ?" e/ I0 F8 q
绝对路径: 以"/"开头的路径,比如:
( T3 {( [" [) x0 }% M* H <a href="/appname/del.do"></a>
' Q L) q1 ~" f9 v. E# m6 B b,怎样写绝对路径?& ?, h# M8 ?! B; u. D8 q% c2 |
链接、表单提交、重定向,绝对路径要从& u# a/ ~5 f7 H1 R9 k8 Z9 U
应用名开始写。
( C. @2 }( E* ]9 \ 转发要从应用名之后开始写。
' n3 e$ e+ F6 ~! A- q+ D //返回应用名,比如返回"/web05";
/ c. y$ \$ p a, W4 w7 f String request.getContextPath();, V; G4 R% Z5 L. ]; V
5 N" I+ s: P/ _' K |
|