﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JAVA-文章分类-JSP</title><link>http://www.blogjava.net/hitlang/category/14251.html</link><description>学以致用</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:20:26 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:20:26 GMT</pubDate><ttl>60</ttl><item><title>JSP学习笔记</title><link>http://www.blogjava.net/hitlang/articles/71845.html</link><dc:creator>liulang</dc:creator><author>liulang</author><pubDate>Mon, 25 Sep 2006 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/hitlang/articles/71845.html</guid><wfw:comment>http://www.blogjava.net/hitlang/comments/71845.html</wfw:comment><comments>http://www.blogjava.net/hitlang/articles/71845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hitlang/comments/commentRss/71845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hitlang/services/trackbacks/71845.html</trackback:ping><description><![CDATA[
		<p>
				<b>                 2004-9-27      星期一      晴</b>
		</p>
		<p>
				<b>JSP介绍</b>
		</p>
		<p>
				<b>1.  概况<br />答：1) 以文本为基础能够返回动态内容到客户端;<br />    2) Http是请求和响应的默认协议;<br />    3) 一个页面可以混和html代码、Java代码以及JSP标答;<br />    4) 允许访问组件;</b>
		</p>
		<p>
				<b>2.  JSP的好处<br />答：1) 通过组件使用支持组件模型和软件重用;<br />    2) 源文件改变自动编译;<br />    3) 用户自定义标签简化页面开发;<br />    4) 能把Web内容, Java代码分开(针对Servlet而言);<br />    5) 平台无关;<br />    6) 性能和可扩展;<br />    7) 可靠;<br />    8) 作为J2EE的一部分(Servlet、JSP以及EJB是J2EE的三大组件)。</b>
		</p>
		<p>
				<b>创建、配置以及执行JSP</b>
		</p>
		<p>
				<b>1.  JSP环境<br />答：1) 开发环境<br />       a. 浏览器：IE/Netscape<br />       b. 开发工具：记事本、SunOne Studio、JBuilder、WSAD<br />    2) 配置和执行环境<br />       a. Tomcat<br />       b. Weblogic<br />       c. Websphere<br />       d. SunONE Application Server</b>
		</p>
		<p>
				<b>2. 第一个JSP页面<br />答：1) 脚本小程序(Scriptlet):<br />       对应于Servlet中service方法中内容<br />       &lt;%...%&gt;或&lt;jsp:scriptlet&gt;&lt;/jsp:scriptlet&gt;<br />    2) 指令(Directives)<br />       a. page<br />          &lt;<a href="mailto:%@page">%@page</a> import="java.util.*"%&gt;或&lt;jsp:directive.page import="java.util.*"/&gt;<br />       b. include<br />          &lt;<a href="mailto:%@include">%@include</a> file="footer.jsp"%&gt;或&lt;jsp:directive.include file="footer.jsp"/&gt;<br />    3) 声明(Declarations)<br />       &lt;%!String str="This is a string!";%&gt;或&lt;jsp:declaration&gt;str="This is a string!"&lt;/jsp:declaration&gt;<br />    4) 表达式(Expressions)<br />       &lt;%=str%&gt;或&lt;jsp:expression&gt;str&lt;/jsp:expression&gt;</b>
		</p>
		<p>
				<b>2004-9-28      星期二      晴</b>
		</p>
		<p>
				<b>脚本元素</b>
		</p>
		<p>
				<b>1.  在JSP页面通过以下脚本元素可用以插入Java代码<br />答：1) 声明(Declarations)：&lt;%! %&gt;或&lt;jsp:declaration&gt;&lt;/jsp:declaration&gt;<br />    2) 脚本小程序(Scriptlet)：&lt;%...%&gt;或&lt;jsp:scriptlet&gt;&lt;/jsp:scriptlet&gt;<br />    3) 表达式(Expressions)：&lt;%=%&gt;或&lt;jsp:expression&gt;&lt;/jsp:expression&gt;<br />    4) 指令(Directives)：&lt;<a href="mailto:%@%">%@%</a>&gt;或&lt;jsp:directive.type attribute /&gt;</b>
		</p>
		<p>
				<b>2.  声明(Declarations)<br />答：1) 允许定义将插入到Servlet类的主体中(由service调用, 与Service()方法平级)的一些方法或域; <br />    2) 语法：<br />       &lt;%! Java代码 %&gt; 或<br />       &lt;jsp:declaration&gt;&lt;/jsp:declaration&gt;<br />    3) 示例：<br />       a. 变量定义：<br />          &lt;%! int i=0;%&gt;<br />       b. 方法定义：<br />          &lt;%! public String f(int i){if(i&lt;3) return("...");...}%&gt;<br />    4) 声明规则：<br />       a. JSP中声明的变量和方法对应于Servlet中的实例方法和实例变量。这些将被同时请求该页面的所有用户所共享;<br />       b. 在使用变量或方法前须先定义(不是说声明变量的位置在页面中要处于使用变量的前面，而是指变量不声明不能使用);<br />       c. 声明的变量或方法的作用域为当前页面或包含的页面;<br />       d. 语句间以分号分隔。</b>
		</p>
		<p>
				<b>3.  脚本小程序(Scriptlet)<br />答：1) Java代码片断，能执行比标记语言更强的功能<br />    2) 语法：<br />       &lt;%...%&gt;或&lt;jsp:scriptlet&gt;&lt;/jsp:scriptlet&gt;<br />    3) 脚本小程序规则：<br />       a. 你使用的脚本语言决定了脚本小程序的规则;<br />       b. 语句间以分号分隔;<br />       c. 可以使用默认的对象、import进的类、declaration声明的方法和对象以及useBean tag中声明的对象。</b>
		</p>
		<p>
				<b>4.  表达式(Expression)<br />答: 1) 用来将值直接插入到输出中<br />    2) 语法：<br />       &lt;%=%&gt;或&lt;jsp:expression&gt;&lt;/jsp:expression&gt;<br />    3) 表达式规则：<br />       a. 你使用的脚本语言决定了脚本小程序的规则;<br />       b. 执行的顺序为从左到右;<br />       c. 分号不能用于表达式。</b>
		</p>
		<p>
				<b>5.  指令(Directive)<br />答：1) Page: 定义页面的全局属性<br />       语法：&lt;<a href="mailto:%@page">%@page</a> ...%&gt;或&lt;jsp:directive.page .../&gt;<br />    2) Include: 插入一个静态页面内容<br />       语法：&lt;<a href="mailto:%@include">%@include</a> file="header.jsp"%&gt;或&lt;jsp:directive.include file="header.jsp"/&gt;</b>
		</p>
		<p>
				<b>6.  操作(Actions)<br />答：1) forward操作：将请求指向一个特定的页面(类似于Servlet中的RequestDispatcher);<br />       语法：&lt;jsp:forward page="URL"/&gt;<br />    2) include操作：在页面插入动态的内容<br />       语法：&lt;jsp:include page="URL" flush="true"/&gt;<br />    3) plugin操作：在输出页面嵌入一个对象<br />       语法：&lt;jsp:plugin type="bean|applet" code="objectCode" codebase="objectCodebase"&gt;<br />             &lt;jsp:params&gt;<br />             ...<br />             &lt;/jsp:params&gt;<br />             &lt;/jsp:plugin&gt;<br />7.  注释<br />答：JSP中有二种类型的注释：<br />    1) 服务器端注释：不会送回客户端<br />       &lt;%--this is a comment--%&gt;<br />    2) 客户端注释：发送回客户端<br />       &lt;!--comments--&gt;</b>
		</p>
		<p>
				<b>8.  JSP处理过程：<br />答：JSP源文件处理分成二个阶段：<br />    1) JSP页面转换阶段：页面被编译成一个Java类，所有的HTML标记和JSP标记都被转换创建一个Servlet。这时，脚本和表达式还没有被执行;<br />    2) 请求处理阶段：发生在服务器将一个客户端请求指向JSP页面。一个请求对象创建、解析以及提交给编译好的JSP对应的servlet。当这个servlet处理求求的时候它执行先前在JSP中定义的处理脚本小程序和表达式。</b>
		</p>
		<p>
				<strong>9.  使用脚本代码的缺点和指导方针<br />答：1) 缺点：<br />       a. 过度使用脚本代码使用JSP页面混乱和难以维护;<br />       b. 脚本代码降低JSP二个主要的优点：软件重用和代码分开<br />    2) 指导方针：<br />       只在组件功能无能为力或需要有限的脚本时使用。<br />2004-9-29      星期三      晴</strong>
		</p>
		<p>
				<strong>使用可重用组件</strong>
		</p>
		<p>
				<strong>1.  JavaBeans<br />答：1) JavaBeans是一个轻便的、平台无关的、用Java写的组件模型，用以创建可重用的组件;<br />    2) Beans能被组件创建健壮、跨平台的应用程序和小应用程序。</strong>
		</p>
		<p>
				<strong>2.  JSP和组件<br />答：1) 在需要的时候，JSP可以访问JavaBean和EJB；<br />    2) JSP使用action标记来使用、修改以及创建服务器端对象(例如Beans);</strong>
		</p>
		<p>
				<strong>3.  JavaBean与一般Java类的区别<br />答：1) Bean类必须具有不带参数的构造函数;<br />    2) Bean类应该没有任何公用实例变量(域);<br />    3) 通过get和set方法应该获得一致的值。</strong>
		</p>
		<p>
				<strong>4.  Bean的基本用法<br />答：1) 调用Bean<br />       语法：&lt;jsp:useBean id="thread1" class="MyClass" type="Runnable"/&gt;<br />             通常可以认为等价于小脚本：<br />             Runnable thread1 = new MyClass();<br />             以上代码意味着仅当不存在具有相同id和scope的对象时实例化class所指定的类对象，并将其绑定到由id指定名称的变量<br />    2) 访问Bean的属性<br />       语法：&lt;jsp:getProperty name="book1" property="title"/&gt; 或者<br />             &lt;%=book1.getTitle()%&gt;<br />    3) 设置Bean的属性<br />       a. 简单情况<br />          语法：&lt;jsp:setProperty name="book1" property="title" value="Core Servlets and JavaServer Page"/&gt; 或者&lt;%book1.setTitle("Core Servlets and JavaServer Page");%&gt;<br />       b. 使用JSP表达式作为value参数<br />          语法：&lt;jsp:setProperty<br />                     name="entry"<br />                     property="itemID"<br />                     value='&lt;%=request.getParameter("itemID")%&gt;'/&gt;<br />       c. 建立个别属性与输入参数之间的关联<br />          语法：&lt;jsp:setProperty<br />                     name="entry"<br />                     property="numItems"<br />                     param="numItems"/&gt; //使用param指定输入参数，此参数值自动用作该属性值，并自动执行简单的类型转换<br />       d. 建立所有属性与输入参数之间的关联<br />          语法：&lt;jsp:setProperty <br />                     name="entry"<br />                     property="*"/&gt;<br />          需要注意：i : 当输入参数遗失时，不执行任何操作，系统不会提供null作为属性值;<br />                    ii: 无法完成值类型为double的属性的类型转换;<br />                    iV: 在使用自动类型转换时，需要考虑错误处理页面;<br />                    v : 属性名和输入参数必须完全匹配。</strong>
		</p>
		<p>
				<strong>5.  共享Bean<br />答：1) scope作用域：<br />       a. page       : 默认值，表明Bean对象除了被绑定到局部变量，还将位于PageContext对象中;<br />       b. application: 表明Bean对象除了被绑定到局部变量，还将位于ServletContext对象中;<br />       c. session    : 表明Bean对象除了被绑定到局部变量，还将位于当前请求相关的HttpSession对象中;<br />       d. request    : 表明Bean对象除了被绑定到局部变量，还将位于ServletRequest对象中;<br />    2) 调用Bean的方式：<br />       &lt;jsp:useBean ...&gt;<br />       语句(仅当创建Bean而不是使用现有Bean时才被执行)<br />       &lt;/jsp:useBean&gt;</strong>
		</p>
		<p>
				<strong>2004-9-30      星期四      晴</strong>
		</p>
		<p>
				<strong>处理异常</strong>
		</p>
		<p>
				<strong>1.  运行时异常<br />答：1) 一个程序运行时重获的错误;<br />    2) 能被一固有的异常对象引用所使用;<br />    3) 可以利用异常引用创建或产生一个JSP页面显示异常信息给用户。</strong>
		</p>
		<p>
				<strong>2.  创建一个异常跟踪方案<br />答：1) 在每一个JSP页面，包含要创建的异常页面名称;<br />       &lt;</strong>
				<a href="mailto:%@page">
						<strong>%@page</strong>
				</a>
				<strong> import="numberguess.NumberGuessBean" errorPage="error.jsp"%&gt;<br />    2) 创建一个异常页面;<br />       &lt;</strong>
				<a href="mailto:%@page">
						<strong>%@page</strong>
				</a>
				<strong> isErrorPage="true"%&gt;</strong>
		</p>
		<p>
				<strong>3.  JSP页面中的异常处理<br />答：1) &lt;%=exception.toString()%&gt;        打印异常名称;<br />    2) &lt;%exception.printStackTrace();%&gt; 打印当前错误流中所有错误的列表;<br />    3) &lt;%=exception.getMessage()%&gt;      打印错误的详细描述信息</strong>
		</p>
		<p>
				<strong>更高级的主题</strong>
		</p>
		<p>
				<strong>1.  JSP中黙认的内在对象<br />答：名称         类型                                     注释和范围<br />    request      javax.servlet.http.HttpServletRequest    request<br />    response     javax.servlet.http.HttpServletResponse   response<br />    pageContext  javax.servlet.jsp.PageContext            page<br />    session      javax.servlet.http.HttpSession           session<br />    application  javax.servlet.ServletContext             ServletContext<br />    out          javax.servlet.jsp.JspWriter              output stream<br />    config       javax.servlet.ServletConfig              ServletConfig<br />    page         javax.lang.Object                        page<br />    Exception    java.lang.Throwable                      page</strong>
		</p>
		<p>
				<strong>2.  默认对象之请求(request)<br />答：封装了来自客户端的请求：<br />    方法：1) getCookies: 取得Cookie数组;<br />          2) getMethod: 返回请求形成的方式(GET/POST);<br />          3) getParameterNames: 返回form中对象名称的枚举;<br />          4) getParameter：返回指定名称的对象值;<br />          5) getParameterValues: 返回指定名称的对象值数组;<br />          6) setAttribute: 设置属性;<br />          7) getAttribute: 返回属性值;<br />          8) getAttributeNames: 返回属性名称的枚举</strong>
		</p>
		<p>
				<strong>3.  默认对象之out<br />答：JSPWriter的一个实例, 用于发送响应给客户端<br />    方法：1) print(String)/println(String)<br />          2) print(int)/println(int)<br />          3) flush()</strong>
		</p>
		<p>
				<strong>4.  默认对象之exception<br />答：1) 用于异常对象的异常实例;<br />    2) 异常页面在page指令中存在属性isErrorPage="true";<br />    3) 方法：getMessage()/printStackTrace()/toString()<br /> <br />5.  默认对象之session<br />答：1) HttpSession的一个实例, 用于在一个session中保持状态<br />    2) 方法：getAttribute()<br />             setAttribute()<br />             removeAttribute()<br />             getAttributeNames()</strong>
		</p>
		<p>
				<strong>6.  默认对象之application<br />答：1) ServletContext一个实例，用于保持application的状态<br />    2) 方法：getAttribute()<br />             setAttribute()<br />             getInitParameter()<br />             getServletInfo()<br />    3) application的作用域比session大得多，一个session和一个client联系, 而application保持了用于所有客户端的状态</strong>
		</p>
		<p>
				<strong>2004-10-8      星期四      晴                                              </strong>
		</p>
		<p>
				<strong>自定义标签库(上)</strong>
		</p>
		<p>
				<strong>1.  什么是自定义标签<br />答：1) 用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;<br />    2) 可以非常机密地和JSP的表示逻辑联系在一起，又具有和普通JavaBean相同的业务逻辑处理能力;<br />    2) 当一个JSP页面转变为servlet时，其间的用户自定义标签转化为操作一个称为标签hander的对象;<br />    3) 可操作默认对象，处理表单数据，访问数据库以及其它企业服务;                 </strong>
		</p>
		<p>
				<strong>2.  自定义标签库的特点<br />答：1) 通过调用页面传递参数实现定制;<br />    2) 访问所有对JSP页面可能的对象;<br />    3) 修改调用页面生成的响应;<br />    4) 自定义标签间可相互通信;<br />    5) 在同一个JSP页面中通过标签嵌套，可实现复杂交互。</strong>
		</p>
		<p>
				<strong>3.  如何使用自定义标签库<br />答：1) 声明标签库<br />    2) 使标签库执行对Web应用程序可用</strong>
		</p>
		<p>
				<strong>4.  声明标签库<br />答：1) 使用taglib指令声明标签库<br />    2) 语法：&lt;</strong>
				<a href="mailto:%@taglib">
						<strong>%@taglib</strong>
				</a>
				<strong> uri="URI" prefix="pre" %&gt;<br />       注意：a. uri属性可以是绝对的，也可以是相对URL，该URL指向标记库描述符(TLD)文件;<br />             b. uri属性也可以是一个并不存在的URL，该URL为web.xml文件中将标记库描述符(TLD)文件的绝对URL到本地系统的一个映射;<br />    3) 范例：&lt;</strong>
				<a href="mailto:%@taglib">
						<strong>%@taglib</strong>
				</a>
				<strong> uri="/WEB-INF/template.tld" prefix="test" %&gt;<br />             &lt;</strong>
				<a href="mailto:%@taglib">
						<strong>%@taglib</strong>
				</a>
				<strong> uri="</strong>
				<a href="http://java.sun.com/jstl/core">
						<strong>http://java.sun.com/jstl/core</strong>
				</a>
				<strong>" prefix="core" %&gt;       </strong>
		</p>
		<p>
				<strong>5.  使标签库执行可用<br />答：方式一：在WEB-INF/classes目录下部署标记处理程序类;<br />    方式二：将标记处理程序类打包成jar文件并置于WEB-INF/lib目录。</strong>
		</p>
		<p>
				<strong>6.  几种典型的标签(疑问：可以有带主体而没有属性的标签么？)<br />答：1) 不带属性和主体的简单标签：&lt;mytaglibs:SomeTag/&gt;;<br />    2) 不带主体但有属性的标签：&lt;mytaglibs:SomeTag user="TonyDeng"/&gt;;<br />    3) 带有主体和属性的标签：&lt;mytaglibs:SomeTag user="TonyDeng"&gt;<br />                             ...// 标签体<br />                             &lt;/mytaglibs:SomeTag&gt;;<br />    注意：a. 属性列于start tag中，它是在标记库描述符(TLD)文件中指定，服务于标记库的自定义行为;<br />          b. 标签体位于start tag和end tag间，可以是任何合法的JSP内容或者标签;</strong>
		</p>
		<p>
				<strong>7.  定义标签<br />答：1) 开发实现tag的类(tag handler);<br />    2) 编辑标记库描述符(TLD)文件;<br />    3) 在web.xml中为标记库描述符(TLD)文件的绝对URL建立一个映射(该步骤可选);</strong>
		</p>
		<p>
				<strong>8.  标记库描述符(TLD)文件<br />答：1) 一个描述标记库的XML文件;<br />    2) 内容开始是整个库的描述，然后是tag的描述;<br />    3) 标记库描述符(TLD)文件用于Web Container确认tag以及JSP页面发展工具;</strong>
		</p>
		<p>
				<strong>9.  实现tag的类(tag handler)<br />答：1) 是一些在引用了标签的JSP页面执行期间被Web Container调用以求自定义标签值的对象;<br />    2) 必须实现Tag, SimpleTag和BodyTag之一;<br />    3) 可以继承TagSupport和BodyTagSupport之一。</strong>
		</p>
		<p>
				<strong>10. 标签库的接口和类的继承关系<br />答：表现形式一：<br />    a. 接口的继承关系：<br />       ☉ interface javax.servlet.jsp.tagext.JspTag<br />          ☉ interface javax.servlet.jsp.tagext.SimpleTag<br />          ☉ interface javax.servlet.jsp.tagext.Tag<br />             ☉ interface javax.servlet.jsp.tagext.IterationTag<br />             ☉ interface javax.servlet.jsp.tagext.BodyTag<br />    b. 类的继承关系：<br />       ☉ class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable) <br />          ☉ class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag) <br />       ☉ class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag) <br />    表现形式二：<br />                  (Interface)<br />                    JspTag<br />                      ↑<br />              |ˉˉˉˉˉˉˉˉ|    <br />         (Interface)      (Interface)<br />             Tag           SimpleTag ←－－SimpleTagSupport<br />              ↑                           <br />              |                            <br />         (Interface)  <br />         IterationTag←－－TagSupport<br />              ↑                ↑<br />              |                 |<br />         (Interface)            |<br />           BodyTag   ←－－BodyTagSupport</strong>
		</p>
		<p>
				<strong>    标签接口方法一览表</strong>
		</p>
		<p>
				<strong>                  (Interface)<br />                    JspTag(没有方法)<br />                      ↑<br />              |ˉˉˉˉˉˉˉˉ|    <br />         (Interface)      (Interface)<br />             Tag           SimpleTag<br />              ↑                           <br />              |         (int doEndTag()、int doStartTag()、Tag getParent()、void release()、void setPageContext(PageContext pc)、void setParent(Tag t))<br />         (Interface)  <br />         IterationTag   (int doAfterBody())<br /> <br />              ↑    <br />              |     <br />         (Interface)<br />           BodyTag      (void doInitBody()、void setBodyContent(BodyContent b))</strong>
		</p>
		<p> </p>
		<p>
				<strong>2004-10-9      星期四      晴                                              </strong>
		</p>
		<p>
				<strong>自定义标签库(中)</strong>
		</p>
		<p>
				<strong>11. 一个Tag处理程序类必须实现的方法<br />答：标签处理程序类型            方法<br />    Simple                      doStartTag, doEndTag, release<br />    Attributes                  doStartTag, doEndTag, set/getAttribute...release<br />    Body,No Itrative and        doStartTag, doEndTag, release<br />    Evaluation  <br />    Body, Itrative Evaluation   doStartTag, doAterTag, doEndTag, release<br />    Body, Interaction           doStartTag, doEndTag, release, doInitbody, doAfterBody</strong>
		</p>
		<p>
				<strong>12. 简单的标签处理程序类<br />答：1) 必须实现Tag接口的doStartTag()和doEndTag()方法;<br />    2) 因为不存在Body，doStartTag()方法必须返回SKIP_BODY;<br />    3) 如其余页面要执行，doEndTag()方法返回EVAL_PAGE, 否则返回SKIP_PAGE;<br />    4) 对于每一个标签属性，你必须在标签处理程序类里定义一个特性以及get和set方法以一致于JavaBeans体系惯例</strong>
		</p>
		<p>
				<strong>13. 带Body的自定义标签<br />答：1) 必须实现Tag接口的doStartTag()和doEndTag()方法;<br />    2) 可以实现IterationTag接口的doAfterBody()方法;<br />    3) 可以实现BodyTag接口的doInitBody和setBodyContent方法;<br />    4) doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用BodyContent);<br />    5) doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;<br />    6) doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;</strong>
		</p>
		<p>
				<strong>14. 定义脚本变量的标签(迭代的标签库)<br />答：1) 定义脚本标签的二个步骤:<br />       a. 在标记库描述符(TLD)文件中列明脚本变量;<br />       b. 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class);<br />    2) 变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置;<br />    3) 标签扩展信息类(TEI)必须继承TagExtraInfo以及覆盖getVariableInfo()方法;<br />    4) 变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息类(TEI)的VariableInfo中定义)之一;</strong>
		</p>
		<p>
				<strong>15. 脚本变量的有效性<br />答：变量     |   有效性                    <br />    ---------------------------------------<br />    NESTED   | 标签中的参数在starttag到endtag之间是有效的<br />    AT_BEGIN | 标签中的参数在标签的开始到JSP页面结束是有效的<br />    AT_END   | 标签中的参数在标签的结束到JSP页面结束是有效的</strong>
		</p>
		<p>
				<strong>2004-10-10     星期四      晴 </strong>
		</p>
		<p>
				<strong>16.  Tag接口的方法<br />答：interface javax.servlet.jsp.tagext.Tag<br />    ------------------------------------------------------<br />    +EVAL_BODY_INCLUDE:int<br />    +EVAL_PAGE:int<br />    +SKIP_BODY:int<br />    +SKIP_PAGE:int<br />    ------------------------------------------------------<br />    +release():void<br />    +getParent():javax.servlet.jsp.tagext.Tag<br />    +setParent(javax.servlet.jsp.tagext.Tag):void<br />    +doEndTag():int<br />    +doStartTag():int<br />    +setPageContext(javax.servlet.jsp.PageContext):void</strong>
		</p>
		<p>
				<strong>17.  Tag的生命周期<br />答：1) setPageContext(javax.servlet.jsp.PageContext):void<br />    2) setParent(javax.servlet.jsp.tagext.Tag):void<br />    3) //setAttribute:void<br />    4) doStartTag():int<br />    5) doEndTag():int<br />    6) release():void</strong>
		</p>
		<p>
				<strong>18.  BodyTag和Tag接口的关系<br />答：interface javax.servlet.jsp.tagext.BodyTag      --&gt;     interface javax.servlet.jsp.tagext.Tag<br />    ------------------------------------------<br />    +EVAL_BODY_AGAIN:int<br />    ------------------------------------------<br />    +doInitBody():void<br />    +setBodyContent(javax.servlet.jsp.tagext.BodyContext):void<br />    +doAfterBody():int</strong>
		</p>
		<p>
				<strong>19.  BodyTag的处理过程<br />答：1) setPageContext(javax.servlet.jsp.PageContext):void<br />    2) setParent(javax.servlet.jsp.tagext.Tag):void<br />    3) //setParent()<br />    4) doStartTag():int<br />    5) setBodyContent(javax.servlet.jsp.tagext.BodyContent):void<br />    6) doInitBody():void<br />    7) doAfterBody():int<br />    8) doEndTag():int<br />    9) release():void</strong>
		</p>
		<p>
				<strong>20.  SimpleTag接口的方法<br />答：javax.servlet.jsp.tagext.SimpleTag<br />    ------------------------------------------<br />    +doTag():void<br />    +getParent():JspTag<br />    +setJspBody(JspFragment jspBody):void <br />    +setJspContext(JspContext pc):void<br />    +setParent(JspTag parent):void</strong>
		</p>
		<p>
				<strong>21.  SimpleTage接口的生命周期<br />答：1) new:<br />       每次遇到标签，容器构造一个SimpleTag的实例，这个构造方法没有参数。和红典的标签一样，SimpleTag不能缓冲，故不能重用，每次都需要构造新的实例。<br />    2) setJspContext()、setParent(): 只有这个标签在另一个标签之内时，才调用setParent()方法;<br />    3) 设置属性：调用每个属性的setter方法;<br />    4) setJspBody();<br />    5) doTag(): 所有标签的逻辑、迭代和Body计算，都在这个方法中;<br />    6) return</strong>
		</p>
		<p>
				<strong>2004-10-11     星期五      </strong>晴 </p>
		<p> </p>
		<p>  </p>
		<p> </p>
		<p>  <br />       <br />         <br />                </p>
<img src ="http://www.blogjava.net/hitlang/aggbug/71845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hitlang/" target="_blank">liulang</a> 2006-09-25 22:52 <a href="http://www.blogjava.net/hitlang/articles/71845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>