<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[Nickelback]]></title>
<description><![CDATA[嘿咻涂鸦室]]></description>
<link>http://82895376.qzone.qq.com</link>
<lastBuildDate>Thu, 26 Nov 2009 07:25:49 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Mon, 23 Nov 2009 12:37:10 GMT</pubDate>

<item>
<title><![CDATA[JSTL 入门: 表达式语言]]></title>
<link>http://82895376.qzone.qq.com/blog/1258979830</link>
<description><![CDATA[<wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:10px;height:18px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:1px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/" target="_blank"><span style="color:#999999;font-size:13px;line-height:1.8em;">developerWorks 中国</span><wbr /></a><wbr /><span style="color:#cccccc;font-size:13px;line-height:1.8em;">  &gt;  </span><wbr /><a href="http://www.ibm.com/developerworks/cn/java/" target="_blank"><span style="color:#999999;font-size:13px;line-height:1.8em;">Java technology</span><wbr /></a><wbr /><span style="font-size:13px;line-height:1.8em;"><span style="color:#cccccc;line-height:1.8em;">  &gt;<wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:1px;height:1px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br></span><wbr /></span><wbr />JSTL 入门: 表达式语言通过避免使用脚本编制元素来简化对 JSP 应用程序的软件维护<br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:1px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/developerworks/i/dw.gif" target="_blank"><img style="width:192px;height:18px;border:0;" src="http://www.ibm.com/developerworks/i/dw.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:10px;height:1px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:10px;height:1px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr />文档选项[img,8,1]//www.ibm.com/i/c.gif[/img][img,16,16]//www.ibm.com/i/v14/icons/printer.gif[/img]<span style="font-weight:bold"><wbr />[url=javascript:print()]打印本页[/url]</span><wbr /><br>');//--&gt;<wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:1px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/v14/icons/printer.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/printer.gif" /></a><wbr /><span style="font-weight:bold"><wbr />[url=javascript:print()]打印本页[/url]</span><wbr /><br><span style="font-style:italic"><wbr /><span style="font-style:italic"><wbr /><span style="font-style:italic"><wbr />[img,8,1]//www.ibm.com/i/c.gif[/img][img,16,16]//www.ibm.com/i/v14/icons/em.gif[/img][url=javascript:document.email.submit();]<span style="font-weight:bold"><wbr />将此页作为电子邮件发送</span><wbr />[/url]<br>');//--&gt; <wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:1px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/v14/icons/em.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/em.gif" /></a><wbr />[url=javascript:document.email.submit();]<span style="font-weight:bold"><wbr /><span style="color:#5c81a7;font-size:13px;line-height:1.8em;">将此页作为电子邮件发送</span><wbr /></span><wbr />[/url]<br><br>级别： 初级<br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#author" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">Mark A. Kolb</span><wbr /></a><wbr /> ([email=[ft=#5c81a7,,]mak@taglib.com</span><wbr />]mak@taglib.com?subject=表达式语言&amp;cc=mak@taglib.com[/email]), 软件工程师<br>2003 年 5 月 27 日<br><span style="font-weight:bold"><wbr />JSP 标准标记库（JSP Standard Tag Library，JSTL）是一个实现 Web 应用程序中常见的通用功能的定制标记库集，这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。在 developerworks 上其新系列的第一篇文章中，软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素。您还将了解如何通过从表示层删除源代码来简化软件维护。最后，您将了解 JSTL 经过简化的表达式语言，它允许在不必使用功能齐全的编程语言的情况下对 JSTL 操作指定动态属性值。</span><wbr />JavaServer Pages（JSP）是用于 J2EE 平台的标准表示层技术。JSP 技术提供了用于执行计算（这些计算用来动态地生成页面内容）的脚本编制元素和操作。脚本编制元素允许在 JSP 页面中包括程序源代码，在为响应用户请求而呈现页面时可以执行这些源代码。操作将计算操作封装到很象 HTML 或 XML 标记的标记中，JSP 页面的模板文本通常包含这些标记。JSP 规范只将几种操作定义成了标准，但从 JSP 1.1 开始，开发人员已经能够以定制标记库的方式创建其自己的操作了。<br>JSP 标准标记库（JSTL）是 JSP 1.2 定制标记库集，这些标记库实现大量服务器端 Java 应用程序常用的基本功能。通过为典型表示层任务（如数据格式化和迭代或条件内容）提供标准实现，JSTL 使 JSP 作者可以专注于特定于应用程序的开发需求，而不是为这些通用操作“另起炉灶”。<br>当然，您可以使用 JSP 脚本编制元素（scriptlet、表达式和声明）来实现此类任务。例如，可以使用三个 scriptlet 实现条件内容，清单 1 中着重显示了这三个 scriptlet。但是，因为脚本编制元素依赖于在页面中嵌入程序源代码（通常是 Java 代码），所以对于使用这些脚本编制元素的 JSP 页面，其软件维护任务的复杂度大大增加了。例如，清单 1 中的 scriptlet 示例严格地依赖于花括号的正确匹配。如果不经意间引入了一个语法错误，则条件内容中的嵌套其它 scriptlet 可能会造成严重破坏，并且在 JSP 容器编译该页面时，要使所产生的错误信息有意义可能会很困难。<br><br><span style="font-weight:bold"><wbr />清单 1. 通过 scriptlet 实现条件内容</span><wbr /><br>&lt;% if (user.getRole() == &quot;member&quot;)) { %&gt;    &lt;p&gt;Welcome, member!&lt;/p&gt;&lt;% } else { %&gt;    &lt;p&gt;Welcome, guest!&lt;/p&gt;&lt;% } %&gt;<br><br>修正此类问题通常需要相当丰富的编程经验。尽管通常会由十分精通页面布局和图形设计的设计人员来开发和维护 JSP，但是同一页面中的脚本编制元素出现问题时，需要程序员的介入。这种状况将单个文件中代码的责任分担给多人，因而使得开发、调试和增强此类 JSP 页面成为很麻烦的任务。通过将常用功能包装到定制标记库的标准集合中，JSTL 使 JSP 作者可以减少对编制脚本元素的需求，甚至可以不需要它们，并避免了相关的维护成本。<br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>JSTL 1.0<br>JSTL 1.0 发布于 2002 年 6 月，由四个定制标记库（core、format、xml 和 sql）和一对通用标记库验证器（ScriptFreeTLV 和 PermittedTaglibsTLV）组成。core 标记库提供了定制操作，通过限制了作用域的变量管理数据，以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义，format 标记库定义了用来格式化数据（尤其是数字和日期）的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记，这些标记用来操作通过 XML 表示的数据，而 sql 库定义了用来查询关系数据库的操作。<br>两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素 ― scriptlet、表达式和声明。类似地，PermittedTaglibsTLV 验证器可以用来限制可能由应用程序的 JSP 页面访问的定制标记库集（包括 JSTL 标记库）。<br>尽管 JSTL 最终将会成为 J2EE 平台的必需组件，但目前只有少数应用程序服务器包括它。JSTL 1.0 的参考实现可作为 Apache 软件基金会（Apache Software Foundation）的 Jakarta Taglibs 项目（请参阅<a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#resources" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">参考资料</span><wbr /></a><wbr />）的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器，以添加对 JSTL 的支持。<br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>表达式语言<br>在 JSP 1.2 中，可以使用静态字符串或表达式（如果允许的话）指定 JSP 操作的属性。例如，在清单 2 中，对 &lt;jsp:setProperty&gt; 操作的 name 和 property 属性指定了静态值，而用表达式指定了其 value 属性。这个操作的效果是将请求参数的当前值赋予命名的 bean 特性。以这种形式使用的表达式被称为<span style="font-style:italic"><wbr />请求时属性值（request-time attribute value）</span><wbr />，这是构建到 JSP 规范中的用于动态指定属性值的唯一机制。<br><br><span style="font-weight:bold"><wbr />清单 2. 合并请求时属性值的 JSP 操作</span><wbr /><br>&lt;jsp:setProperty name=&quot;user&quot; property=&quot;timezonePref&quot;                 value='&lt;%= request.getParameter(&quot;timezone&quot;) %&gt;'/&gt;<br><br>因为请求时属性值是用表达式指定的，所以它们往往有和其它脚本元素一样的软件维护问题。因此，JSTL 定制标记支持另一种用于指定动态属性值的机制。可以用简化的<span style="font-style:italic"><wbr />表达式语言</span><wbr />（EL）而不使用完整的 JSP 表达式来指定 JSTL 操作的属性值。EL 提供了一些标识符、存取器和运算符，用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以 EcmaScript（请参阅<a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/resources" target="_blank"><span style="color:#996699;line-height:1.8em;">参考资料</span><wbr /></a><wbr />）和 XML 路径语言（XML Path Language，XPath）为基础，因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性，然后对它们执行简单操作；它不是编程语言，甚至不是脚本编制语言。但是，与 JSTL 标记一起使用时，它就能使用简单而又方便的符号来表示复杂的行为。EL 表达式的格式是这样的：用美元符号（$）定界，内容包括在花括号（{}）中，如清单 3 所示。<br><br><span style="font-weight:bold"><wbr />清单 3. 说明 EL 表达式定界符的 JSTL 操作</span><wbr /><br>&lt;c:out value=&quot;${user.firstName}&quot;/&gt;<br><br>此外，您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值，如清单 4 所示。单独的表达式由标识符、存取器、文字和运算符组成。标识符用来引用存储在数据中心中的数据对象。EL 有 11 个保留标识符，对应于 11 个 EL 隐式对象。假定所有其它标识符都引用<span style="font-style:italic"><wbr />限制了作用域的变量</span><wbr />。存取器用来检索对象的特性或集合的元素。文字表示固定的值 ― 数字、字符、字符串、布尔型或空值。运算符允许对数据和文字进行组合以及比较。<br><br><span style="font-weight:bold"><wbr />清单 4. 组合静态文本和多个 EL 表达式以指定动态属性值</span><wbr /><br>&lt;c:out value=&quot;Hello ${user.firstName} ${user.lastName}&quot;/&gt;<br><br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>限制了作用域的变量<br>JSP API 通过 &lt;jsp:useBean&gt; 操作允许从 JSP 容器内的四个不同作用域中存储和检索数据。JSTL 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展这一能力。此外，EL 提供将这些对象作为限制了作用域的变量进行检索的内置支持。特别地，任何出现在 EL 表达式中但不对应于任何 EL 隐式对象的标识符，都被自动假定为引用存储在四个 JSP 作用域的其中某个中的对象，这四个作用域是：<br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;">页面作用域</li><li style="margin:25px;">请求作用域</li><li style="margin:25px;">会话作用域</li><li style="margin:25px;">应用程序作用域</li></span><wbr />您可能还记得，只有在为特定请求处理页面期间才能检索存储在该页面作用域中的对象。如果对象是存储在请求作用域中的，可以在处理所有参与处理某请求的页面期间检索这些对象（譬如在对某个请求的处理中遇到了一个或多个 &lt;jsp:include&gt; 或 &lt;jsp:forward&gt; 操作）。如果对象是存储在会话作用域中的，则在与 Web 应用程序的交互式会话期间，可以由用户访问的任何页面检索它（即，直到与该用户交互相关联的 HttpSession 对象无效为止）。可以由任何用户从任何页面访问存储在应用程序作用域中的对象，直到卸载 Web 应用程序本身为止（通常是由于关闭 JSP 容器所致）。<br>通过将字符串映射为期望作用域中的对象来将对象存储到该作用域。然后，就可以通过提供相同字符串来从该作用域检索该对象。在作用域的映射中查找字符串，并返回被映射的对象。在 Servlet API 中，将此类对象称为相应作用域的<span style="font-style:italic"><wbr />属性</span><wbr />。但是，在 EL 的上下文中，也将与属性相关联的字符串看作变量的名称，该变量通过属性映射的方式获得特定的值。<br>在 EL 中，与隐式对象无关联的标识符被认为是存储在四个 JSP 作用域中的名称对象。首先对页面作用域检查是否存在这样的标识符，其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查，然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法，可以将 EL 标识符看作引用限制了作用域的变量。<br>从更技术的方面来说，没有映射到隐式对象的标识符是用 PageContext 实例的 findAttribute() 方法求值的，该实例表示对页面的处理，在该页面上，当前正在处理用于请求的表达式。标识符的名称作为参数传递给这个方法，然后该方法依次在四个作用域中搜索具有相同名称的属性。并将所找到的第一个匹配项作为 findAttribute() 方法的值返回。如果未在这四个作用域中找到这样的属性，则返回 null。<br>最终，限制了作用域的变量是四个 JSP 作用域的属性，这些属性具有可以用作 EL 标识符的名称。只要对限制了作用域的变量赋予由字母数字组成的名称，就可以通过 JSP 中提供的用于设置属性的任何机制来创建它们。这包括内置的 &lt;jsp:useBean&gt; 操作，以及由 Servlet API 中的几个类定义的 setAttribute() 方法。此外，四个 JSTL 库中定义的许多定制标记本身就能够设置作为限制了作用域的变量使用的属性值。<br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>隐式对象<br>表 1 中列出了 11 个 EL 隐式对象的标识符。不要将这些对象与 JSP 隐式对象（一共只有九个）混淆，其中只有一个对象是它们所共有的。<br><span style="font-weight:bold"><wbr />表 1. EL 隐式对象</span><wbr /><br><span style="font-weight:bold"><wbr /></span><wbr /><br><span style="font-weight:bold"><wbr />类别</span><wbr /> <span style="font-weight:bold"><wbr />标识符</span><wbr /> <span style="font-weight:bold"><wbr />描述</span><wbr /> JSPpageContext PageContext 实例对应于当前页面的处理作用域pageScope 与页面作用域属性的名称和值相关联的 Map 类requestScope 与请求作用域属性的名称和值相关联的 Map 类sessionScope 与会话作用域属性的名称和值相关联的 Map 类applicationScope 与应用程序作用域属性的名称和值相关联的 Map 类请求参数param 按名称存储请求参数的主要值的 Map 类paramValues 将请求参数的所有值作为 String 数组存储的 Map 类请求头header 按名称存储请求头主要值的 Map 类headerValues 将请求头的所有值作为 String 数组存储的 Map 类Cookiecookie 按名称存储请求附带的 cookie 的 Map 类初始化参数initParam 按名称存储 Web 应用程序上下文初始化参数的 Map 类<br>尽管 JSP 和 EL 隐式对象中只有一个公共对象（pageContext），但通过 EL 也可以访问其它 JSP 隐式对象。原因是 pageContext 拥有访问所有其它八个 JSP 隐式对象的特性。实际上，这是将它包括在 EL 隐式对象中的主要理由。<br>其余所有 EL 隐式对象都是映射，可以用来查找对应于名称的对象。前四个映射表示先前讨论的各种属性作用域。可以用它们来查找特定作用域中的标识符，而不用依赖于 EL 在缺省情况下使用的顺序查找过程。<br>接下来的四个映射用来获取请求参数和请求头的值。因为 HTTP 协议允许请求参数和请求头具有多个值，所以它们各有一对映射。每对中的第一个映射返回请求参数或头的主要值，通常是恰巧在实际请求中首先指定的那个值。每对中第二个映射允许检索参数或头的所有值。这些映射中的键是参数或头的名称，但这些值是 String对象的数组，其中的每个元素都是单一参数值或头值。<br>cookie 隐式对象提供了对由请求设置的 cookie 名称的访问。这个对象将所有与请求相关联的 cookie 名称映射到表示那些 cookie 特性的 Cookie对象。<br>最后一个 EL 隐式对象 initParam 是一个映射，它储存与 Web 应用程序相关联的所有上下文的初始化参数的名称和值。初始化参数是通过 web.xml 部署描述符文件指定的，该文件位于应用程序的 WEB-INF 目录中。<br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>存取器<br>因为 EL 标识符是作为隐式对象或限制了作用域的变量（通过属性来实现）解析的，因此有必要将它们转换成 Java 对象。EL 可以自动包装和解包其相应的 Java 类中的基本类型（例如，可以在后台将 int 强制转换成 Integer 类，反之亦可），但大多数的标识符将成为指向完整的 Java 对象的指针。<br>结果是，对这些对象的特性或（在对象是数组和集合的情况下）对其元素的访问通常是令人满意的。就为了实现这种用途，EL 提供了两种不同的存取器（点运算符（.）和方括号运算符（[]）），也支持通过 EL 操作特性和元素。<br>点运算符通常用于访问对象的特性。例如，在表达式 ${user.firstName} 中，使用点运算符来访问 user 标识符所引用对象的名为 firstName 的特性。EL 使用 Java bean 约定访问对象特性，因此必须定义这个特性的 getter 方法（通常是名为 getFirstName() 的方法），以便表达式正确求值。当被访问的特性本身是对象时，可以递归地应用点运算符。例如，如果我们虚构的 user 对象有一个实现为 Java 对象的 address 特性，那么也可以用点运算符来访问这个对象的特性。例如，表达式 ${user.address.city} 将会返回这个地址对象嵌套的 city 特性。<br>方括号运算符用来检索数组和集合的元素。在数组和有序集合（也即，实现了 java.util.List 接口的集合）的情况下，把要检索的元素的下标放在方括号中。例如，表达式 ${urls[3]} 返回 urls 标识符所引用的数组或集合的第四个元素（和 Java 语言以及 JavaScript 中一样，EL 中的下标是从零开始的）。<br>对于实现 java.util.Map 接口的集合，方括号运算符使用关联的键查找存储在映射中的值。在方括号中指定键，并将相应的值作为表达式的值返回。例如，表达式 ${commands[&quot;dir&quot;]} 返回与 commands 标识符所引用的 Map 中的 &quot;dir&quot; 键相关联的值。<br>对于上述两种情况，都可允许表达式出现在方括号中。对嵌套表达式求值的结果将被作为下标或键，用来检索集合或数组的适当元素。和点运算符一样，方括号运算符也可以递归应用。这使得 EL 能够从多维数组、嵌套集合或两者的任意组合中检索元素。此外，点运算符和方括号运算符还可以互操作。例如，如果数组的元素本身是对象，则可以使用方括号运算符来检索该数组的元素，并结合点运算符来检索该元素的一个特性（例如 ${urls[3].protocol}）。<br>假定 EL 充当指定动态属性值的简化语言，EL 存取器有一个有趣的功能（与 Java 语言的存取器不同），那就是它们在应用于 null 时不抛出异常。如果应用 EL 存取器的对象（例如，${foo.bar} 和 ${foo[&quot;bar&quot;]} 中的 foo 标识符）是 null，那么应用存取器的结果也是 null。事实证明，在大多数情况下，这是一个相当有用的行为，不久您就会了解这一点。<br>最后，点运算符和方括号运算符可能实现某种程度的互换。例如，也可以使用 ${user[&quot;firstName&quot;]} 来检索 user 对象的 firstName 特性，正如可以用 ${commands.dir} 获取与 commands 映射中的 &quot;dir&quot; 键相关联的值一样。<br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>运算符<br>EL 还可以通过使用标识符和存取器，遍历包含应用程序数据（通过限制了作用域的变量公开）或关于环境的信息（通过 EL 隐式对象）的对象层次结构。但是，只是访问这些数据，通常不足以实现许多 JSP 应用程序所需的表示逻辑。<br>最终，EL 还包括了几个用来操作和比较 EL 表达式所访问数据的运算符。表 2 中汇总了这些运算符。<br><span style="font-weight:bold"><wbr />表 2. EL 运算符</span><wbr /><br><span style="font-weight:bold"><wbr /></span><wbr /><br><span style="font-weight:bold"><wbr />类别</span><wbr /> <span style="font-weight:bold"><wbr />运算符</span><wbr /> 算术运算符+、-、*、/（或 div）和 %（或 mod）关系运算符==（或 eq）、!=（或 ne）、&lt;（或 lt）、&gt;（或 gt）、&lt;=（或 le）和 &gt;=（或 ge）逻辑运算符&amp;&amp;（或 and）、||（或 or）和 !（或 not）验证运算符empty <br>算术运算符支持数值的加法、减法、乘法和除法。还提供了一个求余运算符。注：除法和求余运算符都有替代的、非符号的名称（为的是与 XPath 保持一致）。清单 5 中显示了一个演示算术运算符用法的示例表达式。对几个 EL 表达式应用算术运算符的结果是将该算术运算符应用于这些表达式返回的数值所得的结果。<br><br><span style="font-weight:bold"><wbr />清单 5. 利用算术运算符的 EL 表达式</span><wbr /><br>${item.price * (1 + taxRate[user.address.zipcode])}<br><br>关系运算符允许比较数字或文本数据。比较的结果作为布尔值返回。逻辑运算符允许合并布尔值，返回新的布尔值。因此，可以将 EL 逻辑运算符应用于嵌套的关系或逻辑运算符的结果，如清单 6 所示。<br><br><span style="font-weight:bold"><wbr />清单 6. 利用关系和逻辑运算符的 EL 表达式</span><wbr /><br>${(x &gt;= min) &amp;&amp; (x &lt;= max)}<br><br>最后一种 EL 运算符是 empty，它对于验证数据特别有用。empty 运算符采用单个表达式作为其变量（也即，${empty input}），并返回一个布尔值，该布尔值表示对表达式求值的结果是不是“空”值。求值结果为 null 的表达式被认为是空，即无元素的集合或数组。如果参数是对长度为零的 String 求值所得的结果，则 empty 运算符也将返回 true。<br>表 3 显示了 EL 运算符的优先级。正如清单 5 和 6 所示，可以用圆括号对表达式分组，高于普通的优先级规则。<br><span style="font-weight:bold"><wbr />表 3. EL 运算符优先级（自顶到底，从左到右）</span><wbr /><br><span style="font-weight:bold"><wbr /></span><wbr /><br>[], . () unary -、not、!、empty *、/、div、%、mod +、binary - () &lt;&lt;/code&gt;、&gt;、&lt;=、&gt;=、lt、gt、le、ge ==、!=、eq、ne &amp;&amp;、and ||、or <br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>文字<br>在 EL 表达式中，数字、字符串、布尔值和 null 都可以被指定为文字值。字符串可以用单引号或双引号定界。布尔值被指定为 true 和 false。<br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>Taglib 伪指令<br>正如我们先前讨论的，JSTL 1.0 包括四个定制标记库。为了演示 JSTL 标记和表达式语言的交互，我们将研究几个来自 JSTL core 库的标记。和使用任何 JSP 定制标记库一样，必须在您想要使用这个库标记的任何页面中包括 taglib 伪指令。清单 7 显示了用于这个特定库的伪指令。<br><br><span style="font-weight:bold"><wbr />清单 7. 用于 JSTL core 库 EL 版本的 taglib 伪指令</span><wbr /><br>&lt;%@ taglib uri=&quot;http://java.sun.com/jstl/core&quot; prefix=&quot;c&quot; %&gt;<br><br>实际上，对应于 JSTL core 库的 taglib 伪指令有两种，因为在 JSTL 1.0 中，EL 是可选的。所有四个 JSTL 1.0 定制标记库都有使用 JSP 表达式（而不是 EL）指定动态属性值的备用版本。因为这些备用库依赖于 JSP 的更传统的请求时属性值，所以它们被称为 <span style="font-style:italic"><wbr />RT</span><wbr /> 库，而那些使用表达式语言的则被称为 <span style="font-style:italic"><wbr />EL</span><wbr /> 库。开发人员用不同的 taglib 伪指令来区分每个库的这两个版本。清单 8 显示了使用 core 库的 RT 版本的伪指令。但是，由于现在我们讨论的重点是 EL，所以首先需要这些伪指令。<br><br><span style="font-weight:bold"><wbr />清单 8. 用于 JSTL core 库 RT 版本的 taglib 伪指令</span><wbr /><br>&lt;%@ taglib uri=&quot;http://java.sun.com/jstl/core_rt&quot; prefix=&quot;c_rt&quot; %&gt;<br><br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>变量标记<br>我们首先要考虑的 JSTL 定制标记是 &lt;c:set&gt; 操作。正如已经说明的，限制了作用域的变量在 JSTL 中起关键作用，&lt;c:set&gt; 操作提供基于标记的机制来创建和设置限制了作用域的变量。清单 9 中显示了该操作的语法，其中 var 属性指定了限制了作用域的变量的名称，scope 属性表明了该变量驻留在哪个作用域中，value 属性指定了分配给该变量的值。如果指定变量已经存在，则简单地将所指明的值赋给它。如果不存在，则创建新的限制了作用域的变量，并用该值初始化这个变量。<br><br><span style="font-weight:bold"><wbr />清单 9. &lt;c:set&gt; 操作的语法</span><wbr /><br>&lt;c:set var=&quot;<span style="font-style:italic"><wbr />name</span><wbr />&quot; scope=&quot;<span style="font-style:italic"><wbr />scope</span><wbr />&quot; value=&quot;<span style="font-style:italic"><wbr />expression</span><wbr />&quot;/&gt;<br><br>scope 属性是可选的，其缺省值是 page。<br>清单 10 中显示了 &lt;c:set&gt; 的两个示例。在第一个示例中，将会话作用域变量设置成 String 值。在第二个示例中，用表达式来设置数值：将页面作用域内名为 square 的变量赋值为名为 x 的请求参数的值的平方。<br><br><span style="font-weight:bold"><wbr />清单 10. &lt;c:set&gt; 操作示例</span><wbr /><br>&lt;c:set var=&quot;timezone&quot; scope=&quot;session&quot; value=&quot;CST&quot;/&gt;&lt;c:set var=&quot;square&quot; value=&quot;${param['x'] * param['x']}&quot;/&gt;<br><br>您还可以将限制了作用域的变量的值指定为 &lt;c:set&gt; 操作的主体内容，而不是使用属性。使用这种方法，您可以重新编写清单 10 中的第一个示例，如清单 11 所示。此外，正如我们马上可以看到的，&lt;c:set&gt; 标记的主体内容本身也可以使用定制标记。&lt;c:set&gt; 主体内生成的所有内容都将作为一个 String 值赋给指定变量。<br><br><span style="font-weight:bold"><wbr />清单 11. 通过主体内容指定 &lt;c:set&gt; 操作的值</span><wbr /><br>&lt;c:set var=&quot;timezone&quot; scope=&quot;session&quot;&gt;CST&lt;/c:set&gt;<br><br>JSTL core 库包含第二个用于管理限制了作用域的变量的标记 ― &lt;c:remove&gt;。顾名思义，&lt;c:remove&gt; 操作是用来删除限制了作用域的变量的，它获取两个属性。var 属性指定待删除变量的名称，scope 属性是可选的，它表示待删除变量来自哪个作用域，缺省为 page，如清单 12 所示。<br><span style="font-weight:bold"><wbr />清单 12. &lt;c:remove&gt; 操作示例</span><wbr /> &lt;c:remove var=&quot;timezone&quot; scope=&quot;session&quot;/&gt;<br><br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>输出<br>尽管 &lt;c:set&gt; 操作允许将表达式结果赋给限制了作用域的变量，但开发人员通常会希望只显示表达式的值，而不存储它。JSTL &lt;c:out&gt; 定制标记承担这一任务，其语法如清单 13 所示。该标记对由其 value 属性指定的表达式进行求值，然后打印结果。如果指定了可选属性 default，那么，在对 value 属性的表达式求值所得结果为 null 或空 String 的情况下，&lt;c:out&gt; 将打印其值。<br><br><span style="font-weight:bold"><wbr />清单 13. &lt;c:out&gt; 操作的语法</span><wbr /><br>&lt;c:out value=&quot;<span style="font-style:italic"><wbr />expression</span><wbr />&quot; default=&quot;<span style="font-style:italic"><wbr />expression</span><wbr />&quot; escapeXml=&quot;<span style="font-style:italic"><wbr />boolean</span><wbr />&quot;/&gt;<br><br>escapeXml 属性也是可选的。它控制当用 &lt;c:out&gt; 标记输出诸如“&lt;”、“&gt;”和“&amp;”之类的字符（在 HTML 和 XML 中具有特殊意义）时是否应该进行转义。如果将 escapeXml 设置为 true，则会自动将这些字符转换成相应的 XML 实体（此处提到的字符分别转换成 &amp;lt;、&amp;gt; 和 &amp;amp;）。<br>例如，假定有一个名为 user 的会话作用域变量，它是一个类的实例，该类为用户定义了两个特性：username 和 company。每当用户访问站点时，这个对象被自动分配给会话，但直到用户实际登录后，才会设置这两个特性。假定是这种方案，请考虑清单 14 中的 JSP 片段。在用户登录之后，这个片段将显示单词“Hello”，其后是他／她的用户名和一个惊叹号。但是，在用户登录之前，由这个片段生成的内容则是短语“Hello Guest!”。在这种情况下，因为 username 特性还有待初始化，所以 &lt;c:out&gt; 标记将转而打印出 default 属性的值（即字符串“Guest”）。<br><br><span style="font-weight:bold"><wbr />清单 14. 带缺省内容的 &lt;c:out&gt; 操作示例</span><wbr /><br>Hello &lt;c:out value=&quot;${user.username}&quot; default==&quot;Guest&quot;/&gt;!<br><br>接下来，考虑清单 15，它使用了 &lt;c:out&gt; 标记的 escapeXml 属性。如果在这种情况下已经将 company 特性设置成 Java String 值 &quot;Flynn &amp; Sons&quot;，那么，实际上该操作生成的内容将是 Flynn &amp; Sons。如果这个操作是生成 HTML 或 XML 内容的 JSP 页面的一部分，那么，这个字符串中间的“&amp;”符号最终可能被解释为 HTML 或 XML 控制字符，从而妨碍了对该内容的显示或解析。但是，如果将 escapeXml 属性值设置成 true，则所生成的内容将是 Flynn &amp;amp; Sons。浏览器或解析器不会因在解释时遇到这种内容而出问题。假定 HTML 和 XML 是 JSP 应用程序中最常见的内容类型，所以 escapeXml 属性的缺省值是 true 就不足为奇了。<br><br><span style="font-weight:bold"><wbr />清单 15. 禁用转义的 &lt;c:out&gt; 操作示例</span><wbr /><br>&lt;c:out value=&quot;${user.company}&quot; escapeXml==&quot;false&quot;/&gt;<br><br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>用缺省值设置变量<br>除了简化动态数据的显示之外，当通过 &lt;c:set&gt; 设置变量值时，&lt;c:out&gt; 指定缺省值的能力也很有用。正如<a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#listing11" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">清单 11</span><wbr /></a><wbr /> 所示，用来赋给限制了作用域的变量的值可以指定为 &lt;c:set&gt; 标记的主体内容，也可以通过其值属性来指定。通过将 &lt;c:out&gt; 操作嵌套在 &lt;c:set&gt; 标记的主体内容中，变量赋值就可以利用其缺省值能力。<br>清单 16 中说明了这种方法。外部 &lt;c:set&gt; 标记的行为非常简单：它根据其主体内容设置会话作用域 timezone 变量的值。但是，在这种情况下，主体内容是通过 &lt;c:out&gt; 操作生成的。这个嵌套操作的值属性是表达式 ${cookie['tzPref'].value}，它尝试通过 cookie 隐式对象返回名为 tzPref 的 cookie 值。（cookie 隐式对象将 cookie 名称映射到相应的 Cookie 实例，这意味着必须通过对象的 value 特性使用点运算符来检索储存在 cookie 中的实际数据。）<br><br><span style="font-weight:bold"><wbr />清单 16. 合并 &lt;c:set&gt; 和 &lt;c:out&gt; 以提供缺省变量值</span><wbr /><br>&lt;c:set var=&quot;timezone&quot; scope==&quot;session&quot;&gt;   &lt;c:out value=&quot;${cookie['tzPref'].value}&quot; default==&quot;CST&quot;/&gt;&lt;/c:set&gt;<br><br>但是，请考虑以下情况，用户是第一次尝试使用这段代码的 Web 应用程序。结果是，请求中没有提供名为 tzPref 的 cookie。这意味着使用隐式对象的查找将返回 null，在这种情况下整个表达式将返回 null。因为对 &lt;c:out&gt; 标记的 value 属性求值的结果是 null，所以 &lt;c:out&gt; 标记会转而输出对其 default 属性求值的结果。在这里是字符串 CST。因此，实际的结果是将 timezone 限制了作用域的变量设置成用户的 tzPref cookie 中存储的时区，或者，如果没有，则使用缺省时区 CST。<br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:10px;height:1px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><span style="font-weight:bold"><wbr />EL 和 JSP 2.0</span><wbr /><br>目前，表达式语言仅可用于指定 JSTL 定制标记中的动态属性值。但 JSTL 1.0 表达式语言的一个扩展已经被提出，会把它包括到 JSP 2.0 中去，眼下正在进行最后评审。这个扩展将允许开发人员通过自己的定制标记来使用 EL。页面作者将可以在目前允许使用 JSP 表达式的任何地方使用 EL 表达式，譬如将动态值插入模板文本中：&lt;p&gt;Your preferred time zone is ${timezone}&lt;/p&gt;。<br>这个 JSP 2.0 功能（就象 JSTL 本身一样）将支持页面作者进一步减少对 JSP 编制脚本元素的依赖，从而改进 JSP 应用程序的可维护性。 <br><br><wbr /><a href="http://www.ibm.com/i/v14/rules/blue_rule.gif" target="_blank"><img style="width:100px;height:1px;border:0;" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:8px;height:6px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:4px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/v14/icons/u_bold.gif" target="_blank"><img style="width:16px;height:16px;border:0;" src="http://www.ibm.com/i/v14/icons/u_bold.gif" /></a><wbr /><br><a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#main" target="_blank"><span style="font-weight:bold"><wbr /><span style="color:#5c81a7;line-height:1.8em;">回页首</span><wbr /></span><wbr /></a><wbr /><br><br>结束语<br>EL（与四个 JSTL 定制标记库提供的操作结合起来）允许页面作者不使用脚本元素即可实现表示层逻辑。例如，对比本文开头<a href="http://www.ibm.com/developerworks/cn/java/j-jstl0211/#listing1" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">清单 1</span><wbr /></a><wbr /> 中的 JSP 代码和清单 17 中显示的通过 JSTL 实现的同样功能。（JSTL core 库中其余的标记，包括 &lt;c:choose&gt; 及其子标记，将在本系列的下一篇文章中讨论。）尽管显然执行了条件逻辑，但是 JSTL 版本中没有 Java 语言源代码，并且标记之间的关系（尤其是关于嵌套需求）对于任何精通 HTML 语法的人都应该是熟悉的。<br><br><span style="font-weight:bold"><wbr />清单 17. 合并 &lt;c:set&gt; 和 &lt;c:out&gt; 以提供缺省变量值</span><wbr /><br>&lt;c:choose&gt;&lt;c:when test=&quot;${user.role == 'member'}&quot;&gt;    &lt;p&gt;Welcome, member!&lt;/p&gt;  &lt;/c:when&gt;&lt;c:otherwise&gt;    &lt;p&gt;Welcome, guest!&lt;/p&gt;  &lt;/c:otherwise&gt;&lt;/c:choose&gt;<br><br>通过提供大多数 Web 应用程序常用功能的标准实现，JSTL 有助于加速开发周期。与 EL 结合起来，JSTL 可以不需要对表示层程序编写代码，这极大地简化了 JSP 应用程序的维护。<br><br><br>参考资料 <br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;"><a href="http://www.ibm.com/developerworks/cn/java/j-taglib/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">使用定制标记控制 JSP 页面</span><wbr /></a><wbr /> <br><br><br></li><li style="margin:25px;"><a href="http://www.ibm.com/developerworks/cn/java/j-jsptags/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">JSP 标记库：着意设计的更好的可用性</span><wbr /></a><wbr /> <br><br><br></li><li style="margin:25px;">Sun 的 <a href="http://java.sun.com/products/jsp/jstl/index.html" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">JSP 标准标记库主页</span><wbr /></a><wbr />是了解关于 JSTL 的更多信息的良好起点。<br><br><br></li><li style="margin:25px;"><a href="http://jcp.org/aboutJava/communityprocess/final/jsr052/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">JSTL 1.0 规范</span><wbr /></a><wbr />是关于 EL 和四个 JSTL 标记库的最终权威文本。<br><br><br></li><li style="margin:25px;"><a href="http://jakarta.apache.org/taglibs/index.html" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">Jakarta Taglibs</span><wbr /></a><wbr /> 项目是 JSTL 1.0 参考实现的起源。<br><br><br></li><li style="margin:25px;">Shawn Bayern 所著的 <a href="http://www.manning.com/bayern/index.html" target="_blank"><span style="color:#5c81a7;line-height:1.8em;"><span style="font-style:italic"><wbr />JSTL in Action</span><wbr /> </span><wbr /></a><wbr />（Manning Publications Co.，2002 年）提供了对所有 JSTL 功能的精彩论述，作者是该参考实现的领导。<br><br><br></li><li style="margin:25px;">David Geary 是 Java 技术方面很受欢迎的作者，他也写了一本关于 JSTL 的书，书名是 <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0131001531/103-4207394-1320606?vi=glance" target="_blank"><span style="color:#5c81a7;line-height:1.8em;"><span style="font-style:italic"><wbr />Core JSTL</span><wbr /> </span><wbr /></a><wbr />。<br><br><br></li><li style="margin:25px;"><a href="http://jsptags.com/index.jsp" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">JSPTags.com</span><wbr /></a><wbr /> 是 JSP 技术参考资料的目录，它尤其专注于定制标记库。<br><br><br></li><li style="margin:25px;">通过 Jeff Wilson 精彩的文章“<a href="http://www.ibm.com/developerworks/cn/java/j-taglib/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">使用定制标记控制 JSP 页面</span><wbr /></a><wbr />”（<span style="font-style:italic"><wbr />developerworks</span><wbr />，2002 年 1 月）了解关于定制标记库的一切。<br><br><br></li><li style="margin:25px;">Noel Bergman 的文章“<a href="http://www.ibm.com/developerworks/cn/java/j-jsptags/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">JSP 标记库：着意设计的更好的可用性</span><wbr /></a><wbr />”（<span style="font-style:italic"><wbr />developerworks</span><wbr />，2001 年 12 月）向您展示了声明性标记是如何帮助提高 JSP 页面的可用性的。<br><br><br></li><li style="margin:25px;">有关 EcmaScript 的更多详细信息，请参阅 Sing Li 的“<a href="http://www.ibm.com/developerworks/cn/java/j-qdjava/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;">快速上手 Java 编程</span><wbr /></a><wbr />”（<span style="font-style:italic"><wbr />developerworks</span><wbr />，2001 年 7 月）。<br><br><br></li><li style="margin:25px;">在 <a href="http://www.ibm.com/developerworks/cn/java/" target="_blank"><span style="color:#5c81a7;line-height:1.8em;"><span style="font-style:italic"><wbr />developerworks</span><wbr /> Java 技术专区</span><wbr /></a><wbr />可以找到多达数百篇的 Java 技术参考资料。<br></li></span><wbr /><br><br>关于作者<br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:100px;height:5px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr /><br><wbr /><a href="http://www.ibm.com/i/c.gif" target="_blank"><img style="width:4px;height:5px;border:0;" src="http://www.ibm.com/i/c.gif" /></a><wbr />Mark Kolb 是一名在德克萨斯州奥斯汀工作的软件工程师。他经常就服务器端 Java 主题在业界发表演讲，并且与人合著了 <a href="http://www.manning.com/fields2/index.html" target="_blank"><span style="color:#5c81a7;line-height:1.8em;"><span style="font-style:italic"><wbr />Web Development with JavaServer Pages，第二版</span><wbr /> </span><wbr /></a><wbr />一书。可通过 [email=[ft=#5c81a7,,]mak@taglib.com</span><wbr />]mak@taglib.com?cc=mak@taglib.com[/email]与 Mark 联系。 <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1258979830#comment</comments>
<qz:effect>134218241</qz:effect>
<pubDate>Mon, 23 Nov 2009 12:37:10 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1258979830</guid>
</item>

<item>
<title><![CDATA[EL表达式 （详解）转]]></title>
<link>http://82895376.qzone.qq.com/blog/1258977802</link>
<description><![CDATA[<span style="font-weight:bold"><wbr /><span style="color:#295200;font-size:24px;line-height:1.8em;">L表达式 （详解）<span style="color:#006666;font-size:13px;line-height:1.8em;">EL表达式<br>     1、EL简介</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">1）语法结构</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       ${expression}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">2）[]与.运算符</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     EL 提供.和[]两种运算符来存取数据。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     当要存取的属性名称中包含一些特殊字符，如.或?等并非字母或数字的符号，就一定要使用 []。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例如：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">         ${user.My-Name}应当改为${user[&quot;My-Name&quot;] }</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     如果要动态取值时，就可以用[]来做，而.无法做到动态取值。例如：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">         ${sessionScope.user[data]}中data 是一个变量</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">3）变量</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     EL存取变量数据的方法很简单，例如：${username}。它的意思是取出某一范围中名称为</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">username的变量。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     因为我们并没有指定哪一个范围的username，所以它会依序从Page、Request、Session、</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">Application范围查找。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     假如途中找到username，就直接回传，不再继续找下去，但是假如全部的范围都没有找到时，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">就回传null。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     属性范围在EL中的名称</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">         Page         PageScope</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">         Request         RequestScope</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">         Session         SessionScope</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">         Application     ApplicationScope</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">4) 1--EL表达式用${}表示,可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">2--EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}. </span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">范围内的变量.applicationScope表示应用范围的变量.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">3 --&lt;%@ page isELIgnored=&quot;true&quot;%&gt; 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">止.JSP2.0中默认的启用EL语言.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">             4-- EL语言可显示 逻辑表达式如${true and false}结果是false     关系表达式如${5&gt;6} 结</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">果是false     算术表达式如 ${5+5} 结果是10</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">             5--EL中的变量搜索范围是:page request session application   点运算符(.)和&quot;[ ]&quot;都是</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">表示获取变量的值.区别是[ ]可以显示非词类的变量</span><wbr /><br><br><span style="color:#006666;font-size:13px;line-height:1.8em;">2、EL隐含对象</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">1)与范围有关的隐含对象</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">与范围有关的EL 隐含对象包含以下四个：pageScope、requestScope、sessionScope 和</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">applicationScope；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">它们基本上就和JSP的pageContext、request、session和application一样；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">在EL中，这四个隐含对象只能用来取得范围属性值，即getAttribute(String name)，却不能取得</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">其他相关信息。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例如：我们要取得session中储存一个属性username的值，可以利用下列方法：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     session.getAttribute(&quot;username&quot;) 取得username的值，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">在EL中则使用下列方法</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${sessionScope.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">2)与输入有关的隐含对象</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">与输入有关的隐含对象有两个：param和paramValues，它们是EL中比较特别的隐含对象。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例如我们要取得用户的请求参数时，可以利用下列方法：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     request.getParameter(String name)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     request.getParameterValues(String name)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">在EL中则可以使用param和paramValues两者来取得数据。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${param.name}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${paramValues.name}</span><wbr /><br><br><span style="color:#006666;font-size:13px;line-height:1.8em;">3.其他隐含对象</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">1)cookie</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">JSTL并没有提供设定cookie的动作，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例：要取得cookie中有一个设定名称为userCountry的值，可以使用${cookie.userCountry}     来</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">取得它。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">2)header和headerValues</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">header 储存用户浏览器和服务端用来沟通的数据</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例：要取得用户浏览器的版本，可以使用${header[&quot;User-Agent&quot;]}。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">另外在鲜少机会下，有可能同一标头名称拥有不同的值，此时必须改为使用headerValues 来取得</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">这些值。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">3)initParam</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">initParam取得设定web站点的环境参数(Context)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例：一般的方法String userid = (String)application.getInitParameter(&quot;userid&quot;);</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     可以使用 ${initParam.userid}来取得名称为userid</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">4)pageContext</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">pageContext取得其他有关用户要求或页面的详细信息。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.queryString}         取得请求的参数字符串</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.requestURL}         取得请求的URL，但不包括请求之参数字符串</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.contextPath}         服务的web application 的名称</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.method}           取得HTTP 的方法(GET、POST)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.remoteUser}         取得用户名称</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.request.remoteAddr }         取得用户的IP 地址</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.session.new}             判断session 是否为新的</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.session.id}               取得session 的ID</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     ${pageContext.servletContext.serverInfo}   取得主机端的服务信息</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">   4) 条件标签&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">1.算术运算符有五个：+、-、*或$、/或div、%或mod</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">2.关系运算符有六个：==或eq、!=或ne、&lt;或lt、&gt;或gt、&lt;=或le、&gt;=或ge</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">3.逻辑运算符有三个：&amp;&amp;或and、||或or、!或not</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">4.其它运算符有三个：Empty运算符、条件运算符、()运算符</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     例：${empty param.name}、${A?B:C}、${A*(B+C)}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">5) EL函数(functions)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">语法：ns:function( arg1, arg2, arg3 …. argN)</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">其中ns为前置名称(prefix)，它必须和taglib 指令的前置名称一置</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       6) 补充：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;%@ taglib prefix=&quot;c&quot; http://java.sun.com/jstl/core_rt&quot;&gt;<span style="color:#006666;font-size:13px;line-height:1.8em;">http://java.sun.com/jstl/core_rt</span><wbr /><span style="color:#006666;font-size:13px;line-height:1.8em;">&quot; %&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">FOREACH:</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:forEach items=&quot;${messages}&quot;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">var=&quot;item&quot;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">begin=&quot;0&quot;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">end=&quot;9&quot;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">step=&quot;1&quot;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">varStatus=&quot;var&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">……</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:forEach&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">OUT:</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:out value=&quot;/${logininfo.username}&quot;/&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">c:out&gt;将value 中的内容输出到当前位置，这里也就是把logininfo 对象的</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">username属性值输出到页面当前位置。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${……}是JSP2.0 中的Expression Language（EL）的语法。它定义了一个表达式，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">其中的表达式可以是一个常量（如上），也可以是一个具体的表达语句（如forEach循环体中</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">的情况）。典型案例如下：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">? ${logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">这表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">用对象的属性，也可以用“[]”引用对象属性，如${logininfo[username]}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">与${logininfo.username}达到了同样的效果。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">“[]”引用方式的意义在于，如果属性名中出现了特殊字符，如“.”或者“-”，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">此时就必须使用“[]”获取属性值以避免语法上的冲突（系统开发时应尽量避免</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">这一现象的出现）。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">与之等同的JSP Script大致如下：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">LoginInfo logininfo =</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">(LoginInfo)session.getAttribute(“logininfo”);</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">String username = logininfo.getUsername();</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">可以看到，EL大大节省了编码量。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">这里引出的另外一个问题就是，EL 将从哪里找到logininfo 对象，对于</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${logininfo.username}这样的表达式而言，首先会从当前页面中寻找之前是</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">否定义了变量logininfo，如果没有找到则依次到Request、Session、</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">Application 范围内寻找，直到找到为止。如果直到最后依然没有找到匹配的</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">变量，则返回null.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">如果我们需要指定变量的寻找范围，可以在EL表达式中指定搜寻范围：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${pageScope.logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${requestScope.logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${sessionScope.logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${applicationScope.logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">在Spring 中，所有逻辑处理单元返回的结果数据，都将作为Attribute 被放</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">置到HttpServletRequest 对象中返回（具体实现可参见Spring 源码中</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">org.springframework.web.servlet.view.InternalResourceView.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">exposeModelAsRequestAttributes方法的实现代码），也就是说Spring</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">MVC 中，结果数据对象默认都是requestScope。因此，在Spring MVC 中，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">以下寻址方法应慎用：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${sessionScope.logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">${applicationScope.logininfo.username}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">? ${1＋2}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">结果为表达式计算结果，即整数值3。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">? ${i&gt;1}</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">如果变量值i&gt;1的话，将返回bool类型true。与上例比较，可以发现EL会自</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">动根据表达式计算结果返回不同的数据类型。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">表达式的写法与java代码中的表达式编写方式大致相同。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">IF / CHOOSE:</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:if test=&quot;${var.index % 2 == 0}&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">*</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:if&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">判定条件一般为一个EL表达式。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:if&gt;并没有提供else子句，使用的时候可能有些不便，此时我们可以通过&lt;c:choose&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">tag来达到类似的目的：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:choose&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:when test=&quot;${var.index % 2 == 0}&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">*</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:when&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:otherwise&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">!</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:otherwise&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:choose&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">类似Java 中的switch 语句，&lt;c:choose&gt;提供了复杂判定条件下的简化处理手法。其</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">中&lt;c:when&gt;子句类似case子句，可以出现多次。上面的代码，在奇数行时输出“*”号，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">而偶数行时输出“!”。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">经验：1、如果EL表达式无法解析：– &lt;%@ page isELIgnored=&quot;false&quot; %&gt;</span><wbr /><br><br><span style="color:#006666;font-size:13px;line-height:1.8em;">一、           JSTL</span><wbr /><br><br><span style="color:#006666;font-size:13px;line-height:1.8em;">1、EL运算符&gt;;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       2)var指定变量，并把EL运算结果赋值给该变量值为true/false；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       3）scope:指定 var变量的范围；</span><wbr /><br><br><br><span style="color:#006666;font-size:13px;line-height:1.8em;">6、迭代标签</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">语法：&lt;c:forEach items=“collection” var=“name” varStatus=“status” begin=“int“ </span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">end=”int” step=“int” &gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">           //循环体</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">           &lt;/c:forEach&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     说明:1)items:是集合，用EL表达式；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       2)var:变量名，存放items</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       3)varStatus: 显示循环状态的变量</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">①index:从0开始;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">                     ②count:元素位置,从1开始;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">                     ③first:如果是第一个元素则显示true;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">                     ④last:如果是最后一个元素则显示true;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       4)begin:循环的初始值(整型)；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       5)end: 循环结束 ;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">       6)step:步长,循环间隔的数值；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">7、&lt;c:otherwise&gt;标签</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     例：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">如果user.wealthy值true，则显示user.wealthy is true.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:choose&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:when test=&quot;&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">user.generous is true.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:when&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:when test=&quot;&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">user.stingy is true.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:when&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:otherwise&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">user.generous and user.stingy are false.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:otherwise&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:choose&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">说明：只有当条件user.generous返回值是true时，才显示user.generous is true.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">只有当条件user.stingy返回值是true时，才显示user.stingy is true.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">其它所有的情况（即user.generous和user.stingy的值都不为true）全部显示user.generous and </span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">user.stingy are false.</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">由于JSTL没有形如if (){…} else {…}的条件语句，所以这种形式的语句只能用&lt;c:choose&gt;、</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:when&gt;和&lt;c:otherwise&gt;标签共同来完成了。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">8、c:forTokens&gt;标签</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">说明：   </span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">items 进行循环的项目 是 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">delims 分割符 是 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">begin 开始条件 否 0</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">end 结束条件 否 集合中的最后一个项目</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">step 步长 否 1</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">var 代表当前项目的变量名 否 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">varStatus 显示循环状态的变量 否 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例子:</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:forTokens items=&quot;a:b:c:d&quot; delims=&quot;:&quot; var=&quot;token&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:out value=&quot;&quot;/&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:forTokens&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以：分开循环四次，</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">token是循环到当前分割到的字符串。</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">9、&lt;c:redirect&gt;标签</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     说明：标签将请求重新定向到另外一个页面，它有以下属性 属性 描 述 是否必须 缺省值</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">url url地址 是 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">context /后跟本地web应用程序的名字 否 当前应用程序</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例子：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:redirect /'&gt;<span style="color:#006666;font-size:13px;line-height:1.8em;">http://www.yourname.com/login.jsp&quot;/</span><wbr /><span style="color:#006666;font-size:13px;line-height:1.8em;">&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">将请求重新定向到</span><wbr /><a href="http://www.yourname.com/login.jsp" target="_blank"><span style="color:#006666;font-size:13px;line-height:1.8em;">http://www.yourname.com/login.jsp</span><wbr /></a><wbr /><span style="color:#006666;font-size:13px;line-height:1.8em;">页，相当于response.setRedirect</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">(&quot;</span><wbr /><a href="http://www.yourname.com/login.jsp" target="_blank"><span style="color:#006666;font-size:13px;line-height:1.8em;">http://www.yourname.com/login.jsp</span><wbr /></a><wbr /><span style="color:#006666;font-size:13px;line-height:1.8em;">&quot;);</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">10、&lt;c:param&gt;标签</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     说明：&lt;c:param&gt;标签用来传递参数给一个重定向或包含页面，它有以下属性属 性 描 述 是否</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">必须 缺省值</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">name 在request参数中设置的变量名 是 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">value 在request参数中设置的变量值 否 无</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">例子：</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:redirect url=&quot;login.jsp&quot;&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;c:param name=&quot;id&quot; value=&quot;888&quot;/&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">&lt;/c:redirect&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">将参数888以id为名字传递到login.jsp页面，相当于login.jsp?id=888</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">11、&lt;fmt:&gt;格式化标签</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     说明：需要导入   &lt;%@ taglib prefix=&quot;fmt&quot; http://java.sun.com/jsp/jstl/fmt&quot;&gt;<span style="color:#006666;font-size:13px;line-height:1.8em;">http://java.sun.com/jsp/jstl/fmt</span><wbr /><span style="color:#006666;font-size:13px;line-height:1.8em;">&quot; %&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">     1）格式化日期&lt;fmt:formatDate value=“” pattern=“yyyy-MM-dd HH:mm:ss”/&gt;</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">               Value:通过EL表达式或&lt;%new Date() %&gt; 取的日期值；</span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">               Pattern:输出的日期格式；                       </span><wbr /></span><wbr /></span><wbr /></span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;"><span style="color:#006666;font-size:13px;line-height:1.8em;"><span style="color:#006666;font-size:13px;line-height:1.8em;"><span style="color:#006666;font-size:13px;line-height:1.8em;">    2) 格式化数字&lt;fmt:formatNumber </span><wbr /><br><span style="color:#006666;font-size:13px;line-height:1.8em;">value=&quot;${n}&quot; pattern=&quot;###,###.##&quot; /&gt;</span><wbr /></span><wbr /></span><wbr /></span><wbr /><br></span><wbr /></span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[java技术文摘]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1258977802#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Mon, 23 Nov 2009 12:03:22 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1258977802</guid>
</item>

<item>
<title><![CDATA[[雷]:楼主小白与众YY的对白(摘录自百度贴吧)]]></title>
<link>http://82895376.qzone.qq.com/blog/1258731035</link>
<description><![CDATA[1楼<br>唐家三少共有几部作品 哪个最好看？ 各位推见下<br>2楼<br>唐家三少的星辰变 很不错<br>还有番茄的惟我独仙 也赞一个 <br>3楼<br>我晕你会教坏人的<br>4楼<br>2L脑残？别不懂装懂<br>5楼<br>2L教坏人 3少的神墓最好看<br>6楼<br>草，星辰变是柿子的，不懂就别乱回<br>7楼<br>顶三少的唯我独仙<br>8楼<br>我 一百遍啊一百遍 没一个好好说的 难到这就是现在人的素质<br>9楼<br>狂神我觉得很好看啊。也许是当年我太小了。<br>10楼<br>2楼在玩笑…同志们…3少的《坏蛋是怎样练成的》<br>11楼<br>10楼的你妈叫你回家吃米田共<br>12楼<br>拜托 别乱教人 三少的 无限恐怖 最出名的好不无限流的开山作<br>13楼<br>还有蜡笔小新<br>14楼<br>不内涵.狂神.善良的死神..<br>15楼<br>其实三少的神墓和诛仙.蛮荒记~~搜神记~~紫川这些 也是不错的作品的<br>16楼<br>其实吧 三少作品不少 除了狂神 空速 死神 生肖 冰火 光 唯我 琴帝 都是他的<br>呵呵   开玩笑 三少的神墓 太天才了 从零开始也不错 覆雨翻云也行 <br>17楼<br>围观 哈哈! <br>18楼<br>生肖 是三五组合哦````<br>19楼<br>三小的卡徒，很好看！！<br>20楼<br>他的天魔神潭也很经典的吧………<br>21楼<br>&lt;兽血沸腾&gt;……那个夏天不能忘记的回忆……<br>22楼<br>都错了，三少的【朱颜血系列】非常强大，中国黑暗重口味小说的开山鼻祖~<br>当时三少用的是浮萍居主马甲！ <br>23楼<br>三少的悟空传啦，无限恐怖啦，佛本是道啦，这些好看<br>24楼<br>靠。你们也太会乱搞了吧。<br>25楼<br>三少早期作品飘邈之旅，狼群，升龙道，蛮荒三部曲都可以，中期的星辰变，神墓，坏蛋是怎样炼成的，极品公子也不错。晚期的斗破苍穹，盘龙，屠神之路就更不说了。<br>26楼<br>25L   你知道的太多了<br>27楼<br>《星辰变》《斗罗大陆》这两篇不错。<br>28楼<br>恩 还有三少的《金瓶梅》也是横不错的<br>29楼<br>25楼真无敌！<br>31楼<br>三少的《论持久战》我觉得很不错，去看看吧，可以学到很多东西<br>32楼<br>不是血薇吗？<br>这条留言是通过手机发表的，我也要用手机发表留言！ <br>33楼<br>2楼<br>你太有才了!<br>34楼<br>我无语了 我说几本书吧 狂神 斗罗大陆 独仙 琴帝 空速星痕 善良的死神 <br>冰火魔厨     生肖守护神 光之子 <br>不知道我说的对不 <br>35楼<br>都是看书的人呀怎么多优秀的书都让你们说出来了不过多数都不是三少写的。三少写的书不错真想知道都写过什么上网查下就知道。<br>36楼<br>&lt;&lt;倚天屠龙记&gt;&gt;&lt;&lt;小泽玛利亚&gt;&gt;这两本是唐家三少最新的作品..<br>37楼<br>一群猪蛋<br>38楼<br>三少的《我是智障我怕谁》前阵很流星<br>39楼<br>LZ别听他们的，个人觉得三少的《恶魔法则》很赞！<br>40楼<br>呵呵。三少的书都挺好。网上随便一查就能查到。别听他们的...<br>41楼<br>楼上的都说的狗屁 三少的《十万个为什么》是至今为止最经典的一本书 无人能超越...<br>42楼<br>光之子 善良的死神 狂神 唯我独仙 空速星痕 冰火魔厨 生肖守护神 琴帝 斗罗大陆 楼主大概就这些了，我看过的就这么多！我比较喜欢冰火魔厨这本书！貌似其他的也不错就是空速星痕有这虎头蛇尾的厉害，有些失望！<br>43楼<br>三少的《石头记》很感人的。<br>44楼<br>三少的极品家丁。。。真正的经典。。。俺看了好几遍<br>45楼<br>三少的《从零开始》写了几十M 还没跟新完，你一边等斗罗的更新一般等从零，新写的《九鼎记》现在也很红，3部更新一起等，够你看的。<br>46楼<br>《神墓》这部玄幻巨作给我印象最深，现在已经被游戏运营商开发成网游了。不过是晨东写的。<br>47楼<br>Av<br>48楼<br>MP，前面不懂的不要乱说，三少最近投身AV界，公司S1，东京热，一本道，都有股份，是最大的股东，各个系列堪称经典《苍井空传》，《小泽玛利亚传》，《松岛枫传》，《伊东怜传》，《武腾兰传》，《饭岛爱传》，《神谷姬传》，《佐伯凉子传》，《麻生美由树传》，《高树玛利亚传》，这些都还可以！差不多了，够你看几月了！<br>49楼<br>MP，前面不懂的不要乱说，三少最近投身AV界，公司S1，东京热，一本道，都有股份，是最大的股东，各个系列堪称经典《苍井空传》，《小泽玛利亚传》，《松岛枫传》，《伊东怜传》，《武腾兰传》，《饭岛爱传》，《神谷姬传》，《佐伯凉子传》，《麻生美由树传》，《高树玛利亚传》，这些都还可以！差不多了，够你看几月了！<br>50楼<br>《苍井空传》，《小泽玛利亚传》，《松岛枫传》，《伊东怜传》，《武腾兰传》，《饭岛爱传》，《神谷姬传》，《佐伯凉子传》，《麻生美由树传》，《高树玛利亚传》，这些都还可以！差不多了，够你看几月了！<br>51楼<br>比图书馆还全啊！<br>52楼<br>LZ别听他们乱说,三少最经典的还要属&lt;善良的死神&gt;了.不过,三少的&lt;销魂淑女&gt;&lt;穿过内衣抚摸你&gt;也进了起点的前三哦...<br>53楼<br>别听他们的。三少的《想对论》才是经典中的经典！！<br>54楼<br>弱弱的问一句<br>三少不是菜市场卖猪肉的么。。<br>怎么写起书来了- -#<br>55楼<br>LS的都是猪<br>三少的西游记才是真经典！<br>56楼<br>三少的唐诗三百首，传世名作，你慢慢看吧，相当精彩 .<br>57楼<br>强力推荐三少新书 《土豆阳痿啦》《番茄变质啦》《小三德国嫖妓传说》《辰东性冷淡》《跳舞的变性之旅》非常好看~<br>58楼<br>你们都雷人<br>59楼<br>不清楚，我就看现在三少写的斗破苍穹，以前好像看过他写的诛仙<br>60楼<br>我晕忽忽的。- -#太雷人了。<br>唐家三少共有几部作品 哪个最好看？ 各位推见下<br>61楼<br>三少写的龙 虎 豹，震 惊 全 世界<br>62楼<br>善良的死神.. <br>63楼<br>还有《哈利波特》啊！都去看看啊 不 错 地！<br>64楼<br>放屁、三少的《流星花园》才是王道！！<br>65楼<br>三少的《曾哥史泰龙》绝对够雷 够强   够视觉<br>66楼<br>你们都找抽啊!!!小心长弓叫小弟雷祥 海龙 阿呆 齐岳 天痕 念冰还有那个神音师一干子变态 跟着小三去玩死你们 !!<br>67楼<br>三少的《新概念英语》写的很好啊，都当教科书了捏<br>68楼<br>三少写的比较经典的有：三国演义 ，红楼梦，封神榜，西游记，史记，水浒传，黄帝内经，金瓶梅，白蛇传，倚天屠龙记，天龙八部，射雕英雄传，钢铁是怎样练成的 就先介绍这几本吧 看完再给你介绍！！<br>69楼<br>金瓶梅<br>70楼<br>我靠，你们都错了，三少写的马克思列宁主义那才是精华啊<br>71楼<br>金瓶梅 <br>72楼<br>太无耻了 我说的是唐小3<br>73楼<br>哎~ 大家都别骗楼主了！我觉得要看就看三少的武腾兰小泽圆饭岛爱 <br>74楼<br>错了，是三少的(凌（百度）辱（百度）女友）系列最好看好不好<br>75楼<br>冰火魔厨还凑活<br>76楼<br>我日，星辰变是西红柿的···毫不？<br>77楼<br>你们怎么光说他好的？？<br>他的《二战特种兵》、《特战小队》断更这么长时间，你们都视而不见？？<br>我鄙视三少断更！！！！<br>78楼<br>围观57L     <br>79楼<br>熟读《“唐”诗“三”百首》，不会做湿也会淫~<br>80楼<br>三少的诛仙和哈利波特也不错<br>81楼<br>开玩笑<br>三少的&lt;圣经&gt;有谁人不知道?<br>82楼<br>三少的《史记》 堪称经典<br>83楼<br>错了，是三少的凌辱女友系列最好看好不好<br>84楼<br>你们都错了 三少的 泰坦尼克号 才是最经典的作品 获得11项 奥斯卡奖 此乃神作也 ！！！<br>85楼<br>三少经典《欲妻、育儿10亿绝》。<br>86楼<br>LZ你知道的太多了。。。<br>87楼<br>大家不要争了 我就是三少 我觉得我最好的作品也墨过于自拍自写自导的小泽玛利亚系列把~<br>88楼<br>2楼,三少的盘龙才最好看好波<br>89楼<br>都太能搞了，无敌~顶起~<br>90楼<br>三少的《大家好，我是SB》最好看，可谓是前无古人后无来者。<br>91楼<br>3少的四大名著   水浒 西游记 红楼梦 三国演义都很好！<br>92楼<br>我个人觉得 三少的《水浒传》写的不错 , <br>人物刻画的 都很不错 . 故事情节，什么都挺不错 。<br>还有《水浒传》的子本《金瓶梅》也很不错的 、很有教育意义<br>93楼<br>其实你们都漏了三少的那部最经典的小说，他那篇小蝌蚪找妈妈最经典了<br>94楼<br>厉害!<br>95楼<br>三少的《武藤兰》《苍井空》《饭岛爱》《骂你一脸，梦精》都写的不错，日本人都喜欢看<br>96楼<br>三少的神墓很不错的                                                                                     龙宝宝:宝宝很生气,后果很严重!我本善良!偶米头发!神说! <br>痞子龙:一百遍啊，一百遍！ <br>雨馨:爱你一万年!  <br>独孤小萱:历千劫万险,纵使魂飞魄散,我灵识依在,战百世轮回,纵使六道无常,我依然永生! <br>南宫吟:江山如此多娇,竟引无数色狼折腰! <br>火神:四脚蛇与老鼠不得入内! <br>邪祖:千世劫,百世难,恒古匆匆,弹指间.不死躯,不灭魂,震古烁今,待到阴阳逆乱时,以我魔血染青天! <br>魔主:亿万生灵为兵,百千神魔为将!三生败天 终落一丝残魂! <br>无名神魔:神死了 魔灭了 我却还活着。。。。。 <br>辰南:啊啊啊啊啊你妈个头! 恨天夺我一万年! <br>弯弓射巨龙，逆天七魔刀斩绝世。一日灭八绝，龙腾万里大战东土皇族，勇入永恒的森林，大闹十八层地狱，血战天界……回首见，豪情万丈，挥戟裂天，纵遇松赞、黑起，也敢兵锋相向，热血洒青天。转瞬间，身残体虚，千古骂名加身，心神疲惫，黯然身退，凄冷荒山间!他曾经纵横于天地间，其威震三界。跨界大战，追杀淂太古君王都惶惶如丧家之犬!   <br>龙舞:当年那个为了小晨曦，施展逆天七魔刀，劈杀五阶绝世高手陶然，敢与千军对抗的豪情男子哪里去了？！十年前那个手持方天画戟，纵横于天上地下，敢与盖世君王黑起大战的英伟男子哪里去了？！你曾经睥睨天下的壮志豪情呢？！为何不敢面对我这样一个弱女子<br>97楼<br>错啦<br>98楼<br>错啦<br>99楼<br>是男人就占100楼<br>100楼<br>是男人就占100楼<br>101楼<br>你们都错了…其实小三的《金瓶梅》最好看！<br>102楼<br>三少拍的AV最好看！<br>103楼<br>三少的歌也很好听啊！那首《死了都要爱》多好啊！鼓掌！！<br>104楼<br>哦,原来三少有那么多笔名.<br>105楼<br>貌似三少的最近出来的《易经》算是最经典的一部作品吧<br>106楼<br>三少的百家讲坛我最爱看了！<br>107楼<br>兄弟们啊 难道我是火星来的吗 我发一个帖子引来这麽多大婶   我惭愧啊<br>108楼<br>95楼     你说的这些我怎么找不到啊    那位大婶给说下<br>109楼<br>别听他们瞎说 琴帝 斗罗大陆 我就看过这两部 都不错 读完不死的话 以后你就什么困难都能挺过去了 ，强烈建议你读一下！<br>110楼<br>我刚刚在百度上查了下 三少好象指导过耶和华写圣经 指导过达摩写金刚经 指导过西伯侯完成易经 指导过黄帝的黄帝内经 还有可兰经也有他的影子 又不甘寂寞的完成诗经 颠峰之作是黄天后土碑的无字天书 现在有指导斗罗了<br>111楼<br>5L强悍 你真是人才 神墓是辰东写的。。 三少不会写战争<br>112楼<br>楼上的全瞎BB，三少写的小说那也叫小说，叼，小学生都比他写的好。<br>他还就写的自传还差不多。《三毛流浪记》，不知道大家看过没。推荐大家看看去，讲了三少小时候的悲惨经历，挺立志的，不要错过哟。<br>113楼<br>...别沉了　<br>114楼<br>MLGB的 都在骗楼主 <br>楼主听我说 三少的《露珠湿沙壁 暮幽晓寂寂》才是绝世神作啊<br>115楼<br>我觉得吧，还是他的《兰州的烧饼》、《我与烧饼二三事》、《烧饼的天空》、《在烧饼泛滥的日子里》这些书不错，烧饼系列是经典呀<br>116楼<br>你们啊，忽悠楼主干什么我不知道！<br>其实有时间你可以看看三少早期力作，最近新拍成了同名电影叫《风声》，故事情节写得很紧凑，不拖泥带水的！<br>而且那个时候三少因为刚刚出道也不牛B哄哄的，每天都是3章4章的更，偶尔爆发一下，比如他的《寸芒》和《盘龙》。<br>现在不行咯！写不出来，就充数一样的每天一章！<br>117楼<br>生肖守护神<br>118楼<br>三少写的《我与跳舞不得不说的故事》才最经典<br>119楼<br>老子都被你们给雷死了<br>120楼<br>30L,63L,68L大亮...<br>人家三少可是写的剧本,像那啥007系列啊....斯瓦辛格拍的啊.....都有..<br>还得了奥斯卡最佳编辑奖..连指环王跟哈利的剧本他都该过<br>121楼<br>呃..忘了..还有三少教出的弟子..<br>人家梁羽生啊,金庸啊,<br>还有人家写《魔戒》的语言大师托尔金...天啊<br>OMG<br>122楼<br>回复：48楼<br>现在是《波多野结衣传》了<br>123楼<br>《儿子与情人》，《哥哥我还要》，《老师，别跑》，《受王》<br>124楼<br>晕死，想当年重庆谈判，蒋校长还专门用专机来21世纪接他回去起草合约呢，你们懂蛤，你们懂蛤！！！！尿布还没掉捏，瞎嚷嚷蛤…………这段历史最近还被派成了电影《建国大业》呢，那多少明星阵容啊就是没三少……<br>125楼<br>晕~三少的神墓最好看，好不<br>126楼<br>三少写的四大名著最好看最经典！西游记红楼梦，三国演义，水浒传<br> 30楼<br>三少写的 《指环王》 都拍成史诗巨作了，有机会买碟看吧，拍得很好，很强大。得了三次奥斯卡呢! <br><a href="http://tieba.baidu.com/f?z=654000130&amp;ct=335544320&amp;lm=0&amp;sc=0&amp;rn=30&amp;tn=baiduPostBrowser&amp;word=%B6%B7%C2%DE%B4%F3%C2%BD&amp;pn=0" target="_blank">http://tieba.baidu.com/f?z=654000130&amp;ct=335544320&amp;lm=0&amp;sc=0&amp;rn=30&amp;tn=baiduPostBrowser&amp;word=%B6%B7%C2%DE%B4%F3%C2%BD&amp;pn=0</a><wbr />  <br> <!--v:3.2--> ]]></description>
<category><![CDATA[YippeeBean]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1258731035#comment</comments>
<qz:effect>142606864</qz:effect>
<pubDate>Fri, 20 Nov 2009 15:30:35 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1258731035</guid>
</item>

<item>
<title><![CDATA[CommandName属性和CommandArgument属性 转]]></title>
<link>http://82895376.qzone.qq.com/blog/1257417963</link>
<description><![CDATA[<br>CommandName属性和CommandArgument属性<br><a href="http://cnc.imgcache.qq.com/qzone/newblog/v5/editor.html#" target="_blank"><span style="color:#282e0e;line-height:1.8em;">asp.net</span><wbr /></a><wbr />   2009-08-27 09:41   阅读240   评论0   <br>字号： <a href="http://cnc.imgcache.qq.com/qzone/newblog/v5/editor.html#" target="_blank"><span style="color:#282e0e;line-height:1.8em;">大</span><wbr /></a><wbr /><span style="font-weight:bold"><wbr />大</span><wbr />  <a href="http://cnc.imgcache.qq.com/qzone/newblog/v5/editor.html#" target="_blank"><span style="color:#282e0e;line-height:1.8em;">中</span><wbr /></a><wbr /><span style="font-weight:bold"><wbr />中</span><wbr />  <a href="http://cnc.imgcache.qq.com/qzone/newblog/v5/editor.html#" target="_blank"><span style="color:#282e0e;line-height:1.8em;">小</span><wbr /></a><wbr /><span style="font-weight:bold"><wbr />小</span><wbr /> <br>在ASP.NET页面中利用CommandName属性和CommandArgument属性：<br><br>　　你也许对LinkButton组件中CommandName属性和CommandArgument属性有点迷惑，他们到底会有什么作用。其实他们有着非常重要的作用。举例如下：<br><br>　　假如在你的一个页面中有100个LinkButton，那么在服务器端要判断到底是哪个LinkButton被按动了。如果没有这二个属性，可以通过给每一个LinkButton的Text属性赋值，然后通过检测Text属性值，来判断到底是哪个LinkButton被按动了。当然你也可以通过给每一个LinkButton命不同的名（当然你就是想命同样的名，在ASP.NET中也是不可以的），然后在事件处理函数中，通过检测Sender属性值来判断哪个LinkButton被按动。虽然上述这些方法都是可行的，但无一不繁琐。有了CommandName属性和CommandArgument属性就可以方便的解决这些问题。在程序中给LinkButton的CommandName属性和CommandArgument属性赋值，然后通过OnCommand事件中，就可以得到从CommandEventArgs类中的数据，从而到判断是哪个LinkButton被按动了。那么CommandEventArgs类有是干什么的？CommandEventArgs类存储了和按钮(Button)事件相关的数据，并且可以在事件处理中通过CommandEventArgs类的属性来访问这些数据。说的明白些，就是当LinkButton被按动后，这个LinkButton所触发的数据都被储存到服务器的CommandEventArgs类中，访问CommandEventArgs类中的属性也就访问了被按动的LinkButton了。这样说，也许你还有点不清楚，下面通过一个程序例子来具体说明一下。<br>本文是通过一段和LinkButton组件相关的程序来说明，LinkButton组件如何通过OnCommand( )事件来传递CommandName属性值和CommandArgument属性值的。以及在程序中如何读取CommandEventArgs类中的数据。<br>Link.aspx源程序代码如下：<br><br>＜% @ Page Language = &quot;C#&quot; Debug = &quot;true&quot; %＞<br>＜html ＞<br>＜head ＞<br>＜title ＞Link Button组件演示程序＜/title ＞<br>＜script runat = &quot;server&quot; ＞<br>protected void LinkButton_Command ( object sender , CommandEventArgs e )<br>{<br>Message . Text = &quot;你选择的是： &quot; + e . CommandArgument ;<br>}<br>＜/script ＞<br>＜/head ＞<br>＜body ＞<br>＜form runat = &quot;server&quot; ＞<br>＜table cellspacing = 0 cellpadding = 0 border = 1 ＞<br>＜tr ＞ ＜td ＞ 请选择日期：＜/td ＞ ＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期一&quot; runat = &quot;server&quot; CommandArgument = &quot;星期一&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期二&quot; runat = &quot;server&quot; CommandArgument = &quot;星期二&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期三&quot; runat = &quot;server&quot; CommandArgument = &quot;星期三&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期四&quot; runat = &quot;server&quot; CommandArgument = &quot;星期四&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期五&quot; runat = &quot;server&quot; CommandArgument = &quot;星期五&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期六&quot; runat = &quot;server&quot; CommandArgument = &quot;星期六&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜tr ＞<br>＜td align = center ＞<br>＜asp:LinkButton Text = &quot;星期日&quot; runat = &quot;server&quot; CommandArgument = &quot;星期日&quot; oncommand = &quot;LinkButton_Command&quot; /＞<br>＜/td ＞<br>＜/tr ＞<br>＜/table ＞<br>＜asp:Label id = &quot;Message&quot; runat = &quot;server&quot; /＞<br>＜/form ＞<br>＜/body ＞<br>＜/html ＞<br>　　四． 总结：<br><br>　　本文介绍LinkButton组件一些重要的组成内容，即一些重要的属性和事件。并通过一个程序例子来具体说明他的使用方法。LinkButton组件的出现使得在ASP.NET页面中传递参数越来越方便了。但此组件有一个缺憾，就是不能在不支持javascript语言的浏览器上面使用，这是因为他使用了javascript语言中Submit( )方法来提交页面的。 <br><br> <br>C# <br>[url=javascript:CopyCode('ctl00_mainContentContainer_ctl41_ctl00_ctl03_code');]复制代码 [/url]<br>&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;True&quot; %&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;    &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;&lt;html  &gt;&lt;head&gt;    &lt;title&gt;ImageButton CommandName Sample&lt;/title&gt;&lt;script language=&quot;C#&quot; runat=&quot;server&quot;&gt;      void ImageButton_Command(object sender, CommandEventArgs e)       {         if (e.CommandName == &quot;Sort&quot; &amp;&amp; e.CommandArgument == &quot;Ascending&quot;)            Label1.Text = &quot;You clicked the Sort Ascending Button&quot;;         else            Label1.Text = &quot;You clicked the Sort Descending Button&quot;;      }   &lt;/script&gt;&lt;/head&gt;&lt;body&gt;   &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;      &lt;h3&gt;ImageButton CommandName Sample&lt;/h3&gt;      Click an image.&lt;br /&gt;&lt;br /&gt;      &lt;asp:ImageButton id=&quot;imagebutton1&quot; runat=&quot;server&quot;           AlternateText=&quot;Sort Ascending&quot;           ImageUrl=&quot;images/pict.jpg&quot;           OnCommand=&quot;ImageButton_Command&quot;           CommandName=&quot;Sort&quot;           CommandArgument=&quot;Ascending&quot;/&gt;      &lt;asp:ImageButton id=&quot;imagebutton2&quot; runat=&quot;server&quot;           AlternateText=&quot;Sort Descending&quot;           ImageUrl=&quot;image/pict2.jpg&quot;           OnCommand=&quot;ImageButton_Command&quot;           CommandName=&quot;Sort&quot;           CommandArgument=&quot;Descending&quot;/&gt;      &lt;br /&gt;&lt;br /&gt;      &lt;asp:label id=&quot;Label1&quot; runat=&quot;server&quot;/&gt;   &lt;/form&gt;&lt;/body&gt;&lt;/html&gt;<br>JScript <br>[url=javascript:CopyCode('ctl00_mainContentContainer_ctl41_ctl00_ctl04_code');]复制代码 [/url]<br>&lt;%@ Page Language=&quot;JScript&quot; AutoEventWireup=&quot;True&quot; %&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;    &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;&lt;html  &gt;&lt;head&gt;    &lt;title&gt;ImageButton CommandName Sample&lt;/title&gt;&lt;script language=&quot;JSCRIPT&quot; runat=&quot;server&quot;&gt;      function ImageButton_Command(sender : Object, e : CommandEventArgs){         if(e.CommandName == &quot;Sort&quot; &amp;&amp; e.CommandArgument == &quot;Ascending&quot;)            Label1.Text = &quot;You clicked the Sort Ascending Button&quot;         else            Label1.Text = &quot;You clicked the Sort Descending Button&quot;      }   &lt;/script&gt;&lt;/head&gt;&lt;body&gt;   &lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt;      &lt;h3&gt;ImageButton CommandName Sample&lt;/h3&gt;      Click an image.&lt;br /&gt;&lt;br /&gt;      &lt;asp:ImageButton id=&quot;imagebutton1&quot; runat=&quot;server&quot;           AlternateText=&quot;Sort Ascending&quot;           ImageUrl=&quot;images/pict.jpg&quot;           OnCommand=&quot;ImageButton_Command&quot;           CommandName=&quot;Sort&quot;           CommandArgument=&quot;Ascending&quot;/&gt;      &lt;asp:ImageButton id=&quot;imagebutton2&quot; runat=&quot;server&quot;           AlternateText=&quot;Sort Descending&quot;           ImageUrl=&quot;images/pict2.jpg&quot;           OnCommand=&quot;ImageButton_Command&quot;           CommandName=&quot;Sort&quot;           CommandArgument=&quot;Descending&quot;/&gt;      &lt;br /&gt;&lt;br /&gt;      &lt;asp:label id=&quot;Label1&quot; runat=&quot;server&quot;/&gt;   &lt;/form&gt;&lt;/body&gt;&lt;/html&gt; <!--v:3.2--> ]]></description>
<category><![CDATA[.Net技术文摘]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1257417963#comment</comments>
<qz:effect>142606848</qz:effect>
<pubDate>Thu, 05 Nov 2009 10:46:03 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1257417963</guid>
</item>

<item>
<title><![CDATA[入魔(程序篇)]]></title>
<link>http://82895376.qzone.qq.com/blog/1250937680</link>
<description><![CDATA[有些事明知道是一些非常平常非常琐碎的事，根本没有必要念叨，或者应该说是写下来,自己明白就可以了。<br>但是还是忍不住写出来 。<br>矛盾续写<br> <br>入魔第一条魔语--------<br>生活是多姿多彩的正如程序可以有很多华丽的功能。你不可能把所有功能都表现出来,正如你不能说清楚你是否活的够老，够有沉淀，经历过所有人生。<br> <br>入魔第二条魔语---------<br>记得从前有人总喜欢问我你到底喜欢什么。在程序中有一种叫做枚举的东西，接触的少，可选的自然就少。只要试着去学习新的东西，总会有你喜欢的，但是到底喜欢什么则是一个变量。<br> <br>入魔第三条魔语---------<br>我总是尝试着去写出完美的程序，达到所谓的最优,但是总是求之不得。正是保持着这份追求完美求之不得的心态，才不会总停留在原地不止。<br> <br>入魔第四条魔语---------<br>虚方法和抽象方法都是好父亲。前者留下遗产,你可以选择去做你想做的，或者子承父业父债子偿。后着告诉你人生的路将要经过什么，怎么走是你的事，没人能够帮你，你也必须去经历。<br> <br>入魔第五条魔语----------<br>当出现故障不应该是你来处理的时候，应该聪明的交给上级，或者专业人士，自己专心做好自己的本职工作。<br> <br>入魔第六条魔语----------<br>去买东西没进商场之前你不会知道具体买到什么，但是你进去了,就知道有什么没有什么了，如果有那么皆大欢喜，如果没有,可以选择换一家。<br> <br>入魔第七条魔语----------<br>一个人，可以从事很多事业，心情也可以多变。只需在这之前套上不同制服,转变心态。<br> <br>入魔第八条魔语----------<br>找对象千万别找一个，应为如果只找一个那么你的情况会非常被动。多找几个选择面大了自然找到最合适的机会就大了。<br> <br>入魔第九条魔语----------<br>即使你程序井井有条，处处设想，给出一万个解决方案，你也预测不到万一的情况发生。<br> <br>入魔第十条魔语----------<br>万码皆下品，唯有思想高。 <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1250937680#comment</comments>
<qz:effect>142606848</qz:effect>
<pubDate>Sat, 22 Aug 2009 10:41:20 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1250937680</guid>
</item>

<item>
<title><![CDATA[比利时电音组合 Milk Inc 舞动灵魂]]></title>
<link>http://82895376.qzone.qq.com/blog/1249987588</link>
<description><![CDATA[<wbr /><a href="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=24b57648c15ed5dca0f0b639bc6c0262e4d23609a21337ace9ecc65f0acffa8d180dbe32bfaa4ba214678f8d43d4c2a1a41d3f2bb2b7a49b6647ab901efd00adf77e2261dd1429d64f3ea1875aa17e9c617ee79c" target="_blank"><img style="width:277px;height:798px;border:0;" src="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=24b57648c15ed5dca0f0b639bc6c0262e4d23609a21337ace9ecc65f0acffa8d180dbe32bfaa4ba214678f8d43d4c2a1a41d3f2bb2b7a49b6647ab901efd00adf77e2261dd1429d64f3ea1875aa17e9c617ee79c" /></a><wbr /> <br>曾经获过10次TMF音乐奖的Milk Inc 屡次获得年度最佳舞曲奖。在1996年，两个制作人Regi Penxten 和 Filip Vandueren组建了Milk Incorporated，后来被缩写成Milk Inc。从2000年开始就按现在的组合开始表演。 这支舞曲乐队在法国取得首次成功，单曲La Vache成为热门之后在英国也受到热捧。在比利时，他们靠In My Eyes获得肯定。In My Eyes仿佛就像征服流行排行榜的导线，Promise， Oceans，Losing LoveNever Again都先后成为几乎每个比利时人都可以唱得出口的热门歌曲，并流行向国际。  <br>英文简历 <a href="http://www.danceartistinfo.com/milkinc.htm" target="_blank">http://www.danceartistinfo.com/milkinc.htm</a><wbr /> <br>官方网站 <a href="http://www.milkinc.be/" target="_blank">http://www.milkinc.be/</a><wbr /> <br>试听网站 <a href="http://www.yobo.com/album/index/52779" target="_blank">http://www.yobo.com/album/index/52779</a><wbr /> <br> <!--v:3.2--> ]]></description>
<category><![CDATA[乐乐欲视]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1249987588#comment</comments>
<qz:effect>134218241</qz:effect>
<pubDate>Tue, 11 Aug 2009 10:46:28 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1249987588</guid>
</item>

<item>
<title><![CDATA[理解HTTP消息头]]></title>
<link>http://82895376.qzone.qq.com/blog/1249887911</link>
<description><![CDATA[<span style="font-size:16px;line-height:1.8em;">（一）初识HTTP消息头</span><wbr /> <br>但凡搞WEB开发的人都离不开HTTP（超文本传输协议），而要了解HTTP，除了HTML本身以外，还有一部分不可忽视的就是HTTP消息头。 <br>做过Socket编程的人都知道，当我们设计一个通信协议时，“消息头/消息体”的分割方式是很常用的，消息头告诉对方这个消息是干什么的，消息体告诉对方怎么干。HTTP传输的消息也是这样规定的，每一个HTTP包都分为HTTP头和HTTP体两部分，后者是可选的，而前者是必须的。每当我们打开一个网页，在上面点击右键，选择“查看源文件”，这时看到的HTML代码就是HTTP的消息体，那么消息头又在哪呢？IE浏览器不让我们看到这部分，但我们可以通过截取数据包等方法看到它。 <br>下面就来看一个简单的例子： <br>首先制作一个非常简单的网页，它的内容只有一行： <br>&lt;html&gt;&lt;body&gt;hello world&lt;/body&gt;&lt;/html&gt; <br>把它放到WEB服务器上，比如IIS，然后用IE浏览器请求这个页面（<a href="http://localhost:8080/simple.htm" target="_blank">http://localhost:8080/simple.htm</a><wbr />），当我们请求这个页面时，浏览器实际做了以下四项工作： <br>1 解析我们输入的地址，从中分解出协议名、主机名、端口、对象路径等部分，对于我们的这个地址，解析得到的结果如下： <br>协议名：http <br>主机名：localhost <br>端口：8080 <br>对象路径：/simple.htm <br>2 把以上部分结合本机自己的信息，封装成一个HTTP请求数据包 <br>3 使用TCP协议连接到主机的指定端口（localhost, 8080），并发送已封装好的数据包 <br>4 等待服务器返回数据，并解析返回数据，最后显示出来 <br>由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下： <br>GET /simple.htm HTTP/1.1&lt;CR&gt; <br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*&lt;CR&gt; <br>Accept-Language: zh-cn&lt;CR&gt; <br>Accept-Encoding: gzip, deflate&lt;CR&gt; <br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)&lt;CR&gt; <br>Host: localhost:8080&lt;CR&gt; <br>Connection: Keep-Alive&lt;CR&gt; <br>&lt;CR&gt; <br>为了显示清楚我把所有的回车的地方都加上了“&lt;CR&gt;”，注意最后还有一个空行加一个回车，这个空行正是HTTP规定的消息头和消息体的分界线，第一个空行以下的内容就是消息体，这个请求数据包是没有消息体的。 <br>消息的第一行“GET”表示我们所使用的HTTP动作，其他可能的还有“POST”等，GET的消息没有消息体，而POST消息是有消息体的，消息体的内容就是要POST的数据。后面/simple.htm就是我们要请求的对象，之后HTTP1.1表示使用的是HTTP1.1协议。 <br>第二行表示我们所用的浏览器能接受的Content-type，三四两行则是语言和编码信息，第五行显示出本机的相关系信息，包括浏览器类型、操作系统信息等，很多网站可以显示出你所使用的浏览器和操作系统版本，就是因为可以从这里获取到这些信息。 <br>第六行表示我们所请求的主机和端口，第七行表示使用Keep-Alive方式，即数据传递完并不立即关闭连接。 <br>服务器接收到这样的数据包以后会根据其内容做相应的处理，例如查找有没有“/simple.htm”这个对象，如果有，根据服务器的设置来决定如何处理，如果是HTM，则不需要什么复杂的处理，直接返回其内容即可。但在直接返回之前，还需要加上HTTP消息头。 <br>服务器发回的完整HTTP消息如下： <br>HTTP/1.1 200 OK&lt;CR&gt; <br>Server: Microsoft-IIS/5.1&lt;CR&gt; <br>X-Powered-By: ASP.NET&lt;CR&gt; <br>Date: Fri, 03 Mar 2006 06:34:03 GMT&lt;CR&gt; <br>Content-Type: text/html&lt;CR&gt; <br>Accept-Ranges: bytes&lt;CR&gt; <br>Last-Modified: Fri, 03 Mar 2006 06:33:18 GMT&lt;CR&gt; <br>ETag: &quot;5ca4f75b8c3ec61:9ee&quot;&lt;CR&gt; <br>Content-Length: 37&lt;CR&gt; <br>&lt;CR&gt; <br>&lt;html&gt;&lt;body&gt;hello world&lt;/body&gt;&lt;/html&gt; <br>同样，我用“&lt;CR&gt;”来表示回车。可以看到，这个消息也是用空行切分成消息头和消息体两部分，消息体的部分正是我们前面写好的HTML代码。 <br>消息头第一行“HTTP/1.1”也是表示所使用的协议，后面的“200 OK”是HTTP返回代码，200就表示操作成功，还有其他常见的如404表示对象未找到，500表示服务器错误，403表示不能浏览目录等等。 <br>第二行表示这个服务器使用的WEB服务器软件，这里是IIS 5.1。第三行是ASP.Net的一个附加提示，没什么实际用处。第四行是处理此请求的时间。第五行就是所返回的消息的content-type，浏览器会根据它来决定如何处理消息体里面的内容，例如这里是text/html，那么浏览器就会启用HTML解析器来处理它，如果是image/jpeg，那么就会使用JPEG的解码器来处理。 <br>消息头最后一行“Content-Length”表示消息体的长度，从空行以后的内容算起，以字节为单位，浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。  <br><span style="font-weight:bold"><wbr />理解HTTP消息头 （二）</span><wbr /> <br>  <br>常见的HTTP返回码上一篇文章里我简要的说了说HTTP消息头的格式，注意到在服务器返回的HTTP消息头里有一个“HTTP/1.1 200 OK”，这里的200是HTTP规定的返回代码，表示请求已经被正常处理完成。浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么，每一种返回代码都有自己的含义。这里列举几种常见的返回码。 <br>1 403 Access Forbidden如果我们试图请求服务器上一个文件夹，而在WEB服务器上这个文件夹并没有允许对这个文件夹列目录的话，就会返回这个代码。一个完整的403回复可能是这样的：（IIS5.1） <br>HTTP/1.1 403 Access Forbidden <br>Server: Microsoft-IIS/5.1 <br>Date: Mon, 06 Mar 2006 08:57:39 GMT <br>Connection: close <br>Content-Type: text/html <br>Content-Length: 172  <br>&lt;html&gt;&lt;head&gt;&lt;title&gt;Directory Listing Denied&lt;/title&gt;&lt;/head&gt; <br>&lt;body&gt;&lt;h1&gt;Directory Listing Denied&lt;/h1&gt;This Virtual Directory does not allow contents to be listed.&lt;/body&gt;&lt;/html&gt;2 404 Object not found当我们请求的对象在服务器上并不存在时，就会给出这个返回代码，这可能也是最常见的错误代码了。IIS给出的404消息内容很长，除了消息头以外还有一个完整的说明“为什么会这样”的网页。APACHE服务器的404消息比较简短，如下： <br>HTTP/1.1 404 Not Found <br>Date: Mon, 06 Mar 2006 09:03:14 GMT <br>Server: Apache/2.0.55 (Unix) PHP/5.0.5 <br>Content-Length: 291 <br>Keep-Alive: timeout=15, max=100 <br>Connection: Keep-Alive <br>Content-Type: text/html; charset=iso-8859-1  <br>&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML 2.0//EN&quot;&gt; <br>&lt;html&gt;&lt;head&gt; <br>&lt;title&gt;404 Not Found&lt;/title&gt; <br>&lt;/head&gt;&lt;body&gt; <br>&lt;h1&gt;Not Found&lt;/h1&gt; <br>&lt;p&gt;The requested URL /notexist was not found on this server.&lt;/p&gt; <br>&lt;hr&gt; <br>&lt;address&gt;Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080&lt;/address&gt; <br>&lt;/body&gt;&lt;/html&gt;也许你会问，无论是404还是200，都会在消息体内给出一个说明网页，那么对于客户端来说二者有什么区别呢？一个比较明显的区别在于200是成功请求，浏览器会记录下这个地址，以便下次再访问时可以自动提示该地址，而404是失败请求，浏览器只会显示出返回的页面内容，并不会记录此地址，要再次访问时还需要输入完整的地址。 <br>3 401 Access Denied当WEB服务器不允许匿名访问，而我们又没有提供正确的用户名/密码时，服务器就会给出这个返回代码。在IIS中，设置IIS的安全属性为不允许匿名访问（如下图），此时直接访问的话就会得到以下返回结果： <br><wbr /><a href="http://tk.files.storage.msn.com/x1pUr2osLO3XWjeyHIsPau7c1ndY-D0bRanBts2XP2r24DMCrOSEdn4mxM7aR2sM68kQmv5OmXEdcY7aUTDkZnjmtg2p6dCT5F9FIaIUIaVQTQbvvFZLc_ErHjJgDzLJfKJTN21OszQrpE" target="_blank"><img style="border:0;" src="http://tk.files.storage.msn.com/x1pUr2osLO3XWjeyHIsPau7c1ndY-D0bRanBts2XP2r24DMCrOSEdn4mxM7aR2sM68kQmv5OmXEdcY7aUTDkZnjmtg2p6dCT5F9FIaIUIaVQTQbvvFZLc_ErHjJgDzLJfKJTN21OszQrpE" /></a><wbr /> <br>HTTP/1.1 401 Access Denied <br>Server: Microsoft-IIS/5.1 <br>Date: Mon, 06 Mar 2006 09:15:55 GMT <br>WWW-Authenticate: Negotiate <br>WWW-Authenticate: NTLM <br>Connection: close <br>Content-Length: 3964 <br>Content-Type: text/html  <br>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt; <br>&lt;html dir=ltr&gt; <br>…… <br>此时浏览器上给出的提示如下图，让我们输入用户名和密码：<wbr /><a href="http://tk.files.storage.msn.com/x1pUr2osLO3XWjeyHIsPau7c3QhAXBM9OXASI5VNO_hDTU9zrfKaChTWsKEZHKE0jEJlrJyQsKm1_U7LcwAT-qXtFAslqaFBr_b_YTuaqNjwqwqxYKqlnF4-SJUfdAssI7j-VJUGjRp_cw" target="_blank"><img style="border:0;" src="http://tk.files.storage.msn.com/x1pUr2osLO3XWjeyHIsPau7c3QhAXBM9OXASI5VNO_hDTU9zrfKaChTWsKEZHKE0jEJlrJyQsKm1_U7LcwAT-qXtFAslqaFBr_b_YTuaqNjwqwqxYKqlnF4-SJUfdAssI7j-VJUGjRp_cw" /></a><wbr /> <br>因返回信息中消息体较长，只取前面两行内容。注意，如果是用localhost来访问本机的IIS，因IE可以直接取得当前用户的身份，它会和服务器间直接进行协商，所以不会看到401提示。 <br>当我们在输入了用户名和密码以后，服务器与客户端会再进行两次对话。首先客户端向服务器索取一个公钥，服务器端会返回一个公钥，二者都用BASE64编码，相应的消息如下（编码部分已经做了处理）：GET / HTTP/1.1 <br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* <br>Accept-Language: zh-cn <br>Accept-Encoding: gzip, deflate <br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) <br>Host: 192.168.0.55:8080 <br>Connection: Keep-Alive <br>Authorization: Negotiate ABCDEFG……  <br>HTTP/1.1 401 Access Denied <br>Server: Microsoft-IIS/5.1 <br>Date: Mon, 06 Mar 2006 09:20:53 GMT <br>WWW-Authenticate: Negotiate HIJKLMN…… <br>Content-Length: 3715 <br>Content-Type: text/html  <br>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt; <br>&lt;html dir=ltr&gt; <br>…… <br>客户端拿到公钥之后使用公钥对用户名和密码进行加密码，然后把加密以后的结果重新发给服务器： <br>GET / HTTP/1.1 <br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* <br>Accept-Language: zh-cn <br>Accept-Encoding: gzip, deflate <br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) <br>Host: 192.168.0.55:8080 <br>Connection: Keep-Alive <br>Authorization: Negotiate OPQRST……这样，如果验证通过，服务器端就会把请求的内容发送过来了，也就是说禁止匿名访问的网站会经过三次请求才可以看到页面。但因为客户端浏览器已经缓存了公钥，用同一个浏览器窗口再次请求这个网站上的其它页面时就可以直接发送验证信息，从而一次交互就可以完成了。 <br>4 302 Object Moved用过ASP的人都知道ASP中页面重定向至少有Redirect和Transfer两种方法。二的区别在于Redirect是客户端重定向，而Transfer是服务器端重定向，那么它们具体是如何通过HTTP消息头实现的呢？ <br>先来看一下Transfer的例子： <br>例如ASP文件1.asp只有一行 <br>&lt;% Server.Transfer &quot;1.htm&quot; %&gt; <br>HTML文件1.htm也只有一行： <br>&lt;p&gt;this is 1.htm&lt;/p&gt; <br>如果我们从浏览器里请求1.asp，发送的请求是： <br>GET /1.asp HTTP/1.1 <br>Accept: */* <br>Accept-Language: zh-cn <br>Accept-Encoding: gzip, deflate <br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) <br>Host: localhost:8080 <br>Connection: Keep-Alive <br>Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP注意请求的文件确实是1.asp，而得到的回应则是： <br>HTTP/1.1 200 OK <br>Server: Microsoft-IIS/5.1 <br>Date: Mon, 06 Mar 2006 12:52:44 GMT <br>X-Powered-By: ASP.NET <br>Content-Length: 20 <br>Content-Type: text/html <br>Cache-control: private  <br>&lt;p&gt;this is 1.htm&lt;/p&gt; <br>不难看出，通过Server.Transfer语句服务器端已经做了页面重定向，而客户端对此一无所知，表面上看上去得到的就是1.asp的结果。 <br>如果把1.asp的内容改为： <br>&lt;% Response.Redirect &quot;1.htm&quot; %&gt; <br>再次请求1.asp，发送的请求没有变化，得到的回应却变成了： <br>HTTP/1.1 302 Object moved <br>Server: Microsoft-IIS/5.1 <br>Date: Mon, 06 Mar 2006 12:55:57 GMT <br>X-Powered-By: ASP.NET <br>Location: 1.htm <br>Content-Length: 121 <br>Content-Type: text/html <br>Cache-control: private  <br>&lt;head&gt;&lt;title&gt;Object moved&lt;/title&gt;&lt;/head&gt; <br>&lt;body&gt;&lt;h1&gt;Object Moved&lt;/h1&gt;This object may be found &lt;a HREF=&quot;&quot;&gt;here&lt;/a&gt;.&lt;/body&gt;注意HTTP的返回代码由200变成了302，表示这是一个重定向消息，客户端需要根据消息头中Location字段的值重新发送请求，于是就有了下面一组对话： <br>GET /1.htm HTTP/1.1 <br>Accept: */* <br>Accept-Language: zh-cn <br>Accept-Encoding: gzip, deflate <br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) <br>Host: localhost:8080 <br>Connection: Keep-Alive <br>If-Modified-Since: Thu, 02 Mar 2006 06:50:13 GMT <br>If-None-Match: &quot;b224758ec53dc61:9f0&quot; <br>Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP <br>HTTP/1.1 200 OK <br>Server: Microsoft-IIS/5.1 <br>X-Powered-By: ASP.NET <br>Date: Mon, 06 Mar 2006 12:55:57 GMT <br>Content-Type: text/html <br>Accept-Ranges: bytes <br>Last-Modified: Mon, 06 Mar 2006 12:52:32 GMT <br>ETag: &quot;76d85bd51c41c61:9f0&quot; <br>Content-Length: 20  <br>&lt;p&gt;this is 1.htm&lt;/p&gt; <br>很明显，两种重定向方式虽然看上去结果很像，但在实现原理上有很大的不同。 <!--v:3.2--> ]]></description>
<category><![CDATA[知道]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1249887911#comment</comments>
<qz:effect>134218241</qz:effect>
<pubDate>Mon, 10 Aug 2009 07:05:11 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1249887911</guid>
</item>

<item>
<title><![CDATA[ASP.NET页面刷新方法总结]]></title>
<link>http://82895376.qzone.qq.com/blog/1249824440</link>
<description><![CDATA[先看看ASP.NET页面刷新的实现方法： <br> <br>第一：  <br> <br>private void Button1_Click( object sender, System.EventArgs e ) { Response.Redirect( Request.Url.ToString( ) ); } 第二：  <br> <br>private void Button2_Click( object sender, System.EventArgs e ) { Response.Write( &quot; &lt; script language=javascript&gt;window.location.href=document.URL; &lt; /script&gt;&quot; ); } 第三：  <br> <br>private void Button3_Click( object sender, System.EventArgs e ) { Response.AddHeader( &quot;Refresh&quot;,&quot;0&quot; ); } 第四：  <br> <br>private void Button6_Click( object sender, System.EventArgs e ) { //好像有些不对？ //Response.Write( &quot; &lt; script language=javascript&gt;window.location.reload( ); &lt; /script&gt;&quot; ); } 第五：  <br> <br> <br>&lt; script&gt;&lt; !-- var limit=&quot;3:00&quot; if ( document.images ) { var parselimit=limit.split( &quot;:&quot; )parselimit=parselimit[0]*60+parselimit[1]*1 } function beginrefresh( ) { if ( !document.images )returnif ( parselimit==1 )window.location.reload( )else { parselimit-=1curmin=Math.floor( parselimit/60 )cursec=parselimit%60if ( curmin!=0 )curtime=curmin+&quot;分&quot;+cursec+&quot;秒后重刷本页！&quot;elsecurtime=cursec+&quot;秒后重刷本页！&quot;window.status=curtimesetTimeout( &quot;beginrefresh( )&quot;,1000 ) } } window.onload=beginrefresh//--&gt; &lt; /script&gt;&lt; DIV style=&quot;Z-INDEX: 102; LEFT: 408px; POSITION: absolute; TOP: 232px&quot; ms_positioning=&quot;text2D&quot;&gt; &lt; P&gt;&lt; FONT size=&quot;3&quot;&gt;自动刷新页面&lt; /FONT&gt;&lt; /P&gt; &lt; /DIV&gt; 第六：  <br> <br>&lt; meta http-equiv=&quot;refresh&quot; content=&quot;300; url=target.html&quot;&gt; 用window.location.href实现刷新另个框架页面 <br> <br>在写asp.net程序的时候，我们经常遇到跳转页面的问题，我们经常使用Response.Redirect ，如果客户要在跳转的时候使用提示，这个就不灵光了，如： <br> <br>Response.Write(&quot;&lt; script&gt;alert('恭喜您，注册成功！'); &lt; /script&gt;&quot;); Response.Redirect(&quot;main.html&quot;); 这时候我们的提示内容没有出来就跳转了，和Response.Redirect(&quot;main.html&quot;); 没有任何区别。 <br> <br>这时我们采用下面代码试验一下ASP.NET页面刷新： <br> <br>Response.Write(&quot;&lt; script language=javascript&gt;alert('恭喜您，注册成功！')&lt; /script&gt;&quot;); Response.Write(&quot;&lt; script language=javascript&gt;window.location.href='main.html'&lt; /script&gt;&quot;); 这个即实现了我们的要求，在提示后，跳转页面。 <br> <br>最重要的是window.location.href 语句可以实现一个框架的页面在执行服务器端代码后刷新另一个框架的页面(Response.Redirect无法达到，至少我没有发现)： <br> <br>如：index.htm页面中有二个框架，分别为 frameLeft和frameRight，在frameRight页面中执行服务器端代码后刷新frameLeft中的页面。 <br> <br>先前最常见的是注册之后，自动刷新登陆框，让登陆框换成已登陆页面，只要在注册成功的代码之后加上一段，即可以实现刷新另个框架的页面。代码如下： <br> <br>Response.Write(&quot;&lt; script language=javascript&gt;alert('恭喜您，注册成功！')&lt; /script&gt;&quot;); Response.Write(&quot;&lt; script language=javascript&gt;window.parent.frameLeft.location.href='main.html'&lt; /script&gt;&quot;); ASP.NET页面刷新：自动刷新页面的实现方法总结: <br> <br>1) <br> <br>&lt; meta http-equiv=&quot;refresh&quot;content=&quot;10; url=跳转的页面&quot;&gt; 10表示间隔10秒刷新一次 <br> <br>2) <br> <br>&lt; script language=''javascript''&gt; window.location.reload(true); &lt; /script&gt; 如果是你要刷新某一个iframe就把window给换成frame的名字或ID号 <br> <br>3) <br> <br>&lt; script language=''javascript''&gt; window.navigate(&quot;本页面url&quot;); &lt; /script&gt; 4&gt; <br> <br>function abc() { window.location.href=&quot;/blog/window.location.href&quot;; setTimeout(&quot;abc()&quot;,10000); } 刷新本页： <br> <br>Response.Write(&quot;&lt; script language=javascript&gt;window.location.href=window.location.href; &lt; /script&gt;&quot;) 刷新父页： <br> <br>Response.Write(&quot;&lt; script language=javascript&gt;opener.location.href=opener.location.href; &lt; /script&gt;&quot;) 转到指定页: <br> <br>Response.Write(&quot;&lt; script language=javascript&gt;window.location.href='yourpage.aspx'; &lt; /script&gt;&quot;)  <br>刷新页面实现方式总结(HTML,ASP,JS) <br> <br>'by aloxy <br> <br>定时刷新： <br> <br>1， <br> <br>&lt; script&gt;setTimeout(&quot;location.href='url'&quot;,2000)&lt; /script&gt; 说明：url是要刷新的页面URL地址 <br> <br>2000是等待时间=2秒， <br> <br>2， <br> <br>&lt; meta name=&quot;Refresh&quot; content=&quot;n; url&quot;&gt; 说明：  <br> <br>n is the number of seconds to wait before loading the specified URL.  <br> <br>url is an absolute URL to be loaded.  <br> <br>n,是等待的时间，以秒为单位 <br> <br>url是要刷新的页面URL地址 <br> <br>3， <br> <br>&lt; %response.redirect url%&gt; 说明：一般用一个url参数或者表单传值判断是否发生某个操作然后利用response.redirect 刷新。 <br> <br>4，刷新框架页  <br> <br>〈script language=javascript&gt;top.leftFrm.location.reload(); parent.frmTop.location.reload(); &lt; /script〉 弹出窗体后再刷新的问题 <br> <br>Response.Write(&quot;&lt; script&gt;window.showModalDialog('../OA/SPCL.aspx',window,'dialogHeight: 300px; dialogWidth: 427px; dialogTop: 200px; dialogLeft: 133px')&lt; /script&gt;&quot;); //open Response.Write(&quot;&lt; script&gt;document.location=document.location; &lt; /script&gt;&quot;); 在子窗体页面代码head中加入&lt; base target=&quot;_self&quot;/&gt; <br> <br>刷新的内容加在 if (!IsPostBack) 中 <br> <br>在框架页中右面刷新左面  <br> <br>//刷新框架页左半部分 Response.Write(&quot;&lt; script language=javascript&gt;&quot;); Response.Write(&quot;parent.left.location.href='PayDetailManage_Left.aspx'&quot;); Response.Write(&quot;&lt; /script&gt;&quot;);  <br>页面定时刷新功能实现 <br> <br>有三种方法： <br> <br>1，在html中设置： <br> <br>&lt; title&gt;xxxxx&lt; /title&gt;之後加入下面这一行即可！  <br> <br>定时刷新： <br> <br>&lt; META HTTP-EQUIV=&quot;Refresh&quot; content=&quot;10&quot;&gt; 10代表刷新间隔,单位为秒 <br> <br>2.jsp <br> <br>&lt; % response.setHeader(&quot;refresh&quot;,&quot;1&quot;); %&gt; 每一秒刷新一次 <br> <br>3.使用javascript: <br> <br>&lt; script language=&quot;javascript&quot;&gt; setTimeout(&quot;self.location.reload(); &quot;,1000); &lt; script&gt; 一秒一次 <br> <br>页面自动跳转： <br> <br>1，在html中设置： <br> <br>&lt; title&gt;xxxxx&lt; /title&gt;之後加入下面这一行即可！  <br> <br>定时跳转并刷新： <br> <br>&lt; meta http-equiv=&quot;refresh&quot; content=&quot;20; url=http://自己的URL&quot;&gt;, 其中20指隔20秒后跳转到http://自己的URL 页面。 <br> <br> <br>点击按钮提交表单后刷新上级窗口 <br> <br>A窗口打开B窗口 <br> <br>然后在B里面提交数据至C窗口 <br> <br>最后要刷新A窗口 <br> <br>并且关闭B窗口 <br> <br>几个javascript函数 <br> <br>//第一个自动关闭窗口 <br> <br>&lt; script language=&quot;javascript&quot;&gt; &lt; !-- function clock(){i=i-1 document.title=&quot;本窗口将在&quot;+i+&quot;秒后自动关闭!&quot;; if(i&gt;0)setTimeout(&quot;clock(); &quot;,1000); else self.close(); } var i=2 clock(); //--&gt; &lt; /script&gt; //第二个刷新父页面的函数 <br> <br>&lt; script language=&quot;javascript&quot;&gt; opener.location.reload(); &lt; /script&gt; //第三个打开窗口 <br> <br>&lt; script language=&quot;javascript&quot;&gt; function show(mylink,mytitle,width,height) {mailwin=window.open(mylink,mytitle,'top=350,left=460,width='+width+',height='+height+',scrollbars=no')} &lt; /script&gt; 有关asp.net页面刷新的问题,收藏这几种方法会有用的。 <!--v:3.2--> ]]></description>
<category><![CDATA[.Net技术文摘]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1249824440#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sun, 09 Aug 2009 13:27:20 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1249824440</guid>
</item>

<item>
<title><![CDATA[ASP.NET中防止页面多次提交的代码实现]]></title>
<link>http://82895376.qzone.qq.com/blog/1249823940</link>
<description><![CDATA[Button被点击后disable掉该页面中所有的Button，从而防止提交延时导致的多次提交。基于之前的onceclickbutton脚本. <br> <br>//ASP.NET中防止页面多次提交的代码:javascript&lt; script language=&quot;javascript&quot;&gt; &lt; !-- function disableOtherSubmit() {  <br>var obj = event.srcElement;  <br>var objs = document.getElementsByTagName('INPUT');  <br>for(var i=0; i&lt; objs.length; i++)  <br>{  <br>if(objs<span style="font-style:italic"><wbr />.type.toLowerCase() == 'submit')  <br>{  <br>objs<span style="font-style:italic"><wbr />.disabled = true;  <br>}  <br>}  <br>} //--&gt; &lt; /script&gt;//ASP.NET中防止页面多次提交的代码:asp.netpublic class PreventMultiClick : System.Web.UI.Page {  <br>protected System.Web.UI.WebControls.Button Button1; protected System.Web.UI.WebControls.Button Button2;  <br>protected System.Web.UI.WebControls.LinkButton LinkButton1; protected System.Web.UI.WebControls.Button Button3; private void Page_Load(object sender, System.EventArgs e)  <br>{  <br>this.GetPostBackEventReference(this.Button3);  <br>//保证 __doPostBack(eventTarget, eventArgument) 正确注册 if(!IsPostBack)  <br>{  <br>System.Text.StringBuilder sb = new System.Text.StringBuilder();  <br>sb.Append(&quot;if (typeof(Page_ClientValidate) == 'function')  <br>{  <br>if (Page_ClientValidate() == false) <br>{ <br>return false;  <br>} <br>}&quot;); //保证验证函数的执行 sb.Append(&quot;if(window.confirm('are you sure?')==false) return false; &quot;);  <br>//自定义客户端脚本 sb.Append(&quot;disableOtherSubmit(); &quot;);  <br>// disable所有submit按钮 sb.Append(this.GetPostBackEventReference(this.Button3));  <br>//用__doPostBack来提交，保证按钮的服务器端click事件执行 sb.Append(&quot;; &quot;);  <br>Button3.Attributes.Add(&quot;onclick&quot;,sb.ToString());  <br>}  <br>} #region Web Form Designer generated code override protected void OnInit(EventArgs e)  <br>{  <br>// // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent();  <br>base.OnInit(e);  <br>}  <br>/// &lt; summary&gt; /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// &lt; /summary&gt; private void InitializeComponent()  <br>{  <br>this.Button3.Click += new System.EventHandler(this.Button3_Click); this.Load += new System.EventHandler(this.Page_Load);  <br>}  <br>#endregion private void Button3_Click(object sender, System.EventArgs e)  <br>{  <br>System.Threading.Thread.Sleep(3000);  <br>Response.Write(&quot;Hello world!&quot;);  <br>}  <br>} 此处只是disable掉所有的submit button, 我觉得其它的可提交控件也是可以通过类似的方法来disable的. <br> <br>以上就是ASP.NET中防止页面多次提交的代码实现。 <!--v:3.2--> ]]></description>
<category><![CDATA[.Net技术文摘]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1249823940#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sun, 09 Aug 2009 13:19:00 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1249823940</guid>
</item>

<item>
<title><![CDATA[SQL优化34条[SQL收藏转自CSDN]]]></title>
<link>http://82895376.qzone.qq.com/blog/1249822185</link>
<description><![CDATA[我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享！  <br>（1）      选择最有效率的表名顺序(只在基于规则的优化器中有效)：  <br>ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名，FROM子句中写在最后的表(基础表 driving table)将被最先处理，在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.  <br>（2）      WHERE子句中的连接顺序．：  <br>ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.  <br>（3）      SELECT子句中避免使用 ‘ * ‘：  <br>ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间  <br>（4）      减少访问数据库的次数：  <br>ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等；  <br>（5）      在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200  <br>（6）      使用DECODE函数来减少处理时间：  <br>使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.  <br>（7）      整合简单,无关联的数据库访问：  <br>如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)  <br>（8）      删除重复记录：  <br>最高效的删除重复记录方法 ( 因为使用了ROWID)例子：  <br>DELETE  FROM  EMP E  WHERE  E.ROWID &gt; (SELECT MIN(X.ROWID)  <br>FROM  EMP X  WHERE  X.EMP_NO = E.EMP_NO);  <br>（9）      用TRUNCATE替代DELETE：  <br>当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)  <br>（10） 尽量多使用COMMIT：  <br>只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:  <br>COMMIT所释放的资源:  <br>a. 回滚段上用于恢复数据的信息.  <br>b. 被程序语句获得的锁  <br>c. redo log buffer 中的空间  <br>d. ORACLE为管理上述3种资源中的内部花费  <br>（11） 用Where子句替换HAVING子句：  <br>避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中，on是最先执行，where次之，having最后，因为on是先把不符合条件的记录过滤后才进行统计，它就可以减少中间运算要处理的数据，按理说应该速度是最快的，where也应该比having快点的，因为它过滤数据后才进行sum，在两个表联接时才用on的，所以在一个表的时候，就剩下where跟having比较了。在这单表查询统计的情况下，如果要过滤的条件没有涉及到要计算字段，那它们的结果是一样的，只是where可以使用rushmore技术，而having就不能，在速度上后者要慢如果要涉及到计算的字段，就表示在没计算之前，这个字段的值是不确定的，根据上篇写的工作流程，where的作用时间是在计算之前就完成的，而having就是在计算后才起作用的，所以在这种情况下，两者的结果会不同。在多表联接查询时，on比where更早起作用。系统首先根据各个表之间的联接条件，把多个表合成一个临时表后，再由where进行过滤，然后再计算，计算完后再由having进行过滤。由此可见，要想过滤条件起到正确的作用，首先要明白这个条件应该在什么时候起作用，然后再决定放在那里  <br>（12） 减少对表的查询：  <br>在含有子查询的SQL语句中,要特别注意减少对表的查询.例子：  <br>    SELECT  TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT  <br>TAB_NAME,DB_VER FROM  TAB_COLUMNS  WHERE  VERSION = 604)  <br>（13） 通过内部函数提高SQL效率.：  <br>复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的  <br>（14） 使用表的别名(Alias)：  <br>当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.  <br>（15） 用EXISTS替代IN、用NOT EXISTS替代NOT IN：  <br>在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.  <br>例子：  <br>（高效）SELECT * FROM  EMP (基础表)  WHERE  EMPNO &gt; 0  AND  EXISTS (SELECT ‘X'  FROM DEPT  WHERE  DEPT.DEPTNO = EMP.DEPTNO  AND  LOC = ‘MELB')  <br>(低效)SELECT  * FROM  EMP (基础表)  WHERE  EMPNO &gt; 0  AND  DEPTNO IN(SELECT DEPTNO  FROM  DEPT  WHERE  LOC = ‘MELB')  <br>（16） 识别'低效执行'的SQL语句：  <br>虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法：  <br>SELECT  EXECUTIONS , DISK_READS, BUFFER_GETS,  <br>ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,  <br>ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,  <br>SQL_TEXT  <br>FROM  V$SQLAREA  <br>WHERE  EXECUTIONS&gt;0  <br>AND  BUFFER_GETS &gt; 0  <br>AND  (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8  <br>ORDER BY  4 DESC;  <br>（17） 用索引提高效率：  <br>索引是表的一个概念部分,用来提高检索数据的效率，ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.：  <br>ALTER  INDEX &lt;INDEXNAME&gt; REBUILD &lt;TABLESPACENAME&gt;  <br>18） 用EXISTS替换DISTINCT：  <br>当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子：  <br>      (低效):  <br>SELECT  DISTINCT  DEPT_NO,DEPT_NAME  FROM  DEPT D , EMP E  <br>WHERE  D.DEPT_NO = E.DEPT_NO  <br>(高效):  <br>SELECT  DEPT_NO,DEPT_NAME  FROM  DEPT D  WHERE  EXISTS ( SELECT ‘X'  <br>FROM  EMP E  WHERE E.DEPT_NO = D.DEPT_NO);  <br>（19） sql语句用大写的；因为oracle总是先解析sql语句，把小写的字母转换成大写的再执行  <br>（20） 在java代码中尽量少用连接符“＋”连接字符串！  <br>（21） 避免在索引列上使用NOT 通常，　  <br>我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.  <br>（22） 避免在索引列上使用计算．  <br>WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描．  <br>举例:  <br>低效：  <br>SELECT … FROM  DEPT  WHERE SAL * 12 &gt; 25000;  <br>高效:  <br>SELECT … FROM DEPT WHERE SAL &gt; 25000/12;  <br>（23） 用&gt;=替代&gt;  <br>高效:  <br>SELECT * FROM  EMP  WHERE  DEPTNO &gt;=4  <br>低效:  <br>SELECT * FROM EMP WHERE DEPTNO &gt;3  <br>两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.  <br>（24） 用UNION替换OR (适用于索引列)  <br>通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.  <br>高效:  <br>SELECT LOC_ID , LOC_DESC , REGION  <br>FROM LOCATION  <br>WHERE LOC_ID = 10  <br>UNION  <br>SELECT LOC_ID , LOC_DESC , REGION  <br>FROM LOCATION  <br>WHERE REGION = “MELBOURNE”  <br>低效:  <br>SELECT LOC_ID , LOC_DESC , REGION  <br>FROM LOCATION  <br>WHERE LOC_ID = 10 OR REGION = “MELBOURNE”  <br>如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.  <br>（25） 用IN来替换OR   <br>这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的．　  <br>低效:  <br>SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30  <br>高效  <br>SELECT… FROM LOCATION WHERE LOC_IN  IN (10,20,30);  <br>（26） 避免在索引列上使用IS NULL和IS NOT NULL  <br>避免在索引中使用任何可以为空的列，ORACLE将无法使用该索引．对于单列索引，如果列包含空值，索引中将不存在此记录. 对于复合索引，如果每个列都为空，索引中同样不存在此记录.　如果至少有一个列不为空，则记录存在于索引中．举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入). 然而如果所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.  <br>低效: (索引失效)  <br>SELECT … FROM  DEPARTMENT  WHERE  DEPT_CODE IS NOT NULL;  <br>高效: (索引有效)  <br>SELECT … FROM  DEPARTMENT  WHERE  DEPT_CODE &gt;=0;  <br>（27） 总是使用索引的第一个列：  <br>如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则，当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引  <br>28） 用UNION-ALL 替换UNION ( 如果有可能的话)：  <br>当SQL 语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量  <br>低效：  <br>SELECT  ACCT_NUM, BALANCE_AMT  <br>FROM  DEBIT_TRANSACTIONS  <br>WHERE TRAN_DATE = '31-DEC-95'  <br>UNION  <br>SELECT ACCT_NUM, BALANCE_AMT  <br>FROM DEBIT_TRANSACTIONS  <br>WHERE TRAN_DATE = '31-DEC-95'  <br>高效:  <br>SELECT ACCT_NUM, BALANCE_AMT  <br>FROM DEBIT_TRANSACTIONS  <br>WHERE TRAN_DATE = '31-DEC-95'  <br>UNION ALL  <br>SELECT ACCT_NUM, BALANCE_AMT  <br>FROM DEBIT_TRANSACTIONS  <br>WHERE TRAN_DATE = '31-DEC-95'  <br>（29） 用WHERE替代ORDER BY：  <br>ORDER BY 子句只在两种严格的条件下使用索引.  <br>ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.  <br>ORDER BY中所有的列必须定义为非空.  <br>WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.  <br>例如:  <br>表DEPT包含以下列:  <br>DEPT_CODE PK NOT NULL  <br>DEPT_DESC NOT NULL  <br>DEPT_TYPE NULL  <br>低效: (索引不被使用)  <br>SELECT DEPT_CODE FROM  DEPT  ORDER BY  DEPT_TYPE  <br>高效: (使用索引)  <br>SELECT DEPT_CODE  FROM  DEPT  WHERE  DEPT_TYPE &gt; 0  <br>（30） 避免改变索引列的类型.:  <br>当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.  <br>假设 EMPNO是一个数值类型的索引列.  <br>SELECT …  FROM EMP  WHERE  EMPNO = ‘123'  <br>实际上,经过ORACLE类型转换, 语句转化为:  <br>SELECT …  FROM EMP  WHERE  EMPNO = TO_NUMBER(‘123')  <br>幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.  <br>现在,假设EMP_TYPE是一个字符类型的索引列.  <br>SELECT …  FROM EMP  WHERE EMP_TYPE = 123  <br>这个语句被ORACLE转换为:  <br>SELECT …  FROM EMP  WHERETO_NUMBER(EMP_TYPE)=123  <br>因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型  <br>（31） 需要当心的WHERE子句:  <br>某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.  <br>在下面的例子里, (1)‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) ‘||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) ‘+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.  <br>（32） a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.  <br>b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!  <br>（33） 避免使用耗费资源的操作:  <br>带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎  <br>执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强  <br>（34） 优化GROUP BY:  <br>提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.  <br>低效:  <br>SELECT JOB , AVG(SAL)  <br>FROM EMP  <br>GROUP by JOB  <br>HAVING JOB = ‘PRESIDENT'  <br>OR JOB = ‘MANAGER'  <br>高效:  <br>SELECT JOB , AVG(SAL)  <br>FROM EMP  <br>WHERE JOB = ‘PRESIDENT'  <br>OR JOB = ‘MANAGER'  <br>GROUP by JOB <!--v:3.2--> ]]></description>
<category><![CDATA[SQL技术文摘]]></category>
<author><![CDATA[82895376@qq.com(Nickelback)]]></author>
<comments>http://82895376.qzone.qq.com/blog/1249822185#comment</comments>
<qz:effect>142606848</qz:effect>
<pubDate>Sun, 09 Aug 2009 12:49:45 GMT</pubDate>
<guid>http://82895376.qzone.qq.com/blog/1249822185</guid>
</item>

</channel>
</rss>

