﻿<?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-lanxin1020-随笔分类-jsp&amp;servlet</title><link>http://www.blogjava.net/lanxin1020/category/38972.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 22 May 2009 01:00:47 GMT</lastBuildDate><pubDate>Fri, 22 May 2009 01:00:47 GMT</pubDate><ttl>60</ttl><item><title>tomcat类加载机制</title><link>http://www.blogjava.net/lanxin1020/archive/2009/05/21/274380.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Thu, 21 May 2009 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/05/21/274380.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/274380.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/05/21/274380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/274380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/274380.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/lanxin1020/aggbug/274380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-05-21 22:13 <a href="http://www.blogjava.net/lanxin1020/archive/2009/05/21/274380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>filter（转）</title><link>http://www.blogjava.net/lanxin1020/archive/2009/05/10/269866.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sun, 10 May 2009 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/05/10/269866.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/269866.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/05/10/269866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/269866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/269866.html</trackback:ping><description><![CDATA[&nbsp;过滤器是一个程序，它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上，并且可以检查进入这些资源的请求信息。在这之后，过滤器可以作如下的选择：
<p>1. 以常规的方式调用资源（即，调用servlet或JSP页面）。<font color="#ff99cc">个人理解为请求通过过滤执行其他的操作<br />
</font>2.利用修改过的请求信息调用资源。<font color="#ff99cc">对请求的信息加以修改，然后继续执行<br />
</font>3. 调用资源，但在发送响应到客户机前对其进行修改<br />
4. 阻止该资源调用，代之以转到其他的资源，返回一个特定的状态代码或生成替换输出。<font color="#ff99cc">个人理解为请求被拦截时强制执行（跳转）的操作</font></p>
<p>过滤器提供了几个重要好处 ：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，它以一种模块化的或可重用的方式封装公共的行为。你有30个不同的serlvet或JSP页面，需要压缩它们的内容以减少下载时间吗？没问题：构造一个压缩过滤器，然后将它应用到30个资源上即可。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其次，利用它能够将高级访问决策与表现代码相分离。这对于JSP特别有价值，其中一般希望将几乎整个页面集中在表现上，而不是集中在业务逻辑上。例如，希 望阻塞来自某些站点的访问而不用修改各页面（这些页面受到访问限制）吗？没问题：建立一个访问限制过滤器并把它应用到想要限制访问的页面上即可。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，过滤器使你能够对许多不同的资源进行批量性的更改。你有许多现存资源，这些资源除了公司名要更改外其他的保持不变，能办到么？没问题：构造一个串替换过滤器，只要合适就使用它。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但要注意，过滤器只在与servlet规范2.3版兼容的服务器上有作用。如果你的Web应用需要支持旧版服务器，就不能使用过滤器。</p>
<p>1．&nbsp;&nbsp; 建立基本过滤器</p>
<p>建立一个过滤器涉及下列五个步骤：<br />
1）建立一个<font color="#ff00ff">实现Filter接口</font>的类。这个类<font color="#ff00ff">需要三个方法，分别是：doFilter、init和destroy</font>。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFilter方法包含主要的过滤代码（见第2步），init方法建立设置操作，而destroy方法进行清楚。</p>
<p>2）在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息 （包括表单数据、cookie和HTTP请求头）的完全访问。第二个参数为ServletResponse，通常在简单的过滤器中忽略此参数。最后一个参 数为FilterChain，如下一步所述，此参数用来调用servlet或JSP页。</p>
<p>3）调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参 数。在调用此对象的doFilter方法时，激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联，则servlet或JSP 页面被激活。</p>
<p>4）对相应的servlet和JSP页面注册过滤器。在部署描述符文件（web.xml）中使用filter和filter-mapping元素。</p>
<p>5）禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。</p>
<p>1.1&nbsp;&nbsp; 建立一个实现Filter接口的类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff00ff"> 所有过滤器都必须实现javax.servlet.Filter</font>。这个接口包含三个方法，分别为doFilter、init和destroy。</p>
<p>public void doFilter(ServletRequset request, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletResponse response,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FilterChain chain)<br />
&nbsp;&nbsp;&nbsp;&nbsp; thows ServletException, IOException</p>
<p>每当调用一个过滤器（即，每次请求与此过滤器相关的servlet或JSP页面）时，就执行其doFilter方法。正是这个方法包含了大部分过滤逻辑。 第一个参数为与传入请求有关的ServletRequest。对于简单的过滤器，大多数过滤逻辑是基于这个对象的。如果处理HTTP请求，并且需要访问诸 如getHeader或getCookies等在ServletRequest中无法得到的方法，就要把此对象构造成 HttpServletRequest。</p>
<p>第二个参数为ServletResponse。除了在两个情形下要使用它以外，通常忽略这个参数。首先，如果希望完全阻塞对相关servlet或JSP页 面的访问。可调用response.getWriter并直接发送一个响应到客户机。其次，如果希望修改相关的servlet或JSP页面的输出，可把响 应包含在一个收集所有发送到它的输出的对象中。然后，在调用serlvet或JSP页面后，过滤器可检查输出，如果合适就修改它，之后发送到客户机。</p>
<p>DoFilter的最后一个参数为FilterChain对象。对此对象调用doFilter以激活与servlet或JSP页面相关的下一个过滤器。如果没有另一个相关的过滤器，则对doFilter的调用激活servlet或JSP本身。</p>
<p>public void init(FilterConfig config)&nbsp;&nbsp; thows ServletException</p>
<p>init方法只在此过滤器第一次初始化时执行，不是每次调用过滤器都执行它。对于简单的过滤器，可提供此方法的一个空体，但有两个原因需要使用init。 首先，FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。因此，普遍的办法是利用init将 FilterConfig对象存放在一个字段中，以便doFilter方法能够访问servlet环境或过滤器名.其次，FilterConfig对象具 有一个getInitParameter方法，它能够访问部署描述符文件（web.xml）中分配的过滤器初始化参数。</p>
<p>public void destroy( )<br />
&nbsp;&nbsp;&nbsp;&nbsp; 大多数过滤器简单地为此方法提供一个空体，不过，可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。</p>
<p>1.2&nbsp;&nbsp; 将过滤行为放入doFilter方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; doFilter方法为大多数过滤器地关键部分。每当调用一个过滤器时，都要执行doFilter。对于大多数过滤器来说，doFilter执行的步骤是 基于传入的信息的。因此，可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造为 HttpServletRequest类型，以提供对该类的更特殊方法的访问。</p>
<p>1.3&nbsp;&nbsp; 调用FilterChain对象的doFilter方法<br />
&nbsp;&nbsp;&nbsp;&nbsp; Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时，激活下一个相关的 过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时，激活servlet或 页面自身。<br />
但是，链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程。在这样的情况下，不再调用JSP页面的serlvet，并且中断此调用过程的过滤器负责将输出提供给客户机。</p>
<p>1.4&nbsp;&nbsp; 对适当的servlet和JSP页面注册过滤器<br />
&nbsp;&nbsp;&nbsp;&nbsp; 部署描述符文件的2.3版本引入了两个用于过滤器的元素，分别是：filter和filter-mapping。filter元素向系统注册一个过滤对象，filter-mapping元素指定该过滤对象所应用的URL。</p>
<p>1.filter元素<br />
filter元素位于部署描述符文件（web.xml）的前部，所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素：</p>
<p>1、 icon&nbsp;&nbsp; 这是一个可选的元素，它声明IDE能够使用的一个图象文件。<br />
2、filter-name&nbsp;&nbsp; 这是一个必需的元素，它给过滤器分配一个选定的名字。<br />
3、display-name&nbsp;&nbsp; 这是一个可选的元素，它给出IDE使用的短名称。<br />
4、 description&nbsp;&nbsp; 这也是一个可选的元素，它给出IDE的信息，提供文本文档。<br />
5、 filter-class&nbsp;&nbsp; 这是一个必需的元素，它指定过滤器实现类的完全限定名。<br />
6、 init-param&nbsp;&nbsp; 这是一个可选的元素，它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。</p>
<p>请注意，过滤是在serlvet规范2.3版中初次引入的。因此，web.xml文件必须使用DTD的2.3版本。下面介绍一个简单的例子：</p>
<p>&lt;xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&nbsp;&nbsp;&nbsp; DOCTYPE web-app PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;web-app&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;MyFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;myPackage.FilterClassfilter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;...filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-app&gt;</p>
<p><br />
2.filter-mapping元素<br />
&nbsp;&nbsp;&nbsp; filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素：</p>
<p>1、 filter-name&nbsp;&nbsp; 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。</p>
<p>2、 url-pattern&nbsp;&nbsp; 此元素声明一个以斜杠（/）开始的模式，它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或 servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式，可重复 整个filter-mapping元素。</p>
<p>3、 servlet-name&nbsp;&nbsp; 此元素给出一个名称，此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供 多个servlet-name元素项。如果希望过滤器适合于多个servlet名，可重复这个filter-mapping元素。<br />
下面举一个例子：</p>
<p>xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&nbsp;&nbsp;&nbsp; DOCTYPE web-app PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;web-app&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;MyFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;myPackage.FilterClassfilter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;MyFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/someDirectory/SomePage.jspurl-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; web-app&gt;</p>
<p>&nbsp;</p>
<p>1.5&nbsp;&nbsp; 禁用激活器servlet<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在对资源应用过滤器时，可通过指定要应用过滤器的URL模式或servlet名来完成。如果提供servlet名，则此名称必须与web.xml的 servlet元素中给出的名称相匹配。如果使用应用到一个serlvet的URL模式，则此模式必须与利用web.xml的元素servlet- mapping指定的模式相匹配。但是，多数服务器使用&#8220;激活器servlet&#8221;为servlet体统一个缺省的URL：http: //host/WebAppPrefix/servlet/ServletName。需要保证用户不利用这个URL访问servlet（这样会绕过过滤器 设置）。<br />
例如，假如利用filter和filter-mapping指示名为SomeFilter的过滤器应用到名为SomeServlet的servlet，则如下：</p>
<p>&lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;SomeFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;somePackage.SomeFilterClassfilter-class&gt;<br />
&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;SomeFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;SomeServletservlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;</p>
<p>&nbsp;</p>
<p><br />
接着，用servlet和servlet-mapping规定URL&nbsp;&nbsp; <a href="http://host/webAppPrefix/Blah">http://host/webAppPrefix/Blah</a> 应该调用SomeSerlvet，如下所示：</p>
<p>&lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;SomeFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;somePackage.SomeFilterClassfilter-class&gt;<br />
&nbsp;&nbsp;&nbsp; filter&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;SomeFilterfilter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;/Blahservlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;</p>
<p>&nbsp;</p>
<p><br />
现在，在客户机使用URL&nbsp;&nbsp; <a href="http://host/webAppPrefix/Blah">http://host/webAppPrefix/Blah</a> 时就会调用过滤器。过滤器不应用到<br />
<a href="http://host/webAppPrefix/servlet/SomePackage.SomeServletClass">http://host/webAppPrefix/servlet/SomePackage.SomeServletClass</a>。<br />
尽管有关闭激活器的服务器专用方法。但是，可移植最强的方法时重新映射Web应用钟的/servlet模式，这样使所有包含此模式的请求被送到相同的 servlet中。为了重新映射此模式，首先应该建立一个简单的servlet，它打印一条错误消息，或重定向用户到顶层页。然后，使用servlet和 servlet-mapping元素发送包含/servlet模式的请求到该servlet。程序清单9-1给出了一个简短的例子。</p>
<p>程序清单9-1 web.xml（重定向缺省servlet URL的摘录）</p>
<p>xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&nbsp;&nbsp;&nbsp; DOCTYPE web-app PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;web-app&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Errorservlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;somePackage.ErrorServletservlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; servlet&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Errorservlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/*url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;web-app&gt;</p>
<p>本文参考:http://www.javaeye.com/topic/140553</p>
<img src ="http://www.blogjava.net/lanxin1020/aggbug/269866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-05-10 09:33 <a href="http://www.blogjava.net/lanxin1020/archive/2009/05/10/269866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp语法详解</title><link>http://www.blogjava.net/lanxin1020/archive/2009/05/09/269740.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sat, 09 May 2009 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/05/09/269740.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/269740.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/05/09/269740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/269740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/269740.html</trackback:ping><description><![CDATA[HTML&nbsp;注释&nbsp;<br />
<br />
在客户端显示一个注释.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;!--&nbsp;comment&nbsp;[&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;&nbsp;]&nbsp;--&gt;&nbsp;<br />
例子&nbsp;1<br />
&lt;!--&nbsp;This&nbsp;file&nbsp;displays&nbsp;the&nbsp;user&nbsp;login&nbsp;screen&nbsp;--&gt;&nbsp;<br />
在客户端的HTML源代码中产生和上面一样的数据：&nbsp;<br />
<br />
&lt;!--&nbsp;This&nbsp;file&nbsp;displays&nbsp;the&nbsp;user&nbsp;login&nbsp;screen&nbsp;--&gt;&nbsp;<br />
例子&nbsp;2<br />
&lt;!--&nbsp;This&nbsp;page&nbsp;was&nbsp;loaded&nbsp;on&nbsp;&lt;%=&nbsp;(new&nbsp;java.util.Date()).toLocaleString()&nbsp;%&gt;&nbsp;--&gt;&nbsp;<br />
在客户端的HTML源代码中显示为:&nbsp;<br />
<br />
&lt;!--&nbsp;This&nbsp;page&nbsp;was&nbsp;loaded&nbsp;on&nbsp;January&nbsp;1,&nbsp;2000&nbsp;--&gt;&nbsp;<br />
描述 <br />
这种注释和HTML中很像，也就是它可以在"查看源代码"中看到.&nbsp;<br />
<br />
唯一有些不同的就是，你可以在这个注释中用表达式（例子2所示).这个表达示是不定的，由页面不同而不同，你能够使用各种表达式，只要是合法的就行。更多的请看表达式<br />
<br />
<br />
<br />
隐藏注释&nbsp;<br />
<br />
<br />
写在JSP程序中，但不是发给客户。&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;%--&nbsp;comment&nbsp;--%&gt;&nbsp;<br />
例子：<br />
<br />
&lt;%@&nbsp;page&nbsp;language="java"&nbsp;%&gt;&nbsp;&lt;html&gt;&nbsp;&lt;head&gt;&lt;title&gt;A&nbsp;Comment&nbsp;Test&lt;/title&gt;&lt;/head&gt;&nbsp;&lt;body&gt;&nbsp;&lt;h2&gt;A&nbsp;Test&nbsp;of&nbsp;Comments&lt;/h2&gt;&nbsp;&lt;%--&nbsp;This&nbsp;comment&nbsp;will&nbsp;not&nbsp;be&nbsp;visible&nbsp;in&nbsp;the&nbsp;page&nbsp;source&nbsp;--%&gt;&nbsp;&lt;/body&gt;&nbsp;&lt;/html&gt;&nbsp;<br />
<br />
描述 <br />
用隐藏注释标记的字符会在JSP编译时被忽略掉。这个注释在你希望隐藏或注释你的JSP程序时是很有用的。JSP编译器不是会对&lt;%--and--%&gt;之间的语句进行编译的，它不会显示在客户的浏览器中，也不会在源代码中看到&nbsp;<br />
<br />
声明&nbsp;<br />
<br />
<br />
在JSP程序中声明合法的变量和方法&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;%!&nbsp;declaration;&nbsp;[&nbsp;declaration;&nbsp;]+&nbsp;...&nbsp;%&gt;&nbsp;<br />
例子<br />
&lt;%!&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;%&gt;&nbsp;<br />
&lt;%!&nbsp;int&nbsp;a,&nbsp;b,&nbsp;c;&nbsp;%&gt;&nbsp;<br />
&lt;%!&nbsp;Circle&nbsp;a&nbsp;=&nbsp;new&nbsp;Circle(2.0);&nbsp;%&gt;&nbsp;<br />
描述 <br />
声明你将要在JSP程序中用到的变量和方法。你也必须这样做，不然会出错.&nbsp;<br />
<br />
你可以一次性声明多个变量和方法，只要以";"结尾就行，当然这些声明在Java中要是合法的。&nbsp;<br />
<br />
当你声明方法或变量时，请注意以下的一些规则:&nbsp;<br />
<br />
声明必须以";"结尾(Scriptlet有同样的规则，但是&nbsp;表达式就不同了).&nbsp;<br />
你可以直接使用在&lt;%&nbsp;@&nbsp;page&nbsp;%&gt;中被包含进来的已经声明的变量和方法，不需要对它们重新进行声明.&nbsp;<br />
一个声明仅在一个页面中有效。如果你想每个页面都用到一些声明，最好把它们写成一个单独的文件，然后用&lt;%@&nbsp;include&nbsp;%&gt;或&lt;jsp:include&nbsp;&gt;元素包含进来。&nbsp;<br />
<br />
<br />
表达式&nbsp;<br />
<br />
<br />
包含一个符合JSP语法的表达式&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;%=&nbsp;expression&nbsp;%&gt;&nbsp;<br />
例子<br />
&lt;font&nbsp;color="blue"&gt;&lt;%=&nbsp;map.size()&nbsp;%&gt;&lt;/font&gt;&nbsp;<br />
&lt;b&gt;&lt;%=&nbsp;numguess.getHint()&nbsp;%&gt;&lt;/b&gt;.&nbsp;<br />
描述 <br />
表达式元素表示的是一个在脚本语言中被定义的表达式，在运行后被自动转化为字符串，然后插入到这个表达示在JSP文件的位置显示。因为这个表达式的值已经被转化为字符串，所以你能在一行文本中插入这个表达式（形式和ASP完全一样).&nbsp;<br />
<br />
当你在JSP中使用表达式时请记住以下几点：&nbsp;<br />
<br />
你不能用一个分号（"；"）来作为表达式的结束符.但是同样的表达式用在scriptlet中就需要以分号来结尾了！查看Scriptlet&nbsp;<br />
这个表达式元素能够包括任何在Java&nbsp;Language&nbsp;Specification中有效的表达式.&nbsp;<br />
有时候表达式也能做为其它JSP元素的属性值.一个表达式能够变得很复杂，它可能由一个或多个表达式组成，这些表达式的顺序是从左到右。&nbsp;<br />
<br />
<br />
[/b]Scriptlet&nbsp;[/b]<br />
<br />
<br />
包含一个有效的程序段.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;%&nbsp;code&nbsp;fragment&nbsp;%&gt;&nbsp;<br />
例子<br />
&lt;%&nbsp;<br />
String&nbsp;name&nbsp;=&nbsp;null;&nbsp;<br />
if&nbsp;(request.getParameter("name")&nbsp;==&nbsp;null)&nbsp;{&nbsp;<br />
%&gt;&nbsp;<br />
&lt;%@&nbsp;include&nbsp;file="error.html"&nbsp;%&gt;&nbsp;<br />
&lt;%&nbsp;<br />
}&nbsp;else&nbsp;{&nbsp;<br />
foo.setName(request.getParameter("name"));&nbsp;<br />
if&nbsp;(foo.getName().equalsIgnoreCase("integra"))&nbsp;<br />
name&nbsp;=&nbsp;"acura";&nbsp;<br />
if&nbsp;(name.equalsIgnoreCase(&nbsp;"acura"&nbsp;))&nbsp;{&nbsp;<br />
%&gt;&nbsp;<br />
描述 <br />
一个scriptlet能够包含多个jsp语句，方法，变量，表达式&nbsp;<br />
<br />
因为scriptlet,我们便能做以下的事:&nbsp;<br />
<br />
声明将要用到的变量或方法（参考&nbsp;声明).&nbsp;<br />
编写JSP表达式（参考&nbsp;表达式).&nbsp;<br />
使用任何隐含的对象和任何用&lt;jsp:useBean&gt;声明过的对象&nbsp;<br />
编写JSP语句&nbsp;(如果你在使用Java语言，这些语句必须遵从Java&nbsp;Language&nbsp;Specification,).&nbsp;<br />
任何文本，HTML标记，JSP元素必须在scriptlet之外&nbsp;<br />
当JSP收到客户的请求时，scriptlet就会被执行，如果scriptlet有显示的内容，这些显示的内容就被存在out对象中。&nbsp;<br />
<br />
<br />
Include&nbsp;指令<br />
<br />
<br />
在JSP中包含一个静态的文件，同时解析这个文件中的JSP语句.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;%@&nbsp;include&nbsp;file="relativeURL"&nbsp;%&gt;&nbsp;<br />
例子<br />
include.jsp:&nbsp;<br />
<br />
&lt;html&gt;&nbsp;&lt;head&gt;&lt;title&gt;An&nbsp;Include&nbsp;Test&lt;/title&gt;&lt;/head&gt;&nbsp;&lt;body&nbsp;bgcolor="white"&gt;&nbsp;&lt;font&nbsp;color="blue"&gt;&nbsp;The&nbsp;current&nbsp;date&nbsp;and&nbsp;time&nbsp;are&nbsp;&lt;%@&nbsp;include&nbsp;file="date.jsp"&nbsp;%&gt;&nbsp;&lt;/font&gt;&nbsp;&lt;/body&gt;&nbsp;&lt;/html&gt;&nbsp;<br />
<br />
date.jsp:<br />
<br />
&nbsp;&lt;%@&nbsp;page&nbsp;import="java.util.*"&nbsp;%&gt;&nbsp;&lt;%=&nbsp;(new&nbsp;java.util.Date()&nbsp;).toLocaleString()&nbsp;%&gt;&nbsp;<br />
<br />
Displays&nbsp;in&nbsp;the&nbsp;page:&nbsp;<br />
The&nbsp;current&nbsp;date&nbsp;and&nbsp;time&nbsp;are&nbsp;<br />
Aug&nbsp;30,&nbsp;1999&nbsp;2:38:40&nbsp;<br />
<br />
描述 <br />
&lt;%@include&nbsp;%&gt;指令将会在JSP编译时插入一个包含文本或代码的文件，当你使用&lt;%@&nbsp;include&nbsp;%&gt;指命时，这个包含的过程就当是静态的。静态的包含就是指这个被包含的文件将会被插入到JSP文件中去，这个包含的文件可以是JSP文件，HTML文件，文本文件。如果包含的是JSP文件，这个包含的JSP的文件中代码将会被执行。&nbsp;<br />
<br />
如果你仅仅只是用include&nbsp;来包含一个静态文件。那么这个包含的文件所执行的结果将会插入到JSP文件中放&lt;%&nbsp;@&nbsp;include&nbsp;%&gt;的地方。一旦包含文件被执行，那么主JSP文件的过程将会被恢复，继续执行下一行.&nbsp;<br />
<br />
这个被包含文件可以是html文件，jsp文件，文本文件，或者只是一段Java代码，但是你得注意在这个包含文件中不能使用&lt;html&gt;,&lt;/html&gt;,&lt;body&gt;,&lt;/body&gt;标记，因为这将会影响在原JSP文件中同样的标记&nbsp;，这样做有时会导致错误.&nbsp;<br />
<br />
有一些&lt;%@&nbsp;include&nbsp;%&gt;指命的行为是以特殊的JSP编译条件为基础，比如：&nbsp;<br />
<br />
这个被包含的文件必须对所有客户都有开放且必须f有效，或者它有安全限制&nbsp;<br />
如果这个包含文件被改变，包含此文件的JSP文件将被重新编译&nbsp;<br />
属性:<br />
file="relativeURL"<br />
这个包含文件的路径名一般来说是指相对路径，不需要什么端口，协议，和域名，如下:&nbsp;<br />
<br />
"error.jsp""templates/onlinestore.html""/beans/calendar.jsp"&nbsp;<br />
<br />
如果这个路径以"/"开头，那么这个路径主要是参照JSP应用的上下关系路径，如果路径是以文件名或目录名开头，那么这个路径就是正在使用的JSP文件的当前路径.<br />
<br />
<br />
Page&nbsp;指令<br />
<br />
<br />
定义JSP文件中的全局属性.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;%@&nbsp;page&nbsp;<br />
[&nbsp;language="java"&nbsp;]&nbsp;<br />
[&nbsp;extends="package.class"&nbsp;]&nbsp;<br />
[&nbsp;import="{package.class&nbsp;|&nbsp;package.*},&nbsp;..."&nbsp;]&nbsp;<br />
[&nbsp;session="true&nbsp;|&nbsp;false"&nbsp;]&nbsp;<br />
[&nbsp;buffer="none&nbsp;|&nbsp;8kb&nbsp;|&nbsp;sizekb"&nbsp;]&nbsp;<br />
[&nbsp;autoFlush="true&nbsp;|&nbsp;false"&nbsp;]&nbsp;<br />
[&nbsp;isThreadSafe="true&nbsp;|&nbsp;false"&nbsp;]&nbsp;<br />
[&nbsp;info="text"&nbsp;]&nbsp;<br />
[&nbsp;errorPage="relativeURL"&nbsp;]&nbsp;<br />
[&nbsp;contentType="mimeType&nbsp;[&nbsp;;charset=characterSet&nbsp;]"&nbsp;|&nbsp;"text/html&nbsp;;&nbsp;charset=ISO-8859-1"&nbsp;]&nbsp;<br />
[&nbsp;isErrorPage="true&nbsp;|&nbsp;false"&nbsp;]&nbsp;<br />
%&gt;&nbsp;<br />
例子<br />
&lt;%@&nbsp;page&nbsp;import="java.util.*,&nbsp;java.lang.*"&nbsp;%&gt;&nbsp;<br />
&lt;%@&nbsp;page&nbsp;buffer="5kb"&nbsp;autoFlush="false"&nbsp;%&gt;&nbsp;<br />
&lt;%@&nbsp;page&nbsp;errorPage="error.jsp"&nbsp;%&gt;&nbsp;<br />
描述 <br />
&lt;%@&nbsp;page&nbsp;%&gt;指令作用于整个JSP页面，同样包括静态的包含文件。但是&lt;%&nbsp;@&nbsp;page&nbsp;%&gt;指令不能作用于动态的包含文件，比如&nbsp;&lt;jsp:include&gt;&nbsp;<br />
<br />
你可以在一个页面中用上多个&lt;%&nbsp;@&nbsp;page&nbsp;%&gt;指令，但是其中的属性只能用一次，不过也有个例外，那就是import属性。因为import属性和Java中的import语句差不多(参照Java&nbsp;Language)，所以你就能多用此属性几次了.&nbsp;<br />
<br />
无论你把&lt;%&nbsp;@&nbsp;page&nbsp;%&gt;指令放在JSP的文件的哪个地方，它的作用范围都是整个JSP页面。不过，为了JSP程序的可读性，以及好的编程习惯，最好还是把它放在JSP文件的顶部.&nbsp;<br />
<br />
属性<br />
language="java"<br />
声明脚本语言的种类，暂时只能用"java"&nbsp;<br />
<br />
extends="package.class"<br />
标明JSP编译时需要加入的Java&nbsp;Class的全名，但是得慎重的使用它，它会限制JSP的编译能力.&nbsp;<br />
<br />
import="{package.class&nbsp;|&nbsp;package.*&nbsp;},&nbsp;..."<br />
需要导入的Java包的列表，这些包就作用于程序段，表达式，以及声明。&nbsp;<br />
<br />
下面的包在JSP编译时已经导入了，所以你就不需要再指明了:&nbsp;<br />
<br />
java.lang.*&nbsp;<br />
javax.servlet.*&nbsp;<br />
javax.servlet.jsp.*&nbsp;<br />
javax.servlet.http.*&nbsp;<br />
<br />
session="true&nbsp;|&nbsp;false"<br />
设定客户是否需要HTTP&nbsp;Session.（学过ASP的人，应该对它不陌生)如果它为true,那么Session是有用的。&nbsp;<br />
<br />
如果它有false,那么你就不能使用session对象，以及定义了scope=session的&lt;jsp:useBean&gt;元素。这样的使用会导致错误.&nbsp;<br />
<br />
缺省值是true.&nbsp;<br />
<br />
buffer="none&nbsp;|&nbsp;8kb&nbsp;|&nbsp;sizekb"<br />
buffer的大小被out对象用于处理执行后的JSP对客户浏览器的输出。缺省值是8kb&nbsp;<br />
<br />
autoFlush="true&nbsp;|&nbsp;false"<br />
设置如果buffer溢出，是否需要强制输出，如果其值被定义为true(缺省值)，输出正常，如果它被设置为false,如果这个buffer溢出，就会导致一个意外错误的发生.如果你把buffer设置为none,那么你就不能把autoFlush设置为false.&nbsp;<br />
<br />
isThreadSafe="true&nbsp;|&nbsp;false"<br />
设置Jsp文件是否能多线程使用。缺省值是true,也就是说，JSP能够同时处理多个用户的请求，如果设置为false，一个jsp只能一次处理一个请求&nbsp;<br />
<br />
info="text"<br />
一个文本在执行JSP将会被逐字加入JSP中，你能够使用Servlet.getServletInfo方法取回。&nbsp;<br />
<br />
errorPage="relativeURL"<br />
设置处理异常事件的JSP文件。&nbsp;<br />
<br />
isErrorPage="true&nbsp;|&nbsp;false"<br />
设置此页是否为出错页，如果被设置为true,你就能使用exception对象.&nbsp;<br />
<br />
contentType="mimeType&nbsp;[&nbsp;;charset=characterSet&nbsp;]"&nbsp;|&nbsp;"text/html;charset=ISO-8859-1"<br />
设置MIME类型&nbsp;。缺省MIME&nbsp;类型是:&nbsp;text/html,&nbsp;缺省字符集为&nbsp;ISO-8859-1.<br />
<br />
<br />
&lt;jsp:forward&gt;<br />
<br />
<br />
重定向一个HTML文件，JSP文件，或者是一个程序段.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;jsp:forward&nbsp;page={"relativeURL"&nbsp;|&nbsp;"&lt;%=&nbsp;expression&nbsp;%&gt;"}&nbsp;/&gt;&nbsp;<br />
or&nbsp;<br />
&lt;jsp:forward&nbsp;page={"relativeURL"&nbsp;|&nbsp;"&lt;%=&nbsp;expression&nbsp;%&gt;"}&nbsp;&gt;&nbsp;<br />
&lt;jsp:param&nbsp;name="parameterName"&nbsp;<br />
value="{parameterValue&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;/&gt;+&nbsp;<br />
&lt;/jsp:forward&gt;&nbsp;<br />
例子<br />
&lt;jsp:forward&nbsp;page="/servlet/login"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:forward&nbsp;page="/servlet/login"&gt;&nbsp;<br />
&lt;jsp:param&nbsp;name="username"&nbsp;value="jsmith"&nbsp;/&gt;&nbsp;<br />
&lt;/jsp:forward&gt;&nbsp;<br />
描述 <br />
&lt;jsp:forward&gt;标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象.&lt;jsp:forward&gt;标签以下的代码，将不能执行.&nbsp;<br />
<br />
你能够向目标文件传送参数和值，在这个例子中我们传递的参数名为username,值为scott,如果你使用了&lt;jsp:param&gt;标签的话，目标文件必须是一个动态的文件，能够处理参数.&nbsp;<br />
<br />
如果你使用了非缓冲输出的话，那么使用&lt;jsp:forward&gt;时就要小心。如果在你使用&lt;jsp:forward&gt;之前，jsp文件已经有了数据，那么文件执行就会出错.&nbsp;<br />
<br />
属性<br />
page="{relativeURL&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"<br />
这里是一个表达式或是一个字符串用于说明你将要定向的文件或URL.这个文件可以是JSP,程序段，或者其它能够处理request对象的文件(如asp,cgi,php).&nbsp;<br />
<br />
&lt;jsp:param&nbsp;name="parameterName"&nbsp;value="{parameterValue&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;/&gt;+<br />
向一个动态文件发送一个或多个参数，这个文件一定是动态文件.&nbsp;<br />
<br />
如果你想传递多个参数，你可以在一个JSP文件中使用多个&lt;jsp:param&gt;。name指定参数名，value指定参数值.<br />
<br />
<br />
&lt;jsp:getProperty&gt;<br />
<br />
<br />
获取Bean的属性值，用于显示在页面中&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;jsp:getProperty&nbsp;name="beanInstanceName"&nbsp;property="propertyName"&nbsp;/&gt;&nbsp;<br />
例子<br />
&lt;jsp:useBean&nbsp;id="calendar"&nbsp;scope="page"&nbsp;class="employee.Calendar"&nbsp;/&gt;&nbsp;<br />
&lt;h2&gt;&nbsp;<br />
Calendar&nbsp;of&nbsp;&lt;jsp:getProperty&nbsp;name="calendar"&nbsp;property="username"&nbsp;/&gt;&nbsp;<br />
&lt;/h2&gt;&nbsp;<br />
描述 <br />
这个&lt;jsp:getProperty&gt;元素将获得Bean的属性值，并可以将其使用或显示在JSP页面中.在你使用&lt;jsp:getProperty&gt;之前，你必须用&lt;jsp:useBean&gt;创建它.&nbsp;<br />
<br />
&lt;jsp:getProperty&gt;元素有一些限制:&nbsp;<br />
<br />
你不能使用&lt;jsp:getProperty&gt;来检索一个已经被索引了的属性&nbsp;<br />
你能够和JavaBeans组件一起使用&lt;jsp:getProperty&gt;,但是不能与Enterprise&nbsp;Bean一起使用。&nbsp;<br />
属性<br />
name="beanInstanceName"<br />
bean的名字,由&lt;jsp:useBean&gt;指定&nbsp;<br />
<br />
property="propertyName"<br />
所指定的Bean的属性名。&nbsp;<br />
<br />
技巧:<br />
在sun的JSP参考中提到，如果你使用&lt;jsp:getProperty&gt;来检索的值是空值，那么NullPointerException将会出现，同时如果使用程序段或表达式来检索其值，那么在浏览器上出现的是null（空).<br />
<br />
<br />
&lt;jsp:include&gt;<br />
<br />
<br />
包含一个静态或动态文件.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;jsp:include&nbsp;page="{relativeURL&nbsp;|&nbsp;&lt;%=&nbsp;expression%&gt;}"&nbsp;flush="true"&nbsp;/&gt;&nbsp;<br />
or&nbsp;<br />
&lt;jsp:include&nbsp;page="{relativeURL&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;flush="true"&nbsp;&gt;&nbsp;<br />
&lt;jsp:param&nbsp;name="parameterName"&nbsp;value="{parameterValue&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;/&gt;+&nbsp;<br />
&lt;/jsp:include&gt;&nbsp;<br />
Examples<br />
&lt;jsp:include&nbsp;page="scripts/login.jsp"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:include&nbsp;page="copyright.html"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:include&nbsp;page="/index.html"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:include&nbsp;page="scripts/login.jsp"&gt;&nbsp;<br />
&lt;jsp:param&nbsp;name="username"&nbsp;value="jsmith"&nbsp;/&gt;&nbsp;<br />
&lt;/jsp:include&gt;&nbsp;<br />
<br />
描述 <br />
&lt;jsp:include&gt;元素允许你包含动态文件和静态，这两种包含文件的结果是不同的。如果文件仅是静态文件，那么这种包含仅仅是把包含文件的内容加到jsp文件中去，而如果这个文件动态的，那么这个被包含文件也会被Jsp编译器执行(这一切与asp相似)&nbsp;<br />
<br />
你不能从文件名上判断一个文件是动态的还是静态的，比如aspcn.asp&nbsp;就有可能只是包含一些信息而已，而不需要执行。&lt;jsp:include&gt;能够同时处理这两种文件，因此你就不需要包含时还要判断此文件是动态的还是静态的.&nbsp;<br />
<br />
如果这个包含文件是动态的，那么你还可以用&lt;jsp:param&gt;还传递参数名和参数值。&nbsp;<br />
<br />
属性<br />
page="{relativeURL&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"<br />
参数为一相对路径，或者是代表相对路径的表达式.&nbsp;<br />
<br />
flush="true"<br />
这里你必须使用flush="true",你不能使用false值.缺省值为false&nbsp;<br />
<br />
&lt;jsp:param&nbsp;name="parameterName"&nbsp;value="{parameterValue&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;&nbsp;}"&nbsp;/&gt;+<br />
&lt;jsp:param&gt;子句能让你传递一个或多个参数给动态文件&nbsp;<br />
<br />
你能在一个页面中使用多个&lt;jsp:param&gt;来传递多个参数，<br />
<br />
<br />
&lt;jsp:plugin&gt;<br />
<br />
<br />
执行一个applet或Bean,有可能的话还要下载一个Java插件用于执行它.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;jsp:plugin&nbsp;<br />
type="bean&nbsp;|&nbsp;applet"&nbsp;<br />
code="classFileName"&nbsp;<br />
codebase="classFileDirectoryName"&nbsp;<br />
[&nbsp;name="instanceName"&nbsp;]&nbsp;<br />
[&nbsp;archive="URIToArchive,&nbsp;..."&nbsp;]&nbsp;<br />
[&nbsp;align="bottom&nbsp;|&nbsp;top&nbsp;|&nbsp;middle&nbsp;|&nbsp;left&nbsp;|&nbsp;right"&nbsp;]&nbsp;<br />
[&nbsp;height="displayPixels"&nbsp;]&nbsp;<br />
[&nbsp;width="displayPixels"&nbsp;]&nbsp;<br />
[&nbsp;hspace="leftRightPixels"&nbsp;]&nbsp;<br />
[&nbsp;vspace="topBottomPixels"&nbsp;]&nbsp;<br />
[&nbsp;jreversion="JREVersionNumber&nbsp;|&nbsp;1.1"&nbsp;]&nbsp;<br />
[&nbsp;nspluginurl="URLToPlugin"&nbsp;]&nbsp;<br />
[&nbsp;iepluginurl="URLToPlugin"&nbsp;]&nbsp;&gt;&nbsp;<br />
[&nbsp;&lt;jsp:params&gt;&nbsp;<br />
[&nbsp;&lt;jsp:param&nbsp;name="parameterName"&nbsp;value="{parameterValue&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;/&gt;&nbsp;]+&nbsp;<br />
&lt;/jsp:params&gt;&nbsp;]&nbsp;<br />
<br />
[&nbsp;&lt;jsp:fallback&gt;&nbsp;text&nbsp;message&nbsp;for&nbsp;user&nbsp;&lt;/jsp:fallback&gt;&nbsp;]&nbsp;<br />
<br />
&lt;/jsp:plugin&gt;&nbsp;<br />
<br />
例子<br />
&lt;jsp:plugin&nbsp;type=applet&nbsp;code="Molecule.class"&nbsp;codebase="/html"&gt;&nbsp;<br />
&lt;jsp:params&gt;&nbsp;<br />
&lt;jsp:param&nbsp;name="molecule"&nbsp;value="molecules/benzene.mol"&nbsp;/&gt;&nbsp;<br />
&lt;/jsp:params&gt;&nbsp;<br />
&lt;jsp:fallback&gt;&nbsp;<br />
&lt;p&gt;Unable&nbsp;to&nbsp;load&nbsp;applet&lt;/p&gt;&nbsp;<br />
&lt;/jsp:fallback&gt;&nbsp;<br />
&lt;/jsp:plugin&gt;&nbsp;<br />
描述 <br />
&lt;jsp:plugin&gt;元素用于在浏览器中播放或显示一个对象（典型的就是applet和Bean),而这种显示需要在浏览器的java插件。&nbsp;<br />
<br />
当Jsp文件被编译，送往浏览器时，&lt;jsp:plugin&gt;元素将会根据浏览器的版本替换成&lt;object&gt;或者&lt;embed&gt;元素。注意，&lt;object&gt;用于HTML&nbsp;4.0&nbsp;，&lt;embed&gt;用于HTML&nbsp;3.2.&nbsp;<br />
<br />
一般来说，&lt;jsp:plugin&gt;元素会指定对象是Applet还是Bean,同样也会指定class的名字，还有位置，另外还会指定将从哪里下载这个Java插件。具体如下:&nbsp;<br />
<br />
属性<br />
type="bean&nbsp;|&nbsp;applet"<br />
.将被执行的插件对象的类型，你必须得指定这个是Bean还是applet,因为这个属性没有缺省值.&nbsp;<br />
<br />
code="classFileName"<br />
将会被Java插件执行的Java&nbsp;Class的名字，必须以.class结尾。这个文件必须存在于codebase属性指定的目录中.&nbsp;<br />
<br />
codebase="classFileDirectoryName"<br />
将会被执行的Java&nbsp;Class文件的目录（或者是路径)，如果你没有提供此属性，那么使用&lt;jsp:plugin&gt;的jsp文件的目录将会被使用.&nbsp;<br />
<br />
name="instanceName"<br />
这个Bean或applet实例的名字，它将会在Jsp其它的地方调用.&nbsp;<br />
<br />
archive="URIToArchive,&nbsp;..."<br />
一些由逗号分开的路径名，这些路径名用于预装一些将要使用的class,这会提高applet的性能.&nbsp;<br />
<br />
align="bottom&nbsp;|&nbsp;top&nbsp;|&nbsp;middle&nbsp;|&nbsp;left&nbsp;|&nbsp;right"<br />
图形，对象，Applet的位置,有以下值:&nbsp;<br />
<br />
bottom&nbsp;<br />
top&nbsp;<br />
middle&nbsp;<br />
left&nbsp;<br />
right&nbsp;<br />
height="displayPixels"&nbsp;width="displayPixels"<br />
Applet或Bean将要显示的长宽的值，此值为数字，单位为象素.&nbsp;<br />
<br />
hspace="leftRightPixels"&nbsp;vspace="topBottomPixels"<br />
Applet或Bean显示时在屏幕左右，上下所需留下的空间，单位为象素.&nbsp;<br />
<br />
jreversion="JREVersionNumber&nbsp;|&nbsp;1.1"&nbsp;<br />
Applet或Bean运行所需的Java&nbsp;Runtime&nbsp;Environment&nbsp;(JRE)&nbsp;的版本.&nbsp;缺省值是&nbsp;1.1.&nbsp;<br />
<br />
nspluginurl="URLToPlugin"&nbsp;<br />
Netscape&nbsp;Navigator用户能够使用的JRE的下载地址，此值为一个标准的URL，如http://www.aspcn.com/jsp&nbsp;<br />
<br />
iepluginurl="URLToPlugin"<br />
IE用户能够使用的JRE的下载地址，此值为一个标准的URL，如http://www.aspcn.com/jsp&nbsp;<br />
<br />
&lt;jsp:params&gt;&nbsp;[&nbsp;&lt;jsp:param&nbsp;name="parameterName"&nbsp;value="{parameterValue&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;/&gt;&nbsp;]+&nbsp;&lt;/jsp:params&gt;<br />
你需要向applet或Bean传送的参数或参数值。&nbsp;<br />
<br />
&lt;jsp:fallback&gt;&nbsp;text&nbsp;message&nbsp;for&nbsp;user&nbsp;&lt;/jsp:fallback&gt;<br />
一段文字用于Java&nbsp;插件不能启动时显示给用户的，如果插件能够启动而applet或Bean不能，那么浏览器会有一个出错信息弹出.<br />
<br />
<br />
&lt;jsp:setProperty&gt;<br />
<br />
<br />
设置Bean中的属性值.&nbsp;<br />
<br />
JSP语法<br />
&lt;jsp:setProperty&nbsp;<br />
name="beanInstanceName"&nbsp;<br />
{&nbsp;<br />
property=&nbsp;"*"&nbsp;|&nbsp;<br />
property="propertyName"&nbsp;[&nbsp;param="parameterName"&nbsp;]&nbsp;|&nbsp;<br />
property="propertyName"&nbsp;value="{string&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;<br />
}&nbsp;<br />
/&gt;&nbsp;<br />
例子<br />
&lt;jsp:setProperty&nbsp;name="mybean"&nbsp;property="*"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:setProperty&nbsp;name="mybean"&nbsp;property="username"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:setProperty&nbsp;name="mybean"&nbsp;property="username"&nbsp;value="Steve"&nbsp;/&gt;&nbsp;<br />
描述 <br />
&lt;jsp:setProperty&gt;元素使用Bean给定的setter方法，在Bean中设置一个或多个属性值。你在使用这个元素之前必须得使用&lt;jsp:useBean&gt;声明此Bean.因为，&lt;jsp:useBean&gt;和&lt;jsp:setProperty&gt;是联系在一起的，同时这他们使用的Bean实例的名字也应当相匹配（就是说，在&lt;jsp:setProperty&gt;中的name的值应当和&lt;jsp:useBean&gt;中id的值相同)&nbsp;<br />
<br />
你能使用多种方法利用&lt;jsp:setProperty&gt;来设定属性值&nbsp;:&nbsp;<br />
<br />
通过用户输入的所有值(被做为参数储存中request对象中)来匹配Bean中的属性&nbsp;<br />
通过用户输入的指定的值来匹配Bean中指定的属性&nbsp;<br />
在运行时使用一个表达式来匹配Bean的属性&nbsp;<br />
每一种设定属性值的方法都有其特定的语法，下面我们会来讲解&nbsp;<br />
<br />
属性及其用法<br />
name="beanInstanceName"<br />
表示已经在&lt;jsp:useBean&gt;中创建的Bean实例的名字.&nbsp;<br />
<br />
property="*"<br />
储存用户在Jsp输入的所有值，用于匹配Bean中的属性。在Bean中的属性的名字必须和request对象中的参数名一致.&nbsp;<br />
<br />
从客户传到服器上的参数值一般都是字符类型&nbsp;，这些字符串为了能够在Bean中匹配就必须转换成其它的类型，下面的表中列出了Bean属性的类型以及他们的转换方法.<br />
<br />
把字符串转化为其它类型的方法.&nbsp;Property&nbsp;类型&nbsp;<br />
方法&nbsp;<br />
boolean&nbsp;or&nbsp;Boolean&nbsp;<br />
java.lang.Boolean.valueOf(String)&nbsp;<br />
byte&nbsp;or&nbsp;Byte&nbsp;<br />
java.lang.Byte.valueOf(String)&nbsp;<br />
char&nbsp;or&nbsp;Character&nbsp;<br />
java.lang.Character.valueOf(String)&nbsp;<br />
double&nbsp;or&nbsp;Double&nbsp;<br />
java.lang.Double.valueOf(String)&nbsp;<br />
integer&nbsp;or&nbsp;Integer&nbsp;<br />
java.lang.Integer.valueOf(String)&nbsp;<br />
float&nbsp;or&nbsp;Float&nbsp;<br />
java.lang.Float.valueOf(String)&nbsp;<br />
long&nbsp;or&nbsp;Long&nbsp;<br />
java.lang.Long.valueOf(String)&nbsp;<br />
<br />
如果request对象的参数值中有空值，那么对应的Bean属性将不会设定任何值。同样的，如果Bean中有一个属性没有与之对应的Request参数值，那么这个属性同样也不会设定.&nbsp;<br />
<br />
property="propertyName"&nbsp;[&nbsp;param="parameterName"&nbsp;]<br />
使用request中的一个参数值来指定Bean中的一个属性值。在这个语法中，property指定Bean的属性名，param指定request中的参数名.&nbsp;<br />
<br />
如果bean属性和request参数的名字不同，那么你就必须得指定property和param&nbsp;，如果他们同名，那么你就只需要指明property就行了.&nbsp;<br />
<br />
如查参数值为空（或未初始化),对应的Bean属性不被设定.&nbsp;<br />
<br />
property="propertyName"&nbsp;value="{string&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"<br />
使用指定的值来设定Bean属性。这个值可以是字符串，也可以是表达式。如果这个字符串，那么它就会被转换成Bean属性的类型（查看上面的表).如果它是一个表达式，那么它类型就必须和它将要设定的属性值的类型一致。&nbsp;<br />
<br />
如果参数值为空，那么对应的属性值也不会被设定。另外，你不能在一个&lt;jsp:setProperty&gt;中同时使用param和value&nbsp;<br />
<br />
技巧<br />
如果你使用了property="*",那么Bean的属性没有必要按Html表单中的顺序排序&nbsp;<br />
<br />
<br />
&lt;jsp:useBean&gt;<br />
<br />
<br />
创建一个Bean实例并指定它的名字和作用范围.&nbsp;<br />
<br />
JSP&nbsp;语法<br />
&lt;jsp:useBean&nbsp;<br />
id="beanInstanceName"&nbsp;<br />
scope="page&nbsp;|&nbsp;request&nbsp;|&nbsp;session&nbsp;|&nbsp;application"&nbsp;<br />
{&nbsp;<br />
class="package.class"&nbsp;|&nbsp;<br />
type="package.class"&nbsp;|&nbsp;<br />
class="package.class"&nbsp;type="package.class"&nbsp;|&nbsp;<br />
beanName="{package.class&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;type="package.class"&nbsp;<br />
}&nbsp;<br />
{&nbsp;<br />
/&gt;&nbsp;|&nbsp;<br />
&gt;&nbsp;other&nbsp;elements&nbsp;&lt;/jsp:useBean&gt;&nbsp;<br />
}&nbsp;<br />
例子<br />
&lt;jsp:useBean&nbsp;id="cart"&nbsp;scope="session"&nbsp;class="session.Carts"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:setProperty&nbsp;name="cart"&nbsp;property="*"&nbsp;/&gt;&nbsp;<br />
&lt;jsp:useBean&nbsp;id="checking"&nbsp;scope="session"&nbsp;class="bank.Checking"&nbsp;&gt;&nbsp;<br />
&lt;jsp:setProperty&nbsp;name="checking"&nbsp;property="balance"&nbsp;value="0.0"&nbsp;/&gt;&nbsp;<br />
&lt;/jsp:useBean&gt;&nbsp;<br />
<br />
描述 <br />
&lt;jsp:useBean&gt;用于定位或示例一个JavaBeans组件。&lt;jsp:useBean&gt;首先会试图定位一个Bean实例，如果这个Bean不存在，那么&lt;jsp:useBean&gt;就会从一个class或模版中进行示例。&nbsp;<br />
<br />
为了定位或示例一个Bean，&lt;jsp:useBean&gt;会进行以下步聚，顺序如下:&nbsp;<br />
<br />
通过给定名字和范围试图定位一个Bean.&nbsp;<br />
对这个Bean对象引用变量以你指定的名字命名.&nbsp;<br />
如果发现了这个Bean,将会在这个变量中储存这个引用。如果你也指定了类型，那么这个Bean也设置为相应的类型.&nbsp;<br />
如果没有发现这个Bean,将会从你指定的class中示例，并将此引用储存到一个新的变量中去。如果这个class的名字代表的是一个模版，那么这个Bean被java.beans.Beans.instantiate示例.&nbsp;<br />
如果&lt;jsp:useBean&gt;已经示例（不是定位）了Bean,同时&lt;jsp:useBean&gt;和&lt;/jsp:useBean&gt;中有元素，那么将会执行其中的代码.&nbsp;<br />
&lt;jsp:useBean&gt;元素的主体通常包含有&lt;jsp:setProperty&gt;元素，用于设置Bean的属性值。正如上面第五步所说的，&lt;jsp:useBean&gt;的主体仅仅只有在&lt;jsp:useBean&gt;示例Bean时才会被执行，如果这个Bean已经存在，&lt;jsp:useBean&gt;能够定位它，那么主体中的内容将不会起作用&nbsp;<br />
<br />
属性以及用法<br />
id="beanInstanceName"<br />
在你所定义的范围中确认Bean的变量，你能在后面的程序中使用此变量名来分辨不同的Bean&nbsp;<br />
<br />
这个变量名对大小写敏感，必须符合你所使用的脚本语言的规定，在Java&nbsp;Programming&nbsp;Language中，这个规定在Java&nbsp;Language&nbsp;规范已经写明。如果这个Bean已经在别的&lt;jsp:useBean&gt;中创建，那么这个id的值必须与原来的那个id值一致.&nbsp;<br />
<br />
scope="page&nbsp;|&nbsp;request&nbsp;|&nbsp;session&nbsp;|&nbsp;application"<br />
Bean存在的范围以及id变量名的有效范围。缺省值是page,以下是详细说明：&nbsp;<br />
<br />
page&nbsp;-&nbsp;你能在包含&lt;jsp:useBean&gt;元素的JSP文件以及此文件中的所有静态包含文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。<br />
&nbsp;&nbsp;&nbsp;<br />
request&nbsp;-&nbsp;你在任何执行相同请求的Jsp文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。你能够使用Request对象访问Bean,比如request.getAttribute(beanInstanceName)<br />
<br />
session&nbsp;-&nbsp;从创建Bean开始，你就能在任何使用相同session的Jsp文件中使用Bean.这个Bean存在于整个Session生存周期内，任何在分享此Session的Jsp文件都能使用同一Bean.注意在你创建Bean的Jsp文件中&lt;%&nbsp;@&nbsp;page&nbsp;%&gt;指令中必须指定session=true<br />
<br />
application&nbsp;-&nbsp;从创建Bean开始，你就能在任何使用相同application的Jsp文件中使用Bean.这个Bean存在于整个application生存周期内，任何在分享此application的Jsp文件都能使用同一Bean.&nbsp;<br />
class="package.class"<br />
使用new关键字以及class构造器从一个class中示例一个bean.这个class不能是抽象的，必须有一个公用的，没有参数的构造器.这个package的名字区别大小写。&nbsp;<br />
<br />
type="package.class"<br />
如果这个Bean已经在指定的范围中存在，那么写这个Bean一个新的数据库类型&nbsp;。如果你没有使用class或beanName指定type，Bean将不会被示例.package和class的名字，区分大小写.&nbsp;<br />
<br />
beanName="{package.class&nbsp;|&nbsp;&lt;%=&nbsp;expression&nbsp;%&gt;}"&nbsp;type="package.class"<br />
使用java.beans.Beans.instantiate方法来从一个class或连续模版中示例一个Bean,同时指定Bean的类型。&nbsp;<br />
<br />
beanName可以是package和class也可以是表达式,它的值会传给Beans.instantiate.tupe的值可以和Bean相同。&nbsp;<br />
<br />
package&nbsp;和&nbsp;class&nbsp;名字区分大小写. 
<img src ="http://www.blogjava.net/lanxin1020/aggbug/269740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-05-09 11:58 <a href="http://www.blogjava.net/lanxin1020/archive/2009/05/09/269740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet生命周期（转)</title><link>http://www.blogjava.net/lanxin1020/archive/2009/04/04/263904.html</link><dc:creator>lanxin1020</dc:creator><author>lanxin1020</author><pubDate>Sat, 04 Apr 2009 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/lanxin1020/archive/2009/04/04/263904.html</guid><wfw:comment>http://www.blogjava.net/lanxin1020/comments/263904.html</wfw:comment><comments>http://www.blogjava.net/lanxin1020/archive/2009/04/04/263904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lanxin1020/comments/commentRss/263904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lanxin1020/services/trackbacks/263904.html</trackback:ping><description><![CDATA[Servlet运行在Servlet容器中，其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。 <br />
<br />
Servlet的生命周期包含了下面4个阶段： <br />
<br />
<strong>（1）加载和实例化</strong> <br />
<br />
Servlet容器负责加载和实例化Servlet。当Servlet容器启动时，或者在容器检测到需要这个Servlet来响应第一个请求时，创建Servlet实例。当Servlet容器启动后，它必须要知道所需的Servlet类在什么位置，Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类，成功加载后，容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例，调用的是Servlet的默认构造方法（即不带参数的构造方法），所以我们在编写Servlet类的时候，不应该提供带参数的构造方法。 <br />
<br />
<strong>（2）初始化</strong> <br />
<br />
在Servlet实例化之后，容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作，如建立数据库的连接，获取配置信息等。对于每一个Servlet实例，init()方法只被调用一次。在初始化期间，Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息（在web.xml中配置）中获取初始化的参数信息。在初始化期间，如果发生错误，Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败，例如没有找到初始化参数；而UnavailableException异常用于通知容器该Servlet实例不可用。例如，数据库服务器没有启动，数据库连接无法建立，Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可用。 <br />
<br />
<strong>（3）请求处理</strong> <br />
<br />
Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是，在service()方法调用之前，init()方法必须成功执行。在service()方法中，Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息，在对请求进行处理后，调用ServletResponse对象的方法设置响应信息。在service()方法执行期间，如果发生错误，Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用，Servlet容器将调用实例的destroy()方法，释放该实例。此后对该实例的任何请求，都将收到容器发送的HTTP 404（请求的资源不可用）响应。如果UnavailableException异常指示了该实例暂时不可用，那么在暂时不可用的时间段内，对该实例的任何请求，都将收到容器发送的HTTP 503（服务器暂时忙，不能处理请求）响应。 <br />
<br />
<strong>（4）服务终止</strong> <br />
<br />
当容器检测到一个Servlet实例应该从服务中被移除的时候，容器就会调用实例的destroy()方法，以便让该实例可以释放它所使用的资源，保存数据到持久存储设备中。当需要释放内存或者容器关闭时，容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后，容器会释放这个Servlet实例，该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求，Servlet容器会创建一个新的Servlet实例。 <br />
<br />
在整个Servlet的生命周期过程中，创建Servlet实例、调用实例的init()和destroy()方法都只进行一次，当初始化完成后，Servlet容器会将该实例保存在内存中，通过调用它的service()方法，为接收到的请求服务。 <br />
<br />
如果需要让Servlet容器在启动时即加载Servlet，可以在web.xml文件中配置&lt;load-on-startup&gt;元素。 
 <img src ="http://www.blogjava.net/lanxin1020/aggbug/263904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lanxin1020/" target="_blank">lanxin1020</a> 2009-04-04 18:20 <a href="http://www.blogjava.net/lanxin1020/archive/2009/04/04/263904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>