该用户从未签到
|
java server page(java服务器端页面技术)。
) V* F% Z: ~, \5 a' d1 n 是sun公司制订的一种服务器端动态页面生成技术的
3 H: h& l: x8 M, @5 r7 o; |% ?+ u规范。3 w) H- q! z. F4 T5 Y
因为直接使用servlet生成页面,如果页面比较复杂,$ r$ b! r2 s. \. `( i
则代码过于繁琐,并且难以维护。所以,对于比较复杂! J2 l9 w9 X0 x& l5 l& H d
的页面,使用jsp来编写,更容易编写和维护。: P$ J. x' ?) E! D7 o* _5 y
2)如何写一个jsp文件。& L$ E/ E0 s- ?6 F0 B, n3 N& D
写一个以.jsp为后缀的文件,然后,在该文件当中,
, A3 C, j# b+ [4 a$ |7 Y6 `添加html和java代码。编写完成之后,不需要编译,当2 Y( P# q. g" U
客户端请求访问某个.jsp文件,则服务器会自动将
7 z* J2 ]( \8 a, ^; l.jsp文件转换成一个.java文件(该.java文件其实是一个
" n; v0 t# `" G/ l& m7 d+ q& Nservlet)。# [% i/ Q9 q/ A7 a
3)jsp文件的组成
5 U* d$ o8 Y: V! b* m5 V* ^8 y a,html(包括css,javascript):
8 l2 o/ F$ R( u+ L/ K4 W 直接写在.jsp文件里即可。6 j3 e- M3 Z$ s5 s
b,java代码:6 M3 w' V9 `, _2 P" o
第一种形式 java代码片断
& N' v, G' k( [% i3 V% Q { 语法:/ ]/ f1 P& Q. E4 D) k0 z
<% java代码 %>
. r. `: P1 i8 O! r7 W! s- ^ 第二种形式 jsp表达式 X8 r2 _2 |: p
语法:
; ^' @$ o6 e3 L# e% _# @3 B& y! p <%= java表达式%>
2 M( ?& j& d) h7 ?! v c,指令:7 H+ O* `5 |9 |6 a1 ] P
所谓指令,就是告诉jsp引擎(容器当中,负责! ^8 `$ Q7 {# f7 L: v) J0 w$ F
将.jsp文件转换成.java文件,并在运行时,5 w7 p( ?( L L& [& F* ^
为jsp提供一些 辅助支持的模块),在将.jsp
; G: Q& _3 o# ~8 K% |' L; ~ 文件转换成.java文件时,做一些额外的处理。
; H! R l7 v& s' L 语法:
7 F1 u5 d- I( q0 o <%@ 指令名 属性名=属性值%>2 x& F0 |- ]5 m6 t( m4 z$ ~ i
page指令3 S3 C/ T8 ?7 w( R, q2 Y4 G
import属性:用于导包。# f! y8 u" F& I% }; T. C2 |5 g
比如1 K9 `) }8 M/ P; T# o' y# u7 f
<%@page import="java.util.*,java.text.*"%>
& v9 T5 X3 X4 v7 m' J& A2 B6 Q; K# { f contentType属性:等价于
+ ]# w' n H, J( [" E. p+ I/ j L response.setContentType();
t9 n% a$ i) @% K pageEncoding属性:告诉jsp引擎,.jsp文件! O, x/ p$ u% c. D ~0 A' F! i
保存时的编码。# L \. V; h Q( g( k
include指令
/ I# A- l! h+ }% A& Z" E: t/ W file属性& F/ g% u9 \+ {! g3 f; P
告诉jsp引擎,在将.jsp文件转换成
" M8 Y) k0 x; c0 R .java文件时,在指令所在的位置,插入$ }! k K/ B$ @ o
file属性所指定的文件中的内容。
2 M8 D. g4 q$ U. o( a, A d,隐含对象
5 K& T5 N+ H+ n: z r( A 所谓隐含对象,指的是在.jsp文件当中,不用
, h6 p& W& W( R 声明和创建该对象,就可以直接使用的对象。原
) B: x# ?1 L1 O+ r' a! T. O8 M9 t 因是,.jsp文件对应的.java文件当中,已经自动
5 w4 }/ X/ |- M8 W/ x7 E2 } Y 生成了该对象的代码。2 D/ j7 R3 B2 k) x' q) l7 {* Y: ^
out
& _ r' d0 v: }. Z request2 {& F$ M7 ~" f6 o" t. S c% d! D
response. _5 m1 b) L, d% d( T
4).jsp文件如何转换成.java文件
# r1 }: u, X" x% A7 x a,html ----> 放到service()方法里,使用8 r& s8 @. `) D5 H! U
out.write()输出。
* E$ `) c( A+ a& Z H( v1 [, q6 H b,java代码片断 -> 放到service()方法里,照搬。, _' ~9 n8 n1 k! D u6 B4 g
c,jsp表达式 ----> 放到service()方法里,使用
& P" Z9 x+ Q* G: q out.print()输出。" f1 N" j" x' _
7 V% [7 g: {" Q& o* }
3 h4 i" v% X. i$ k0 Y( q) n
1、转发
1 u/ V% v" ?9 B4 Z9 M7 E$ f+ L 1)什么是转发?
( `1 v9 ]; F. r" Z8 Y 一个web组件(jsp/servlet)将未完成的处理
2 i4 Z6 G5 Y" L, z) h: A 转交给另一个web组件继续处理。转发的各个组
. h1 P5 ]& _0 n- M2 R" ^ 件会共享request和response对象。
8 ]) A. K# F. n+ P1 v( S& d0 X 2)如何转发?( @2 x/ g$ N) T/ c* i' {
step1 先绑订数据
* M. P2 [8 Y* k$ z9 d request.setAttribute(String name," M; l: v# G9 q4 }) ^
Object obj);
6 D$ j4 ~, e# @: N+ e. ], G. c 跟绑订相关的另外两个方法
5 L6 |, i$ c& V5 M6 w //如果name对应的值不存在,返回null。% _3 t. T G! t. n7 M M$ {
Object request.getAttribute(String name);
% ^ P$ s+ I& q2 L% V. e request.removeAttribute(String name);$ J8 L8 }+ d. e c$ f: A
step2 获得转发器,转发。/ O0 @+ N3 o c8 H% V* U: x0 r
RequestDispatcher rd =
6 h' L* T1 ^. F& s request.getRequestDispatcher(String uri);' X$ c% n6 N5 T$ J/ m2 W2 Q2 o. A1 u
rd.forward(request,response);
0 C7 I+ o6 ?& K, q* {" R4 `. y 3)编程中要注意的问题
3 R; a3 ^! K' p8 }, N+ c5 ` 转发之前,不能够执行out.close或者out.flush。
' h- u1 ^( F2 U 转发之前,会将response中缓存的数据先清空。
/ l, ?1 q" D1 O) X2 [* n! W. _ 4)转发的特点
4 ]; a0 g! {# E2 I a,转发的目的地只能是同一个应用内部的某个组件。
" f. T L7 `! V0 t: L b,转发之后,浏览器地址栏的地址没有变化。
7 v9 d5 Q) G% {/ i1 E m+ |; X c,转发所涉及的各个组件可以共享同一个request,
, Y) U& I$ S2 V7 r2 D( ~ response对象。4 V$ `8 i9 ^0 d/ e+ i
思考:
9 J. t9 O ?/ V; l0 m* o 转发与重定向的区别。' Y& {# Y" X# C6 B
2、表单中文问题
3 K: W0 z9 K( ] step1 jsp文件,要添加
. R% I8 l N3 j/ X' u# F) s <%@page pageEncoding="utf-8" & t- J' I/ ?$ `' m% H, G, z9 u, X
contentType="text/html;charset=utf-8"%>: N2 U. e3 [4 x; @1 }
表单设置method="post"。" t8 |* d6 P/ t: c# ]
step2 在servlet类当中,添加1 ~" k, I4 W/ g+ @7 l* X. O4 H
request.setCharacterEncoding("utf-8");
` {- }, T2 G, `6 [
`1 _8 Z. C( @! j* x9 `! n step3 如果要访问数据库:
5 C+ n" H" R$ I% q, ?' [ a,保证数据库能够正常地保存中文。! v* f- A4 I3 u) Q5 T
对于mysql0 m: R) v3 U0 Y. r; s
create database dbname 4 a8 P" z! T$ g/ Z" U
default character set utf8;" I: A: |4 v v R/ m+ k
b,使用jdbc访问数据库时,必须要保证
( S+ `7 V2 _* C jdbc驱动程序能够识别数据库中保存
' A# n: _% t8 Y 数据的编码。7 W+ @2 X; a z. N
jdbc:mysql://localhost:3306/jd1109db2?
g- S B8 W& @. F: X# j O useUnicode=true&characterEncoding=utf8
7 @1 p8 A& e1 K/ @' R6 [1 L) n, ~+ ^0 U1 p/ o% J* V6 r
3、路径问题
' e0 u/ E" V2 m& |* m 链接地址、表单提交、重定向、转发的路径应该
; A& f+ }$ z: V4 s2 m如何写?! ~5 r% W9 X- E
<a href=""></a>' {3 q8 D5 c0 l, K t
<form action="">1 R* y2 U! @' v! f' J i* x
response.sendRedirect("");
4 k! W# q; U5 R+ n7 }. e1 V2 u getRequestDispatcher("");
% f1 f0 ~; |. T. A a,相对路径与绝对路径
2 r% [8 O$ U4 p- j" z 相对路径:不以"/"开头的路径,比如:
) p) B5 i+ [# m3 X( `) E4 d8 R7 t+ s <a href="del.do"></a>
/ X$ C+ n4 K7 Q) P `: u# @ 绝对路径: 以"/"开头的路径,比如:' g P" y$ F5 g# H* p( O
<a href="/appname/del.do"></a>
5 w, N, o; s0 D7 T9 n- n b,怎样写绝对路径?3 K9 w- u; |% a3 i) ^; d
链接、表单提交、重定向,绝对路径要从+ I/ ]& H E6 X7 w# F# T
应用名开始写。
) T$ f5 u. D9 T0 A' B 转发要从应用名之后开始写。
/ H% Q( L3 ?8 ]' l9 E4 p //返回应用名,比如返回"/web05";$ B& B3 C6 K" B; J) c2 T3 p. h/ P
String request.getContextPath();+ Q& ]/ W. x" ?5 k& G( a1 }( I
4 A9 I8 e7 @( R3 P, @4 p4 ]
|
|