该用户从未签到
|
java server page(java服务器端页面技术)。
9 ^# l) D& \% n; J 是sun公司制订的一种服务器端动态页面生成技术的
# t+ j; w$ y2 U: g' e规范。" {* g9 j5 Q# V7 P6 g) }
因为直接使用servlet生成页面,如果页面比较复杂," r5 Y& }) U1 E: u
则代码过于繁琐,并且难以维护。所以,对于比较复杂& _; L4 R- M- H) C. `; P
的页面,使用jsp来编写,更容易编写和维护。7 Y* x! C0 q. w1 N9 [
2)如何写一个jsp文件。6 a4 t( U) Q1 \2 f+ U) k
写一个以.jsp为后缀的文件,然后,在该文件当中,
3 d# Z* o% Y- S+ g7 x7 X4 G L+ _5 t添加html和java代码。编写完成之后,不需要编译,当
; y' G, |" d( c$ ^6 t客户端请求访问某个.jsp文件,则服务器会自动将
) P5 L) H4 W! j$ V.jsp文件转换成一个.java文件(该.java文件其实是一个
; N5 E$ ]/ o$ {8 @ n/ e, Iservlet)。2 f" z6 Q/ a9 a4 A! [
3)jsp文件的组成* J, B' Z4 ~. P$ |4 V
a,html(包括css,javascript):: x8 }+ y5 A# j) `% M' Y
直接写在.jsp文件里即可。2 f T0 A" I) P. k
b,java代码:' Y' K6 `8 V8 `0 Q
第一种形式 java代码片断6 S( G% q. T' Q+ g/ H2 [& W7 S
语法:
R' \+ n4 o* b; ` <% java代码 %>% u8 U$ t+ R! R+ D
第二种形式 jsp表达式
1 t' H& f3 W) V9 x 语法:$ g* |. B$ b2 ^0 ]( O! m
<%= java表达式%>
: N: U3 ~+ p! ~. p9 g& u0 X c,指令:/ C, x6 b2 E( ]" B+ K1 U4 Z
所谓指令,就是告诉jsp引擎(容器当中,负责
$ u* k* w/ j- R) M' O# b 将.jsp文件转换成.java文件,并在运行时,! q1 W' s1 m- ]
为jsp提供一些 辅助支持的模块),在将.jsp) G1 I( }+ d# X3 Q
文件转换成.java文件时,做一些额外的处理。
+ r1 _; o% Z' D6 A& } 语法:' V/ M( I* {* M# a
<%@ 指令名 属性名=属性值%>
+ ^( Y! t/ ]( s, `# v page指令
4 ^$ D O3 P7 \ import属性:用于导包。
9 ^8 [4 I& Y' C# o% ~+ W' C 比如% D" Y( H9 J( o' w4 J8 }7 }$ ?1 w9 r
<%@page import="java.util.*,java.text.*"%> S$ I! x$ `/ j6 \
contentType属性:等价于
9 I+ p8 f: |; m( m- e response.setContentType();- w0 I5 j3 X0 u* M
pageEncoding属性:告诉jsp引擎,.jsp文件
& |9 f k- ~8 Y# q7 f1 U 保存时的编码。
9 C( t9 k! s B include指令
( ~5 c; P' A# K1 P# ~/ @' J; C file属性, R" J" g) f1 I5 v8 D) X0 u
告诉jsp引擎,在将.jsp文件转换成' T' n7 Q& r, y! f) ^7 {0 ~4 W
.java文件时,在指令所在的位置,插入& D9 |7 P2 @3 ?- q0 R1 S
file属性所指定的文件中的内容。
8 p3 {) O( A/ p+ B8 {0 P! _' L d,隐含对象. S E/ b+ ~1 e5 F/ L
所谓隐含对象,指的是在.jsp文件当中,不用
4 I) N0 i: X, i! {. i% E 声明和创建该对象,就可以直接使用的对象。原
* T) G. B7 O2 o1 G% G$ _9 S 因是,.jsp文件对应的.java文件当中,已经自动
7 M. r+ Y# l' I! V2 y5 l 生成了该对象的代码。+ \& P% F9 M. X! h
out " J, v" X. o: G2 \) E
request
5 w- I& j2 I1 f9 x0 |! d response
O7 e( R' w3 ~; X( X8 Q 4).jsp文件如何转换成.java文件
5 b: k6 a& `4 _" L* u; K a,html ----> 放到service()方法里,使用
$ N y3 v4 d7 }; Q; g/ k out.write()输出。
; M! w: u1 M( z b,java代码片断 -> 放到service()方法里,照搬。3 V! o+ r, O) M7 a, O6 x% e
c,jsp表达式 ----> 放到service()方法里,使用- Q* d3 K# Z3 ]9 F
out.print()输出。5 z# T8 _- o' l% ~9 V, M" u! S
- P% _- q) X Z4 v3 c& x
4 P* i* j1 Y3 a# y1、转发6 x5 h0 C1 E7 ]7 N2 G
1)什么是转发?
3 h, Y1 Q5 r" m3 l. V3 I 一个web组件(jsp/servlet)将未完成的处理$ Y9 i0 g8 q1 [3 Z, `! O
转交给另一个web组件继续处理。转发的各个组" z/ O3 r. E' m: S% N
件会共享request和response对象。* K7 Z# Q/ r5 @& W! {
2)如何转发?3 h3 ?, P7 B" u0 b
step1 先绑订数据
7 K! l0 m5 ^( L) V/ L request.setAttribute(String name,7 c. Y3 [; I" h7 _
Object obj);- A! ^" G. o* M z
跟绑订相关的另外两个方法1 f% d5 d% I" P5 P. m
//如果name对应的值不存在,返回null。
( m. o8 l$ L" {5 X Object request.getAttribute(String name); ?$ Z, p" I- c/ O% Z& o2 {+ B
request.removeAttribute(String name);
. L+ s; v$ v/ N& Q! Z% v7 t$ a step2 获得转发器,转发。
2 K. N; C$ N6 p3 ~ RequestDispatcher rd =
: Q$ O- ~: b/ d request.getRequestDispatcher(String uri);: m. t# t7 G' @+ S
rd.forward(request,response);8 G& L8 H" I! }3 _
3)编程中要注意的问题; M- e3 o+ u8 ~8 P) f* G
转发之前,不能够执行out.close或者out.flush。1 M, f$ X Q9 Z4 C0 h& k( w) L
转发之前,会将response中缓存的数据先清空。 " s2 j" Y( Z7 k8 f; o8 y
4)转发的特点
3 E, o5 x$ [2 T5 \ u1 ? a,转发的目的地只能是同一个应用内部的某个组件。
. p G: K2 \8 h/ ]6 Y b,转发之后,浏览器地址栏的地址没有变化。
2 N9 }+ f2 h$ a) {" _) z& b/ a3 O, z c,转发所涉及的各个组件可以共享同一个request,
+ h" k' ]7 n' `6 v0 T1 e( X4 K response对象。- P w' c4 R3 x4 L& K/ B* d4 |
思考:' y! J9 d3 o- K7 D
转发与重定向的区别。
) l8 Y" O$ O& f5 o) [+ u6 Z2、表单中文问题
, J5 W6 F3 M5 Z2 P+ D' }/ V$ `/ U step1 jsp文件,要添加0 X8 Z! u2 ^$ O
<%@page pageEncoding="utf-8"
9 B2 _$ ]$ t1 c0 ]* O contentType="text/html;charset=utf-8"%>4 T" _ w, s0 T2 X
表单设置method="post"。
; ?) n/ W$ f8 y( u1 ^ step2 在servlet类当中,添加
. r: O$ C. T/ }7 t* u: @, f3 F2 E request.setCharacterEncoding("utf-8");
7 k, S0 N' D% Z- c4 v8 }
2 K/ M& I$ f9 q; s; v& t' W1 R step3 如果要访问数据库: z6 w" A- F9 L7 P" V5 f
a,保证数据库能够正常地保存中文。
) u' q; _4 z2 M/ a 对于mysql8 ?* l w# z+ |* Y3 {, H" c
create database dbname
$ N* x: g. F! y+ t l2 h. t3 u% Y% b default character set utf8;
5 i; W b6 k6 {' Z& V" P b,使用jdbc访问数据库时,必须要保证
1 x2 W, o9 L9 z1 v- k v jdbc驱动程序能够识别数据库中保存
$ K0 g# A( k. ?$ ^ e! v" q 数据的编码。
* Y! a$ `. J0 x jdbc:mysql://localhost:3306/jd1109db2?: Z0 j: ^- Q: t4 O4 S
useUnicode=true&characterEncoding=utf8
& `- A9 v; c3 S5 U
, K3 |4 P6 P2 T5 Z1 m7 P p& O+ f9 B3、路径问题
* e6 H9 T! p: d% a 链接地址、表单提交、重定向、转发的路径应该
3 n5 ^8 B& r5 A3 f- @% U1 n如何写?
: r$ ]- p7 @% f; P4 t <a href=""></a>
# o& N# q& m. j+ Q <form action="">; ~& ^' p5 L+ K9 M
response.sendRedirect("");( I* j" E: t& i: a+ o
getRequestDispatcher("");
! b! _$ R4 N* \, ^% N a,相对路径与绝对路径
( ]& X( d% F; }! y& c" v 相对路径:不以"/"开头的路径,比如:4 R3 v8 P8 G7 }) G x) E! H4 ?
<a href="del.do"></a>
0 i& r1 v c' D( ]# d 绝对路径: 以"/"开头的路径,比如:
" J3 ~! ], e) z9 ?8 w5 E <a href="/appname/del.do"></a>; `0 x2 S9 W% O8 M5 ^
b,怎样写绝对路径?1 o) S0 `/ r0 U, P8 l2 @( a: h4 `5 K. P
链接、表单提交、重定向,绝对路径要从
' P6 r$ E0 d* y! H0 [# @/ x- E9 J 应用名开始写。
l, b9 T3 y. o, I 转发要从应用名之后开始写。
# Y% F0 J1 {- z' L //返回应用名,比如返回"/web05";3 k7 \, z" W9 K* d" l% g: ^
String request.getContextPath();* F" L" x' v& |! r: M* D
# r5 I/ _) D. _
|
|