该用户从未签到
|
java server page(java服务器端页面技术)。% ^# q5 `; T ^; F- S* Q* ]
是sun公司制订的一种服务器端动态页面生成技术的: R' ^) K+ S. x
规范。* S v8 v5 _% ~4 v/ f- j1 T0 l
因为直接使用servlet生成页面,如果页面比较复杂,! @# W1 [+ V. ?8 E: f
则代码过于繁琐,并且难以维护。所以,对于比较复杂% m% F+ P1 a; w, q' f
的页面,使用jsp来编写,更容易编写和维护。
7 E; D( v, C- g+ l 2)如何写一个jsp文件。& V! t6 ]9 R( t
写一个以.jsp为后缀的文件,然后,在该文件当中,
( I# @. H; _& b' z% a添加html和java代码。编写完成之后,不需要编译,当8 m$ o" I0 W8 k' b, G8 T \
客户端请求访问某个.jsp文件,则服务器会自动将; _# m' H0 s) }9 e# _$ F# x. I
.jsp文件转换成一个.java文件(该.java文件其实是一个
" z' i( ^2 f. b0 l. rservlet)。1 y* M1 [7 b- j) Q; X& u
3)jsp文件的组成
2 k- M8 s* f+ o7 u, L8 M& ^ a,html(包括css,javascript):
4 A$ X3 a& p, C7 ?% [8 Y 直接写在.jsp文件里即可。 H- m1 `; T" B8 ]( ?( p% D
b,java代码:& u2 {+ x# D' _5 G1 n
第一种形式 java代码片断
4 A# K7 |9 L, P& Z4 u 语法:
3 D) H' E5 n9 C" K0 I <% java代码 %>
8 d( s7 Q$ b( @" r/ Q! _$ E( \ 第二种形式 jsp表达式 ^$ r2 Y; h f
语法:% P' K* a& R$ l% u3 I) U& Q! g% Y
<%= java表达式%>
5 [* W7 a4 e; y% W+ |; {4 }0 f c,指令:4 o+ ?. T" |* c# O0 |; s
所谓指令,就是告诉jsp引擎(容器当中,负责) B3 c8 u' a1 ?: @
将.jsp文件转换成.java文件,并在运行时,
7 l' T" D7 Y! v8 y. J$ ] 为jsp提供一些 辅助支持的模块),在将.jsp
# T' A, l& g0 r 文件转换成.java文件时,做一些额外的处理。
5 U) u( x1 c* B0 w. x 语法:
- `- l- a9 ?) R; k: I( C, g <%@ 指令名 属性名=属性值%>: N6 ~; f$ V! N# K3 M
page指令& |1 q1 s6 v3 v1 U& h
import属性:用于导包。
5 G5 ^1 R/ M2 Q7 G8 ~ 比如1 I& T7 S5 s* N& J
<%@page import="java.util.*,java.text.*"%>) @; Y# P7 q$ P% D, d" }6 g# }
contentType属性:等价于' [* J$ C5 J5 X3 n' p+ ]
response.setContentType();
2 I# n2 C# m5 T% F1 r' A. W \ pageEncoding属性:告诉jsp引擎,.jsp文件
2 y: H, d; v5 K% G6 e% v 保存时的编码。) E# R! J6 D) {- a8 ^ [- F
include指令% T" V+ ]3 n7 m5 J
file属性( j" Z1 s0 I( F: w* v( K4 s
告诉jsp引擎,在将.jsp文件转换成
: t8 H0 Z1 q: T2 i .java文件时,在指令所在的位置,插入
9 g5 m4 S7 D$ g: c( f) Q# p7 \ file属性所指定的文件中的内容。
* Y% F3 Q' ~* B: u+ _ d,隐含对象, v8 A x: e7 |' l1 h) {
所谓隐含对象,指的是在.jsp文件当中,不用- Z& q7 D- D0 w/ Y6 \' f
声明和创建该对象,就可以直接使用的对象。原& K# r6 C6 X7 w
因是,.jsp文件对应的.java文件当中,已经自动
% ]& ^2 Z6 \3 Z* M) i0 G: _- t 生成了该对象的代码。# d0 y* b' j& p# u+ h2 [; c
out : F& L2 M2 M8 }8 E. k; _4 |. U2 v6 t
request
6 W$ k; }0 {4 B3 o response4 a, @, g9 ^, ^1 K7 e+ R }
4).jsp文件如何转换成.java文件. S9 t* E& z7 u5 Z _/ {0 p! s' a
a,html ----> 放到service()方法里,使用
. _9 G7 Q3 N/ U* u$ D9 z out.write()输出。
4 e7 `4 L$ k1 e( b b,java代码片断 -> 放到service()方法里,照搬。: s+ l9 z; V) u. x- e$ j3 y8 g
c,jsp表达式 ----> 放到service()方法里,使用
6 H, |7 X2 B, e out.print()输出。
2 \( A8 h5 l/ ^& [% K
" @3 i6 t/ k: Z- ^. u9 w3 i7 C
/ \/ T* h. ^0 ]. G6 Y( U/ T% o1、转发4 S& m9 j+ X# _' k0 N. X
1)什么是转发?
' y" @8 m' E' j/ _/ w/ z& ? 一个web组件(jsp/servlet)将未完成的处理
! r8 g$ N7 n' |- H 转交给另一个web组件继续处理。转发的各个组5 R/ X6 R3 V0 w( l6 P+ I4 T
件会共享request和response对象。
& ~" x( Z P/ f5 A- r$ _3 p 2)如何转发?
; j( A6 x4 \4 r% P5 E step1 先绑订数据5 x2 z- ]. C7 o0 g
request.setAttribute(String name,
7 }7 l: j. ^9 x5 ? Object obj);1 T5 z; u2 C- n
跟绑订相关的另外两个方法
) Z6 T; H; B- E: ~7 ~9 q+ g //如果name对应的值不存在,返回null。1 m. s% |& i" J3 K/ E' z
Object request.getAttribute(String name);. ~! a/ r9 f0 y3 k- x# A
request.removeAttribute(String name);
. U$ t8 l( o9 P" x4 R1 ` step2 获得转发器,转发。* ~1 p. l: W* F
RequestDispatcher rd =
& h0 \8 L4 I8 d2 Z v! Y request.getRequestDispatcher(String uri);8 k4 H- B; \$ P" X/ }
rd.forward(request,response);8 m8 w6 Z* Y0 P6 t; e
3)编程中要注意的问题
5 Q1 r2 d& P5 g3 l6 N1 j7 S 转发之前,不能够执行out.close或者out.flush。, [( g. P) t5 r8 K7 K, G
转发之前,会将response中缓存的数据先清空。 3 t5 N4 K/ n0 g8 g4 ?$ `4 h: ~# N
4)转发的特点
% T8 c5 E0 J7 T- ]- U2 i6 _: } a,转发的目的地只能是同一个应用内部的某个组件。) X3 ^& w7 O! D
b,转发之后,浏览器地址栏的地址没有变化。$ {1 j0 O& c) L1 ]: L: P( \0 i
c,转发所涉及的各个组件可以共享同一个request,) }2 t( x* ~, @, V; k- R, D
response对象。2 H- a0 N7 I9 l0 |, l K! M
思考:
2 g0 O6 A1 S* ]4 V4 Z Q2 v 转发与重定向的区别。. I y$ f7 J0 J% p/ h: f7 }
2、表单中文问题
; k: N/ E$ b# M step1 jsp文件,要添加# M4 Q0 T5 X( U/ x
<%@page pageEncoding="utf-8"
6 a$ t) L! o* M& [ I contentType="text/html;charset=utf-8"%>3 [+ ^! f5 u' \- `4 m' J4 U! H
表单设置method="post"。" M$ _# n3 l1 u1 v4 D
step2 在servlet类当中,添加
0 e& X) `& j. c$ ?( ^* r- y$ X request.setCharacterEncoding("utf-8");
8 { W) L4 m. v+ R0 T `% h
/ o8 b n9 d: O* o1 o' f step3 如果要访问数据库:* J! G' v1 t" H* P& N# }
a,保证数据库能够正常地保存中文。8 c6 H+ [9 F9 v% `. l: W
对于mysql
& x. S' N: ?+ Y/ d& V create database dbname , p- C( `0 u( n, A, S' `* l$ n
default character set utf8;
/ W; K. W+ V/ P9 |$ p b,使用jdbc访问数据库时,必须要保证" m/ S7 _6 R P
jdbc驱动程序能够识别数据库中保存
) S: n- L" P: D5 A: I$ `3 M 数据的编码。
2 V# y+ K0 j; m5 R jdbc:mysql://localhost:3306/jd1109db2?
* ?7 E- s/ m$ F: C: j8 x useUnicode=true&characterEncoding=utf88 n# K L+ X1 U
" S R1 P! V6 m" {0 M' z: L2 G; r3、路径问题
0 J3 I$ \$ H0 \7 t, y/ `" [6 Z f 链接地址、表单提交、重定向、转发的路径应该
" `( n; d9 r. s. m如何写?
* b5 |0 t* {6 J$ U+ _7 n <a href=""></a>/ E) x" E' Z( k
<form action="">3 C, g) J! M: D+ Y
response.sendRedirect("");
' _6 G* V" t/ r0 k; y4 ?- B+ M getRequestDispatcher("");: j6 i! W1 I2 c% }: P
a,相对路径与绝对路径
/ `! W+ q; b& l1 E+ ^4 e9 } 相对路径:不以"/"开头的路径,比如:
) R* n9 ?4 a# I. ]: Z- T, k <a href="del.do"></a>
0 G3 m# R' U W" H3 \ 绝对路径: 以"/"开头的路径,比如:
8 W3 K& z' v" X9 p0 P, R <a href="/appname/del.do"></a>6 m; @% T% z$ G2 s
b,怎样写绝对路径?
$ k2 S% m+ ` P5 r 链接、表单提交、重定向,绝对路径要从
% {4 {. ]: F$ Z' C( I 应用名开始写。- Q* b8 ?& H0 ^6 z1 W
转发要从应用名之后开始写。1 y" r6 o& [8 B6 t* [
//返回应用名,比如返回"/web05";8 C, n0 w( e0 i. m& X' F# b
String request.getContextPath();9 O: R" ^- `$ e. `0 z
N2 O* l7 u$ Z8 }' C |
|