??xml version="1.0" encoding="utf-8" standalone="yes"?>
JSP介绍
1. 概况
{:1) 以文本ؓ基础能够q回动态内容到客户?
2) Http是请求和响应的默认协?
3) 一个页面可以和html代码、Java代码以及JSP标答;
4) 允许讉Klg;
2. JSP的好?br />{:1) 通过lg使用支持lg模型和Y仉?
2) 源文件改变自动编?
3) 用户自定义标{化页面开?
4) 能把Web内容, Java代码分开(针对Servlet而言);
5) q_无关;
6) 性能和可扩展;
7) 可靠;
8) 作ؓJ2EE的一部分(Servlet、JSP以及EJB是J2EE的三大组??/b>
创徏、配|以及执行JSP
1. JSP环境
{:1) 开发环?br /> a. 览器:IE/Netscape
b. 开发工PC本、SunOne Studio、JBuilder、WSAD
2) 配置和执行环?br /> a. Tomcat
b. Weblogic
c. Websphere
d. SunONE Application Server
2. W一个JSP面
{:1) 脚本程?Scriptlet):
对应于Servlet中serviceҎ中内?br /> <%...%>?lt;jsp:scriptlet></jsp:scriptlet>
2) 指o(Directives)
a. page
<%@page import="java.util.*"%>?lt;jsp:directive.page import="java.util.*"/>
b. include
<%@include file="footer.jsp"%>?lt;jsp:directive.include file="footer.jsp"/>
3) 声明(Declarations)
<%!String str="This is a string!";%>?lt;jsp:declaration>str="This is a string!"</jsp:declaration>
4) 表达?Expressions)
<%=str%>?lt;jsp:expression>str</jsp:expression>
2004-9-28 星期二 ??/b>
脚本元素
1. 在JSP面通过以下脚本元素可用以插入Java代码
{:1) 声明(Declarations)Q?lt;%! %>?lt;jsp:declaration></jsp:declaration>
2) 脚本程?Scriptlet)Q?lt;%...%>?lt;jsp:scriptlet></jsp:scriptlet>
3) 表达?Expressions)Q?lt;%=%>?lt;jsp:expression></jsp:expression>
4) 指o(Directives)Q?lt;%@%>?lt;jsp:directive.type attribute />
2. 声明(Declarations)
{:1) 允许定义插入到ServletcȝM?由service调用, 与Service()Ҏq)的一些方法或?
2) 语法Q?br /> <%! Java代码 %> ?br /> <jsp:declaration></jsp:declaration>
3) CZQ?br /> a. 变量定义Q?br /> <%! int i=0;%>
b. Ҏ定义Q?br /> <%! public String f(int i){if(i<3) return("...");...}%>
4) 声明规则Q?br /> a. JSP中声明的变量和方法对应于Servlet中的实例Ҏ和实例变量。这些将被同时请求该面的所有用h׃n;
b. 在用变量或Ҏ前须先定?不是说声明变量的位置在页面中要处于用变量的前面Q而是指变量不声明不能使用);
c. 声明的变量或Ҏ的作用域为当前页面或包含的页?
d. 语句间以分号分隔?/b>
3. 脚本程?Scriptlet)
{:1) Java代码片断Q能执行比标记语a更强的功?br /> 2) 语法Q?br /> <%...%>?lt;jsp:scriptlet></jsp:scriptlet>
3) 脚本程序规则:
a. 你用的脚本语言军_了脚本小E序的规?
b. 语句间以分号分隔;
c. 可以使用默认的对象、importq的cRdeclaration声明的方法和对象以及useBean tag中声明的对象?/b>
4. 表达?Expression)
{? 1) 用来值直接插入到输出?br /> 2) 语法Q?br /> <%=%>?lt;jsp:expression></jsp:expression>
3) 表达式规则:
a. 你用的脚本语言军_了脚本小E序的规?
b. 执行的顺序ؓ从左到右;
c. 分号不能用于表达式?/b>
5. 指o(Directive)
{:1) Page: 定义面的全局属?br /> 语法Q?lt;%@page ...%>?lt;jsp:directive.page .../>
2) Include: 插入一个静态页面内?br /> 语法Q?lt;%@include file="header.jsp"%>?lt;jsp:directive.include file="header.jsp"/>
6. 操作(Actions)
{:1) forward操作Q将h指向一个特定的面(cM于Servlet中的RequestDispatcher);
语法Q?lt;jsp:forward page="URL"/>
2) include操作Q在面插入动态的内容
语法Q?lt;jsp:include page="URL" flush="true"/>
3) plugin操作Q在输出面嵌入一个对?br /> 语法Q?lt;jsp:plugin type="bean|applet" code="objectCode" codebase="objectCodebase">
<jsp:params>
...
</jsp:params>
</jsp:plugin>
7. 注释
{:JSP中有二种cd的注释:
1) 服务器端注释Q不会送回客户?br /> <%--this is a comment--%>
2) 客户端注释:发送回客户?br /> <!--comments-->
8. JSP处理q程Q?br />{:JSP源文件处理分成二个阶D:
1) JSP面转换阶段Q页面被~译成一个Javac,所有的HTML标记和JSP标记都被转换创徏一个Servlet。这Ӟ脚本和表辑ּq没有被执行;
2) h处理阶段Q发生在服务器将一个客Lh指向JSP面。一个请求对象创建、解析以及提交给~译好的JSP对应的servlet。当q个servlet处理求求的时候它执行先前在JSP中定义的处理脚本程序和表达式?/b>
9. 使用脚本代码的缺点和指导斚w
{:1) ~点Q?br /> a. q度使用脚本代码使用JSP面混ؕ和难以维?
b. 脚本代码降低JSP二个主要的优点:软g重用和代码分开
2) 指导斚wQ?br /> 只在lg功能无能为力或需要有限的脚本时用?br />2004-9-29 星期三 ??/strong>
使用可重用组?/strong>
1. JavaBeans
{:1) JavaBeans是一个轻便的、^台无关的、用Java写的lg模型Q用以创建可重用的组?
2) Beans能被lg创徏健壮、跨q_的应用程序和应用程序?/strong>
2. JSP和组?br />{:1) 在需要的时候,JSP可以讉KJavaBean和EJBQ?br /> 2) JSP使用action标记来用、修改以及创建服务器端对?例如Beans);
3. JavaBean与一般Javacȝ区别
{:1) Beancdd有不带参数的构造函?
2) Beancd该没有Q何公用实例变??;
3) 通过get和setҎ应该获得一致的倹{?/strong>
4. Bean的基本用?br />{:1) 调用Bean
语法Q?lt;jsp:useBean id="thread1" class="MyClass" type="Runnable"/>
通常可以认ؓ{h于小脚本Q?br /> Runnable thread1 = new MyClass();
以上代码意味着仅当不存在具有相同id和scope的对象时实例化class所指定的类对象Qƈ其l定到由id指定名称的变?br /> 2) 讉KBean的属?br /> 语法Q?lt;jsp:getProperty name="book1" property="title"/> 或?br /> <%=book1.getTitle()%>
3) 讄Bean的属?br /> a. 单情?br /> 语法Q?lt;jsp:setProperty name="book1" property="title" value="Core Servlets and JavaServer Page"/> 或?lt;%book1.setTitle("Core Servlets and JavaServer Page");%>
b. 使用JSP表达式作为value参数
语法Q?lt;jsp:setProperty
name="entry"
property="itemID"
value='<%=request.getParameter("itemID")%>'/>
c. 建立个别属性与输入参数之间的关?br /> 语法Q?lt;jsp:setProperty
name="entry"
property="numItems"
param="numItems"/> //使用param指定输入参数Q此参数D动用作该属性|q自动执行简单的cd转换
d. 建立所有属性与输入参数之间的关?br /> 语法Q?lt;jsp:setProperty
name="entry"
property="*"/>
需要注意:i : 当输入参数遗失时Q不执行M操作Q系l不会提供null作ؓ属性?
ii: 无法完成值类型ؓdouble的属性的cd转换;
iV: 在用自动类型{换时Q需要考虑错误处理面;
v : 属性名和输入参数必d全匹配?/strong>
5. ׃nBean
{:1) scope作用域:
a. page : 默认|表明Bean对象除了被绑定到局部变量,q将位于PageContext对象?
b. application: 表明Bean对象除了被绑定到局部变量,q将位于ServletContext对象?
c. session : 表明Bean对象除了被绑定到局部变量,q将位于当前h相关的HttpSession对象?
d. request : 表明Bean对象除了被绑定到局部变量,q将位于ServletRequest对象?
2) 调用Bean的方式:
<jsp:useBean ...>
语句(仅当创徏Bean而不是用现有Bean时才被执?
</jsp:useBean>
2004-9-30 星期四 ??/strong>
处理异常
1. q行时异?br />{:1) 一个程序运行时重获的错?
2) 能被一固有的异常对象引用所使用;
3) 可以利用异常引用创徏或生一个JSP面昄异常信息l用戗?/strong>
2. 创徏一个异常跟t方?br />{:1) 在每一个JSP面Q包含要创徏的异帔R面名U?
<
%@page
import="numberguess.NumberGuessBean" errorPage="error.jsp"%>
2) 创徏一个异帔R?
<
%@page
isErrorPage="true"%>
3. JSP面中的异常处理
{:1) <%=exception.toString()%> 打印异常名称;
2) <%exception.printStackTrace();%> 打印当前错误中所有错误的列表;
3) <%=exception.getMessage()%> 打印错误的详l描qC?/strong>
更高U的主题
1. JSP中黙认的内在对象
{:名称 cd 注释和范?br /> request javax.servlet.http.HttpServletRequest request
response javax.servlet.http.HttpServletResponse response
pageContext javax.servlet.jsp.PageContext page
session javax.servlet.http.HttpSession session
application javax.servlet.ServletContext ServletContext
out javax.servlet.jsp.JspWriter output stream
config javax.servlet.ServletConfig ServletConfig
page javax.lang.Object page
Exception java.lang.Throwable page
2. 默认对象之请?request)
{:装了来自客L的请求:
ҎQ?) getCookies: 取得Cookie数组;
2) getMethod: q回h形成的方?GET/POST);
3) getParameterNames: q回form中对象名U的枚D;
4) getParameterQ返回指定名U的对象?
5) getParameterValues: q回指定名称的对象值数l?
6) setAttribute: 讄属?
7) getAttribute: q回属性?
8) getAttributeNames: q回属性名U的枚D
3. 默认对象之out
{:JSPWriter的一个实? 用于发送响应给客户?br /> ҎQ?) print(String)/println(String)
2) print(int)/println(int)
3) flush()
4. 默认对象之exception
{:1) 用于异常对象的异常实?
2) 异常面在page指o中存在属性isErrorPage="true";
3) ҎQgetMessage()/printStackTrace()/toString()
5. 默认对象之session
{:1) HttpSession的一个实? 用于在一个session中保持状?br /> 2) ҎQgetAttribute()
setAttribute()
removeAttribute()
getAttributeNames()
6. 默认对象之application
{:1) ServletContext一个实例,用于保持application的状?br /> 2) ҎQgetAttribute()
setAttribute()
getInitParameter()
getServletInfo()
3) application的作用域比session大得多,一个session和一个client联系, 而application保持了用于所有客L的状?/strong>
2004-10-8 星期四 ?晾b ?
自定义标{ֺ(?
1. 什么是自定义标{?br />{:1) 用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;
2) 可以非常机密地和JSP的表C逻辑联系在一P又具有和普通JavaBean相同的业务逻辑处理能力;
2) 当一个JSP面转变为servletӞ光的用戯定义标签转化为操作一个称为标{hander的对?
3) 可操作默认对象,处理表单数据Q访问数据库以及其它企业服务;
2. 自定义标{ֺ的特?br />{:1) 通过调用面传递参数实现定?
2) 讉K所有对JSP面可能的对?
3) 修改调用面生成的响?
4) 自定义标{N可相互通信;
5) 在同一个JSP面中通过标签嵌套Q可实现复杂交互?/strong>
3. 如何使用自定义标{ֺ
{:1) 声明标签?br /> 2) 使标{ֺ执行对Web应用E序可用
4. 声明标签?br />{:1) 使用taglib指o声明标签?br /> 2) 语法Q?lt;
%@taglib
uri="URI" prefix="pre" %>
注意Qa. uri属性可以是l对的,也可以是相对URLQ该URL指向标记库描q符(TLD)文g;
b. uri属性也可以是一个ƈ不存在的URLQ该URL为web.xml文g中将标记库描q符(TLD)文g的绝对URL到本地系l的一个映?
3) 范例Q?lt;
%@taglib
uri="/WEB-INF/template.tld" prefix="test" %>
<
%@taglib
uri="
http://java.sun.com/jstl/core
" prefix="core" %>
5. 使标{ֺ执行可用
{:方式一Q在WEB-INF/classes目录下部|标记处理程序类;
方式二:标记处理程序类打包成jar文gq置于WEB-INF/lib目录?/strong>
6. 几种典型的标{?疑问Q可以有带主体而没有属性的标签么?)
{:1) 不带属性和M的简单标{:<mytaglibs:SomeTag/>;
2) 不带M但有属性的标签Q?lt;mytaglibs:SomeTag user="TonyDeng"/>;
3) 带有M和属性的标签Q?lt;mytaglibs:SomeTag user="TonyDeng">
...// 标签?br /> </mytaglibs:SomeTag>;
注意Qa. 属性列于start tag中,它是在标记库描述W?TLD)文g中指定,服务于标记库的自定义行ؓ;
b. 标签体位于start tag和end tag_可以是Q何合法的JSP内容或者标{?
7. 定义标签
{:1) 开发实现tag的类(tag handler);
2) ~辑标记库描q符(TLD)文g;
3) 在web.xml中ؓ标记库描q符(TLD)文g的绝对URL建立一个映?该步骤可?;
8. 标记库描q符(TLD)文g
{:1) 一个描q标记库的XML文g;
2) 内容开始是整个库的描述Q然后是tag的描q?
3) 标记库描q符(TLD)文g用于Web Container认tag以及JSP面发展工具;
9. 实现tag的类(tag handler)
{:1) 是一些在引用了标{JSP面执行期间被Web Container调用以求自定义标{ր的对象;
2) 必须实现Tag, SimpleTag和BodyTag之一;
3) 可以l承TagSupport和BodyTagSupport之一?/strong>
10. 标签库的接口和类的承关p?br />{:表现形式一Q?br /> a. 接口的承关p:
?interface javax.servlet.jsp.tagext.JspTag
?interface javax.servlet.jsp.tagext.SimpleTag
?interface javax.servlet.jsp.tagext.Tag
?interface javax.servlet.jsp.tagext.IterationTag
?interface javax.servlet.jsp.tagext.BodyTag
b. cȝl承关系Q?br /> ?class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)
?class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag)
?class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag)
表现形式二:
(Interface)
JspTag
?br /> |ˉˉˉˉˉˉˉˉ|
(Interface) (Interface)
Tag SimpleTag ←-QSimpleTagSupport
↑ ?
|
(Interface)
IterationTag←-QTagSupport
↑ ??br /> | |
(Interface) |
BodyTag ←-QBodyTagSupport
标签接口Ҏ一览表
(Interface)
JspTag(没有Ҏ)
?br /> |ˉˉˉˉˉˉˉˉ|
(Interface) (Interface)
Tag SimpleTag
↑ ?
| (int doEndTag()、int doStartTag()、Tag getParent()、void release()、void setPageContext(PageContext pc)、void setParent(Tag t))
(Interface)
IterationTag (int doAfterBody())
↑ ?
|
(Interface)
BodyTag (void doInitBody()、void setBodyContent(BodyContent b))
2004-10-9 星期四 ?晾b ?
自定义标{ֺ(?
11. 一个Tag处理E序cdd现的Ҏ
{:标签处理E序cd Ҏ
Simple doStartTag, doEndTag, release
Attributes doStartTag, doEndTag, set/getAttribute...release
Body,No Itrative and doStartTag, doEndTag, release
Evaluation
Body, Itrative Evaluation doStartTag, doAterTag, doEndTag, release
Body, Interaction doStartTag, doEndTag, release, doInitbody, doAfterBody
12. 单的标签处理E序c?br />{:1) 必须实现Tag接口的doStartTag()和doEndTag()Ҏ;
2) 因ؓ不存在BodyQdoStartTag()Ҏ必须q回SKIP_BODY;
3) 如其余页面要执行QdoEndTag()Ҏq回EVAL_PAGE, 否则q回SKIP_PAGE;
4) 对于每一个标{ֱ性,你必d标签处理E序c里定义一个特性以及get和setҎ以一致于JavaBeans体系惯例
13. 带Body的自定义标签
{:1) 必须实现Tag接口的doStartTag()和doEndTag()Ҏ;
2) 可以实现IterationTag接口的doAfterBody()Ҏ;
3) 可以实现BodyTag接口的doInitBody和setBodyContentҎ;
4) doStartTagҎ可以q回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想用BodyContent);
5) doEndTagҎ可以q回SKIP_PAGE或EVAL_PAGE;
6) doAfterBodyҎ可以q回EVAL_BODY_AGAIN, SKIP_BODY;
14. 定义脚本变量的标{?q代的标{ֺ)
{:1) 定义脚本标签的二个步?
a. 在标记库描述W?TLD)文g中列明脚本变?
b. 定义标签扩展信息c?TEI)q且在TLD文g中包括这个类元素(tei-class);
2) 变量必须在标{֤理程序类中用pageContext.setAttribute()Ҏ讄;
3) 标签扩展信息c?TEI)必须l承TagExtraInfo以及覆盖getVariableInfo()Ҏ;
4) 变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息c?TEI)的VariableInfo中定?之一;
15. 脚本变量的有效?br />{:变量 | 有效性 ?
---------------------------------------
NESTED | 标签中的参数在starttag到endtag之间是有效的
AT_BEGIN | 标签中的参数在标{开始到JSP面l束是有效的
AT_END | 标签中的参数在标{l束到JSP面l束是有效的
2004-10-10 星期四 ??
16. Tag接口的方?br />{:interface javax.servlet.jsp.tagext.Tag
------------------------------------------------------
+EVAL_BODY_INCLUDE:int
+EVAL_PAGE:int
+SKIP_BODY:int
+SKIP_PAGE:int
------------------------------------------------------
+release():void
+getParent():javax.servlet.jsp.tagext.Tag
+setParent(javax.servlet.jsp.tagext.Tag):void
+doEndTag():int
+doStartTag():int
+setPageContext(javax.servlet.jsp.PageContext):void
17. Tag的生命周?br />{:1) setPageContext(javax.servlet.jsp.PageContext):void
2) setParent(javax.servlet.jsp.tagext.Tag):void
3) //setAttribute:void
4) doStartTag():int
5) doEndTag():int
6) release():void
18. BodyTag和Tag接口的关p?br />{:interface javax.servlet.jsp.tagext.BodyTag --> interface javax.servlet.jsp.tagext.Tag
------------------------------------------
+EVAL_BODY_AGAIN:int
------------------------------------------
+doInitBody():void
+setBodyContent(javax.servlet.jsp.tagext.BodyContext):void
+doAfterBody():int
19. BodyTag的处理过E?br />{:1) setPageContext(javax.servlet.jsp.PageContext):void
2) setParent(javax.servlet.jsp.tagext.Tag):void
3) //setParent()
4) doStartTag():int
5) setBodyContent(javax.servlet.jsp.tagext.BodyContent):void
6) doInitBody():void
7) doAfterBody():int
8) doEndTag():int
9) release():void
20. SimpleTag接口的方?br />{:javax.servlet.jsp.tagext.SimpleTag
------------------------------------------
+doTag():void
+getParent():JspTag
+setJspBody(JspFragment jspBody):void
+setJspContext(JspContext pc):void
+setParent(JspTag parent):void
21. SimpleTage接口的生命周?br />{:1) new:
每次遇到标签Q容器构造一个SimpleTag的实例,q个构造方法没有参数。和U典的标{一PSimpleTag不能~冲Q故不能重用Q每ơ都需要构造新的实例?br /> 2) setJspContext()、setParent(): 只有q个标签在另一个标{之内时Q才调用setParent()Ҏ;
3) 讄属性:调用每个属性的setterҎ;
4) setJspBody();
5) doTag(): 所有标{逻辑、P代和Body计算Q都在这个方法中;
6) return
2004-10-11 星期五 ??