﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Junky's IT Notebook-随笔分类-web</title><link>http://www.blogjava.net/junky/category/11396.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 06 Jul 2007 17:33:15 GMT</lastBuildDate><pubDate>Fri, 06 Jul 2007 17:33:15 GMT</pubDate><ttl>60</ttl><item><title>spring+JAX-RPC(Axis) 构建webservice</title><link>http://www.blogjava.net/junky/archive/2007/07/06/128590.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Fri, 06 Jul 2007 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/07/06/128590.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/128590.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/07/06/128590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/128590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/128590.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 介绍关于用eclipse+wtp发布webservice是相当的简单。这里只简单介绍一下，wtp下发布webservice有以下几个步骤：&#183;创建Dynamic Web Project.(wtp自带项目)&#183;在soure folder 下面创建要发布的java bean。本例中发布了一个User.java&#183;在创建的工程上面新建Web Service. (w...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2007/07/06/128590.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/128590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-07-06 15:07 <a href="http://www.blogjava.net/junky/archive/2007/07/06/128590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）（1）</title><link>http://www.blogjava.net/junky/archive/2007/06/28/126726.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126726.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126726.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126726.html</trackback:ping><description><![CDATA[<p align=left><span><font face=Century>1</font></span><span>、下载和安装</span><span><font face=Century>WW2</font></span></p>
<p><span>（</span><span><font face=Century>1</font></span><span>）本教程基于</span><span><font face=Century>WebWork 2.1</font></span><span>版本，在</span><span><font face=Century>webwork.dev.java.net</font></span><span>网站上下载</span><span><font face=Century>webwork-2.1.zip</font></span><span>；</span></p>
<p><span>（</span><span><font face=Century>2</font></span><span>）将压缩包解压，使用</span><span><font face=Century>WebWork</font></span><span>所需要的</span><span><font face=Century>lib</font></span><span>包括</span><span><font face=Century>webwork-2.1.jar</font></span><span>和</span><span><font face=Century>lib/core</font></span><span>文件夹中的</span><span><font face=Century>jar</font></span><span>文件</span></p>
<img src ="http://www.blogjava.net/junky/aggbug/126726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:42 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）(3)</title><link>http://www.blogjava.net/junky/archive/2007/06/28/126724.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126724.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126724.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126724.html</trackback:ping><description><![CDATA[<p><span><font face=Century>3</font></span><span>、</span><span><font face=Century>Actions</font></span><span>和</span><span><font face=Century>Results</font></span></p>
<p><span><font face=Century>Actions</font></span><span>是基本执行单元，在</span><span><font face=Century>WebWork</font></span><span>配置中注册，用来响应特定的请求。在</span><span><font face=Century>MVC</font></span><span>中，</span><span><font face=Century>Actions</font></span><span>是控制部分。下面是在</span><span><font face=Century>WebWork</font></span><span>中创建</span><span><font face=Century>Action</font></span><span>的基本步骤：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>创建调用</span><span><font face=Century>Action</font></span><span>的</span><span><font face=Century>JSP</font></span><span>页；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>创建</span><span><font face=Century>Action</font></span><span>类；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>创建处理</span><span><font face=Century>Action</font></span><span>返回结果的</span><span><font face=Century>JSP</font></span><span>页；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在</span><span><font face=Century>xwork.xml</font></span><span>中注册</span><span><font face=Century>Action</font></span><span>；</span></p>
<p><span>（</span><span><font face=Century>1</font></span><span>）</span><span><font face=Century>Hello WebWorld</font></span><span>的例子</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><font face=Century>xwork.xml</font></span><span>文件内容如下：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Default interceptor stack. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;default-interceptor-ref name="defaultStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Action: Lesson 03: HelloWebWorldAction. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="helloWebWorld" class="lesson03.HelloWebWorldAction"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="dispatcher"&gt;ex01-success.jsp&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span>配置文件告诉</span><span><font face=Century>WebWork</font></span><span>，有一个叫</span><span><font face=Century>helloWebWorld</font></span><span>的</span><span><font face=Century>Action</font></span><span>，由</span><span><font face=Century>lesson03.HelloWebWorldAction</font></span><span>实现；同时定义了一个叫</span><span><font face=Century>success</font></span><span>的结果，指向</span><span><font face=Century>ex01-success.jsp</font></span><span>页面；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>调用</span><span><font face=Century>Action</font></span><span>的页面</span><span><font face=Century>ex01-index.jsp</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 3 - Example 1&lt;/title&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;Click the button below to activate HelloWebWorldAction.&lt;/p&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;form action="helloWebWorld.action" method="post"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;&lt;input type="submit" value="Hello!" /&gt;&lt;/p&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/form&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span>当点击页面的按钮时，浏览器提交表单数据给</span><span><font face=Century>helloWebWorld.action</font></span><span>；既然</span><span><font face=Century>URL</font></span><span>匹配映射</span><span><font face=Century>*.action</font></span><span>，</span><span><font face=Century>Servlet</font></span><span>容器激活</span><span><font face=Century>WebWork</font></span><span>的</span><span><font face=Century>ServletDispatcher</font></span><span>；</span><span><font face=Century>ServletDispatcher</font></span><span>读取</span><span><font face=Century>xwork.xml</font></span><span>，查找名为</span><span><font face=Century>helloWebWorld</font></span><span>的</span><span><font face=Century>Action</font></span><span>，如果找到就</span><span>创建</span><span><font face=Century>Action</font></span><span>类的一个新实例，调用</span><span><font face=Century>execute()</font></span><span>方法</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><font face=Century>Action</font></span><span>类：</span><span><font face=Century>HelloWebWorldAction.java</font></span></p>
<div>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>package</font></span></span><span> lesson03; </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>import</font></span></span><span> com.opensymphony.xwork.ActionSupport; </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>public</font></span></span><span> class HelloWebWorldAction </span><span><span><font color=#000066>extends</font></span></span><span> ActionSupport { </span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#660066>String</font></span></span><span> hello; </span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> </span><span><span><font color=#660066>String</font></span></span><span> getHello() { </span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>return</font></span></span><span> hello; </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> </span><span><span><font color=#660066>String</font></span></span><span> execute() </span><span><span><font color=#000066>throws</font></span></span><span> Exception { </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>hello = "Hello, WebWorld!"; </font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>return</font></span></span><span> SUCCESS; </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">}</font></font></span></pre>
</div>
<p><span><font face=Century>Action</font></span><span>类继承</span><span><font face=Century>com.opensymphony.xwork.ActionSupport</font></span><span>，并实现</span><span><font face=Century>execute()</font></span><span>方法；</span><span><font face=Century>execute()</font></span><span>方法的返回值</span><span><font face=Century>SUCCESS</font></span><span>和</span><span><font face=Century>success</font></span><span>（</span><span><font face=Century>&lt;result&gt;</font></span><span>的</span><span><font face=Century>name</font></span><span>属性值）对应；</span><span><font face=Century>ServletDispatcher</font></span><span>查找名字相匹配的</span><span><font face=Century>result</font></span><span>，转移到指定的</span><span><font face=Century>JSP</font></span><span>页</span><font face=Century><span>ex01-success.jsp</span></font></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>结果显示</span><span><font face=Century>JSP</font></span><span>页</span><span><font face=Century>ex01-success.jsp</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;%@ taglib uri="webwork" prefix="ww" %&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 3 - Example 1&lt;/title&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;ww:property value="hello" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>&lt;ww:property value="hello" /&gt;</font></span><span>在</span><span><font face=Century>Action</font></span><span>类中查找</span><span><font face=Century>hello</font></span><span>属性，调用</span><span><font face=Century>hello</font></span><span>属性的</span><span><font face=Century>setter</font></span><span>方法获得属性值（在</span><span><font face=Century>execute()</font></span><span>中已经设置），显示</span><font face=Century><span>Hello, WebWorld!</span></font></p>
<p><span>（</span><span><font face=Century>2</font></span><span>）向</span><span><font face=Century>Action</font></span><span>提供数据的例子</span></p>
<p><span><font face=Century>xwork.xml</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Default interceptor stack. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;default-interceptor-ref name="defaultStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Action: Lesson 03: HelloAction. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="hello" class="lesson03.HelloAction"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="error" type="dispatcher"&gt;ex02-index.jsp&lt;/result&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="dispatcher"&gt;ex02-success.jsp&lt;/result&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><font face=Century><span>HelloAction</span><span>.java</span></font><span>：</span></p>
<div>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>package</font></span></span><span> lesson03;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>import</font></span></span><span> com.opensymphony.xwork.ActionSupport;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>public</font></span></span><span> class HelloAction </span><span><span><font color=#000066>extends</font></span></span><span> ActionSupport {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#660066>String</font></span></span><span> person;</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> </span><span><span><font color=#660066>String</font></span></span><span> getPerson() {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>return</font></span></span><span> person;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> void setPerson(</span><span><span><font color=#660066>String</font></span></span><span> person) {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>this</font></span></span><span>.person = person;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> </span><span><span><font color=#660066>String</font></span></span><span> execute() </span><span><span><font color=#000066>throws</font></span></span><span> Exception {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>if</font></span></span><span> ((person == </span><span><span><font color=#000066>null</font></span></span><span>) || (person.length() == 0)) </span><span><span><font color=#000066>return</font></span></span><span> ERROR;</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>else</font></span></span><span> </span><span><span><font color=#000066>return</font></span></span><span> SUCCESS;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">}</font></font></span></pre>
</div>
<p><span><font face=Century>ex02-index.jsp</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 3 - Example 2&lt;/title&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;What's your name?&lt;/p&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;form action="hello.action" method="post"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;&lt;input type="text" name="person" /&gt;&lt;input type="submit" /&gt;&lt;/p&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/form&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>ex02-success.jsp</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;%@ taglib uri="webwork" prefix="ww" %&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 3 - Example 2&lt;/title&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">Hello, &lt;ww:property value="person" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span>这个例子使用</span><span><font face=Century>POST</font></span><span>方法向</span><span><font face=Century>Action</font></span><span>发送表单数据（使用</span><span><font face=Century>person</font></span><span>名），在</span><span><font face=Century>HelloAction</font></span><span>的实例创建以后，</span><span><font face=Century>ServletDispatcher</font></span><span>调用</span><span><font face=Century>setter</font></span><span>方法用数据设置</span><span><font face=Century>Action</font></span><span>的对应属性（</span><span><font face=Century>person</font></span><span>）；因此，在执行</span><span><font face=Century>execute()</font></span><span>之前，</span><span><font face=Century>person</font></span><span>属性已经设置了</span></p>
<p><span>（</span><span><font face=Century>3</font></span><span>）</span><span><font face=Century>result</font></span><span>的类型</span></p>
<p><span>上面的例子中使用的</span><span><font face=Century>result</font></span><span>类型是</span><span><font face=Century>dispatcher</font></span><span>，而</span><span><font face=Century>WebWork</font></span><span>的</span><span><font face=Century>result</font></span><span>类型已经在</span><span><font face=Century>webwork-default.xml</font></span><span>中配置：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>dispatcher</span></strong><span> (com.opensymphony.webwork.dispatcher.ServletDispatcherResult)</span></font><span>：</span><span><font face=Century> forwards </font></span><span>结果到指定位置</span><span><font face=Century>URL </font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>redirect</span></strong><span> (com.opensymphony.webwork.dispatcher.ServletRedirectResult)</span></font><span>：</span><span><font face=Century> redirects</font></span><span>结果到指定位置</span><span><font face=Century>URL </font></span><span>；与</span><span><font face=Century>dispatcher</font></span><span>不同的是不会发送表单数据</span><span><font face=Century> </font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>velocity</span></strong><span> (com.opensymphony.webwork.dispatcher.VelocityResult</span></font><span>：使用</span><span><font face=Century> Velocity </font></span><span>模版作为结果，需要在</span><span><font face=Century>web.xml</font></span><span>中配置</span><span><font face=Century> VelocityServlet</font></span><span>，这是一种很好的方法</span><span><font face=Century> </font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>chain</span></strong><span> (com.opensymphony.xwork.ActionChainResult): Action</span></font><span>链，将结果传送给另外一个</span><span><font face=Century>Action</font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>xslt</span></strong><span> (com.opensymphony.webwork.views.xslt.XSLTResult): </span></font><span>使用</span><span><font face=Century>XSLT</font></span><span>式样格式化结果</span></p>
<img src ="http://www.blogjava.net/junky/aggbug/126724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:41 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）（2）</title><link>http://www.blogjava.net/junky/archive/2007/06/28/126725.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126725.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126725.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126725.html</trackback:ping><description><![CDATA[<p><span><font face=Century>2</font></span><span>、建立</span><span><font face=Century>Web</font></span><span>应用程序</span></p>
<p><span>（</span><span><font face=Century>1</font></span><span>）这里假设你安装了</span><span><font face=Century>Servlet</font></span><span>容器，并知道如何创建一个</span><span><font face=Century>Web</font></span><span>应用程序；如果你不知道，建议学习</span><span><font face=Century>Apache Tomcat</font></span><span>（</span><span><font face=Century>Apache Jakarta</font></span><span>项目中的一个免费</span><span><font face=Century>Servlet</font></span><span>容器）；</span></p>
<p><span>（</span><span><font face=Century>2</font></span><span>）复制需要的运行库（</span><span><font face=Century>webwork-2.1.jar</font></span><span>和</span><span><font face=Century>lib/core/*.jar</font></span><span>）到</span><span><font face=Century>Web</font></span><span>应用程序的</span><span><font face=Century>WEB-INF/lib</font></span><span>文件夹中；</span></p>
<p><span>（</span><span><font face=Century>3</font></span><span>）如下配置</span><span><font face=Century>web.xml</font></span><span>、</span><span><font face=Century>xwork.xml</font></span><span>和</span><span><font face=Century>validators.xml</font></span><span>文件；</span></p>
<p><span>（</span><span><font face=Century>4</font></span><span>）</span><span><font face=Century>web.xml</font></span><span>看起来象下面的样子：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;?xml version="1.0"?&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;web-app&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;display-name&gt;My WebWork Application&lt;/display-name&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;webwork&lt;/servlet-name&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-class&gt;com.opensymphony.webwork.dispatcher.ServletDispatcher&lt;/servlet-class&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-mapping&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;webwork&lt;/servlet-name&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet-mapping&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;taglib&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;taglib-uri&gt;webwork&lt;/taglib-uri&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;taglib-location&gt;/WEB-INF/lib/webwork-2.1.jar&lt;/taglib-location&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/taglib&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/web-app&gt;</font></font></span></pre>
</div>
<p><span>为了使用</span><span><font face=Century>WebWork</font></span><span>，必须注册</span><span><font face=Century>ServletDispatcher</font></span><span>，并映射到</span><span><font face=Century>*.action</font></span><span>；作为可选，如果要使用</span><span><font face=Century>WebWork</font></span><span>的</span><span><font face=Century>tags</font></span><span>，要声明</span><span><font face=Century>WebWork</font></span><span>的</span><span><font face=Century>taglib</font></span><span>描述；</span></p>
<p><span>（</span><span><font face=Century>5</font></span><span>）在</span><span><font face=Century>WEB-INF/classes</font></span><span>目录下创建</span><span><font face=Century>WebWork</font></span><span>的配置文件</span><span><font face=Century>xwork.xml</font></span><span>，下面是一个配置框架（会在教程的后面增加内容）：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span>这做两件事：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>导入</span><span><font face=Century>webwork-default.xml</font></span><span>（位于</span><span><font face=Century>webwork-2.1.jar</font></span><span>中）<span>的配置信息，包含</span></span><span><font face=Century>WebWork</font></span><span>应用程序的缺省配置；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>定义名为</span><span><font face=Century>default</font></span><span>的</span><span><font face=Century>package</font></span><span>，用于</span><span><font face=Century>actions</font></span><span>、</span><span><font face=Century> results</font></span><span>和</span><span><font face=Century>interceptors</font></span><span>的注册；这个</span><span><font face=Century>package</font></span><span>继承</span><span><font face=Century>webwork-default</font></span><span>，以继承其中定义的配置；</span></p>
<p><span>（</span><span><font face=Century>6</font></span><span>）<span>在</span></span><span><font face=Century>WEB-INF/classes</font></span><span>目录下创建</span><span><font face=Century>validators.xml</font></span><span>。包括以下内容：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;validators&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="required"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="requiredstring"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="int"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="date"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="expression"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="fieldexpression"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="email"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.EmailValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="url"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.URLValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="visitor"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;validator name="conversion"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/validators&gt;</font></font></span></pre>
</div>
<p><span>这个文件定义可以使用的有效</span><span><font face=Century>Validators</font></span><span>。</span></p>
<img src ="http://www.blogjava.net/junky/aggbug/126725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:41 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）(4.1.1) </title><link>http://www.blogjava.net/junky/archive/2007/06/28/126721.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126721.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126721.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 4.1.1、WebWork UI标记（1）创建表单WebWork UI标记和HTML标记很相似，很容易从它的名字辨认出。你可以直接使用这些标记创建表单，和HTML标记的区别在于：参数使用双引号和单引号括起，这是因为要和Value Stack中的名字区分。看下面的例子：ex01-index.jsp：&lt;%@ taglib uri="webwork" prefix="ww" %...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2007/06/28/126721.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/126721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:40 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）(4.1) </title><link>http://www.blogjava.net/junky/archive/2007/06/28/126722.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126722.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126722.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126722.html</trackback:ping><description><![CDATA[<p><span><font face=Century>4</font></span><span>、视图</span></p>
<p><span>有几种作为视图的技术可以使用：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><font face=Century>JSP</font></span><span>：这是</span><span><font face=Century>Java Web</font></span><span>开发者熟悉的技术，可以作为通用选择；本教程介绍在</span><span><font face=Century>JSP</font></span><span>中使用</span><span><font face=Century>WebWork</font></span><span>的标记库</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><font face=Century>Velocity</font></span><span>：一种基于</span><span><font face=Century>Java</font></span><span>的模板引擎，提供简单而强大的模板语言</span><span><font face=Century>VTL</font></span><span>来替代</span><span><font face=Century>JSP</font></span><span>，</span><span>将</span><span><font face=Century>Java</font></span><span>代码从</span><span><font face=Century>Web</font></span><span>页面中分离</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><font face=Century>Freemaker</font></span><span>：</span><span>对于</span><span><font face=Century>MVC</font></span><span>模式设计</span><span>，</span><span>另外一种</span><span>可以</span><span>替代</span><span><font face=Century>JSP</font></span><span>的基于</span><span><font face=Century>Java</font></span><span>的模板引擎，</span><span>但兼容</span><span><font face=Century>JSP</font></span><span>标记</span></p>
<p><span><font face=Century>4.1</font></span><span>、使用</span><span><font face=Century>JSP</font></span><span>作为视图</span></p>
<p><span>使用</span><span><font face=Century>JSP</font></span><span>呈现视图，可以使用</span><span><font face=Century>Scriptlets</font></span><span>或</span><span><font face=Century>WebWork</font></span><span>标记来访问</span><span><font face=Century>Action</font></span><span>的数据。推荐使用</span><span><font face=Century>WebWork</font></span><span>标记</span><span>库</span><span>。</span></p>
<p><span>（</span><span><font face=Century>1</font></span><span>）使用</span><span><font face=Century>Scriptlets</font></span><span>访问</span><span><font face=Century>Acition</font></span><span>的数据</span></p>
<p><span>在</span><span><font face=Century>Scriptlets</font></span><span>中是使用</span><span><font face=Century>Value Stack</font></span><span>对象访问</span><span><font face=Century>Action</font></span><span>的数据的，下面是使用</span><span><font face=Century>Scriptlets</font></span><span>实现上节中第二个例子的结果输出页面：</span></p>
<div>
<pre><font size=2><font face="ＭＳ ゴシック"><span>&lt;%@ page </span><span><span><font color=#000066>import</font></span></span><span>="com.opensymphony.xwork.util.OgnlValueStack" %&gt;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 4.1 - Lesson 3's example modified&lt;/title&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;%</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">OgnlValueStack stack = (OgnlValueStack)request.getAttribute("webwork.valueStack");</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">out.write("Hello, " + stack.findValue("person"));</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">%&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span>然而，推荐使用</span><span>WebWork</span><span>标记，就象</span><span>上节中第二个例子</span><span>使用</span><span><font face=Century>&lt;ww:property /&gt;</font></span><span>做的那样，具有清晰的语法，并能在</span><span><font face=Century>Value Stack</font></span><span>对象</span><span>不存在时处理。</span></p>
<p><span>（</span><span>2</span><span>）使用</span><span>WebWork</span><span>标记库</span></p>
<p><span>WebWork</span><span>标记库可以分为</span><span>7</span><span>类：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>通用标记：最常用的基本标记；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>组件标记：在视图中生成组件；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>流程控制标记：控制</span><span>JSP</span><span>中的流程；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>Iteration</span><span>标记：遍历访问元素或操作可遍历对象；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>UI</span><span>标记：生成</span><span>HTML</span><span>表单域和控制；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>VUI</span><span>标记：（需要志愿者来编写）；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>国际化标记：使视图具有国际化；</span></p>
<p><span>（</span><span>1</span><span>）通用标记</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:property /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>获得结果属性值；如果值不存在，返回</span><span>Value Stack </span><span>中最顶上的值</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:push /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>将值推入</span><span>Value Stack</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:param /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>设置父标记的参数（属性）值；该标记只能在其它标记内部使用</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:set /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>设置</span><span>Value Stack </span><span>中具有指定范围（</span><span>page, stack, application, session</span><span>）的对象值；如果没有指定值，使用</span><span>Value Stack </span><span>中最顶上的值</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:url /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>创建编码的</span><span>URL</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>（</span><span>2</span><span>）组件标记</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:action /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>在</span><span>taglib</span><span>的上下文中执行一个</span><span>Action </span><span>，标记体用来显示</span><span>Action </span><span>的响应结果</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:bean /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>在</span><span>ActionContext </span><span>中创建一个</span><span>JavaBean</span><span>，实例化它的属性，以便以后使用</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:include /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>包含另外一个页面或</span><span>Action</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>（</span><span>3</span><span>）流程控制标记</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:if /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>如果条件标记的布尔表达式为</span><span>true </span><span>，计算标记体的内容</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:else /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>如果前面条件标记的布尔表达式为</span><span>false</span><span>，计算标记体的内容</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:elseif /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>如果前面条件标记的布尔表达式为</span><span>false</span><span>，而本条件标记的布尔表达式为</span><span>true</span><span>，计算标记体的内容</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>（</span><span><font face=Century>4</font></span><span>）</span><span>Iteration</span><span>标记</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:iterator /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>遍历一个集合</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:generator /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>生成遍历对象</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:append /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>追加遍历对象</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:subset /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>获得遍历对象的子集</span></p>
            </td>
        </tr>
        <tr>
            <td width=120>
            <p align=center><tt><strong><span>&lt;ww:merge /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>合并几个遍历对象为一个</span><span>.</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>（</span><span><font face=Century>5</font></span><span>）</span><span><font face=Century>UI</font></span><span>标记</span></p>
<p><span>生成</span><span><font face=Century>HTML</font></span><span>表单控件的</span><span><font face=Century>UI</font></span><span>标记和</span><span><font face=Century>WebWork</font></span><span>核心紧密集成，标记被设计为最小化编译代码逻辑的数量和使用模板系统呈现</span><span><font face=Century>HTML</font></span><span>的代表。</span><span><font face=Century>UI</font></span><span>标记覆盖了大部分常用标记，而且提供了一个组件标记，用来创建定制组件。</span><span><font face=Century>UI</font></span><span>标记还提供了显示内联错误信息的内建支持。有关</span><span><font face=Century>UI</font></span><span>标记的详细介绍，在下一节中讲述。</span></p>
<p><span>（</span><span><font face=Century>6</font></span><span>）</span><span><font face=Century>VUI</font></span><span>标记</span></p>
<p><span>需要志愿者来编写。</span></p>
<p><span>（</span><span><font face=Century>7</font></span><span>）国际化标记</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:text /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>打印出国际化字符串</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=120>
            <p align=center><tt><strong><span>&lt;ww:i18n /&gt;</span></strong></tt></p>
            </td>
            <td vAlign=top width=466>
            <p><span>将一个资源包放到</span><span>Value Stack</span><span>中</span><span>, </span><span>以便</span><span>&lt;ww:text /&gt;</span><span>标记</span><span>使用</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<img src ="http://www.blogjava.net/junky/aggbug/126722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:40 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）(4.2)</title><link>http://www.blogjava.net/junky/archive/2007/06/28/126719.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126719.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126719.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126719.html</trackback:ping><description><![CDATA[<p><span><font face=Century>4.2</font></span><span>、在</span><span><font face=Century>WebWork</font></span><span>中使用</span><span><font face=Century>Velocity</font></span></p>
<p><span>使用</span><span><font face=Century>Velocity</font></span><span>作为视图，有两种方法：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用</span><span><font face=Century>velocity</font></span><span>结果类型来呈现</span><span><font face=Century>Velocity</font></span><span>模板</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在</span><span><font face=Century>web.xml</font></span><span>中注册</span><span><font face=Century>WebWorkVelocityServlet</font></span><span>，直接请求</span><span><font face=Century>Velocity</font></span><span>模板文件来呈现；这种方法要在</span><span><font face=Century>web.xml</font></span><span>中为</span><span><font face=Century>WebWorkVelocityServlet</font></span><span>添加一个</span><span><font face=Century>Servlet</font></span><span>映射，如下：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;servlet&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;velocity&lt;/servlet-name&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-class&gt;com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet&lt;/servlet-class&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/servlet&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;servlet-mapping&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;velocity&lt;/servlet-name&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;*.vm&lt;/url-pattern&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/servlet-mapping&gt;</font></font></span></pre>
</div>
<p><span>使用</span><span><font face=Century>velocity</font></span><span>结果类型意味着</span><span><font face=Century>Velocity</font></span><span>模板是通过</span><span><font face=Century>Action</font></span><span>来呈现。如果访问</span><span><font face=Century>.vm</font></span><span>文件，不会呈现该文件，而是返回文本文件。因此，</span><span><font face=Century>Velocity</font></span><span>模板文件应该放在</span><span><font face=Century>WEB-INF</font></span><span>目录下，使其无法直接访问。</span></p>
<p><span>使用</span><span><font face=Century>WebWorkVelocityServlet</font></span><span>意味着可以通过请求</span><span><font face=Century>.vm</font></span><span>文件来呈现</span><span><font face=Century>Velocity</font></span><span>模板，这可能需要在模板中实现安全检查。</span></p>
<p><span>无论使用哪种方法，在写模板时，</span><span><font face=Century>Velocity</font></span><span>的所有特性都是有效的，并且有一些</span><span><font face=Century>WebWork</font></span><span>的特定功能可以使用。这里假设你对</span><span><font face=Century>Velocity</font></span><span>很熟悉，重点放在</span><span><font face=Century>WebWork</font></span><span>的特定功能上。</span></p>
<p><span>（</span><span><font face=Century>1</font></span><span>）</span><span><font face=Century>WebWork</font></span><span>的特定功能</span></p>
<p><span><font face=Century>WebWork</font></span><span>在</span><span><font face=Century>Value Stack</font></span><span>中提供了一些可以访问的对象，包括：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>当前的</span><span><font face=Century>HttpServletRequest</font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>当前的</span><span><font face=Century>HttpServletResponse</font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>当前的</span><span><font face=Century>OgnlValueStack</font></span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><font face=Century>OgnlTool</font></span><span>实例</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>当前</span><span><font face=Century>Action</font></span><span>类的所有属性</span></p>
<p><span>要访问</span><span><font face=Century>Value Stack</font></span><span>中的对象，需要在模板中正确使用</span><span><font face=Century>Velocity</font></span><span>引用：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>$req</span></strong><span>=HttpServletRequest</span></font></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>$res</span></strong><span>=HttpServletResponse</span></font></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>$stack</span></strong><span>=OgnlValueStack</span></font></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>$ognl</span></strong><span>=OgnlTool</span></font></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face=Century><strong><span>$name-of-property</span></strong><span>=</span></font><span>当前</span><span><font face=Century>Action</font></span><span>类的属性</span></p>
<p><span>（</span><span><font face=Century>2</font></span><span>）使用</span><span><font face=Century>velocity</font></span><span>结果类型</span></p>
<p><span>下面的例子是使用</span><span><font face=Century>Velocity</font></span><span>模板作为结果，来实现前面的</span><span><font face=Century>Hello</font></span><span>例子，注意</span><span><font face=Century>&lt;property value="person" /&gt;</font></span><span>标记被</span><span><font face=Century>$person</font></span><span>引用所替代：</span></p>
<p><span><font face=Century>xwork.xml</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Default interceptor stack. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;default-interceptor-ref name="defaultStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Action: Lesson 4.2: HelloAction using Velocity as result. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="helloVelocity" class="lesson03.HelloAction"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="error" type="dispatcher"&gt;ex01-index.jsp&lt;/result&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="velocity"&gt;ex01-success.vm&lt;/result&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>HelloAction.java</font></span><span>：（同前面的例子）</span></p>
<p><span><font face=Century>ex01-index.jsp</font></span><span>：（同前面的例子）</span></p>
<p><span><font face=Century>ex01-success.vm</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 4.2 - Example 1&lt;/title&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">Hello, $person </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span>（</span><span><font face=Century>3</font></span><span>）在</span><span><font face=Century>Velocity</font></span><span>中使用</span><span><font face=Century>WebWork</font></span><span>标记</span></p>
<p><span>使用</span><span><font face=Century>Velocity</font></span><span>模板替代</span><span><font face=Century>JSP</font></span><span>标记，会失去使用</span><span><font face=Century>JSP</font></span><span>标记的能力。然而，</span><span><font face=Century>WebWork</font></span><span>的</span><span><font face=Century>Velocity Servlet</font></span><span>提供了一种在</span><span><font face=Century>Velocity</font></span><span>模板中使用</span><span><font face=Century>JSP</font></span><span>标记的方法：使用</span><span><font face=Century>#tag</font></span><span>、</span><span><font face=Century>#bodytag</font></span><span>和</span><span><font face=Century>#param Velocimacros</font></span><span>。下面是通用语法：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">#tag (name-of-tag list-of-attributes)</font></font></span></pre>
</div>
<p><span>或：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">#bodytag (name-of-tag list-of-attributes)</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#param (key value)</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#param (key value)</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">...</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">#end</font></font></span></pre>
</div>
<p><span>下面的例子使用</span><span><font face=Century>Velocity</font></span><span>实现</span><span><font face=Century>4.1.1</font></span><span>节中示范</span><span><font face=Century>UI</font></span><span>标记用法的例子：</span></p>
<p><span><font face=Century>xwork.xml</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Default interceptor stack. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;default-interceptor-ref name="defaultStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Actions: Lesson 4.2: FormProcessingAction using Velocity. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="formProcessingVelocityIndex" class="lesson04_02.FormProcessingIndexAction"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="velocity"&gt;ex02-index.vm&lt;/result&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="formProcessingVelocity" class="lesson04_01_01.FormProcessingAction"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="input" type="velocity"&gt;ex02-index.vm&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="velocity"&gt;ex02-success.vm&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="validationWorkflowStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>ex02-index.vm</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 4.2 - Example 2&lt;/title&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;style type="text/css"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;</span>.errorMessage { color: red; } </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/style&gt;<span>&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;UI Form Tags Example using Velocity:&lt;/p&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">#bodytag (Form "action='formProcessingVelocity.action'" "method='post'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Checkbox "name='checkbox'" "label='A checkbox'" "fieldValue='checkbox_value'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (File "name='file'" "label='A file field'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Hidden "name='hidden'" "value='hidden_value'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Label "label='A label'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Password "name='password'" "label='A password field'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Radio "name='radio'" "label='Radio buttons'" "list={'One', 'Two', 'Three'}") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Select "name='select'" "label='A select list'" "list={'One', 'Two', 'Three'}" </font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>"emptyOption=</span><span><span><font color=#000066>true</font></span></span><span>") </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Textarea "name='textarea'" "label='A text area'" "rows='3'" "cols='40'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (TextField "name='textfield'" "label='A text field'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#tag (Submit "value='Send Form'") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">#end </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>ex02-success.vm</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial Lesson 4.2 - Example 2&lt;/title&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;UI Form Tags Example result using Velocity:&lt;/p&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;ul&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;checkbox: $!checkbox&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;file: $!file&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;hidden: $!hidden&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;password: $!password&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;radio: $!radio&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;select: $!select&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;textarea: $!textarea&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;li&gt;textfield: $!textfield&lt;/li&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/ul&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><font face=Century><span>FormProcessingAction</span><span>.java</span></font><span>：（同</span><span><font face=Century>4.1.1</font></span><span>节的例子）</span></p>
<p><font face=Century><span>FormProcessingAction</span><span>-validation.xml</span></font><span>：（同</span><span><font face=Century>4.1.1</font></span><span>节的例子）</span></p>
<p><span>下面的例子使用</span><span><font face=Century>Velocity</font></span><span>实现</span><span><font face=Century>4.1.1</font></span><span>节中自定义组件的例子，注意</span><span><font face=Century>#param</font></span><span>的用法：</span></p>
<p><span><font face=Century>ex03.vm</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 4.2 - Example 3&lt;/title&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;Custom Component Example:&lt;/p&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">#bodytag (Component "template=/files/templates/components/datefield.vm") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#param ("label" "Date") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#param ("name" "mydatefield") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>#param ("size" "3") </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">#end </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/p&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>/files/templates/components/datefield.vm</font></span><span>：<span>（同</span></span><span><font face=Century>4.1.1</font></span><span>节的例子）</span></p>
<p><span><font face=Century>&nbsp;</font></span></p>
<p><span><font face=Century>4.3</font></span><span>、在</span><span><font face=Century>WebWork</font></span><span>中使用</span><span><font face=Century>Freemaker</font></span><span>（略）</span></p>
<img src ="http://www.blogjava.net/junky/aggbug/126719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:39 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2教程（中文版）(5)(完）</title><link>http://www.blogjava.net/junky/archive/2007/06/28/126718.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126718.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126718.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126718.html</trackback:ping><description><![CDATA[<p><span><font face=Century>5</font></span><span>、</span><span><font face=Century>Interceptors</font></span></p>
<p><span><font face=Century>Interceptors</font></span><span>允许在调用堆栈中包含任意在</span><span><font face=Century>Action</font></span><span>处理之前和</span><span><font face=Century>/</font></span><span>或处理之后执行的代码。这是你的代码简单，更能重用。</span><span><font face=Century>Xwork</font></span><span>和</span><span><font face=Century>WebWork</font></span><span>的大部分特性都是</span><span><font face=Century>Interceptors</font></span><span>实现的。你可以通过外部配置，按照你定义的顺序，对指定的</span><span><font face=Century>Action</font></span><span>应用你自己的</span><span><font face=Century>Interceptors</font></span><span>。</span></p>
<p><span>当你访问</span><span><font face=Century>.action URL</font></span><span>时，</span><span><font face=Century>WebWork</font></span><span>的</span><span><font face=Century>ServletDispatcher</font></span><span>启动</span><span><font face=Century>Action</font></span><span>对象，在</span><span><font face=Century>Action</font></span><span>被执行之前，启动允许被其它的对象中断，这就称</span><span><font face=Century>Interceptor</font></span><span>。在指定的</span><span><font face=Century>Action</font></span><span>之前（或之后）执行</span><span><font face=Century>Interceptor</font></span><span>，只要在</span><span><font face=Century>xwork.xml</font></span><span>中配置属性。下面是</span><span><font face=Century>4.1.1</font></span><span>节中展示</span><span><font face=Century>UI</font></span><span>标记用法的例子的</span><span><font face=Century>Interceptor</font></span><span>配置：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;action name="formProcessing" class="lesson04_01_01.FormProcessingAction"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="input" type="dispatcher"&gt;ex01-index.jsp&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="dispatcher"&gt;ex01-success.jsp&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="validationWorkflowStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/action&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>FormProcessingAction</font></span><span>使用了</span><span><font face=Century>validationWorkflowStack</font></span><span>。这是一个</span><span><font face=Century>Interceptor</font></span><span>堆，组织一组按顺序执行的</span><span><font face=Century>Interceptors</font></span><span>。</span><span><font face=Century>ValidationWorkflowStack</font></span><span>在</span><span><font face=Century>webwork-default.xml</font></span><span>中配置，所以我们只要使用</span><span><font face=Century>&lt;interceptor-ref /&gt;</font></span><span>在</span><span><font face=Century>Action</font></span><span>配置中，或使用</span><span><font face=Century>&lt;default-interceptor-ref /&gt;</font></span><span>在</span><span><font face=Century>package</font></span><span>配置中使用它。下面是</span><span><font face=Century>HelloWebWorld</font></span><span>例子的</span><span><font face=Century>Interceptor</font></span><span>配置：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Default interceptor stack. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;default-interceptor-ref name="defaultStack" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Action: Lesson 03: HelloWebWorldAction. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="helloWebWorld" class="lesson03.HelloWebWorldAction"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="dispatcher"&gt;ex01-success.jsp&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span>看一下</span><span><font face=Century>Interceptor</font></span><span>如何工作的</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>创建</span><span><font face=Century>Interceptor</font></span><span>类，需要扩展</span><span><font face=Century>com.opensymphony.xwork.interceptor.Interceptor</font></span><span>接口（包含在</span><span><font face=Century>xwork-1.0.jar</font></span><span>）；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在</span><span><font face=Century>xwork.xml</font></span><span>文件中，使用</span><span><font face=Century>&lt;interceptors /&gt;</font></span><span>内嵌的</span><span><font face=Century>&lt;interceptor /&gt;</font></span><span>声明</span><span><font face=Century>Interceptor</font></span><span>类；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用</span><span><font face=Century>&lt;interceptor-stack /&gt;</font></span><span>创建</span><span><font face=Century>Interceptor</font></span><span>堆（可选）；</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>使用</span><span><font face=Century>&lt;interceptor-ref /&gt; </font></span><span>或</span><span><font face=Century>&lt;default-interceptor-ref /&gt;</font></span><span>哪些</span><span><font face=Century>Interceptor</font></span><span>由哪个</span><span><font face=Century>Action</font></span><span>使用；前者由指定</span><span><font face=Century>Action</font></span><span>使用，后者为所有</span><span><font face=Century>Action</font></span><span>使用</span></p>
<p><span>（</span><span><font face=Century>1</font></span><span>）</span><font face=Century><span>webwork-default.xml</span></font></p>
<p><span>让我们看一下</span><span><font face=Century>webwork-default.xml</font></span><span>的内容：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result-types&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result-type name="dispatcher" default="true"</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result-type name="redirect" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result-type name="velocity" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.dispatcher.VelocityResult"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result-type name="chain" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.ActionChainResult"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result-type name="xslt" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.views.xslt.XSLTResult"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/result-types&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptors&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="timer" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.TimerInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="logger" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="chain" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="static-params" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="params" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="model-driven" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="component" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="token" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.interceptor.TokenInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="token-session" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="validation" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.validator.ValidationInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="workflow" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="servlet-config" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="prepare" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="conversionError" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-stack name="defaultStack"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="static-params"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="params"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="conversionError"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/interceptor-stack&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-stack name="validationWorkflowStack"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="defaultStack"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="validation"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="workflow"/&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/interceptor-stack&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/interceptors&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span>既然在我们的</span><span><font face=Century>xwork.xml</font></span><span>中包含了</span><span><font face=Century>webwork-default.xml</font></span><span>，我们就可以在</span><span><font face=Century>Action</font></span><span>中使用这些</span><span><font face=Century>Interceptor</font></span><span>或</span><span><font face=Century>Interceptor</font></span><span>堆。下面是这些</span><span><font face=Century>Interceptor</font></span><span>做的事情：</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>timer</font></span></strong><span>：对</span><span><font face=Century>Action</font></span><span>的执行进行计时（包括嵌套的</span><span><font face=Century>Interceptor</font></span><span>和视图）</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>chain</font></span></strong><span>：使前一个</span><span><font face=Century>Action</font></span><span>的属性对当前的</span><span><font face=Century>Action</font></span><span>有效，通常创建</span><span><font face=Century>Action</font></span><span>链</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>static-params</font></span></strong><span>：设置</span><span><font face=Century>xwork.xml</font></span><span>中的参数到</span><span><font face=Century>Action</font></span><span>中（</span><span><font face=Century>&lt;action /&gt;</font></span><span>内嵌的</span><span><font face=Century>&lt;param /&gt;</font></span><span>）</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>params</font></span></strong><span>：设置请求参数（</span><span><font face=Century>POST</font></span><span>或</span><span><font face=Century>GET</font></span><span>）到</span><span><font face=Century>Action</font></span><span>中</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>model-driven</font></span></strong><span>：如果</span><span><font face=Century>Action</font></span><span>实现</span><span><font face=Century>ModelDriven</font></span><span>，将</span><span><font face=Century>getModel()</font></span><span>的结果推到</span><span><font face=Century>Value Stack</font></span><span>中</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>component</font></span></strong><span>：使能和注册组件，使其对</span><span><font face=Century>Action</font></span><span>有效</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>token</font></span></strong><span>：检查</span><span><font face=Century>Action</font></span><span>中的有效</span><span><font face=Century>token</font></span><span>，防止重复提交</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>token-session</font></span></strong><span>：同上，但是当处理到无效</span><span><font face=Century>token</font></span><span>时，在</span><span><font face=Century>session</font></span><span>中保存提交的数据</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>validation</font></span></strong><span>：使用在</span><span><font face=Century>{Action}-vaildation.xml</font></span><span>中定义的验证器进行数据验证</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>workflow</font></span></strong><span>：调用</span><span><font face=Century>Action</font></span><span>类中的</span><span><font face=Century>validate()</font></span><span>方法，在发生错误时，返回</span><span><font face=Century>INPUT</font></span><span>视图；应该和</span><span><font face=Century>validation Interceptor</font></span><span>一起使用</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>servlet-config</font></span></strong><span>：获得对</span><span><font face=Century>HttpServletRequest</font></span><span>和</span><span><font face=Century>HttpServletResponse</font></span><span>的访问（由于绑定到</span><span><font face=Century>Servlet API</font></span><span>，最好不要使用）</span></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>prepare</font></span></strong></p>
<p><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span><font face=Century>conversionError</font></span></strong></p>
<p><span>（</span><span><font face=Century>2</font></span><span>）创建自己的</span><span><font face=Century>Interceptor</font></span></p>
<p><span>如果上面的</span><span><font face=Century>Interceptor</font></span><span>没有适合你的，你可以创建自己的</span><span><font face=Century>Interceptor</font></span><span>。下面的例子假设我们需要一个</span><span><font face=Century>Interceptor</font></span><span>在</span><span><font face=Century>session</font></span><span>中根据当天时间放置一个欢迎信息：</span></p>
<p><span><font face=Century>GreetingInterceptor.java</font></span><span>：</span></p>
<div>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>package</font></span></span><span> lesson05;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>import</font></span></span><span> java.util.Calendar;</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>import</font></span></span><span> com.opensymphony.xwork.interceptor.Interceptor;</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>import</font></span></span><span> com.opensymphony.xwork.ActionInvocation;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>public</font></span></span><span> class GreetingInterceptor </span><span><span><font color=#000066>implements</font></span></span><span> Interceptor {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> void init() { }</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> void destroy() { }</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> </span><span><span><font color=#660066>String</font></span></span><span> intercept(ActionInvocation invocation) </span><span><span><font color=#000066>throws</font></span></span><span> Exception {</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Calendar calendar = Calendar.getInstance();</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#660066>int</font></span></span><span> hour = calendar.get(Calendar.HOUR_OF_DAY);</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#660066>String</font></span></span><span> greeting = (hour &lt; 6) ? "Good evening" : </span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((hour &lt; 12) ? "Good morning": </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((hour &lt; 18) ? "Good afternoon": "Good evening"));</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>invocation.getInvocationContext().getSession().put("greeting", greeting);</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#660066>String</font></span></span><span> result = invocation.invoke();</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>return</font></span></span><span> result;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">}</font></font></span></pre>
</div>
<p><span><font face=Century>xwork.xml</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;xwork&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Include webwork defaults (from WebWork-2.1 JAR). --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;include file="webwork-default.xml" /&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Configuration for the default package. --&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;package name="default" extends="webwork-default"&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptors&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor name="greeting" class="section02.lesson05.GreetingInterceptor" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/interceptors&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;!-- Action: Lesson 5: GreetingInterceptor. --&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;action name="greetingAction" class="lesson05.GreetingAction"&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result name="success" type="velocity"&gt;ex01-result.vm&lt;/result&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;interceptor-ref name="greeting" /&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/action&gt; </font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/package&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/xwork&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>GreetingAction.java</font></span><span>：</span></p>
<div>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>package</font></span></span><span> lesson05;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>import</font></span></span><span> com.opensymphony.xwork.ActionSupport;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span><font color=#000066>public</font></span></span><span> class GreetingAction </span><span><span><font color=#000066>extends</font></span></span><span> ActionSupport {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>public</font></span></span><span> </span><span><span><font color=#660066>String</font></span></span><span> execute() </span><span><span><font color=#000066>throws</font></span></span><span> Exception {</span></font></font></pre>
<pre><font size=2><font face="ＭＳ ゴシック"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span><span><font color=#000066>return</font></span></span><span> SUCCESS;</span></font></font></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">}</font></font></span></pre>
</div>
<p><span><font face=Century>ex01-result.vm</font></span><span>：</span></p>
<div>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;html&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;title&gt;WebWork Tutorial - Lesson 5 - Example 1&lt;/title&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/head&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">#set ($ses = $req.getSession())</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;p&gt;&lt;b&gt;${ses.getAttribute('greeting')}!&lt;/b&gt;&lt;/p&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&nbsp;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/body&gt;</font></font></span></pre>
<pre><span><font size=2><font face="ＭＳ ゴシック">&lt;/html&gt;</font></font></span></pre>
</div>
<p><span><font face=Century>Interceptor</font></span><span>类要扩展</span><span><font face=Century>com.opensymphony.xwork.interceptor.Interceptor</font></span><span>接口：</span><span><font face=Century>init()</font></span><span>在</span><span><font face=Century>Interceptor</font></span><span>初始化时调用；</span><span><font face=Century>destroy()</font></span><span>在销毁时调用；</span><span><font face=Century>intercept(ActionInvocation invocation)</font></span><span>是处理的中心。</span></p>
<p><span><font face=Century>invocation.invoke()</font></span><span>用来调用</span><span><font face=Century>Interceptor</font></span><span>堆中下一个</span><span><font face=Century>Interceptor</font></span><span>，或是</span><span><font face=Century>Action</font></span><span>（如果没有的话）。因此，我们完全可以绕开</span><span><font face=Century>Action</font></span><span>而返回结果（不执行</span><span><font face=Century>Action</font></span><span>）。</span></p>
<p><span>上面的例子是在</span><span><font face=Century>Action</font></span><span>执行之前调用，如果要在</span><span><font face=Century>Action</font></span><span>执行之后调用</span><span><font face=Century>Interceptor</font></span><span>，只要将执行代码放在</span><span><font face=Century>invocation.invoke()</font></span><span>之后。</span></p>
<p><span><font face=Century>WebWork</font></span><span>提供一个实现这种方式的抽象类</span><span><font face=Century>com.opensymphony.xwork.interceptor.AroundInterceptor</font></span><span>，你只要实现它的</span><span><font face=Century>before(ActionInvocation invocation)</font></span><span>和</span><span><font face=Century> after(ActionInvocation dispatcher, String result)</font></span><span>方法就可以了。</span></p>
<br>
<img src ="http://www.blogjava.net/junky/aggbug/126718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:38 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Services带来了什么</title><link>http://www.blogjava.net/junky/archive/2007/05/22/119109.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 22 May 2007 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/05/22/119109.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/119109.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/05/22/119109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/119109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/119109.html</trackback:ping><description><![CDATA[<p align=right><font size=4 16pt><strong>作者：王昱</strong></font></p>
<p><font size=3><strong>摘要</strong>：本文介绍了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的起源和基本原理，分析了在企业应用中</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>带来的冲击和变革，指出了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的一些优缺点以及如何正确地应用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services. </span></font></font></p>
<p><font size=3>无论是在计算机杂志还是在</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Internet</span></font></font><font size=3>上，目前最热门的话题莫过于&#8220;</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services&#8221;</span></font></font><font size=3>。各个平台之间的锋争，各个新产品的发布，众多新标准的制订，大都和</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>有关。</font></p>
<p><font size=3>我的一些朋友是这样的一些人，他们总是用着最新的平台，尝试着最新的技术，他们喜欢变化，喜欢流行，用他们自己的话说，新技术创造新生活！可是，当我的一个朋友，带领他们一个部门的开发人员，花了两个月的，将他们内部的管理系统用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>重新设计和实现了一遍，却发现在实际使用的情况下，系统性能非常糟糕。他提出了这样一个问题：是不是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>现在还处于实验和市场炒作时期，根本没有进入实用的阶段？简单的回答是：</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>不是万能的，它有它的应用范围和优势劣势。</font></p>
<h3 class=cjk><font face=Times New Roman, serif><span lang=en-US>Web Services</span></font>的起源</h3>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US>Web</span></font></font><font size=3>应用的巨大成功和不断发展，使其渗透到商业领域和个人生活的各个方面。人们只要使用浏览器，就可以享受到各种各样的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web</span></font></font><font size=3>服务，例如网上购物，网上交易，网络游戏，预定车票，网上聊天和交友等等。与此同时，由于</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web</span></font></font><font size=3>技术所带来的优势（统一的客户端和较好的维护性），使一些传统的应用纷纷转型到</font><font face=Times New Roman, serif><font size=3><span lang=en-US>BS</span></font></font><font size=3>结构上。</font></p>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US></span></font></font><font size=3>然而，在发展中，逐步暴露了一些问题。所有这些</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web</span></font></font><font size=3>页面都是为人准备的，是让人去阅读，去输入，去判断。因此各种反映视觉效果的内容占用了大量的网络带宽，例如各种图片，字体信息，文字排版样式等。而真正含有高价值的一些信息，被深深埋在这些显示信息中，很难被其他应用和程序所使用。更重要的是，各种</font><font face=Times New Roman, serif><font size=3><span lang=en-US>web</span></font></font><font size=3>服务之间缺少交互和通讯的机制。</font></p>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US></span></font></font><font size=3>程序之间的互相通讯很重要吗？简单举一个例子。</font></p>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US></span></font></font><font size=3>假设你经常去国外出差，在你回国以后，第一件事就是费用报销了。而你们公司有这样的财务规定，所有的报销款，都按报销当天的外汇比价进行结算。因此在你填写报销单的时候必须先填写每一笔在各个国家的花消，然后上网查出当天的外汇比价，填写到报销单上。剩下的事情也许不用你做了，你的报销单填写工具会自动进行换算和统计。</font></p>
<p><font size=3>觉得有什么不妥吗？作为</font><font face=Times New Roman, serif><font size=3><span lang=en-US>IT</span></font></font><font size=3>公司的员工，也许都有一个特点，计算机能做的事情，尽量要计算机去做。外汇比价的查询可以让计算机自动去做嘛！然而，让你的程序自动去网页上查找指定的外汇比价可不是一件容易的事。因为这些网页是给人阅读的，人眼和大脑的反应速度有多快，它们可以从一整页信息中快速定位到你所要的内容，而且无论网页怎样变化和改版都不会带来太大的影响。而应用程序想要做同样的事就差得太远了。因此，现在需要的是专门为应用程序制定的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web</span></font></font><font size=3>服务。</font></p>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US></span></font></font><font size=3>随着应用程序之间通讯的需求越来越大，这就需要制定统一的标准和协议。</font><font face=Times New Roman, serif><font size=3><span lang=en-US>HP</span></font></font><font size=3>公司是最先提出这个观点的公司，他们制定了有关&#8220;</font><font face=Times New Roman, serif><font size=3><span lang=en-US>e-Speak&#8221;</span></font></font><font size=3>的标准来保证应用程序之间的交互，并声称将成为下一代</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Internet</span></font></font><font size=3>信息交互的标准。<span lang="">而随后，</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">MicroSoft</span></span></font></font><font size=3><span lang="">意识到此计划的美好前景，便推出了</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">.Net</span></span></font></font><font size=3><span lang="">战略；</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">IBM</span></span></font></font><font size=3><span lang="">很快就发布了</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services Toolkit(WSTK)</span></span></font></font><font size=3><span lang="">，和</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services Development Environment(WSDE)</span></span></font></font><font size=3><span lang="">，申明对</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的全力支持。与此同时，</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Oracle</span></span></font></font><font size=3><span lang="">也开发出自己的</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Dynamic Services</span></span></font></font><font size=3><span lang="">，并和</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Oracle 8i Release 2</span></span></font></font><font size=3><span lang="">集成在一起。在这以后，</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">W3C</span></span></font></font><font size=3><span lang="">统一制定了</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的各种标准。而</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">SUN</span></span></font></font><font size=3><span lang="">公司在宣布了自己的</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的框架以后，将</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的标准溶入</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">J2EE</span></span></font></font><font size=3><span lang="">的环境，使</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">有了广泛支持的基础和平台。</span></font></p>
<h3 class=cjk><font face=Times New Roman, serif><span lang=en-US>Web Services</span></font>的基本原理</h3>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services </span></font></font><font size=3>是通过一系列标准和协议来保证程序之间的动态连接。其中最基本的协议包括：</font><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP, WSDL, UDDI</span></font></font></p>
<ul>
    <li>
    <p><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP: </span></font></font><font size=3>是&#8220;</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Simple Object Access Protocol&#8221;</span></font></font><font size=3>的缩写，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP</span></font></font><font size=3>是消息传递的协议，它规定了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>之间是怎样传递信息的。简单的说，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP</span></font></font><font size=3>规定了：</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br>1. </span></font></font><font size=3>传递信息的格式为</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>。这就使</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>能够在任何平台上，用任何语言进行实现。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br>2. </span></font></font><font size=3>远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br>3. </span></font></font><font size=3>参数类型和</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>格式之间的映射。这是因为，被调用的方法有时候需要传递一个复杂的参数，例如，一个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Person</span></font></font><font size=3>对象。怎样用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>来表示一个对象参数，也是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP</span></font></font><font size=3>所定义的范围。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br>4. </span></font></font><font size=3>异常处理以及其他的相关信息</font><font face=Times New Roman, serif><font size=3><span lang=en-US>.</span></font></font></p>
    <li>
    <p><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL:</span></font></font><font size=3>是&#8220;</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services Description Language&#8221;</span></font></font><font size=3>的缩写</font><font face=Times New Roman, serif><font size=3><span lang=en-US>.</span></font></font><font size=3>意如其名</font><font face=Times New Roman, serif><font size=3><span lang=en-US>,WSDL</span></font></font><font size=3>是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的定义语言。当你实现了某种服务的时候</font><font face=Times New Roman, serif><font size=3><span lang=en-US>(</span></font></font><font size=3>如</font><font face=Times New Roman, serif><font size=3><span lang=en-US>,</span></font></font><font size=3>股票查询服务</font><font face=Times New Roman, serif><font size=3><span lang=en-US>),</span></font></font><font size=3>为了让别的程序调用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>,</span></font></font><font size=3>你必须告诉大家你的服务的接口</font><font face=Times New Roman, serif><font size=3><span lang=en-US>.</span></font></font><font size=3>例如</font><font face=Times New Roman, serif><font size=3><span lang=en-US>,</span></font></font><font size=3>服务名称，服务所在的机器名称，监听端口号，传递参数的类型</font><font face=Times New Roman, serif><font size=3><span lang=en-US>,</span></font></font><font size=3>个数和顺序</font><font face=Times New Roman, serif><font size=3><span lang=en-US>,</span></font></font><font size=3>返回结果的类型等等</font><font face=Times New Roman, serif><font size=3><span lang=en-US>.</span></font></font><font size=3>这样别的应用程序才能调用你的服务。</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>协议就是规定了有关</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>描述的标准。</font></p>
    <li>
    <p><font face=Times New Roman, serif><font size=3><span lang=en-US>UDDI: </span></font></font><font size=3>是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Universal Description, Discovery, and Integration</span></font></font><font size=3>的缩写。简单说，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>UDDI</span></font></font><font size=3>用于集中存放和查找</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>描述文件，起着目录服务器的作用。</font></p>
    </li>
</ul>
<p align=center><img height=250 src="http://gceclub.sun.com.cn/staticcontent/html/java/webservices_for/webservice_for_html_m126e0ad.gif" width=336 align=bottom border=0 name=图形1></p>
<p><font size=3>如上图，一个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的生命周期是：</font></p>
<ol>
    <li>
    <p><font size=3>实现一个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>，使其能够接受和响应</font><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP</span></font></font><font size=3>消息（现在有很多工具都可以帮助实现）。</font></p>
    <li>
    <p><font size=3>撰写一个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>文件用于描述此</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>。（现在有很多工具可以自动生成</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>文件）。</font></p>
    <li>
    <p><font size=3>将此</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>发布到</font><font face=Times New Roman, serif><font size=3><span lang=en-US>UDDI</span></font></font><font size=3>上。</font></p>
    <li>
    <p><font size=3>其他的应用程序（客户端）从</font><font face=Times New Roman, serif><font size=3><span lang=en-US>UDDI</span></font></font><font size=3>上搜索到你的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>。</font></p>
    <li>
    <p><font size=3>根据你的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>，客户端可以编写程序（现在有很多工具可以自动生成调用程序）调用你的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>。</font></p>
    </li>
</ol>
<h3 class=cjk><font face=Times New Roman, serif><span lang=en-US>Web Services</span></font>的缺点</h3>
<p align=left><font face=Times New Roman, serif><font size=3><span lang=en-US></span></font></font><font size=3>由于是基于</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>的应用，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>与生俱来地在拥有</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>带来的一切优势的同时，不可避免地继承了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>所带来的一些限制。</font></p>
<ul>
    <li>
    <p align=left><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>通常需要大量的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>CPU</span></font></font><font size=3>资源。因为</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>数据要经过多步处理才能被系统使用。首先是效验（</font><font face=Times New Roman, serif><font size=3><span lang=en-US>validate</span></font></font><font size=3>），检查它的格式是否符合</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>的规范，以及根据应用程序定义（</font><font face=Times New Roman, serif><font size=3><span lang=en-US>DTD</span></font></font><font size=3>或</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Schema</span></font></font><font size=3>）检查是否符合语义上的规范；然后还要进行解析（</font><font face=Times New Roman, serif><font size=3><span lang=en-US>parse</span></font></font><font size=3>），从</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>文档分解出单个的元素；最后还要转换成应用程序所需要的二进制表达（例如，把&#8220;</font><font face=Times New Roman, serif><font size=3><span lang=en-US>12&#8221; </span></font></font><font size=3>转换成整型</font><font face=Times New Roman, serif><font size=3><span lang=en-US>12</span></font></font><font size=3>的二进制表示）。</font></p>
    <li>
    <p align=left><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>还意味着占用较多的内存资源。在进行</font><font face=Times New Roman, serif><span lang=en-US><font size=3>XML</font></span></font><font size=3>解析的时候，会产生大量的临时内存对象。特别是在处理</font><font face=Times New Roman, serif><span lang=en-US><font size=3>DOM</font></span></font><font size=3>对象的时候。这些大量的临时对象对于象</font><font face=Times New Roman, serif><span lang=en-US><font size=3>JAVA</font></span></font><font size=3>这类自动回收内存的语言和系统其实是一种负担，大量的临时对象将会使系统每隔一段时间就会进行内存回收，从而降低系统的性能。当然，现在有的</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>的产品（如</font><font face=Times New Roman, serif><span lang=en-US><font size=3>axis</font></span></font><font size=3>）采用了</font><font face=Times New Roman, serif><span lang=en-US><font size=3>SAX</font></span></font><font size=3>技术，大大减少了内存的占用量。详细信息请参考：（</font><font face=Times New Roman, serif><span lang=en-US><u><a href="http://xml.apache.org/axis/index.html"><font color=#000000 size=3>http://xml.apache.org/axis/index.html</font></a></u></span></font><font size=3>）。</font></p>
    <li>
    <p align=left><font size=3>网络资源的消耗也是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>应用的一些限制。因为基于</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>数据的传递通常数据量要比二进制的协议（如</font><font face=Times New Roman, serif><font size=3><span lang=en-US>RMI/IIOP</span></font></font><font size=3>）要大的多。这种额外的消耗在网络资源比较紧张或网络传输比较频繁的应用中会产生一定的影响。</font></p>
    </li>
</ul>
<p align=left><font size=3>除了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>带来的限制，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>本身也具有一些缺点：</font></p>
<ul>
    <li>
    <p align=left><font size=3>到目前为止，</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>还可以说是一种无状态（</font><font face=Times New Roman, serif><span lang=en-US><font size=3>stateless</font></span></font><font size=3>）的服务。</font><font face=Times New Roman, serif><span lang=en-US><font size=3><br></font></span></font><font size=3>所谓</font><font face=Times New Roman, serif><span lang=en-US><font size=3>stateless</font></span></font><font size=3>就意味着不保存客户端服务调用者的任何信息。这是由</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>的本质所决定的。</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>在本质上是要为应用程序之间提供数据通讯的标准，为企业应用之间动态地提供大颗粒度的服务，所以</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>并不适合于非常精细的基于会话的方法调用以及复杂的事务（</font><font face=Times New Roman, serif><span lang=en-US><font size=3>transaction</font></span></font><font size=3>）处理之中。</font><font face=Times New Roman, serif><span lang=en-US><font size=3><br></font></span></font><font size=3>也许有人会对我这点提出异议！因为，现在有很多</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>的产品（如</font><font face=Times New Roman, serif><span lang=en-US><font size=3>WASD</font></span></font><font size=3>），不但可以保存</font><font face=Times New Roman, serif><span lang=en-US><font size=3>session</font></span></font><font size=3>的信息，使服务成为有状态（</font><font face=Times New Roman, serif><span lang=en-US><font size=3>stateful</font></span></font><font size=3>）的服务，而且还实现了</font><font face=Times New Roman, serif><span lang=en-US><font size=3>remote interface</font></span></font><font size=3>，可以在</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Web Services</font></span></font><font size=3>的会话中传递远程对象的句柄，让客户端可以操纵递远程对象（详细信息请参考：</font><font face=Times New Roman, serif><span lang=en-US><u><a href="http://www.systinet.com/"><font color=#000000 size=3>http://www.systinet.com</font></a></u><font size=3> </font></span></font><font size=3>）。原理上说，这并不难实现，因为在</font><font face=Times New Roman, serif><span lang=en-US><font size=3>XML</font></span></font><font size=3>数据中，可以互相传送任何数据，包括</font><font face=Times New Roman, serif><span lang=en-US><font size=3>sessionID</font></span></font><font size=3>和</font><font face=Times New Roman, serif><span lang=en-US><font size=3>transactionID</font></span></font><font size=3>，有了这些</font><font face=Times New Roman, serif><span lang=en-US><font size=3>ID</font></span></font><font size=3>，从技术角度上说，实现有状态（</font><font face=Times New Roman, serif><span lang=en-US><font size=3>stateful</font></span></font><font size=3>）的服务和事务处理并不复杂。但是，这样功能缺少标准的支持，当前版本的</font><font face=Times New Roman, serif><span lang=en-US><font size=3>WSDL</font></span></font><font size=3>还无法表示这些复杂的服务。在企业内部，你可以任意使用这些特殊的功能，可以自己定义会话状态的交互协议，因为服务者和服务调用者之间的通讯都在你的控制之中；然而要将这些服务发布到</font><font face=Times New Roman, serif><span lang=en-US><font size=3>Internet</font></span></font><font size=3>上，其他的应用程序是无法根据标准去识别这些特殊功能。</font></p>
    <li>
    <p align=left><font size=3>数据绑定也存在一些不足。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>因为所有的数据传递都用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>格式，因此，需要在二进制数据和</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>数据之间有个转换。但是，并不是所有的二进制数据都能方便地用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>来表示，并不是所有的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>JAVA</span></font></font><font size=3>对象都能被</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>所表示。因此，经常在转换过程中会出现语义丢失的情况。</font></p>
    <li>
    <p align=left><font size=3>技术要求高，学习曲线较长。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>每一个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的产品，都有丰富的工具，能够根据</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的定义（如</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>文件）方便地生成客户端的程序；能够将一般的服务程序，很容易就包装成</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>服务。因此，各个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的产品都声称自己的平台容易使用，根本不需要了解</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>，也不需要了解什么</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>UDDI</span></font></font><font size=3>，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>SOAP</span></font></font><font size=3>就能使用发布</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>。特别是一个朋友告诉我，他在什么都不了解的情况下，用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>.NET</span></font></font><font size=3>花了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>15</span></font></font><font size=3>分钟就发布了一个</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>！</font><font face=Times New Roman, serif><font size=3><span lang=en-US> <br></span></font></font><font size=3>千万不要醉心于这种简便，这对于简单的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Demo</span></font></font><font size=3>也许是对的，可是对于真正意义上严肃的应用，一定要了解</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的各个方面，设计整体结构和解决方案，还要根据具体的应用调整性能。所有这些都需要对</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>知识的全面掌握。</font></p>
    </li>
</ul>
<h3 class=cjk>什么应用适合<font face=Times New Roman, serif><span lang=en-US>Web Services</span></font></h3>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>这么多的缺点是不是让你很泄气？其实，已经有很多成功的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的应用和越来越多的开发商的加盟，证明</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>一定会成为新一代</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WEB</span></font></font><font size=3>信息通讯的主流。经过不断的发展，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>一定能克服自身的弱点，得到更广泛的应用。但就目前来说，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>比较适合用于下列形式的应用：</font></p>
<ul>
    <li>
    <p><font size=3>基于</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WAN</span></font></font><font size=3>和</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Internet</span></font></font><font size=3>的应用</font></p>
    </li>
</ul>
<p><font size=3>要在</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Internet</span></font></font><font size=3>上创建基于二进制协议的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>RMI/IIOP</span></font></font><font size=3>的应用，一般都会遇上一个大麻烦</font><font face=Times New Roman, serif><font size=3><span lang=en-US>--</span></font></font><font size=3>防火墙。客户端浏览器极大可能在</font><font face=Times New Roman, serif><font size=3><span lang=en-US>ISP</span></font></font><font size=3>防火墙后，大多数防火墙都只能允许和外部的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>HTTP</span></font></font><font size=3>连接，因此想要</font><font face=Times New Roman, serif><font size=3><span lang=en-US>ISP</span></font></font><font size=3>防火墙后的客户端能和防火墙外的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>RMI/IIOP</span></font></font><font size=3>的应用端口进行连接的话，就要改变</font><font face=Times New Roman, serif><font size=3><span lang=en-US>ISP</span></font></font><font size=3>的安全策略，让客户端能够连接除了</font><font face=Times New Roman, serif><font size=3><span lang=en-US>80</span></font></font><font size=3>以外的其他端口。可是当运行</font><font face=Times New Roman, serif><font size=3><span lang=en-US>RMI/IIOP</span></font></font><font size=3>的应用的服务器为了安全也在防火墙之后的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>DMZ</span></font></font><font size=3>中的话，那这个连接就更加复杂了，要跨越两个防火墙。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>而</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>由于使用的是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>HTTP</span></font></font><font size=3>协议，传递的是纯文本的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>数据，因此拥有穿透防火墙的良好性能。</font></p>
<ul>
    <li>
    <p><font size=3>基于异构平台的应用</font></p>
    </li>
</ul>
<p><font face=Times New Roman, serif><font size=3><span lang=en-US>XML</span></font></font><font size=3>语言本身就是跨平台、跨语言的数据表示方法，在加上通用的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>HTTP</span></font></font><font size=3>等协议，使得</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>天生就适用于基于异构平台的应用。如果你的客户端包含了各种不同的平台，例如，你希望你的服务即可以被</font><font face=Times New Roman, serif><font size=3><span lang=en-US>JAVA</span></font></font><font size=3>程序所调用，又可以由</font><font face=Times New Roman, serif><font size=3><span lang=en-US>VB</span></font></font><font size=3>和</font><font face=Times New Roman, serif><font size=3><span lang=en-US>COM</span></font></font><font size=3>程序所调用。你有两种选择：一种是为不同的平台提供相应的</font><font face=Times New Roman, serif><font size=3><span lang=en-US>API</span></font></font><font size=3>，还要为不同的语言提供</font><font face=Times New Roman, serif><font size=3><span lang=en-US>API</span></font></font><font size=3>；如果提供</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>，所有平台和语言都可以调用了！</font></p>
<ul>
    <li>
    <p><font size=3>需要强安全特性的应用</font></p>
    </li>
</ul>
<p><font size=3>很多人都认为，安全性是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的弱项。其实不然，经过不断的完善和各种新的协议的出台，</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>完全可以用于安全性很强的应用环境下。并且，由于</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>使用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>HTTP</span></font></font><font size=3>协议进行传输，所以可以和容易就使用已经很成熟的基于</font><font face=Times New Roman, serif><font size=3><span lang=en-US>HTTP</span></font></font><font size=3>的各种安全技术。</font></p>
<ul>
    <li>
    <p><font face=Times New Roman, serif><font size=3><span lang=en-US>EAI</span></font></font><font size=3>（企业应用集成）</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>这是目前</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>应用最看好的方向之一。大多数企业内部都有着各种各样的应用系统，它们是在不同的领导在任期间，由不同的软件开发商开发，因此运行在不同的平台和系统上，系统的开发语言也各不相同。由于现代企业信息自动化要求的提高，各个系统之间的互动和相互通讯便提到日程上。因此，保护原有投资，重用遗留系统是当前很多中大型企业的重要任务。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>由于遗留系统的运行平台是异构环境，因此企业应用集成的代价一般来说是很高的。但如果使用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>作为应用集成的手段，将会大大降低集成的消耗。</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>与平台和语言无关的特性，以及各种平台和环境下的开发工具都是企业应用集成的利器。</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>另外，在开发新的应用系统的时候，仍然需要考虑和其他系统的集成，需要考虑调用其他系统的功能，和被其他系统所调用。使用</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>作为系统与外部交流的接口，能够使新的系统和别的系统之间保持松耦合的关系，保持较高的可扩展性。</font></p>
    <li>
    <p><font size=3>行业内部</font><font face=Times New Roman, serif><font size=3><span lang=en-US>B2B</span></font></font><font size=3>应用</font><font face=Times New Roman, serif><font size=3><span lang=en-US><br></span></font></font><font size=3>行业内部的应用是</font><font face=Times New Roman, serif><font size=3><span lang=en-US>Web Services</span></font></font><font size=3>的另外一个方向。因为在一个行业中，商业业务是很相似的，因此在行业内部很容易形成服务的标准，使所有的业内企业共同遵守；但怎样实现服务和使用什么样的系统，决定权在于各个企业自己。例如，电信运营商之间的结算服务，银行之间的转帐服务等都可以形成行业标准，以</font><font face=Times New Roman, serif><font size=3><span lang=en-US>WSDL</span></font></font><font size=3>的形式公布出来。各个企业之间可以选择不同的平台进行服务的实现。</font></p>
    </li>
</ul>
<h3 class=cjk>提高<font face=Times New Roman, serif><span lang=en-US>Web Services</span></font>的性能</h3>
<p><font size=3>要想提高</font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">应用的性能，需要对整个系统做全盘的考虑。一般来说，有以下几点需要注意：</span></font></p>
<ol>
    <li>
    <p><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的颗粒度</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang=""><br></span></span></font></font><font size=3><span lang="">选择</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的颗粒度是提高</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">应用的性能的主要手段。因为</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">使用的传输协议为</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">HTTP</span></span></font></font><font size=3><span lang="">或</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">SMTP</span></span></font></font><font size=3><span lang="">等，这些协议都是面向无状态的连接协议，每一个请求都要建立一个新的连接。因此</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">的调用不能象数据库</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">JDBC</span></span></font></font><font size=3><span lang="">（</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">ODBC</span></span></font></font><font size=3><span lang="">）接口一样可以进行精细而复杂的方法调用（例如，先获得</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Connection</span></span></font></font><font size=3><span lang="">，再获得结果集，然后一行一行获取结果）。</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">比较适用于大颗粒度的应用，在一个调用中便获得所有的信息（比如说银行之间的转帐，在一次调用中就将包括金额和认证等所有的信息都传输过去）。</span></font></p>
    <li>
    <p><font size=3><span lang="">谨慎使用</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">接口</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang=""><br></span></span></font></font><font size=3><span lang="">系统之间的接口可以使用</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">，这样可以增加系统的灵活性；但不要使用</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">作为系统内部的接口，因为这不会带来任何好处，尽量使用二进制作为系统内部的接口，避免不必要的</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">文档的解析和效验；在处理</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">的时候，尽快将</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">转换成内部对象，</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">XML</span></span></font></font><font size=3><span lang="">的传递只会增加系统的开销。</span></font></p>
    <li>
    <p><font size=3><span lang="">最大可能性使用</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">CACHE<br></span></span></font></font><font size=3><span lang="">当有些信息是只读的，或者在一段时间内保持不变，就可以使用</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">CACHE</span></span></font></font><font size=3><span lang="">。无论是客户端的</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">CACHE</span></span></font></font><font size=3><span lang="">还是服务器端的</span></font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">CACHE</span></span></font></font><font size=3><span lang="">，都能大大提高系统的性能</span></font></p>
    </li>
</ol>
<h3 class=cjk>总结</h3>
<p><font size=3>一旦</font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">得到更加广泛的应用，使得各种服务可以动态查找和定位，这样就提供了不同设备之间各种各样的信息交互方式，将会大大改变商业运做的模式和信息交流的风格。</span></font></p>
<p align=left><span lang=""><font size=3>你可以使用别人已经成熟的功能来使自己提供更好的服务，例如</font></span><font face=Times New Roman, serif><span lang=en-US><span lang=""><font size=3>google</font></span></span></font><span lang=""><font size=3>，它的搜索引擎可以通过</font></span><font face=Times New Roman, serif><span lang=en-US><span lang=""><font size=3>Web Services</font></span></span></font><span lang=""><font size=3>来访问。这就意味着在你的系统中可以方便的嵌入使用</font></span><font face=Times New Roman, serif><span lang=en-US><span lang=""><font size=3>google</font></span></span></font><span lang=""><font size=3>的强大搜索功能，而不论你的系统是运行在什么平台上，使</font></span><font face=Times New Roman, serif><span lang=en-US><span lang=""><font size=3>google</font></span></span></font><span lang=""><font size=3>的搜索引擎成为你系统的一部分，（请参考</font></span><font face=Times New Roman, serif><span lang=en-US><u><a href="http://www.google.com/apis/"><em><font size=3><font face=Arial, color=#000000 sans-serif>http://www.google.com/apis/</font></font></em></a></u></span></font><font size=3>）。站在别人的肩膀上，毕竟要看得远些！</font></p>
<p align=left><font size=3>面对</font><font face=Times New Roman, serif><font size=3><span lang=en-US><span lang="">Web Services</span></span></font></font><font size=3><span lang="">，</span>你现在可以不行动，但你一定要准备好！</font></p>
</t
<div style="DISPLAY: none">
<img src ="http://www.blogjava.net/junky/aggbug/119109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-05-22 13:43 <a href="http://www.blogjava.net/junky/archive/2007/05/22/119109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>采用dwr+ajax和struts开发文件上传进度条(转)</title><link>http://www.blogjava.net/junky/archive/2007/04/16/111027.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 16 Apr 2007 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/04/16/111027.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/111027.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/04/16/111027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/111027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/111027.html</trackback:ping><description><![CDATA[<p><strong><span>编写监听器以及相关的类</span></strong><strong></strong></p>
<p><span>不用自己写了，源码可以从</span></p>
<p><span><a href="http://www.telio.be/blog/2006/01/06/ajax-upload-progress-monitor-for-commons-fileupload-example">http://www.telio.be/blog/2006/01/06/ajax-upload-progress-monitor-for-commons-fileupload-example</a></span><span>里面下载，</span></p>
<p><span>下载地址</span></p>
<p><span><a href="http://www.telio.be/blog/wp-content/uploads/2006/01/ajax-upload-1.0.war">http://www.telio.be/blog/wp-content/uploads/2006/01/ajax-upload-1.0.war</a></span></p>
<p><span>下载完之后，你需要解包，在命令行中：</span></p>
<p><span>jar xvf ajax-upload-1.0.war</span></p>
<p><span>源码就在</span><span>\WEB-INF\src</span><span>下面</span></p>
<p><span>将要用到的文件有</span><span>resources</span><span>文件夹下，</span><span>\WEB-INF\</span><span>下面的</span><span>dwr.xml</span><span>和</span><span>lib</span><span>下面的</span><span>jar</span><span>文件</span></p>
<p><strong><span>上传页面</span></strong><strong></strong></p>
<p><span>在上面解开的包里面有</span><span>index.jsp</span><span>这个是上传页面，</span><span>upload.jsp</span><span>负责上传，</span><span>resources</span><span>包里面包含了</span><span>dwr</span><span>与服务器通讯的</span><span>javascript</span><span>脚本，你需要把</span><span>index.jsp</span><span>的</span><span>form</span><span>中的</span><span>action</span><span>换成你的</span><span>struts action</span><span>即可，然后把</span><span>form</span><span>中的</span><span>file</span><span>名改成你</span><span>actionform</span><span>中的</span><span>file</span><span>属性名，把页面中剩余的</span><span>file</span><span>去掉</span></p>
<p><span>index.jsp</span><span>上传页面示例代码：</span></p>
<p align=left><span>&lt;%@ </span><span>page </span><span>contentType</span><span>=</span><span>"text/html; charset=gb2312" </span><span>language</span><span>=</span><span>"java"</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>import</span><span>=</span><span>"java.util.*" </span><span>errorPage</span><span>=</span><span>""</span><span>%&gt;</span></p>
<p align=left><span>&lt;%</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>String path=request.getContextPath();</span></p>
<p align=left><span>%&gt;</span></p>
<p align=left><span>&lt;</span><span>html </span><span>locale</span><span>=</span><span>"true"</span><span>&gt;</span></p>
<p align=left><span>&lt;</span><span>head</span><span>&gt;</span></p>
<p align=left><span>&lt;</span><span>SCRIPT </span><span>language</span><span>=</span><span>javascript</span><span>&gt;</span></p>
<p align=left><span>function </span><span>check_file() </span><span>{</span></p>
<p align=left><span>&nbsp;var </span><span>strFileName=document.forms(0).file;</span></p>
<p align=left><span>&nbsp;&nbsp;</span><span>if </span><span>(strFileName.value==</span><span>""</span><span>)</span><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>alert(</span><span>"</span><span>请选择要上传的文件</span><span>"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>return false</span><span>;</span></p>
<p align=left><span>&nbsp;</span><span>}</span></p>
<p align=left><span>&nbsp;</span><span>startProgress();</span></p>
<p align=left><span>}</span></p>
<p align=left><span>function </span><span>loadmessage()</span><span>{&nbsp;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;%</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>if</span></strong><span> (request.getAttribute(</span><span>"message"</span><span>) != </span><strong><span>null</span></strong><span>) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>%&gt;</span><span>&nbsp;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>window.alert(</span><span>"</span><span>&lt;%=</span><span>request.getAttribute(</span><span>"message"</span><span>)</span><span>%&gt;</span><span>"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>window.returnValue=</span><span>"yes"</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;%</span><span>}</span><span>%&gt;</span></p>
<p align=left><span>}</span></p>
<p align=left><span>&lt;/</span><span>SCRIPT</span><span>&gt;</span></p>
<p align=left><span>&lt;</span><span>title</span><span>&gt;</span><span>上传</span><span>&lt;/</span><span>title</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>script </span><span>src</span><span>=</span><span>'<span>&lt;%=</span><span>path</span><span>%&gt;</span><span>/resources/js/upload.js</span>'<span>&gt;</span><span> </span><span>&lt;/</span><span>script</span><span>&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>script </span><span>src</span><span>=</span><span>'<span>&lt;%=</span><span>path</span><span>%&gt;</span><span>/dwr/interface/UploadMonitor.js</span>'<span>&gt;</span><span> </span><span>&lt;/</span><span>script</span><span>&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>script </span><span>src</span><span>=</span><span>'<span>&lt;%=</span><span>path</span><span>%&gt;</span><span>/dwr/engine.js</span>'<span>&gt;</span><span> </span><span>&lt;/</span><span>script</span><span>&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>script </span><span>src</span><span>=</span><span>'<span>&lt;%=</span><span>path</span><span>%&gt;</span><span>/dwr/util.js</span>'<span>&gt;</span><span> </span><span>&lt;/</span><span>script</span><span>&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>style </span><span>type</span><span>=</span><span>"text/css"</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>#progressBar</span><span> { </span><span>padding-top</span><span>: </span><span>5px</span><span>; }</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>#progressBarBox</span><span> { </span><span>width</span><span>: </span><span>350px</span><span>; </span><span>height</span><span>: </span><span>20px</span><span>; </span><span>border</span><span>: </span><span>1px inset</span><span>; </span><span>background</span><span>: </span><span>#eee</span><span>;}</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>#progressBarBoxContent</span><span> { </span><span>width</span><span>: </span><span>0</span><span>; </span><span>height</span><span>: </span><span>20px</span><span>; </span><span>border-right</span><span>: </span><span>1px solid #444</span><span>; </span><span>background</span><span>: </span><span>blue</span><span>; }</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&lt;/</span><span>style</span><span>&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>LINK </span><span>href</span><span>=</span><span>"<span>&lt;%=</span><span>path</span><span>%&gt;</span><span>/css/style.css</span>"<span> </span><span>type</span><span>=</span><span>"text/css" </span><span>rel</span><span>=</span><span>"stylesheet"</span><span>&gt;</span><span> </span></span></p>
<p align=left>&nbsp;</p>
<p align=left><span>&lt;</span><span>meta </span><span>http-equiv</span><span>=</span><span>"Content-Type" </span><span>content</span><span>=</span><span>"text/html; charset=gb2312"</span><span>&gt;</span></p>
<p align=left><span>&lt;/</span><span>head</span><span>&gt;</span></p>
<p align=left><span>&lt;</span><span>style </span><span>type</span><span>=</span><span>"text/css"</span><span>&gt;</span></p>
<p align=left><span>&lt;!--</span></p>
<p align=left><span>body</span><span> {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>margin-left</span><span>: </span><span>0px</span><span>;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>margin-top</span><span>: </span><span>0px</span><span>;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>margin-right</span><span>: </span><span>0px</span><span>;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>margin-bottom</span><span>: </span><span>0px</span><span>;</span></span></p>
<p align=left>&nbsp;</p>
<p align=left><span>}</span></p>
<p align=left><span>--&gt;</span></p>
<p align=left><span>&lt;/</span><span>style</span><span>&gt;</span></p>
<p align=left><span>&lt;</span><span>body </span><span>leftmargin</span><span>=</span><span>"0" </span><span>topmargin</span><span>=</span><span>"0" </span><span>marginwidth</span><span>=</span><span>"0" </span><span>marginheight</span><span>=</span><span>"0" </span><span>onLoad</span><span>=</span><span>"loadmessage()"</span><span>&gt;</span></p>
<p align=left><span>&lt;</span><span>form </span><span>name</span><span>=</span><span>"form" </span><span>method</span><span>=</span><span>"post" </span><span>action</span><span>=</span><span>"<span>&lt;%=</span><span>path</span><span>%&gt;</span><span>/upload.do?method=upload</span>"<span> </span><span>enctype</span><span>=</span><span>"multipart/form-data"&nbsp;</span><span>onSubmit</span><span>=</span><span>"return check_file()"</span><span>&gt;</span></span></p>
<p align=left><span>&nbsp;</span><span>&lt;</span><span>table </span><span>width</span><span>=</span><span>"60%"&nbsp;</span><span>border</span><span>=</span><span>"0" </span><span>cellspacing</span><span>=</span><span>"1"</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>tr </span><span>background-color</span><span>=</span><span>" #E<st1:chmetcnv w:st="on" unitname="F" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7F</st1:chmetcnv>5FE"</span><span>&gt;</span><span> </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>td </span><span>width</span><span>=</span><span>"30%" </span><span>align</span><span>=</span><span>"right"</span><span>&gt;</span><span>从文件导入：</span><span>&lt;/</span><span>td</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>td </span><span>width</span><span>=</span><span>"51%"</span><span>&gt;&lt;</span><span>input </span><span>type</span><span>=</span><span>"file" </span><span>name</span><span>=</span><span>"file" </span><span>class</span><span>=</span><span>"input"</span><span>&gt;&lt;/</span><span>td</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>td </span><span>width</span><span>=</span><span>"27%"</span><span>&gt;&lt;</span><span>input </span><span>type</span><span>=</span><span>"submit" </span><span>name</span><span>=</span><span>"files" </span><span>class</span><span>=</span><span>"button_4" </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>style</span><span>=</span><span>"border-style:None;width:71px;" </span><span>value</span><span>=</span><span>"</span><span>确定</span><span>" </span><span>id</span><span>=</span><span>"uploadbutton"</span><span>&gt;</span><span> </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span><span>&lt;/</span><span>td</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>tr</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>tr </span><span>align</span><span>=</span><span>"left" </span><span>background-color</span><span>=</span><span>" #E<st1:chmetcnv w:st="on" unitname="F" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0">7F</st1:chmetcnv>5FE"</span><span>&gt;</span><span> </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>td </span><span>colspan</span><span>=</span><span>"3"</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>&lt;</span><span>div </span><span>id</span><span>=</span><span>"progressBar" </span><span>style</span><span>=</span><span>"display: none;"</span><span>&gt;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>div </span><span>id</span><span>=</span><span>"theMeter"</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>div </span><span>id</span><span>=</span><span>"progressBarText"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>div </span><span>id</span><span>=</span><span>"progressBarBox"</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;</span><span>div </span><span>id</span><span>=</span><span>"progressBarBoxContent"</span><span>&gt;&lt;/</span><span>div</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>div</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>div</span><span>&gt;</span><span> </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>&lt;/</span><span>td</span><span>&gt;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>&lt;/</span><span>tr</span><span>&gt;</span></p>
<p align=left><span>&nbsp;</span><span>&lt;/</span><span>table</span><span>&gt;</span></p>
<p align=left><span>&lt;/</span><span>form</span><span>&gt;</span></p>
<p align=left><span>&lt;/</span><span>body</span><span>&gt;</span></p>
<p><span>&lt;/</span><span>html</span><span>&gt;</span></p>
<p><span>并且要修改一下</span><span>\resources\js</span><span>中的</span><span>upload.js</span><span>文件：</span></p>
<p><span>/* Licence:</span></p>
<p><span>*<span>&nbsp;&nbsp; </span>Use this however/wherever you like, just don't blame me if it breaks anything.</span></p>
<p><span>*</span></p>
<p><span>* Credit:</span></p>
<p><span>*<span>&nbsp;&nbsp; </span>If you're nice, you'll leave this bit:</span></p>
<p><span>*</span></p>
<p><span>*<span>&nbsp;&nbsp; </span>Class by Pierre-Alexandre Losson -- http://www.telio.be/blog</span></p>
<p><span>*<span>&nbsp;&nbsp; </span>email : plosson@users.sourceforge.net</span></p>
<p><span>*/</span></p>
<p><span>function refreshProgress()</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>UploadMonitor.getUploadInfo(updateProgress);</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>function updateProgress(uploadInfo)</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>if (uploadInfo.inProgress)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>document.getElementById('uploadbutton').disabled = true;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>document.getElementById('file').disabled = true;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>var fileIndex = uploadInfo.fileIndex;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>var progressPercent = Math.ceil((uploadInfo.bytesRead / uploadInfo.totalSize) * 100);</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>document.getElementById('progressBarText').innerHTML = '</span><span>文件读取进度</span><span>: ' + progressPercent + '%';</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>document.getElementById('progressBarBoxContent').style.width = parseInt(progressPercent * 3.5) + 'px';</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>window.setTimeout('refreshProgress()', 1000);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>else</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>document.getElementById('uploadbutton').disabled = false;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>document.getElementById('file').disabled = false;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>return true;</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>function startProgress()</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>document.getElementById('progressBar').style.display = 'block';</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>document.getElementById('progressBarText').innerHTML = '</span><span>文件读取进度</span><span>: 0%';</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>document.getElementById('uploadbutton').disabled = true;</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>// wait a little while to make sure the upload has started ..</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>window.setTimeout("refreshProgress()", 1000);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>return true;</span></p>
<p><span>}</span></p>
<p><strong><span>配置</span></strong><strong><span>dwr.xml</span></strong></p>
<p><font size=3><span>放在</span><span><font face="Times New Roman">/WEB-INF/</font></span><span>下面</span><strong></strong></font></p>
<p><span><font face="Times New Roman" size=3>&lt;dwr&gt;</font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>&lt;allow&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;create creator="new" javascript="UploadMonitor"&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param name="class" value="be.telio.mediastore.ui.upload.UploadMonitor"/&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/create&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;convert converter="bean" match="be.telio.mediastore.ui.upload.UploadInfo"/&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>&lt;/allow&gt;</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&lt;/dwr&gt;</font></span></p>
<p><strong><span>web.xml</span></strong><strong><span>中配置</span></strong><strong><span>dwr</span></strong><font size=3><span>，省略</span><span><font face="Times New Roman">spring</font></span><span>，</span><span><font face="Times New Roman">struts</font></span><span>等的配置</span></font></p>
<p><span><font face="Times New Roman" size=3>&lt;servlet&gt;</font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;display-name&gt;DWR Servlet&lt;/display-name&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;debug&lt;/param-name&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;false&lt;/param-value&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;logLevel&lt;/param-name&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;WARN&lt;/param-value&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&lt;/servlet&gt;</font></span></p>
<p><span><font face="Times New Roman" size=3>&lt;servlet-mapping&gt;</font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&lt;/servlet-mapping&gt;</font></span></p>
<p><strong><span>编写</span></strong><strong><span>struts</span></strong><strong><span>的</span></strong><strong><span>MultipartRequestHandler</span></strong><font size=3><span><font face="Times New Roman"> </font></span><span>：</span><span><font face="Times New Roman">AjaxMultipartRequestHandler</font></span></font></p>
<p><font size=3><span>实现</span><span><font face="Times New Roman"> MultipartRequestHandler</font></span><span>接口并在</span><span><font face="Times New Roman">struts-config.xml</font></span><span>的</span><span><font face="Times New Roman">controller</font></span><span>中替换默认的</span><span><font face="Times New Roman">multipartClass</font></span></font></p>
<p><span><font face="Times New Roman" size=3>&lt;controller&gt;</font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;set-property property="multipartClass"</font></font></span></p>
<p><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="org.springside.components.ajaxupload.AjaxMultipartRequestHandler" /&gt;</font></font></span></p>
<p><span><font face="Times New Roman" size=3>&lt;/controller&gt;</font></span></p>
<p><font size=3><span>其实这个类</span><span><font face="Times New Roman">AjaxMultipartRequestHandler</font></span><span>编写很简单，把</span><span><font face="Times New Roman">struts</font></span><span>的</span><span><font face="Times New Roman">src</font></span><span>源码中的</span><span><font face="Times New Roman">org.apache.struts.upload.CommonsMultipartRequestHandler.java</font></span><span>修改一下就可以了<strong>：</strong></span></font></p>
<p align=left><span>在</span><strong><span>public</span></strong><span> </span><strong><span>void</span></strong><span> <span>handleRequest</span>(HttpServletRequest request)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>throws</span></strong><span> ServletException {</span></p>
<p align=left><span>方法中把定义</span><span>factory</span><span>之前的那几行代码注释掉然后写入</span></p>
<p align=left><span>UploadListener listener = </span><strong><span>new</span></strong><span> UploadListener(request, 30);</span></p>
<p><span>FileItemFactory factory = </span><strong><span>new</span></strong><span> MonitoredDiskFileItemFactory(</span><u><span>listener</span></u><span>);</span></p>
<p><span>之后再注释掉</span></p>
<p><span>// upload.setSizeThreshold((int) getSizeThreshold(ac));</span></p>
<p><span>// upload.setRepositoryPath(getRepositoryPath(ac));</span></p>
<p><span>这个类就算写完了</span></p>
<p><strong><span>编写</span></strong><strong><span>struts</span></strong><strong><span>上传类</span></strong><strong></strong></p>
<p><span>就用你原来编写的</span><span>struts</span><span>上传类</span></p>
<p><span>上传方法代码段示例：</span></p>
<p align=left><span>/**</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>*</span><span> </span><span>上传文件</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>*/</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><strong><span>public</span></strong><span> ActionForward upload(ActionMapping mapping, ActionForm form,</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HttpServletRequest request, HttpServletResponse response)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>throws</span></strong><span> Exception {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String path = getServlet().getServletContext().getRealPath(</span><span>"/"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><span>log</span></em><span>.info(</span><span>"&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;path:"</span><span> + path);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>if</span></strong><span> (form == </span><strong><span>null</span></strong><span>) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>return</span></strong><span> mapping.findForward(</span><span>"success"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FileUploadForm fuf = (FileUploadForm) form;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FormFile file = fuf.getFile();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>try</span></strong><span> {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>if</span></strong><span> (file == </span><strong><span>null</span></strong><span>) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><span>log</span></em><span>.info(</span><span>"&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;file</span><span>为空</span><span>"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>return</span></strong><span> mapping.findForward(</span><span>"success"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span><strong><span>catch</span></strong><span> (Exception e) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>e.printStackTrace();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String fname = file.getFileName();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>int</span></strong><span> t = 0;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>for</span></strong><span> (</span><strong><span>int</span></strong><span> i = 0; i &lt; fname.length(); i++) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>if</span></strong><span> (fname.charAt(i) == </span><span>'.'</span><span>) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>t = i;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String filename = </span><strong><span>null</span></strong><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>if</span></strong><span> (t &gt; 0) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>filename = fname.substring(0, t);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><span>log</span></em><span>.info(</span><span>"&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span>文件名：</span><span>"</span><span> + filename);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String filepath = path + </span><span>"dataimport/upfiles/"</span><span> + fname;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>File f = </span><strong><span>new</span></strong><span> File(path + </span><span>"dataimport/upfiles/"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><span>log</span></em><span>.info(</span><span>"&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span>文件生成路径：</span><span>"</span><span> + filepath);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>if</span></strong><span> (!f.exists()) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f.mkdirs();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span><strong><span>else</span></strong><span> {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><em><span>log</span></em><span>.info(</span><span>"&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span>路径存在</span><span>"</span><span>);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InputStream stream = file.getInputStream();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>OutputStream os = </span><strong><span>new</span></strong><span> FileOutputStream(path + </span><span>"dataimport/upfiles/"</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>+ fname);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>int</span></strong><span> readBytes = 0;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>byte</span></strong><span> buffer[] = </span><strong><span>new</span></strong><span> </span><strong><span>byte</span></strong><span>[8192];</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>while</span></strong><span> ((readBytes = stream.read(buffer, 0, 8192)) != -1) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>os.write(buffer, 0, readBytes);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>os.close();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>stream.close();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>file.destroy();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String message = </span><span>"</span><span>成功！</span><span>"</span><span>;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>request.setAttribute(</span><span>"message"</span><span>, message);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span>return</span></strong><span> </span><u><span>mapping</span></u><span>.findForward(</span><span>"success"</span><span>);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=center><strong></strong></p>
<p align=center><strong><span>-------------------------</span></strong><strong><span>一切</span></strong><strong><span>ok</span></strong><strong><span>------------------------</span></strong></p>
<img src ="http://www.blogjava.net/junky/aggbug/111027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-04-16 17:31 <a href="http://www.blogjava.net/junky/archive/2007/04/16/111027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ExtremeTable 的使用(转)</title><link>http://www.blogjava.net/junky/archive/2007/04/03/108188.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 03 Apr 2007 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/04/03/108188.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/108188.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/04/03/108188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/108188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/108188.html</trackback:ping><description><![CDATA[<pre><a href="http://www.javabc.com/">www.javabc.com</a><br><br><script type=text/javascript><!--google_ad_client = "pub-6769732252051080";google_ad_width = 468;google_ad_height = 60;google_ad_format = "468x60_as";google_ad_type = "text_image";//2007-01-24: www.csdn.netgoogle_ad_channel = "7833314861";//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript></script></pre>
<pre>0.概述</pre>
<pre>&nbsp;&nbsp;&nbsp; Home Page:<a href="http://www.extremecomponents.org/">http://www.extremecomponents.org</a> </pre>
<pre>&nbsp;&nbsp;&nbsp; &nbsp;Extreme Table是最功能强大而又容易配置<span>,扩展,自定义的Table 控件。</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 最紧要的功能包括排序<span>, 分页, 导出Excel, pdf和汇总。</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;基础读物<span>:&nbsp;</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 1. <a href="http://extremecomponents.org/wiki/index.php/Main_Page" target=_blank>ExtremeTable<span><span>自带的文档</span></span> http://extremecomponents.org/wiki/index.php/Main_Page</a> .</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 2.<a href="http://extremecomponents.org/wiki/index.php/Simplified_Chinese" target=_blank>Luck<span><span>翻译的ExtremeTable</span><span>官方文档中文版</span></span></a>http://extremecomponents.org/wiki/index.php/Simplified_Chinese</pre>
<pre>1. 安装</pre>
<pre>1.1 安装原始版本</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 1. 从<span><a href="http://www.extremecomponents.org/">http://www.extremecomponents.org</a> 下载最新版</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 2.把<span>extremecomponents.jar 放入web-inf/lib</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 3.根据<span>minum, 导出excel 或 导出pdf的需要，把/lib下的jar copy到web-inf/lib</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 4.把<span>images里的图片放入web的任意目录</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 5.把<span>css文件放到web的任意目录</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 6.在<span>/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面并进行修改.</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 7.修改<span>web.xml (见2)。</span></pre>
<pre>&nbsp;1.2 复制修改过的样式</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 1.Copy 修改过的<span>Table Head的图，查。</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 2.将修改版<span>extremecomponents.css文件放入任意目录</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 3.把<span>/src/resource/extremetable.properties 复制到对应目录</span></pre>
<pre><span>&nbsp;&nbsp;&nbsp; &nbsp;4.</span>把<span>extremecomponents.tld复制到web-inf/下</span></pre>
<pre>1.3 使用<span>Compact View很重要</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 默认的式样不符合大家的审美，幸亏还有<span>Compact View和css设置，让我们可以敬谢不敏它号称非常方便的HtmlView子类扩展。</span></pre>
<pre>&nbsp;&nbsp;&nbsp; 1. 在全局设置里</pre>
<pre>&nbsp;</pre>
<pre>table.view.html=org.extremecomponents.table.view.CompactView</pre>
<pre>&nbsp;&nbsp;&nbsp; 2.把<span>images里/table/compact/*.gif copy 到 /table</span></pre>
<pre>2.全局属性配置</pre>
<pre>&nbsp;&nbsp; ExtremeTable支持在<span>properties文件里方便的统一配置丰富的全局属性</span></pre>
<pre>&nbsp;在<span>/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面.</span></pre>
<pre>&nbsp;在<span>web.xml里面增加</span></pre>
<pre>&nbsp;&nbsp; &lt;context-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;extremecomponentsPreferencesLocation&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/extremetable.properties&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/context-param&gt;</pre>
<pre>一般只写需要修改的文件<span>:</span></pre>
<pre>table.filterable=false<br>table.imagePath=/images/table/*.gif<br>table.locale=zh_CN<br>table.view.html=org.extremecomponents.table.view.CompactView<br>row.highlightRow=true<br>column.format.date=yyyy-MM-dd<br>column.format.currency=###,###,###,###,#00.00</pre>
<pre>3.导出<span>Excel</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;注意<span>Excel 导出的Tag已改为，且官方版不支持中文文件名。</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ec:exportXls fileName="BookList.xls" tooltip="导出<span> Excel"/&gt;</span></pre>
<pre>在<span>web.xml必须加入：</span></pre>
<pre>&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.extremecomponents.table.filter.ExportFilter&lt;/filter-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br><span>&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;</span></pre>
<pre>&nbsp;&nbsp;&nbsp; &nbsp;ExtremeTable导出的一项重要特性是可以根据不同的<span>View导出不同的列.</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 比如<span>html管理界面可能只列出订单几个最重要的列，而导出excel时则需要导出所有的列。</span></pre>
<pre>&lt;ec:column property="orderdate" title="订单日期<span>"&nbsp; <span>cell="date" format="yyyy-MM-dd"&nbsp; viewsDenied= "html"/&gt;</span></span></pre>
<pre>又比如有些操作按纽的列只想在<span>html出现,excel里不想出现：</span></pre>
<pre>&lt;ec:column property="orderdate" title="订单日期<span>" viewAllowed= "html"/&gt;</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 以上订单日期列在<span>html view看不到，而excel,pdf view可以见到.</span></pre>
<pre>&nbsp;&nbsp;&nbsp; 而<span>"编辑图标"，"选择Checkbox"这些管理界面上的列，也可以设置不export到pdf,excel view</span></pre>
<pre>4.其他要点</pre>
<pre>4.1. 使用排序功能时<span>,如果property为嵌套属性时,需要设置alias</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;因为<span>javascript的关系.</span></pre>
<pre>&lt;ec:column property="customer.name" title="客户名称<span>" alias="customer"/&gt;</span></pre>
<pre>4.2. Date Cell与<span>NumberCell 和RowCountCell</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; 在全局属性定义<span>:</span></pre>
<pre>&nbsp;column.format.date= <a name=OLE_LINK1>yyyy-MM-dd</a></pre>
<pre>column.format.currency= ￥<span>###,###,#00.00</span></pre>
<pre>&lt;ec:column property="totalprice" title="总金额<span>" cell="currency" width="80" /&gt;<br>&lt;ec:column property="shipdate" title="发货日期"&nbsp; cell="date" width= "80"/&gt;<br>&lt;e</span></pre>
<pre>其中<span>RowCountCell用于显示序号。</span></pre>
<pre>4.3. 汇总</pre>
<pre>在<span>column中加入两个cac属性，就会自动在table的底端显示汇总</span></pre>
<pre>&lt;ec:column property="totalprice" title="总金额<span>" cell="number" format="###,###,##0.00" calc="total" calcTitle= "汇总:"/&gt;</span></pre>
<pre>4.4 i18N</pre>
<pre>在<span>Web.xml里面指定i18N的Properties文件</span></pre>
<pre>&lt;context-param&gt;<br>&nbsp;&nbsp;&lt;param-name&gt;extremecomponentsMessagesLocation&lt;/param-name&gt;<br>&nbsp;&nbsp;&lt;param-value&gt;messages&lt;/param-value&gt;<br>&lt;/context-param&gt;</pre>
<pre>&lt;ec:column property="name" title="book.name"/&gt;</pre>
<pre>4.5数据库分页</pre>
<pre>&nbsp;EC默认从数据库中查找所有记录然后由它来分页，如果查询结果较大，可以考虑使用数据库端分页的方案。</pre>
<pre>&nbsp;此时，<span>EC会使用Limit对象向Controller传递PageNo,PageSize,OrderBy等分页信息。而服务端将向EC返回总记录数和当前页的内容。 </span></pre>
<pre>4.6不显示导出<span>excel及分页</span></pre>
<pre>最快的方式是设置<span>table的showStatusBar= false</span></pre>
<pre>&lt;ec:table&nbsp; items= "order.orderItems"var="item"&nbsp;action=""&nbsp;&nbsp; showStatusBar= "false"&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp; 4.7ImagePath</pre>
<pre>&nbsp;旧版<span>EC包括其文档都在每个table tag里定义ImagePath, 新版已经可以自动插入ContextPath,只需在properties文件定义table.imagePath=/images/table/*.gif即可</span></pre>
<pre>5.自定义及扩展</pre>
<pre>&nbsp;&nbsp; ExtremeTable比<span>Display Tag的一个就是良好的自定义和扩展能力，不用千人一面。<br>&nbsp;&nbsp; 不过，人总是懒的，虽然扩展子类很容易，但能不扩展就还是不可扩展了。幸亏用Compact View再改改CSS一般就能达到要求。</span></pre>
<pre>&nbsp;5.1. 良好的<span>CSS定义</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExtremeTable 的<span>CSS定义非常严谨, 并且提供很多个层次的修改方式:</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.直接修改<span>css文件, 可以把table view改成任意样式</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.修改全局属性<span>, 改变某种元素对应的css class名</span></pre>
<pre>table.styleClass=tableRegion</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.在某个页面的<span>row,column tag中定义class</span></pre>
<pre>&nbsp;&lt;ec:row or styleClass=""/&gt;</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们这边采用 直接修改<span>extremecomponents.css为合适的样式</span></pre>
<pre>5.2方便的<span>&lt;tr&gt;&lt;td&gt;属性扩展</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row与<span>column已提供了丰富的普通属性与 javascript属性如onClick(), 如果属性仍然未够,可自行扩展&lt;row&gt;与&lt;column&gt;tag ，并通过全局属性指定新的子类名。</span></pre>
<pre>&nbsp;&nbsp;&nbsp;为了方便大家在子类扩展属性<span>, extreme Table提供了专门的回调函数与Util函数如</span></pre>
<pre>public void addColumnAttributes(Column column) {</pre>
<pre><span>&nbsp;&nbsp; column.addAttribute("customAttributeOne", customAttributeOne);<br>}&nbsp;&nbsp; </span></pre>
<pre>&nbsp;</pre>
<pre><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></pre>
<pre>详细请看手册<span>,Table, Row,Column都提供相同的扩展:<br><a href="http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes">http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes</a></span></pre>
<pre>如果不是<span>Extremetable的特别支持, 普通taglib class要扩展属性的话:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.定义真正的Java属性,setter,getter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. tld文件中声明新的属性 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.重载输出函数将新属性打印出来</span></pre>
<pre>5.3 扩展<span>HTMLView,cell 等显示组件</span></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp; Extreme Table在这些类的扩展上放便很多，但这个版本里我还没有进行尝试，就不写了。请自行参考官方文档<span>:<a href="http://extremecomponents.org/wiki/index.php/Html_View_Tutorial">http://extremecomponents.org/wiki/index.php/Html_View_Tutorial</a> .</span></pre>
<img src ="http://www.blogjava.net/junky/aggbug/108188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-04-03 13:27 <a href="http://www.blogjava.net/junky/archive/2007/04/03/108188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE平台介绍(转)</title><link>http://www.blogjava.net/junky/archive/2007/03/16/104226.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Fri, 16 Mar 2007 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/03/16/104226.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/104226.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/03/16/104226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/104226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/104226.html</trackback:ping><description><![CDATA[
		<div class="con_sample">
				<p>今天，越来越多的程序设计人员希望借助服务器端技术的快捷、安全以及可靠性，为他们的企业开发分布式的交易应用系统。如果你已经工作在这一领域，你将非常清楚，在今天这样一个电子商务和信息技术飞速发展、并充满需求的世界上，企业应用必须以更少的资金、更快的速度和比以往更少的资源来设计、建造和运营。 </p>
		</div>
		<div class="con_all">
				<p>
				</p>
				<div style="CLEAR: right">
						<p>
								<span style="FONT-FAMILY: 宋体">     今天，越来越多的程序设计人员希望借助服务器端技术的快捷、安全以及可靠性，为他们的企业开发分布式的交易应用系统。如果你已经工作在这一领域，你将非常清楚，在今天这样一个电子商务和信息技术飞速发展、并充满需求的世界上，企业应用必须以更少的资金、更快的速度和比以往更少的资源来设计、建造和运营。</span>
						</p>
						<p>为降低成本、快速实现企业应用的设计和开发，J2EE平台技术为企业应用的设计、开发、集成以及部署提供了一条基于组件的实现途径。J2EE平台为您提供了一个多层次分布是应用设计模式，重用组件的能力，统一的安全模式，灵活的交易控制。你不仅可以把全新的客户解决方案，用比以往都快的速度推向市场，而且平台独立、基于J2EE组件的解决方案将使你的产品不绑定在任何一个厂商的产品和API上。</p>
						<p>本文介绍J2EE 1.3平台并同时作为J2EE教程的概述章节。J2EE教程采用基于范例的方式，描述J2EE SDK 1.3版的特点和功能。无论你是新手还是有经验的企业应用开发人员，你都将发现J2EE教程中结合了文字的范例，是你创建自己企业的解决方案时，有价值的、唾手可得知识库。</p>
						<p>
								<span style="FONT-FAMILY: 宋体">如果你是刚刚开始接触J2EE应用开发，这个介绍是一个很好的起点。在这里你将学习J2EE架构，开始熟悉重要的术语和概念，找到如何开始进行J2EE应用程序编程，集成和部署。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">分布式的多层次应用</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE平台采用一个多层次分布式的应用模式。这意味着应用逻辑根据功能被划分成组件，组成J2EE应用的不同应用组件安装在不同的服务器上，这种划分是根据应用组件属于多层次J2EE环境中的哪一个层次来决定的。图1展示了两个多层次J2EE应用划分成在下面的表中描述的不同层次。图1中表示的J2EE应用部分代表了J2EE应用组件。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">运行在客户机器上的客户层组件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">运行在J2EE服务器上的Web层组件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">运行在J2EE服务器上的业务层组件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">运行在EIS服务器上的企业信息系统层软件</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">如图1所示，J2EE应用可以由三或四个层次组成，J2EE多层次应用一般被认为是三层应用，因为它们是被分布在三个不同的地点：客户端机器、J2EE服务器和数据库或后端的传统系统服务器。三层架构应用是对标准的客户端/服务器应用架构的一种扩展，即在客户端应用和后台存储之间增加一个多线程应用服务器。</span>
						</p>
						<p style="TEXT-ALIGN: center" align="center">
								<img height="300" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200606/20060604202317676.jpg" width="384" v:shapes="_x0000_s1026" />
								<br clear="all" />
								<span style="FONT-FAMILY: 宋体">图1：多层应用</span>
						</p>
						<p>
								<strong>
										<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">J2EE应用组件</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE应用是由组件组成的。J2EE组件是一个自我封装的功能软件单元，它将通过相关的类、文件和与其它组件的通讯，被集成进J2EE应用。J2EE规范定义了如下J2EE组件：</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">应用（Application）客户端和小程序（applet）是客户端组件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span> Java Servlet和Java Server Pages技术组件是Web组件</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">Enterprise JavaBeans(EJB)组件是业务组件</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE组件使用Java编程语言编写的，也向任何Java编程语言程序一样编译的。使用J2EE平台的不同之处是，J2EE组件是被集成到J2EE应用中的，是经过很好格式化的并经过J2EE规范兼容性验证的，而且在部署和正式运行时，是运行在J2EE服务器上，并且是在J2EE服务器的管理下运行的。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">客户端组件</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">一个J2EE应用可以使基于Web的或不基于Web的。对于不基于Web的J2EE应用，一个应用客户端软件将运行在客户端机器上，而对于基于Web的J2EE应用，浏览器会下载Web页面和小程序（applet）到客户端机器上。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">应用客户端</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">运行在客户端机器上的应用客户端软件，为用户提供一个途径，处理象J2EE系统或应用管理这样的工作。它通常由一个用Swing或AWT API开发的图形用户界面，但是也可以使用命令行接口。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">应用客户端软件直接访问运行在业务层的企业Bean。当然，如果J2EE应用客户端允许，一个应用客户端也可以建立HTTP连接，与运行在Web层的Servlet进行通讯。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">Web浏览器</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">用户端的Web浏览器从Web层下载HTML/WML/XML等静态或动态Web页面。动态页面是由运行在Web层的Servlet或JSP页面生成的。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">Applet</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">一个从Web层下载的Web页面可以包含嵌入的applet。一个applet是一个用Java编程语言编写的小客户端应用，通过安装在Web浏览器上的Java虚拟机执行。然而，applet要在Web浏览器上成功运行，客户端系统还需要Java插件（Java Plug-in）和安全策略文件。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">JSP页面是推荐的创建基于Web的客户端程序的API，因为在客户端无需插件和安全策略文件。而且，JSP页面支持清晰的、多模块应用设计，因为它提供一个途径，使应用程序编程和Web页面设计分离。这意味着参与Web页面设计的人员所要做的工作，不需要了解Java编程语言的语法。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">运行在基于网络的系统，例如手持设备、汽车电话等上的Applet，可以执行运行在J2EE服务器上的JSP页面或Servlet生成的WML页面。WML页面是通过无线应用协议（WAP）传送的，网络配置需要一个网关，把WAP转换成HTTP，然后在转换回来。网关把从手持设备上来的WAP请求转换成J2EE服务器的HTTP请求，再把HTTP服务器的响应和WML页面转换成一个WAP服务器响应和WML页面显示在手持设备上。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体">JavaBeans组件架构</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">客户层也由一个基于JavaBeans组件架构的组件，用于管理应用客户端或applet 与运行在J2EE服务器上的组件之间的数据流。JavaBeans组件不是在J2EE规范中的组件。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">为J2EE平台而写的JavaBeans组件，包含实例变量以及为访问实例变量的读取和设置方法。以这种方式使用的JavaBeans组件一般设计和实现起来非常简单，但是要遵循JavaBeans组件架构中的命名和设计规范。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">J2EE服务器通讯</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">图2展示了组成客户层的不同组成部分。客户端与运行在J2EE服务器上的业务层之间的通讯，可以是直接的，或者是在客户端运行浏览器的情况下，通过运行在Web层的JSP页面或Servlet完成。</span>
						</p>
						<p style="TEXT-ALIGN: center" align="center">
								<img height="194" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200606/20060604202317460.jpg" width="350" v:shapes="_x0000_s1027" />
								<br clear="all" />
								<span style="FONT-FAMILY: 宋体">图2：服务器通讯</span>
						</p>
						<br clear="all" />
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">瘦客户端</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE应用使用瘦客户端。一个瘦客户端是与应用连接地轻负载接口，它不处理象查询数据库、执行负载业务逻辑、或域传统系统连接等工作。象这样的重负载被转移到运行在J2EE服务器上的Web或企业Beans上，这样可以借助J2EE服务器端技术的安全性、快速、服务和可靠性。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">Web组件</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE的Web组件可以是JSP页面，也可以是Servlet。Servlet是Java编程语言的类，能够动态处理请求并生成响应。JSP页面是基于文本的文件，包含静态内容和小段的Java编程语言代码用以生成动态内容。当JSP页面被调用时，后台Servlet执行这小短代码，并返回结果。</span>
						</p>
						<p>静态HTML页面和applet在应用集成的时候是与Web组件捆绑在一起的。但是没有被J2EE规范最为Web组件处理。服务器端应用类也可以与Web组件捆绑，象HTML一样，没有作为Web组件。</p>
						<p>
								<span style="FONT-FAMILY: 宋体">如图3展示，向客户层一样，Web层有JavaBeans对象管理用户的输入，并把输入发送到运行在业务层的企业Bean处理。</span>
						</p>
						<p style="TEXT-ALIGN: center" align="center">
								<img height="209" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200606/20060604202317599.jpg" width="449" v:shapes="_x0000_s1028" />
								<br clear="all" />
								<span style="FONT-FAMILY: 宋体">图3：Web层和J2EE应用</span>
						</p>
						<br clear="all" />
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">业务组件</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">业务代码，用于解决或满足特定的业务领域的问题的逻辑，例如银行、零售或者金融等等，是在业务层，由企业Beans来处理的。图4展示一个企业Beans是如何接收客户端程序的数据，处理它（如果需要的话），并把它发送到企业信息系统层进行存储。企业Bean同样接收存储的数据，处理它（如果需要的话），在发送回客户端程序。</span>
						</p>
						<p>企业Beans有三类：Session Beans、实体beans(entity beans)和消息驱动Beans。一个Session Bean代表一个与客户的临时会话。当客户结束操作时，这个Session Bean和它的数据就消失了。相反，实体Bean表示一个永久存储在数据库的表中的数据。如果客户结束操作或服务器关机，后台操作保证实体Beans的数据存储下来。</p>
						<p>
								<span style="FONT-FAMILY: 宋体">一个消息驱动的Bean结合了Session Bean和Java消息服务（JMS）消息侦听器的功能，允许业务组件以异步的方式接收JMS消息。这里介绍实体Beans和Session Beans。想了解更多的关于消息驱动Beans，参加Java Message Service教程。</span>
						</p>
						<p style="TEXT-ALIGN: center" align="center">
								<img height="221" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200606/20060604202317842.jpg" width="539" v:shapes="_x0000_s1029" />
								<br clear="all" />
								<span style="FONT-FAMILY: 宋体">图4：业务和企业信息系统（EIS）层</span>
						</p>
						<br clear="all" />
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">企业信息系统层</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">企业信息系统层处理企业信息系统软件，包括企业体系结构系统如企业资源规划（ERP），大型机交易处理，数据库系统，以及传统信息系统。J2EE应用组件需要访问企业信息系统，例如建立数据库连接等等。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">J2EE架构</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">通常，瘦客户端多层次应用是很难编写的，因为它包括很多行非常难以理解的代码，以处理交易和状态管理，多线程，资源池管理，以及其他复杂的低层次细节问题。基于组件的、与平台无关的J2EE应用的开发是很容易的，因为业务逻辑被组织成可重复使用的组件，而且J2EE服务器以容器(Container)的形式为每种类型的组件提供后台支持。由于你不必自己开发这些服务，你可以专注于解决你面临的业务问题。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">容器（container）和服务</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">组件在部署时被安装在容器之中，是组件和特定平台底层功能之间的接口支持着组件。在Web，企业Bean或者应用客户端组件能够被执行以前，它必须被组装到J2EE应用里，并且被部署到它的容器里。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">组装流程包括设定J2EE应用中的每一个组件以及J2EE应用本身在容器之中的设置。容器的设置个性化了J2EE服务器对每个组件的后台支持，包括象安全性、交易管理、Java命名和目录接口查询，以及远程连接等等。这里是一些重点：</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">J2EE安全模式，使你能够配置Web组件或企业Bean，使系统资源只能被授权的用户访问。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">J2EE交易模式，使你能够指定方法之间的关系，从而组成一个交易，这样交易中的所有方法将被作为一个单元对待。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">JNDI查询服务，为企业中多种命名和目录服务提供统一的接口，这样应用组件就可以访问命名和目录服务了。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">J2EE远程连接模式，管理客户端和企业Beans之间的底层通讯。在企业Bean被创建后，客户端调用它的方法，就象它在同一个虚拟机上一样。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">实际上，J2EE架构提供可配置的服务，意思是在同一个J2EE应用中的应用组件可以根据他们部署的位置不同，表现不同。一个企业Bean可以通过不同的安全设置，是它在一个生产系统中获得一种层次的数据库数据访问，而在另一个生产系统中，则获得另一种数据库访问权限。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">容器还管理着不可配置服务，如企业bean和Servlet的生命周期，数据库连接资源池，数据持续性（persistence），以及J2EE API中描述的访问J2EE平台的API。尽管数据持续性机制是一个不可配置服务，J2EE架构允许你在需要比缺省的容器管理的持续性机制更多的控制时，用你的企业Bean实现中的相应的代码覆盖原有的容器管理的持续机制。例如，你可以使用Bean管理的持续性机制来实现你自己的搜索方法，或创建个性化的数据库缓存。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">容器类型</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">在部署过程之中，J2EE应用组件被安装在如下类型的J2EE容器中。本文中涉及的J2EE组件和容器参见图5。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">企业JavaBeans(EJB)容器，为J2EE应用管理着所有的企业Beans。企业Bean和它们的容器运行在J2EE服务器上。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">Web容器，为J2EE应用管理着所有的JSP页面和Servlet组件。Web组件和它们的容器运行在J2EE服务器上。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">应用客户端容器，为J2EE应用管理着所有的应用客户端组件。应用客户端组件和它们的容器运行在客户端机器上。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">applet容器，是Web浏览器和Java插件的组合，运行在客户端机器上。</span>
						</p>
						<p style="TEXT-ALIGN: center" align="center">
								<img height="313" alt="" src="http://www.crackj2ee.com/Article/UploadFiles/200606/20060604202317294.jpg" width="556" v:shapes="_x0000_s1030" />
								<br clear="all" />
								<span style="FONT-FAMILY: 宋体">图5：J2EE服务器和容器</span>
						</p>
						<br clear="all" />
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">包装</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE组件是单独包装的，为部署而捆绑到J2EE应用中。每个组件，其相关的文件如GIF和HTML文件，或者服务器端应用类，以及部署描述，被集成成一个模块并添加到J2EE应用中。J2EE应用是由一个或多个企业Bean，Web，或应用客户端组件模块组成的。最终企业解决方案可以使用一个J2EE应用或根据设计需要由两个或更多的J2EE应用组成。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">一个J2EE应用以及它的每一个模块都有它自己的部署描述。部署描述是一个XML文本文件，带有.xml后缀，描述组件的部署设置。一个企业Bean的部署描述，例如，声明交易属性，和企业Bean的安全认证。由于部署描述的信息是可以声明的，这样它可以在无需修改Bean的源代码的情况下，进行修改。在运行时，J2EE服务器读取部署描述，并依次对组件进行操作。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE应用以及相关的模块是在一个Enterprise Archive(EAR)中发送的。EAR文件是一个标准的JAR文件，以.ear后缀结尾。在GUI版的J2EE SDK应用部署工具集中，你先创建一个EAR文件，在添加JAR和WAR到EAR中。如果你使用命令行打包工具，则先创建JAR和WAR文件，然后创建EAR文件。J2EE SDK工具：</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">每个EJB JAR文件包含它的部署描述，相关文件和企业Bean的.class文件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">每个应用客户端JAR包含它的部署描述，相关文件和应用客户端的.class文件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">每个WAR文件包含它的部署描述，相关文件和servlet的.class文件以及JSP页面的.jsp文件</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">使用模块和EAR文件使使用一些相同的组件组装多个不同的J2EE应用成为可能。无需额外的编程，只是把不同的J2EE模块组装到J2EE EAR文件中。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">开发的角色</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">可重用模块使把应用开发和部署过程分成截然不同的角色成为可能。这样不同的人或公司能够在整个过程中实施不同的部分。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">最开始的两个角色包括购买和安装J2EE产品和工具。当软件采购的并且安装了， J2EE组件可以由应用组件提供商开发，由应用组装商组装，由应用部署商部署。在一个大的机构中，每一个角色由不同的个人或小组完成。这种劳动力的分割是可行的，因为每一个先前的角色输出一个可移植的文件，这个文件可以作为后续角色的输入。例如，在应用组件开发阶段，一个企业Bean软件开发商提交EJB JAR文件。在应用组装角色中，另一个开发商把这些EJB JAR文件与J2EE应用相结合，并存放在一个EAR文件中。在应用部署角色中，系统管理员在客户现场，使用EAR文件，把J2EE应用安装到一个J2EE服务器中。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">不同的角色并不是总是由不同的人来执行的。如果你为一个小公司工作，或者你在构建一个测试应用，你可能要执行每一个阶段的工作。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">J2EE产品供应商</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE产品供应商是设计和制作能够用于销售的J2EE平台、API和J2EE规范所定义的其他特性的公司。产品供应商一般是操作系统、数据库系统、应用服务器或Web服务器厂商，他们根据J2EE规范实现J2EE平台。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">工具供应商</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">工具供应商是个人或公司，他们提供组件开发商、组装商、部署商等使用的开发、组装和包装工具。参见工具信息提供的J2EE SDK 1.3兼容的工具。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">应用组件供应商</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">应用组件供应商是公司或个人，他们制作Web组件、企业Beans、applet或应用客户端，这些组件可用于J2EE应用。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">企业Bean制作</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">软件开发者完成以下工作，以提供包含企业Bean的EJB JAR文件：</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">编写并编译源代码</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">定制部署描述</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">捆绑.class文件和部署描述到一个EJB JAR文件</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">Web组件制作</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">Web开发者（JSP页面）或软件开发者（servlet）完成以下工作，以提供包含Web组件的WAR文件。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">编写并编译servlet源代码</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">编写JSP和HTML文件</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">为web组件定制部署描述</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">捆绑.class，.jsp，.html和部署描述文件到WAR文件</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">J2EE应用客户端制作</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">软件开发者完成以下工作，以提供包含J2EE应用客户端的JAR文件。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">编写并编译源代码</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">为客户端定制部署描述</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">捆绑.class文件和部署描述文件到JAR文件</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">应用组装商</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">应用组装商是一些公司或个人，他们从组件供应商那里得到应用组件的JAR文件，并组装成J2EE应用的EAR文件。组装商和部署商可以直接编辑部署描述或者使用工具，根据交互方式的选择，正确的增加XML标签。软件开发商完成以下工作，以提供包含J2EE应用的EAR文件。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">组装EJB JAR和前一阶段开发的Web组件（WAR）文件，生成新的J2EE应用（EAR）文件。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">为J2EE应用定制部署描述</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">检查EAR文件的内容是否是很好格式化的并符合J2EE规范</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">应用部署商和管理员</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">部署商和管理员是公司或个人，他们配置并部署J2EE应用，管理J2EE运行的计算和网络架构，并监视运行环境。责任包括设置交易控制，安全属性，并设定与数据库地连接。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">在配置过程中，部署者遵循由应用组件供应商提供的指南，解决外部依赖关系，设定安全框架，设置交易属性。在安装过程中，部署商将应用组件转移到服务器上，并生成容器专用的类和接口。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">部署商/系统管理员完成以下工作，已安装并配置J2EE应用。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">增加在前一阶段制作的J2EE应用（EAR）文件到J2EE服务器上</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">为运行环境配置J2EE应用，即修改J2EE应用的部署描述</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">检查EAR文件的内容是否是很好格式化的并符合J2EE规范</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">部署（安装）J2EE应用的EAR文件到J2EE服务器</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">参考实现软件</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">J2EE SDK是由Sun公司提供的J2EE平台和规范的非商业用途的实现，适用于示范、原形制作和教学环境。包含J2EE应用服务器、Web服务器、关系型数据库、J2EE API等，是一套完整的开发部署工具。你可以从网上下载J2EE SDK。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">产品开发商使用J2EE SDK确定在一组给定应用条件下必须组那些实现，并且运行J2EE兼容性测试包，以检测它们的产品测试包是否完全符合J2EE规范。</span>
						</p>
						<p>
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">应用组件开发商在J2EE SDK上运行他们的J2EE应用，以验证这些应用是否适用于所有J2EE产品和工具。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">Web服务器</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">Web服务器提供一个或多个Web容器。例如，Web容器一般依赖于Web服务器提供HTTP消息管理。J2EE实现不是必须支持某个特定的Web服务器，这意味着不同的J2EE产品对Web服务器的支持是由变化的。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">数据库访问</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">关系性数据库对应用数据提供持久的存储。J2EE实现不是必须支持某一特定类型的数据库，这意味着不同J2EE产品对数据库的支持是变化的。参见J2EE SDK下载文件中的版本说明，提供了参考实现目前支持的数据库清单。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">J2EE API</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">Java 2平台标准版（J2SE）SDK在运行J2EE SDK时是必需的，它为编写J2EE组件提供核心API，核心开发工具，以及Java虚拟机。J2EE SDK提供下列API供J2EE应用使用。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">企业JavaBeans技术 2.0</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">一个企业Bean是一段包含域和方法的代码体，用于实现业务逻辑的一个模块。你可以认为企业Bean是一个构建模块，可以单独使用或与其他企业Beans一起在J2EE服务器上执行业务逻辑。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">由三种类型的企业Bean：Session Bean，实体Beans，和消息驱动Beans，这些在业务组件中描述过。有了实体Beans，你无需编写任何SQL代码或直接使用JDBC API执行数据库访问操作。EJB容器替你处理这些。当然，如果你不管因为任何原因，覆盖了却省的容器管理持续性机制，你将需要使用JDBC API。同样，如果你选用Session Beans访问数据库，你必须使用JDBC API。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">JDBC 2.0 API</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">JDBC API是你可以从Java编程语言的方法中，调用SQL命令。你在覆盖了却省的容器管理持续性机制，或选用Session Beans访问数据库，则企业Bean中访问数据库必须使用JDBC API。有了容器管理持续性机制，数据库访问操作由容器来处理，你的企业Bean的实现中不包含JDBC代码或SQL命令。你也可以从servlet或JSP页面中直接使用JDBC API访问数据库，而不通过企业Bean。</span>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">JDBC API由两个部分：一个适用于应用组件访问数据库的应用驱动接口；一个是隶属于J2EE平台的服务提供接口。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">Java Servlet技术2.3</span>
								</strong>
						</p>
						<p>
								<span style="FONT-FAMILY: 宋体">Java Servlet技术为你定义HTTP专用的servlet类。一个Servlet类扩展了服务器的能力，这个服务器存放着应用，而应用是以请求-响应编程模式被访问的。尽管Servlet可以响应任意形式的请求，但是它通常被用于扩展Web服务器存放的应用。</span>
						</p>
						<p>
								<strong>
										<span style="FONT-FAMILY: 宋体">JavaServer Pages(JSP)技术 1.2</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">JSP页面技术是你能够在基于文本的文件中结合小段的Java编程语言代码和静态内容。一个JSP页面是一个基于文本的文件，它包含两种类型的文本：静态模板数据，它可以表示为任何基于文本的格式，如HTML、WML和XML；JSP元素，决定这个页面如何构造动态内容。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>Java Messaging Service 1.0</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">JMS API是一种消息标准，允许J2EE应用组件创建、发送、接受和读取消息。它是松散耦合的、可靠的，异步地进行分布式通讯。有关JMS的更多信息参见Java消息服务教程。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>Java Transaction API(JTA) 1.0</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">JTA API为分段交易提供标准的分段接口。J2EE架构提供一个缺省的自动确认来处理交易的确认和回滚。一个自动确认意味着任何其他查询数据的应用，在每次数据库的读写操作以后，将看到最新的数据。然而，如果你的应用执行两个独立的相互依赖的数据库访问操作，你将希望使用JTA API来划分，使整个交易同时含有开始、回滚和确认。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">JavaMail技术1.2</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">很多互联网应用需要发送邮件进行确认，所以J2EE平台包含了与JavaMail服务提供商配合使用的JavaMail API，这样，应用组件可以使用它发送邮件。JavaMail API包含两个部分：一个是应用层接口，应用组件使用它发送邮件；一个服务提供商接口。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>JavaBean Activation Framework 1.0</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">JavaBeans激活框架被包含是因为JavaMail要使用它。它提供标准的服务，以确定专用数据的类型，对它的压缩访问，发现对它可以使用的操作，并创建相应的JavaBean组件来执行那些操作。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">Java API for XML(JAXP) 1.1</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">XML是一种语言，用于表示和描述基于文本的数据，这样数据可以被使用XML API的程序或者工具所读取和处理。程序和工具可以生成XML文件，另一些程序和工具可以读取和处理。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">例如，一个J2EE应用使用XML制作报表，不同的公司收到这个报表，可以用最符合他们需要的方式处理这些数据。一个公司可能把XML数据通过程序转换成HTML格式，这样它可以把报表放在Web上，另一个公司可能把XML数据通过工具生成市场演讲稿，再有另一个公司可能把XML数据读到J2EE应用中进行处理。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>J2EE Connector API 1.0</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">连接器API被J2EE工具厂商和系统集成商用于创建资源适配器，使企业信息系统可以嵌入一些J2EE产品。一个资源适配器是一个软件组件，它使J2EE应用组件可以与后台资源管理器进行访问和交互。因为资源适配器是他的资源管理器专用的，所以每个类型的数据库或信息系统有它不同的资源适配器。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">Java授权与认证服务（JAAS）1.0</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">Java授权与认证服务（JAAS）提供一个途径，使J2EE应用可以授权并认证一个用户或一个用户组使用它。JAAS是标准的嵌入式认证模块（PAM）框架的一个Java编程语言版本，使Java 2平台安全架构可以支持基于用户的授权。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">工具</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">J2EE参考实现提供一个应用部署工具和一组脚本，用于组装、验证和部署J2EE应用并管理你的开发和生产环境。参见J2EE教程以全面了解这些工具。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">应用部署工具</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">J2EE参考实现提供一个应用部署工具，用于组装、验证和部署J2EE应用。它由两个版本：命令行和GUI。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">GUI工具包含有Wizards用于：</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">打包、配置和部署J2EE应用</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">打包、配置企业Beans</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">打包、配置Web组件</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">打包、配置应用客户端</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: 9pt; FONT-FAMILY: StarSymbol">•</span>
								<span style="FONT-FAMILY: 宋体">打包、配置资源使配器</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">另外，配置信息可以在表格化的检验图框中为每一个组件和模块类型进行设置。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">脚本</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">表1列出了J2EE参考实现中包含的脚本，你可以在命令行中执行这些操作。</span>
						</p>
						<table bordercolor="#000000" cellspacing="0" cellpadding="0" border="1">
								<thead>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a1">
																<span style="FONT-FAMILY: 宋体">脚本</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a1">
																<span style="FONT-FAMILY: 宋体">描述</span>
														</p>
												</td>
										</tr>
								</thead>
								<tbody>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">j2ee</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">启动和停止J2EE服务器</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">cloudscape</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">启动和停止缺省数据库</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">cloudIJ</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">运行交互式SQL工具，这是一个不支持的工具</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">j2eeadmin</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">为不同的资源增加JDBC驱动，JMS目标，和连接工厂</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">keytool</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">创建公开的和私有的密钥，生成X509自己签署（self-signed）的证书</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">realmtool</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">输入证书文件。为J2EE应用在认证/授权列表中，增加、删除J2EE用户</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">packager</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">包装J2EE应用组件到EAR，EJB JAR，应用客户端JAR和WAR文件中。</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">verifier</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">验证EAR、EJB JAR、应用客户端JAR和WAR文件是否是很好格式化的，以及是否遵从J2EE规范</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">runclient</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">运行J2EE应用客户端</span>
														</p>
												</td>
										</tr>
										<tr>
												<td class="Normal" valign="top" width="88">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">cleanup</span>
														</p>
												</td>
												<td class="Normal" valign="top" width="554">
														<p class="a0">
																<span style="FONT-FAMILY: 宋体">从J2EE服务器上清除所有部署的应用</span>
														</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">结论</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">J2EE平台提供了你设计、建造、测试、部署分布式多层次应用所需要的所有内容。J2EE教程对平台特性、API和工具进行了有深度的介绍。如果你需要J2EE应用设计方面的帮助，J2EE BluePrints Digest对在J2EE平台上，开发多层次、瘦客户应用，提供了高层次的描述。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">应用编程模式由技术主体和原则组成，指导J2EE应用开发人员确定最合理的实施选择、最有效的使用JSP和Servlets，在实现业务逻辑时选择好的设计、有效的把J2EE安全模型映射到企业计算环境和体系结构。</span>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<strong>
										<span style="FONT-FAMILY: 宋体">作者简介</span>
								</strong>
						</p>
						<p style="TEXT-JUSTIFY: inter-ideograph; TEXT-ALIGN: justify">
								<span style="FONT-FAMILY: 宋体">Monica Pawlan, Java Developer Connection(JDC)的首席作家，是Essentials of the Java Programming Language: A Hands-On Guide的作者，和Advanced Programming for the Java 2 Platform的合作作者。</span>
						</p>
						<center>
						</center>
				</div>
		</div>
<img src ="http://www.blogjava.net/junky/aggbug/104226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-03-16 13:32 <a href="http://www.blogjava.net/junky/archive/2007/03/16/104226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>40种网站常用Javascript技巧(转)</title><link>http://www.blogjava.net/junky/archive/2007/02/27/100917.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 27 Feb 2007 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/02/27/100917.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/100917.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/02/27/100917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/100917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/100917.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="600" border="0">
				<tbody>
						<tr>
								<td width="600">
										<table style="TABLE-LAYOUT: fixed" cellpadding="3" width="580">
												<tbody>
														<tr>
																<td>
																		<div style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<br />&lt;table border oncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt; 可用于Table<br /><br />2. &lt;body onselectstart="return false"&gt; 取消选取、防止复制<br /><br />3. onpaste="return false" 不准粘贴<br /><br />4. oncopy="return false;" oncut="return false;" 防止复制<br /><br />5. &lt;link rel="Shortcut Icon" href="favicon.ico"&gt; IE地址栏前换成自己的图标<br /><br />6. &lt;link rel="Bookmark" href="favicon.ico"&gt; 可以在收藏夹中显示出你的图标<br /><br />7. &lt;input style="ime-mode:disabled"&gt; 关闭输入法<br /><br />8. 永远都会带着框架<br />&lt;script language="JavaScript"&gt;&lt;!--<br />if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页<br />// --&gt;&lt;/script&gt;<br /><br />9. 防止被人frame<br />&lt;SCRIPT LANGUAGE=JAVASCRIPT&gt;&lt;!-- <br />if (top.location != self.location)top.location=self.location;<br />// --&gt;&lt;/SCRIPT&gt;<br /><br />10. 网页将不能被另存为<br />&lt;noscript&gt;&lt;iframe src="/blog/*.html&gt;";&lt;/iframe&gt;&lt;/noscript&gt; <br /><br />11. &lt;input type=button value=查看网页源代码 <br />onclick="window.location = "view-source:"+ "http://www.williamlong.info""&gt;<br /><br />12.删除时确认<br />&lt;a href="javascript:if(confirm("确实要删除吗?"))location="boos.asp?&amp;areyou=删除&amp;page=1""&gt;删除&lt;/a&gt; <br /><br />13. 取得控件的绝对位置<br />//Javascript<br />&lt;script language="Javascript"&gt;<br />function getIE(e){<br />var t=e.offsetTop;<br />var l=e.offsetLeft;<br />while(e=e.offsetParent)<br />alert("top="+t+"/nleft="+l);<br />}<br />&lt;/script&gt;<br /><br />//VBScript<br />&lt;script language="VBScript"&gt;&lt;!--<br />function getIE()<br />dim t,l,a,b<br />set a=document.all.img1<br />t=document.all.img1.offsetTop<br />l=document.all.img1.offsetLeft<br />while a.tagName&lt;&gt;"BODY"<br />set a = a.offsetParent<br />t=t+a.offsetTop<br />l=l+a.offsetLeft<br />wend<br />msgbox "top="&amp;t&amp;chr(13)&amp;"left="&amp;l,64,"得到控件的位置"<br />end function<br />--&gt;&lt;/script&gt;<br /><br />14. 光标是停在文本框文字的最后<br />&lt;script language="javascript"&gt;<br />function cc()<br />{<br />var e = event.srcElement;<br />var r =e.createTextRange();<br />r.moveStart("character",e.value.length);<br />r.collapse(true);<br />r.select();<br />}<br />&lt;/script&gt;<br />&lt;input type=text name=text1 value="123" onfocus="cc()"&gt;<br /><br />15. 判断上一页的来源<br />javascript:<br />document.referrer<br /><br /><br /></div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td width="600" height="10">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="580" border="0">
				<tbody>
						<tr class="color1" height="25">
								<td width="20"> </td>
								<td width="360"> </td>
								<td width="120"> </td>
								<td width="80"> </td>
						</tr>
						<tr>
								<td bgcolor="#0066cc" colspan="4" height="1"> </td>
						</tr>
						<tr>
								<td colspan="4" height="5"> </td>
						</tr>
						<tr>
								<td>
										<font color="#ffffff">?</font>
								</td>
								<td colspan="3">
										<table style="TABLE-LAYOUT: fixed" cellpadding="3" width="580">
												<tbody>
														<tr>
																<td>
																		<div style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
																				<br />16. 最小化、最大化、关闭窗口<br />&lt;object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />&lt;param name="Command" value="Minimize"&gt;&lt;/object&gt;<br />&lt;object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"&gt; <br />&lt;param name="Command" value="Maximize"&gt;&lt;/object&gt;<br />&lt;OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;PARAM NAME="Command" VALUE="Close"&gt;&lt;/OBJECT&gt;<br />&lt;input type=button value=最小化 onclick=hh1.Click()&gt;<br />&lt;input type=button value=最大化 onclick=hh2.Click()&gt;<br />&lt;input type=button value=关闭 onclick=hh3.Click()&gt;<br />本例适用于IE<br /><br />17.屏蔽功能键Shift,Alt,Ctrl<br />&lt;script&gt;<br />function look(){ <br />if(event.shiftKey) <br />alert("禁止按Shift键!"); //可以换成ALT　CTRL<br />} <br />document.onkeydown=look; <br />&lt;/script&gt;<br /><br />18. 网页不会被缓存<br />&lt;META HTTP-EQUIV="pragma" CONTENT="no-cache"&gt;<br />&lt;META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"&gt;<br />&lt;META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"&gt;<br />或者&lt;META HTTP-EQUIV="expires" CONTENT="0"&gt;<br /><br />19.怎样让表单没有凹凸感？<br />&lt;input type=text style="border:1 solid #000000"&gt; <br />或<br />&lt;input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: <br /><br />1 solid #000000"&gt;&lt;/textarea&gt;<br /><br />20.&lt;div&gt;&lt;span&gt;&amp;&lt;layer&gt;的区别？ <br />&lt;div&gt;(division)用来定义大段的页面元素，会产生转行 <br />&lt;span&gt;用来定义同一行内的元素，跟&lt;div&gt;的唯一区别是不产生转行 <br />&lt;layer&gt;是ns的标记，ie不支持，相当于&lt;div&gt;<br /><br />21.让弹出窗口总是在最上面:<br />&lt;body onblur="this.focus();"&gt;<br /><br />22.不要滚动条? <br />让竖条没有: <br />&lt;body style="overflow:scroll;overflow-y:hidden"&gt; <br />&lt;/body&gt; <br />让横条没有: <br />&lt;body style="overflow:scroll;overflow-x:hidden"&gt; <br />&lt;/body&gt; <br />两个都去掉？更简单了 <br />&lt;body scroll="no"&gt; <br />&lt;/body&gt; <br /><br />23.怎样去掉图片链接点击后，图片周围的虚线？<br />&lt;a href="#" onFocus="this.blur()"&gt;&lt;img src="/blog/logo.jpg" border=0&gt;&lt;/a&gt;<br /><br />24.电子邮件处理提交表单<br />&lt;form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain"&gt; <br />&lt;input type=submit&gt;<br />&lt;/form&gt;<br /><br />25.在打开的子窗口刷新父窗口的代码里如何写？<br />window.opener.location.reload()<br /><br />26.如何设定打开页面的大小<br />&lt;body onload="top.resizeTo(300,200);"&gt;<br />打开页面的位置&lt;body onload="top.moveBy(300,200);"&gt;<br /><br />27.在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动 <br />&lt;STYLE&gt; <br />body <br />{background-image:url(/blog/logo.gif); background-repeat:no-repeat; <br />background-position:center;background-attachment: fixed} <br />&lt;/STYLE&gt; <br /><br />28. 检查一段字符串是否全由数字组成<br />&lt;script language="Javascript"&gt;&lt;!--<br />function checkNum(str){return str.match(//D/)==null}<br />alert(checkNum("1232142141"))<br />alert(checkNum("123214214a1"))<br />// --&gt;&lt;/script&gt;<br /><br />29. 获得一个窗口的大小<br />document.body.clientWidth; document.body.clientHeight<br /><br />30. 怎么判断是否是字符<br />if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");<br />else alert("全是字符");<br /><br />31.TEXTAREA自适应文字行数的多少<br />&lt;textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"&gt;<br />&lt;/textarea&gt;<br /><br />32. 日期减去天数等于第二个日期<br />&lt;script language=Javascript&gt;<br />function cc(dd,dadd)<br />{<br />//可以加上错误处理<br />var a = new Date(dd)<br />a = a.valueOf()<br />a = a - dadd * 24 * 60 * 60 * 1000<br />a = new Date(a)<br />alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")<br />}<br />cc("12/23/2002",2)<br />&lt;/script&gt;<br /><br />33. 选择了哪一个Radio<br />&lt;HTML&gt;&lt;script language="vbscript"&gt;<br />function checkme()<br />for each ob in radio1<br />if ob.checked then window.alert ob.value<br />next<br />end function<br />&lt;/script&gt;&lt;BODY&gt;<br />&lt;INPUT name="radio1" type="radio" value="style" checked&gt;Style<br />&lt;INPUT name="radio1" type="radio" value="barcode"&gt;Barcode<br />&lt;INPUT type="button" value="check" onclick="checkme()"&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;<br /><br />34.脚本永不出错<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt; <br />&lt;!-- Hide <br />function killErrors() { <br />return true; <br />} <br />window.onerror = killErrors; <br />// --&gt; <br />&lt;/SCRIPT&gt;<br /><br />35.ENTER键可以让光标移到下一个输入框<br />&lt;input onkeydown="if(event.keyCode==13)event.keyCode=9"&gt;<br /><br /><br /></div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<tr>
								<td align="right" colspan="4" height="10">
										<font color="#ff6633">
												<strong>
														<a href="http://community.csdn.net/Expert/TopicView3.asp?id=5244445#top">
																<font color="#3366cc">Top</font>
														</a>
												</strong>
										</font>
								</td>
						</tr>
						<tr>
								<td colspan="4" height="5"> </td>
						</tr>
				</tbody>
		</table>
		<table style="WIDTH: 595px; HEIGHT: 3666px" cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr class="color1" height="25">
								<td width="20"> </td>
								<td width="360"> </td>
								<td width="120"> </td>
								<td width="80"> </td>
						</tr>
						<tr>
								<td bgcolor="#0066cc" colspan="4" height="1"> </td>
						</tr>
						<tr>
								<td colspan="4" height="5"> </td>
						</tr>
						<tr>
								<td>
										<font color="#ffffff">?</font>
								</td>
								<td colspan="3">
										<table style="TABLE-LAYOUT: fixed" cellpadding="3" width="580">
												<tbody>
														<tr>
																<td>
																		<div style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">
																				<br />36. 检测某个网站的链接速度：<br />把如下代码加入&lt;body&gt;区域中:<br />&lt;script language=Javascript&gt;<br />tim=1<br />setInterval("tim++",100)<br />b=1<br />var autourl=new Array()<br />autourl[1]="www.njcatv.net"<br />autourl[2]="javacool.3322.net"<br />autourl[3]="www.sina.com.cn"<br />autourl[4]="www.nuaa.edu.cn"<br />autourl[5]="www.cctv.com"<br />function butt(){<br />document.write("&lt;form name=autof&gt;")<br />for(var i=1;i&lt;autourl.length;i++)<br />document.write("&lt;input type=text name=txt"+i+" size=10 value="/blog/测试中......&gt;" =》&lt;input type=text <br />name=url"+i+" size=40&gt; =》&lt;input type=button value=GO <br /><br />onclick=window.open(this.form.url"+i+".value)&gt;&lt;br/&gt;")<br />document.write("&lt;input type=submit value=刷新&gt;&lt;/form&gt;")<br />}<br />butt()<br />function auto(url)<br />else<br /><br />b++<br />}<br />function run(){for(var i=1;i&lt;autourl.length;i++)document.write("&lt;img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 <br /><br />onerror=auto("http://"+autourl+"")&gt;")}<br />run()&lt;/script&gt;<br /><br />37. 各种样式的光标<br />auto ：标准光标<br />default ：标准箭头<br />hand ：手形光标<br />wait ：等待光标<br />text ：I形光标<br />vertical-text ：水平I形光标<br />no-drop ：不可拖动光标<br />not-allowed ：无效光标<br />help ：?帮助光标<br />all-scroll ：三角方向标<br />move ：移动标<br />crosshair ：十字标<br />e-resize<br />n-resize<br />nw-resize<br />w-resize<br />s-resize<br />se-resize<br />sw-resize<br /><br />38.页面进入和退出的特效<br />进入页面&lt;meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"&gt;<br />推出页面&lt;meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"&gt; <br />这个是页面被载入和调出时的一些特效。duration表示特效的持续时间，以秒为单位。transition表示使用哪种特效，取值为1-23:<br />　　0 矩形缩小 <br />　　1 矩形扩大 <br />　　2 圆形缩小<br />　　3 圆形扩大 <br />　　4 下到上刷新 <br />　　5 上到下刷新<br />　　6 左到右刷新 <br />　　7 右到左刷新 <br />　　8 竖百叶窗<br />　　9 横百叶窗 <br />　　10 错位横百叶窗 <br />　　11 错位竖百叶窗<br />　　12 点扩散 <br />　　13 左右到中间刷新 <br />　　14 中间到左右刷新<br />　　15 中间到上下<br />　　16 上下到中间 <br />　　17 右下到左上<br />　　18 右上到左下 <br />　　19 左上到右下 <br />　　20 左下到右上<br />　　21 横条 <br />　　22 竖条 <br />　　23 以上22种随机选择一种<br /><br />39.在规定时间内跳转<br />&lt;META http-equiv=V="REFRESH" content="5;URL=http://www.williamlong.info"&gt; <br /><br />40.网页是否被检索<br />&lt;meta name="ROBOTS" content="属性值"&gt;<br />　　其中属性值有以下一些:<br />　　属性值为"all": 文件将被检索，且页上链接可被查询；<br />　　属性值为"none": 文件不被检索，而且不查询页上的链接；<br />　　属性值为"index": 文件将被检索；<br />　　属性值为"follow": 查询页上的链接；<br />　　属性值为"noindex": 文件不检索，但可被查询链接；<br />　　属性值为"nofollow": 文件不被检索，但可查询页上的链接。<br /><br />最大化窗口？<br />&lt;script language="JavaScript"&gt;<br />&lt;!--<br />self.moveTo(0,0)<br />self.resizeTo(screen.availWidth,screen.availHeight)<br />//--&gt;<br />&lt;/script&gt;<br /><br /><br /><br /><br />解 决问题：由于层与下拉框之间的优先级是：下拉框 &gt; 层，因此在显示的时候，会因为优先级的次序而会出现如上问题。（如果几个元素都是层的话，我们可以通过层的 z-index 属性来设置）解决办法就是：给层中放一个优先级比下拉框更高的元素（iframe），从而解决此问题！具体解决代码如下：<br /><br />&lt;div id="menu" style="position:absolute; visibility:hidden; top:20px; left:20px; width:100px; height:200px; background-color:#6699cc;"&gt;<br />&lt;table&gt;<br />&lt;tr&gt;&lt;td&gt;item 1&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;item 2&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;item 3&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;item 4&lt;/td&gt;&lt;/tr&gt;<br />&lt;tr&gt;&lt;td&gt;item 5&lt;/td&gt;&lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;iframe src="/blog/javascript:false" style="position:absolute; visibility:inherit; top:0px; left:0px; width:100px; height:200px; z-index:-1; filter='progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';"&gt;&lt;/iframe&gt;<br />&lt;/div&gt;<br /><br />&lt;a href="#" onclick="document.getElementById('menu').style.visibility='visible'"&gt;menu&lt;/a&gt;<br /><br />&lt;form&gt;<br />&lt;select&gt;&lt;option&gt;A form selection list&lt;/option&gt;&lt;/select&gt;<br />&lt;/form&gt;<br /><br />输入框也可以做的很漂亮了<br />&lt;div align="center"&gt;&lt;input type="hidden" name="hao" value="yes"&gt;<br />外向数：&lt;input <br />name=answer <br />style="color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192)"&gt;<br />　没回答的题数：&lt;input <br />name=unanswer id="unanswer" <br />style="color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192)"&gt;<br />&lt;br/&gt;<br />总得分:<br />&lt;input <br />name=score id="score" <br />style="color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192)"&gt;<br />　结　　　　论:<br />&lt;input <br />name=xgjg id="xgjg" <br />style="color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192)"&gt;<br />&lt;br/&gt;<br />&lt;br/&gt; <br /><br />&lt;input onClick=processForm(this.form) style="FONT-FAMILY: 宋体; FONT-SIZE: 9pt" type=button value=查看结果 name="button"&gt; <br />&lt;input type="reset" name="Submit" value="重做"&gt;<br />&lt;/div&gt;<br />注意：修改&lt;body&gt;为&lt;body onload="max.Click()"&gt;即为打开最大<br /><br />化窗口，而如果改为&lt;body onload="min.Click()"&gt;就变为窗口一打开就最小化<br /><br />&lt;object id="min" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;param name="Command" value="Minimize"&gt;<br />&lt;/object&gt; &lt;object id="max" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;param name="Command" value="Maximize"&gt;<br />&lt;/object&gt;<br />&lt;/body&gt;<br /><br />页面自动刷新（说明）<br /><br />当你做网页时，是不是有的时候想让你的网页自动不停刷新，或者过一段时间自动跳转到另外一个你自己设定的页面？其实实现这个效果非常地简单，而且这个效果甚至不能称之为特效。你只要把如下代码加入你的网页中就可以了。<br /><br />1，页面自动刷新：把如下代码加入&lt;head&gt;区域中&lt;meta http-equiv="refresh" content="20"&gt;,其中20指每隔20秒刷新一次页面.<br /><br />2， 页面自动跳转：把如下代码加入&lt;head&gt;区域中&lt;meta http-equiv="refresh" content="20;url=http://www.williamlong.info"&gt;,其中20指隔20秒后跳转到http: //www.williamlong.info页面。 <br /><br />页面自动关闭<br /><br />5000是指时间&lt;body onLoad="setTimeout(window.close, 5000)"&gt; <br /><br />弹出窗口自动关闭 <br /><br />10秒后弹出窗口自动关闭<br /><br />注意：在新的tan.htm的body中要加 &lt;onLoad="closeit()"&gt;<br />head<br /><br />&lt;script language="JavaScript"&gt;<br /><br />&lt;!--<br /><br />var gt = unescape('%3e');<br /><br />var popup = null;<br /><br />var over = "Launch Pop-up Navigator";<br /><br />popup = window.open('', 'popupnav', 'width=225,height=235,resizable=1,scrollbars=auto');<br /><br />if (popup != null) {<br /><br />if (popup.opener == null) {<br /><br />popup.opener = self; <br /><br />}<br /><br />popup.location.href = 'tan.htm';<br /><br />}<br /><br />// --&gt;<br /><br />&lt;/script&gt;<br />&lt;body&gt;注意：这段代码是在新建文件中的<br />&lt;script language="JavaScript"&gt;<br /><br />function closeit() <br /><br />&lt;/script&gt;<br /><br />这个可不是&lt;iframe&gt;(引用）呀。是直接调用的。以下代码加入&lt;body&gt;区域<br /><br />&lt;object type="text/x-scriptlet" width="800" height="1000" data="../index.htm"&gt;<br />&lt;/object&gt;<br /></div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/junky/aggbug/100917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-02-27 12:57 <a href="http://www.blogjava.net/junky/archive/2007/02/27/100917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>get与post方法 (转)</title><link>http://www.blogjava.net/junky/archive/2007/01/25/95947.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 25 Jan 2007 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/01/25/95947.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/95947.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/01/25/95947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/95947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/95947.html</trackback:ping><description><![CDATA[
		<p>在B/S应用程序中，前台与后台的数据交互，都是通过HTML中Form表单完成的。Form提供了两种数据传输的方式——get和post。虽然它们都是数据的提交方式，但是在实际传输时确有很大的不同，并且可能会对数据产生严重的影响。虽然为了方便的得到变量值，Web容器已经屏蔽了二者的一些差异，但是了解二者的差异在以后的编程也会很有帮助的。<br />Form中的get和<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">post方法</strong>，在数据传输过程中分别对应了HTTP协议中的GET和<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">POST方法</strong>。二者主要区别如下：<br />1、Get是用来从服务器上获得数据，而Post是用来向服务器上传递数据。<br />2、Get将表单中数据的按照variable=value的形式，添加到action所指向的URL后面，并且两者使用“?”连接，而各个变量之间使用“&amp;”连接；Post是将表单中的数据放在form的数据体中，按照变量和值相对应的方式，传递到action所指向URL。<br />3、Get是不安全的，因为在传输过程，数据被放在请求的URL中，而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中，然后放在某个地方，这样就可能会有一些隐私的信息被第三方看到。另外，用户也可以在浏览器上直接看到提交的数据，一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。<br />4、Get传输的数据量小，这主要是因为受URL长度限制；而Post可以传输大量的数据，所以在上传文件只能使用Post（当然还有一个原因，将在后面的提到）。<br />5、Get限制Form表单的数据集的值必须为ASCII字符；而Post支持整个ISO10646字符集。<br />6、Get是Form的默认方法。<br />下面我们一个实例来查看二者的不同：<br /><br /><br /><br /><br /><br /></p>
		<p>
		</p>
		<form name="test" method="post" action="parse">
				<br />Username: <input name="user" /><br /><br />Password: <input type="password" name="pwd" /><br /><br /><input type="submit" value="提交查询内容" /><br /><br /><br /><p>//接受数据的Servlet文件<br />import java.io.*;</p><p>import javax.servlet.*;<br />import javax.servlet.http.*;</p><p>public class ParseServlet<br />extends HttpServlet {<br />public void init(ServletConfig config) throws ServletException {<br />super.init(config);<br />}</p><p>public void service(HttpServletRequest request, HttpServletResponse response) throws<br />IOException, ServletException {<br />System.out.println("************** begin ***************");<br />String method = request.getMethod();<br />System.out.println("method = " + method);<br />int contentLength = request.getContentLength();<br />System.out.println("contentLength = " + contentLength);<br />System.out.println("ContentType = " + request.getContentType());<br />//System.out.println("------- 在设定字符编码前 -------");<br />System.out.println("QueryString = " + request.getQueryString());</p><p>//得到ServletInputStream，请注意：这段代码和得到user的值的代码，不能同时出现，否则<br />//在后面的那个将会得到空值。<br />if (method.equalsIgnoreCase("Post")) {<br />try {<br />ServletInputStream ins = request.getInputStream();<br />byte[] arr = new byte[contentLength];<br />while (ins.read() != -1)<br />ins.read(arr, 0, contentLength);<br />System.out.println("content = " + new String(arr));<br />} catch (IOException e) {}<br />}<br /><br />//得到user的值<br />//System.out.println("Username = " + request.getParameter("user"));</p><p>//设置字符编码，必须放在得到ServletInputStream或者得到user的值的代码之前，否则将起不<br />//到转化编码的作用。<br />try {<br />request.setCharacterEncoding("gb2312");<br />} catch (UnsupportedEncodingException use) {}</p><p>//System.out.println("------- 在设定字符编码后 -------");<br />//得到user的值<br />//System.out.println("Username = " + request.getParameter("user"));</p><p>//System.out.println("QueryString = " + request.getQueryString());<br />System.out.println("************** end ***************");<br />}<br />}<br />首先，我们设置form的method="post"，提交数据，则可以得到如下的结果：<br /><img onmousewheel="function anonymous(){function anonymous(){return bbimg(this)}}" height="84" alt="method=" src="http://www.j2medev.com/Article/UploadFiles/200508/20050819170933467.jpg" width="413" onload="function anonymous(){function anonymous(){resizepic(this)}}" border="0" /><br />从结果中可以看到，QueryString为null，而content是输入的值，并且按照variable=value的形式组织，而且变量之间使用“&amp;”连接，这和结果中的另外一个变量（ContentType）有关。在后面将会提到ContentType的有关概念。<br />接着，我们将form中的method设置为get，重新提交数据，则可以得到如下的结果：<br /><img onmousewheel="function anonymous(){function anonymous(){return bbimg(this)}}" height="69" alt="method=" src="http://www.j2medev.com/Article/UploadFiles/200508/20050819171046844.jpg" width="302" onload="function anonymous(){function anonymous(){resizepic(this)}}" border="0" /><br />可以看到，QueryString的值正是我们在页面上的变量及其对应值，而此时ContentLength=-1。从以上的结果，我们可以清楚地看到，Get和Post分别将数据放在不同的位置来传输。我们还可以将程序中注释去掉，观察一下，在Get和Post下设置字符编码对数据的影响，会发现：使用Post传输的数据，可以通过设置编码的方式正确转化中文；而Get传输的数据却没有变化。在以后的程序中，我们一定要注意这一点。<br />下面简单介绍一下ContentType，它和Form中enctype属性的相对应，它是Form用来组织数据的方式，主要包含了两种：<br />1、application/x-www-form-urlencoded：它是默认内容类型（content type），在结果中我们已经看到了经它编码的数据的效果。编码方法：i.将空格使用“+”代替，非字母和数字字符，是用以%HH表示的该字符的ASCII代替（汉字就是这种形式）；ii.变量和值使用“=”，各个变量和值对之间使用“&amp;”连接。<br />2、multipart/form-data：它可以用来传输大量二进制数据或者非ASCII字符的文本，因此在上传文件需设置enctype="multipart/form-data"，此时method必须为post。它传输的消息包含了一系列的数据块，每一块都代表Form中的一个变量，并且数据块的顺序和页面上的顺序一致，块与块之间使用特殊字符（boundary）分隔。如果Form中包含file控件，相应的数据块还会包含一个Content-Type头，用来指定MIME，默认值为text/plain。下面是设置enctype="multipart/form-data"时content的结果：<br /><img onmousewheel="function anonymous(){function anonymous(){return bbimg(this)}}" height="246" alt="enctype=" src="http://www.j2medev.com/Article/UploadFiles/200508/20050819171210713.jpg" width="600" onload="function anonymous(){function anonymous(){resizepic(this)}}" border="0" multipart="" /><br />此时在Servlet中，使用常规getParameter(String)方法已经不能到值，至于如何解析，可以参考文件上传的程序。</p></form>
<img src ="http://www.blogjava.net/junky/aggbug/95947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-01-25 15:25 <a href="http://www.blogjava.net/junky/archive/2007/01/25/95947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaScript通用数据类型校验</title><link>http://www.blogjava.net/junky/archive/2006/12/27/90224.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 27 Dec 2006 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/27/90224.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/90224.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/27/90224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/90224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/90224.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /** * 取得字符串的字节长度 */ 										代码																																																																																																																						function strlen(str)   							...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2006/12/27/90224.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/90224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-27 09:45 <a href="http://www.blogjava.net/junky/archive/2006/12/27/90224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOMCAT配置技巧10</title><link>http://www.blogjava.net/junky/archive/2006/12/27/90218.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 27 Dec 2006 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/27/90218.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/90218.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/27/90218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/90218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/90218.html</trackback:ping><description><![CDATA[
		<p>
				<strong>1． 配置系统管理（Admin Web Application）</strong>
		</p>
		<p>
				<iframe id="ad_top" name="ad_top" align="left" marginwidth="0" marginheight="0" src="http://adv.pconline.com.cn/adpuba/show?id=pc.rjzx.kaifa.wenzhang.hzh.&amp;media=html&amp;pid=cs.pconline.rjzx.hzh." frameborder="0" width="320" scrolling="no" height="280">
				</iframe>　　大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。</p>
		<p>　　Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。<br />（译者注：CATALINA_BASE即tomcat安装目录下的server目录）</p>
		<p>　　你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。</p>
		<p>　　如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下：</p>
		<p>&lt;role name="admin"/&gt;</p>
		<p>　　你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）：</p>
		<p>&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt;</p>
		<p>　　当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。</p>
		<p>
				<strong>2．配置应用管理（Manager Web Application）</strong>
		</p>
		<p>　　Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。</p>
		<p>　　Manager Web Application被被定义在一个自动部署文件中：</p>
		<p>　　CATALINA_BASE/webapps/manager.xml 。</p>
		<p>　　你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。<br />　　（译者注：CATALINA_HOME即tomcat安装目录）</p>
		<p>　　如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中：</p>
		<p>　　&lt;role name=”manager”&gt;</p>
		<p>　　你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：</p>
		<p>　　&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt;</p>
		<p>　　然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。</p>
		<p>　　Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。</p>
		<p>　　Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误——“503 - This application is not currently available”。</p>
		<p>　　移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<br /></p>
		<p>
				<strong>3．部署一个web应用</strong>
		</p>
		<p>　　有两个办法可以在系统中部署web服务。</p>
		<p>　　1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<br />　　2&gt; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。</p>
		<p>　　如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。</p>
		<p>　　部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。</p>
		<p>　　举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：</p>
		<p>&lt;!--  <br /> Context fragment for deploying MyWebApp.war  <br />--&gt;<br />&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <br />        debug="0" privileged="true"&gt;<br /> &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"                <br />        resourceName="UserDatabase"/&gt; <br />&lt;/Context&gt;</p>
		<p>　　把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。</p>
		<p>　　这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。</p>
		<p>
				<br />
				<strong>4．配置虚拟主机（Virtual Hosts）</strong>
		</p>
		<p>
				<strong>　　</strong>关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。</p>
		<p>　　基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<br />在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：</p>
		<p>&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br /> &lt;Service name="Tomcat-Standalone"&gt;<br />   &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8080" minProcessors="5" maxProcessors="75"<br />enableLookups="true" redirectPort="8443"/&gt;<br />   &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8443" minProcessors="5" maxProcessors="75"<br />acceptCount="10" debug="0" scheme="https" secure="true"/&gt;<br />     &lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<br />clientAuth="false" protocol="TLS" /&gt;<br />   &lt;/Connector&gt;<br />   &lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;<br />     &lt;!-- This Host is the default Host --&gt;<br />     &lt;Host name="localhost" debug="0" appBase="webapps"<br />     unpackWARs="true" autoDeploy="true"&gt;<br />       &lt;Context path="" docBase="ROOT" debug="0"/&gt;<br />       &lt;Context path="/orders" docBase="/home/ian/orders" debug="0"<br />                      reloadable="true" crossContext="true"&gt;<br />       &lt;/Context&gt;<br />     &lt;/Host&gt;</p>
		<p>     &lt;!-- This Host is the first "Virtual Host": www.example.com --&gt;<br />     &lt;Host name="www.example.com" appBase="/home/example/webapp"&gt;<br />       &lt;Context path="" docBase="."/&gt;<br />     &lt;/Host&gt;</p>
		<p>   &lt;/Engine&gt;<br /> &lt;/Service&gt;<br />&lt;/Server&gt;</p>
		<p>　　Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。</p>
		<p>
				<strong>5．配置基础验证（Basic Authentication）</strong>
		</p>
		<p>
				<strong>　　</strong>容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。</p>
		<p>　　注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加&lt;security-constraint&gt;和&lt;login-config&gt;两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的&lt;role&gt;和&lt;user&gt;即可，然后重新启动Tomcat。</p>
		<p>　　下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。</p>
		<p>&lt;!--<br /> Define the Members-only area, by defining<br /> a "Security Constraint" on this Application, and<br /> mapping it to the subdirectory (URL) that we want<br /> to restrict.<br />--&gt;<br />&lt;security-constraint&gt;<br /> &lt;web-resource-collection&gt;<br />   &lt;web-resource-name&gt;<br />     Entire Application<br />   &lt;/web-resource-name&gt;<br />   &lt;url-pattern&gt;/members/*&lt;/url-pattern&gt;<br /> &lt;/web-resource-collection&gt;<br /> &lt;auth-constraint&gt;<br />     &lt;role-name&gt;member&lt;/role-name&gt;<br /> &lt;/auth-constraint&gt;<br />&lt;/security-constraint&gt;<br />&lt;!-- Define the Login Configuration for this Application --&gt;<br />&lt;login-config&gt;<br /> &lt;auth-method&gt;BASIC&lt;/auth-method&gt;<br /> &lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt;<br />&lt;/login-config&gt;</p>
		<p>
				<strong>6．配置单点登录（Single Sign-On）</strong>
		</p>
		<p>　　一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。</p>
		<p>　　Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：</p>
		<p>&lt;Valve className="org.apache.catalina.authenticator.SingleSignOn"<br />      debug="0"/&gt;</p>
		<p>　　在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。</p>
		<p>　　使用single sign-on valve有一些重要的限制：</p>
		<p>　　1&gt; value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<br />　　2&gt; 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<br />　　3&gt; 不能被context中的realm覆盖。<br />　　4&gt; 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的&lt;auth-method&gt;中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<br />　　5&gt; 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<br />　　6&gt; 单点登录需要使用cookies。</p>
		<p>
				<strong>7．配置用户定制目录（Customized User Directores）</strong>
		</p>
		<p>　　一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如：</p>
		<p>http://www.cs.myuniversity.edu/~username<br />http://members.mybigisp.com/~username</p>
		<p>　　Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。</p>
		<p>&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" <br />userClass="org.apache.catalina.startup.PasswdUserDatabase"/&gt;</p>
		<p>　　web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。</p>
		<p>　　实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。</p>
		<p>&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" homeBase="/home" <br />userClass="org.apache.catalina.startup.HomesUserDatabase"/&gt;</p>
		<p>　　这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。</p>
		<p>　　这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。</p>
		<p>
				<strong>8．在Tomcat中使用CGI脚本</strong>
		</p>
		<p>　　Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。</p>
		<p>　　Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。</p>
		<p>　　为了使Tomcat能够运行CGI，你必须做如下几件事：</p>
		<p>　　1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<br />　　2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于&lt;servlet-name&gt; CGI的那段的注释去掉（默认情况下，该段位于第241行）。<br />　　3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<br />　　4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<br />　　5. 重新启动Tomcat，你的CGI就可以运行了。</p>
		<p>　　在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。</p>
		<p>
				<strong>9．改变Tomcat中的JSP编译器（JSP Compiler）</strong>
		</p>
		<p>　　在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在&lt;init-param&gt; 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：</p>
		<p>&lt;servlet&gt;<br />   &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />   &lt;servlet-class&gt;<br />     org.apache.jasper.servlet.JspServlet<br />   &lt;/servlet-class&gt;<br />   &lt;init-param&gt;<br />     &lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />     &lt;param-value&gt;WARNING&lt;/param-value&gt;<br />   &lt;/init-param&gt;<br />   &lt;init-param&gt;<br />     &lt;param-name&gt;compiler&lt;/param-name&gt;<br />     &lt;param-value&gt;jikes&lt;/param-value&gt;<br />   &lt;/init-param&gt;<br />   &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;</p>
		<p>　　当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。</p>
		<p>
				<strong>10．限制特定主机访问（Restricting Access to Specific Hosts）</strong>
		</p>
		<p>　　有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。</p>
		<p>　　通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。<br />例如你可以把Admin Web application设置成只允许本地访问，设置如下：</p>
		<p>&lt;Context path="/path/to/secret_files" ...&gt;<br /> &lt;Valve className="org.apache.catalina.valves.RemoteAddrValve"<br />        allow="127.0.0.1" deny=""/&gt;<br />&lt;/Context&gt;</p>
		<p>　　如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。</p>
<img src ="http://www.blogjava.net/junky/aggbug/90218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-27 09:40 <a href="http://www.blogjava.net/junky/archive/2006/12/27/90218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse中struts配置 </title><link>http://www.blogjava.net/junky/archive/2006/12/27/90214.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 27 Dec 2006 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/27/90214.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/90214.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/27/90214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/90214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/90214.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">一、准备安装程序<br />　　<br />　　1、JDK 5.0 安装程序下载<br />　　<br />　　下载地址：<br />　　<br />　　</font>
				<a href="https://jsecom15b.sun.com/ECom/EComActionServlet">
						<font color="#009933">
								<font size="2">https://jsecom15b.sun.com/ECom/EComActionServlet</font>
						</font>
				</a>
				<br />
				<font size="2">　　/DownloadPage:~:com.sun.<br />　　sunit.sdlc.content.DownloadPageInfo;<br />　　jsessionid=502E87C71D77E3BC297C08B35<br />　　DAC9AD4;jsessionid=502E87C71D77E3BC297C08B35DAC9AD4<br />　　<br />　　同意协议后，可以下载jdk-1_5_0_05-windows-i586-p.exe。<br />　　<br />　　2、tomcat 5.5.9下载<br />　　<br />　　下载地址：</font>
				<a href="http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi">
						<font color="#009933">
								<font size="2">http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi</font>
						</font>
				</a>
				<br />
				<font size="2">　　<br />　　最新版本是5.5.11alpha版，由于是测试版，所以，可能存在不确定的因素，所以，我们这里下载5.5.9 exe。<br />　　<br />　　3、Sysdeo Eclipse Tomcat Launcher plugin 3.1beta版下载<br />　　<br />　　下载地址：</font>
				<a href="http://www.sysdeo.com/eclipse/tomcatplugin">
						<font color="#009933">
								<font size="2">http://www.sysdeo.com/eclipse/tomcatplugin</font>
						</font>
				</a>
				<br />
				<font size="2">　　<br />　　这里下载tomcatPluginV31beta.zip。<br />　　<br />　　4、eclipse 3.1安装程序下载<br />　　<br />　　下载地址：</font>
				<a href="http://www.eclipse.org/downloads/index.php">
						<font color="#009933">
								<font size="2">http://www.eclipse.org/downloads/index.php</font>
						</font>
				</a>
				<br />
				<font size="2">　　<br />　　这里需要对应版本的JDT，如果下载的是Eclipse SDK版本就自带了，如果没有，同一个下载页面的靠后部分有JDT的下载链接，下载后将对应的文件分别拷贝进eclipse安装目录下的对应的文件夹即可。<br />　　<br />　　这里我们下载eclipse-SDK-3.1-win32.zip 。<br />　　<br />　　5、GEF 3.1 安装程序下载<br />　　<br />　　下载地址：<br />　　<br />　　</font>
				<a href="http://download.eclipse.org/tools/gef/downloads/drops/R-3.1-200507071758/">
						<font color="#009933">
								<font size="2">http://download.eclipse.org/tools/gef/downloads/drops/R-3.1-200507071758/</font>
						</font>
				</a>
				<br />
				<font size="2">　　<br />　　index.php<br />　　<br />　　这里我们下载GEF-ALL-3.1.zip。<br />　　<br />　　6、Eclipse HTML Editor 1.6.7 安装程序下载<br />　　<br />　　下载地址：</font>
				<a href="https://sourceforge.jp/projects/amateras/files/?release_id=16537">
						<font color="#009933">
								<font size="2">https://sourceforge.jp/projects/amateras/files/?release_id=16537</font>
						</font>
				</a>
				<br />
				<font size="2">　　<br />　　#16537<br />　　<br />　　这里我们下载：tk.eclipse.plugin.htmleditor_1.6.7.zip。<br />　　<br />　　7、StrutsIDE 1.1.7 安装程序下载<br />　　<br />　　下载地址：</font>
				<a href="https://sourceforge.jp/projects/amateras/files/?release_id=16537#16537">
						<font color="#009933">
								<font size="2">https://sourceforge.jp/projects/amateras/files/?release_id=16537#16537</font>
						</font>
				</a>
				<br />
				<font size="2">　　<br />　　这里我们下载：tk.eclipse.plugin.struts_1.1.7.zip。<br />　　<br />　　好了，到此我们准备好了所有的安装包。<br />　　<br />　　二、安装JDK并<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(6);" onmouseover="kwE(event,6);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://www.baidu.com/s?wd=site:(bokee.com)配置','_blank');" onmouseout="kwL(event);" target="_blank">配置</a></nobr>开发环境<br />　　<br />　　这里只需要双击JDK安装包的exe文件，按照提示安装即可。安装完成后，将JDK安装目录下的bin文件夹设置进环境变量的path路径中去。同时，将JRE的lib目录下的rt.jar包设置进环境变量的classpath中去。<br />　　<br />　　这里我们把JDK安装到了默认安装路径C:\Program Files\Java\jdk1.5.0_02下。这里就不多说了，网上可以<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(0);" onmouseover="kwE(event,0);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://www.baidu.com/s?wd=site:(bokee.com)搜索','_blank');" onmouseout="kwL(event);" target="_blank">搜索</a></nobr>到很多JDK安装配置的文章。<br />　　<br />　　三、安装tomcat服务器<br />　　<br />　　只需要双击tomcat安装包的exe文件，按照提示安装即可，这里我们的安装目录为D:\Tomcat5.5，管理员密码设置为12345678。<br />　　<br />　　四、安装Eclipse开发工具<br />　　<br />　　只需要把eclipse-SDK-3.1-win32.zip安装包解压，然后把里面的eclipse文件<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(4);" onmouseover="kwE(event,4);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://www.baidu.com/s?wd=site:(bokee.com)夹剪','_blank');" onmouseout="kwL(event);" target="_blank">夹剪</a></nobr>切至想放置的目录即可，这里我们把eclipse安装到了D:\eclipse目录下。<br />　　<br />　　在安装目录下双击eclipse.exe文件，即可启动eclipse。中间会询问默认的工作目录，你可以按其默认设定的，也可以自己设定工作目录，这里设置为E:\workspace目录。请选中Use this as the default and do not ask again选项，这样以后启动就不会再询问了。<br />　　<br />　　到此eclipse安装成功。<br />　　<br />　　五、安装tomcatPlugin<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(2);" onmouseover="kwE(event,2);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://www.baidu.com/s?wd=site:(bokee.com)插件','_blank');" onmouseout="kwL(event);" target="_blank">插件</a></nobr><br />　　<br />　　安装很简单，解压我们已经下载的安装包tomcatPluginV31beta.zip，将解压后的com.sysdeo.eclipse.tomcat_3.1.0.beta文件夹拷贝至D:\eclipse\plugins目录下即可。我们关掉已经打开的eclipse，重新打开，OK,现在我们会发现工具栏上多了几个雄猫的图标，就是tomcat的启动、停止和重启动的<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(3);" onmouseover="kwE(event,3);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://www.baidu.com/s?wd=site:(bokee.com)按钮','_blank');" onmouseout="kwL(event);" target="_blank">按钮</a></nobr>。打开eclipse的window/preferences，我们在左边的树种也可以找到tomcat一项。<br />　　<br />　　点击tomcat项，在右边我们选择version 5.x版本，然后设定tomcat home为D:\Tomcat5.5，Contexts directory为D:\Tomcat5.5\conf\Catalina\localhost。到此tomcat plugin设置完毕。<br />　　<br />　　六、安装GEF插件<br />　　<br />　　同样，将GEF-ALL-3.1.zip解压缩，然后拷贝解压后的eclipse目录下的三个文件夹到D:\eclipse目录下，覆盖所有的现有文件夹。<br />　　<br />　　好了，到此GEF安装完成。<br />　　<br />　　八、创建测试工程<br />　　<br />　　如果已经完成了上面所有步骤，现在可以重新启动eclipse，使新安装的插件生效，开始正式开发了。<br />　　<br />　　1、使用Sysdeo Tomcat Plugin创建tomcat工程：<br />　　<br />　　File-&gt;new-&gt;others，打开新建<nobr><a class="iAs" oncontextmenu="return false;" onmousemove="kwM(5);" onmouseover="kwE(event,5);" style="CURSOR: hand; COLOR: #0000ff; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="window.open('http://www.baidu.com/s?wd=site:(bokee.com)向导','_blank');" onmouseout="kwL(event);" target="_blank">向导</a></nobr>对话框，在树中找到java-&gt;tomcat projects，选中，点击next按钮。在projects name中输入textweb，选中Use default，点击next。在下一个对话页面，保持默认设置，点击finished。这时，我们在eclipse的package explorer中会看到新建的工程testweb，创建完成。<br />　　<br />　　2、加入struts框架<br />　　<br />　　File-&gt;new-&gt;others，打开新建向导对话框，找到Amateras-&gt;Struts-&gt;Add Struts Support，选中点击next按钮。<br />　　<br />　　保持默认设置，点击Finish按钮。这时，在eclipse的package explorer中会看到增加了很多struts的库文件，在WEB-INF下也增加了很多struts的配置文件。到此我们已经在项目加入了Struts框架。<br />　　<br />　　3、编辑struts-config.xml文件<br />　　<br />　　在WEB-INF文件夹下可以找到，右键点击菜单中选择open with-&gt;Amateras XML Editer可以直接对xml文本进行编辑，选择open with-&gt;struts-config.xml editor可以在图形模式下对文件进行编辑。</font>
		</p>
<img src ="http://www.blogjava.net/junky/aggbug/90214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-27 09:35 <a href="http://www.blogjava.net/junky/archive/2006/12/27/90214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js验证大全（正则表达式）- -</title><link>http://www.blogjava.net/junky/archive/2006/12/26/90047.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 26 Dec 2006 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/26/90047.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/90047.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/26/90047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/90047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/90047.html</trackback:ping><description><![CDATA[
		<p>js验证常用正则表达式集锦<br />&lt;script&gt;<br />  /*************************************************<br />*************************************************/<br /> Validator = {<br /> Require : /.+/,<br /> Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,<br /> Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,<br /> Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,<br /> Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&amp;_~`@[\]\':+!]*([^&lt;&gt;\"\"])*$/,<br /> IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,<br /> Currency : /^\d+(\.\d+)?$/,<br /> Number : /^\d+$/,<br /> Zip : /^[1-9]\d{5}$/,<br /> QQ : /^[1-9]\d{4,8}$/,<br /> Integer : /^[-\+]?\d+$/,<br /> Double : /^[-\+]?\d+(\.\d+)?$/,<br /> English : /^[A-Za-z]+$/,<br /> Chinese :  /^[\u0391-\uFFE5]+$/,<br /> Username : /^[a-z]\w{3,}$/i,<br /> UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&amp;\*\.\(\)\[\]\{\}&lt;&gt;\?\\\/\'\"]*)|.{0,5})$|\s/,<br /> IsSafe : function(str){return !this.UnSafe.test(str);},<br /> SafeString : "this.IsSafe(value)",<br /> Filter : "this.DoFilter(value, getAttribute('accept'))",<br /> Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",<br /> LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",<br /> Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",<br /> Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",<br /> Range : "getAttribute('min') &lt; (value|0) &amp;&amp; (value|0) &lt; getAttribute('max')",<br /> Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",<br /> Custom : "this.Exec(value, getAttribute('regexp'))",<br /> Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",<br /> ErrorItem : [document.forms[0]],<br /> ErrorMessage : ["以下原因导致提交失败：\t\t\t\t"],<br /> Validate : function(theForm, mode){<br />  var obj = theForm || event.srcElement;<br />  var count = obj.elements.length;<br />  this.ErrorMessage.length = 1;<br />  this.ErrorItem.length = 1;<br />  this.ErrorItem[0] = obj;<br />  for(var i=0;i&lt;count;i++){<br />   with(obj.elements[i]){<br />    var _dataType = getAttribute("dataType");<br />    if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;<br />    this.ClearState(obj.elements[i]);<br />    if(getAttribute("require") == "false" &amp;&amp; value == "") continue;<br />    switch(_dataType){<br />     case "Date" :<br />     case "Repeat" :<br />     case "Range" :<br />     case "Compare" :<br />     case "Custom" :<br />     case "Group" : <br />     case "Limit" :<br />     case "LimitB" :<br />     case "SafeString" :<br />     case "Filter" :<br />      if(!eval(this[_dataType])) {<br />       this.AddError(i, getAttribute("msg"));<br />      }<br />      break;<br />     default :<br />      if(!this[_dataType].test(value)){<br />       this.AddError(i, getAttribute("msg"));<br />      }<br />      break;<br />    }<br />   }<br />  }<br />  if(this.ErrorMessage.length &gt; 1){<br />   mode = mode || 1;<br />   var errCount = this.ErrorItem.length;<br />   switch(mode){<br />   case 2 :<br />    for(var i=1;i&lt;errCount;i++)<br />     this.ErrorItem[i].style.color = "red";<br />   case 1 :<br />    alert(this.ErrorMessage.join("\n"));<br />    this.ErrorItem[1].focus();<br />    break;<br />   case 3 :<br />    for(var i=1;i&lt;errCount;i++){<br />    try{<br />     var span = document.createElement("SPAN");<br />     span.id = "__ErrorMessagePanel";<br />     span.style.color = "red";<br />     this.ErrorItem[i].parentNode.appendChild(span);<br />     span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");<br />     }<br />     catch(e){alert(e.description);}<br />    }<br />    this.ErrorItem[1].focus();<br />    break;<br />   default :<br />    alert(this.ErrorMessage.join("\n"));<br />    break;<br />   }<br />   return false;<br />  }<br />  return true;<br /> },<br /> limit : function(len,min, max){<br />  min = min || 0;<br />  max = max || Number.MAX_VALUE;<br />  return min &lt;= len &amp;&amp; len &lt;= max;<br /> },<br /> LenB : function(str){<br />  return str.replace(/[^\x00-\xff]/g,"**").length;<br /> },<br /> ClearState : function(elem){<br />  with(elem){<br />   if(style.color == "red")<br />    style.color = "";<br />   var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];<br />   if(lastNode.id == "__ErrorMessagePanel")<br />    parentNode.removeChild(lastNode);<br />  }<br /> },<br /> AddError : function(index, str){<br />  this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];<br />  this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;<br /> },<br /> Exec : function(op, reg){<br />  return new RegExp(reg,"g").test(op);<br /> },<br /> compare : function(op1,operator,op2){<br />  switch (operator) {<br />   case "NotEqual":<br />    return (op1 != op2);<br />   case "GreaterThan":<br />    return (op1 &gt; op2);<br />   case "GreaterThanEqual":<br />    return (op1 &gt;= op2);<br />   case "LessThan":<br />    return (op1 &lt; op2);<br />   case "LessThanEqual":<br />    return (op1 &lt;= op2);<br />   default:<br />    return (op1 == op2);            <br />  }<br /> },<br /> MustChecked : function(name, min, max){<br />  var groups = document.getElementsByName(name);<br />  var hasChecked = 0;<br />  min = min || 1;<br />  max = max || groups.length;<br />  for(var i=groups.length-1;i&gt;=0;i--)<br />   if(groups[i].checked) hasChecked++;<br />  return min &lt;= hasChecked &amp;&amp; hasChecked &lt;= max;<br /> },<br /> DoFilter : function(input, filter){<br />return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);<br /> },<br /> IsDate : function(op, formatString){<br />  formatString = formatString || "ymd";<br />  var m, year, month, day;<br />  switch(formatString){<br />   case "ymd" :<br />    m = op.match(new RegExp("^((<a href="file://d{4})|(//d{2}))([-./])(//d{1,2})//4(//d{1,2})$">\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$</a>"));<br />    if(m == null ) return false;<br />    day = m[6];<br />    month = m[5]*1;<br />    year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));<br />    break;<br />   case "dmy" :<br />    m = op.match(new RegExp("^(<a href="file://d{1,2})([-./])(//d{1,2})//2((//d{4})|(//d{2}))$">\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$</a>"));<br />    if(m == null ) return false;<br />    day = m[1];<br />    month = m[3]*1;<br />    year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));<br />    break;<br />   default :<br />    break;<br />  }<br />  if(!parseInt(month)) return false;<br />  month = month==0 ?12:month;<br />  var date = new Date(year, month-1, day);<br />        return (typeof(date) == "object" &amp;&amp; year == date.getFullYear() &amp;&amp; month == (date.getMonth()+1) &amp;&amp; day == date.getDate());<br />  function GetFullYear(y){return ((y&lt;30 ? "20" : "19") + y)|0;}<br /> }<br /> }<br />&lt;/script&gt;</p>
<img src ="http://www.blogjava.net/junky/aggbug/90047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-26 10:19 <a href="http://www.blogjava.net/junky/archive/2006/12/26/90047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式入门教程</title><link>http://www.blogjava.net/junky/archive/2006/12/26/90046.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 26 Dec 2006 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/26/90046.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/90046.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/26/90046.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/90046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/90046.html</trackback:ping><description><![CDATA[
		<h2>本文目标</h2>
		<p>30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。</p>
		<h2 id="h2">如何使用本教程</h2>
		<p>别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并不像你想像中的那么困难。当然，如果你看完了这篇教程之后发现自己明白了很多，却又几乎什么都记不得，那也是很正常的——其实我认为没接触过正则表达式的人在看完这篇教程后能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本道理，以后你还需要多练习，多查资料，才能熟练掌握正则表达式。</p>
		<p>除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册（就作者本人的经历来说，这个目标还是完成得不错的）。</p>
		<p>文本格式约定：<span class="name"><strong>专业术语</strong></span> <span class="code"><font color="#0000ff">元字符/语法格式</font></span> <span class="regex"><font color="#ff0000">正则表达式</font></span> <span class="part"><font color="#008000">正则表达式中的一部分(用于分析)</font></span> <span class="string"><em>用于在其中搜索的字符串</em></span> <span class="desc">对正则表达式或其中一部分的说明</span><input id="clearButton" accesskey="c" onclick="clearFormats();" type="button" value="清除格式(Alt+C)" /></p>
		<h2 id="h3">什么是正则表达式？</h2>
		<p>在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。<span class="name"><strong>正则表达式</strong></span>就是用于描述这些规则的工具。换句话说，正则表达式就是记录文本规则的代码。</p>
		<p>很可能你使用过Windows/Dos下用于文件查找的<span class="name"><strong>通配符(wildcard)</strong></span>，也就是<span class="code"><font color="#0000ff">*</font></span>和<span class="code"><font color="#0000ff">?</font></span>。如果你想查找某个目录下的所有的Word文档的话，你会搜索<span style="COLOR: red">*.doc</span>。在这里，<span class="code"><font color="#0000ff">*</font></span>会被解释成任意的<a title="参考" href="http://www.w3pop.com/sucai/regular_expression/regular_expression.htm#reference">字符串</a>。和通配符类似，正则表达式也是用来进行<a title="参考" href="http://www.w3pop.com/sucai/regular_expression/regular_expression.htm#reference">文本</a><a title="参考" href="http://www.w3pop.com/sucai/regular_expression/regular_expression.htm#reference">匹配</a>的工具，只不过比起通配符它能更精确地描述你的需求——当然，代价就是更复杂。比如你可以编写一个正则表达式来查找<span class="desc"><u>所有以0开头，后面跟着2-3个数字，然后是一个连字号“-”，最后是7或8位数字的字符串</u></span>(像<span class="string"><em>010-12345678</em></span>或<span class="string"><em>0376-7654321</em></span>)。</p>
		<p id="match">正则表达式是用于进行文本匹配的工具，所以本文里多次提到了在字符串里搜索/查找，这种说法的意思是在给定的字符串中，寻找与给定的正则表达式相匹配的部分。有可能字符串里有不止一个部分满足给定的正则表达式，这时每一个这样的部分被称为一个匹配。<span class="name"><strong>匹配</strong></span>在本文里可能会有三种意思：一种是形容词性的，比如说一个字符串匹配一个表达式；一种是动词性的，比如说在字符串里匹配正则表达式；还有一种是名词性的，就是刚刚说到的“字符串中满足给定的正则表达式的一部分”。</p>
		<h2 id="h4">入门</h2>
		<p>学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。</p>
		<p>假设你在一篇英文小说里查找<span class="desc"><u>hi</u></span>，你可以使用正则正则表达式<span class="regex"><font color="#ff0000">hi</font></span>。</p>
		<p>这是最简单的正则表达式了，它可以精确匹配这样的字符串：<span class="desc"><u>由两个字符组成，前一个字符是h,后一个是i</u></span>。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配<span class="string"><em>hi</em></span>,<span class="string"><em>HI</em></span>,<span class="string"><em>Hi</em></span>,<span class="string"><em>hI</em></span>这四种情况中的任意一种。</p>
		<p>不幸的是，很多单词里包含<span class="string"><em>hi</em></span>这两个连续的字符，比如<span class="string"><em>him</em></span>,<span class="string"><em>history</em></span>,<span class="string"><em>high</em></span>等等。用<span class="regex"><font color="#ff0000">hi</font></span>来查找的话，这里边的<span class="string"><em>hi</em></span>也会被找出来。如果要<span class="desc"><u>精确地查找hi这个单词</u></span>的话，我们应该使用<span class="regex"><font color="#ff0000">\bhi\b</font></span>。</p>
		<p>
				<span class="part">
						<font color="#008000">\b</font>
				</span>是正则表达式规定的一个特殊代码（好吧，某些人叫它<span class="name"><strong>元字符，metacharacter</strong></span>），代表着<span class="desc"><u>单词的开头或结尾，也就是单词的分界处</u></span>。虽然通常英文的单词是由空格或标点符号或换行来分隔的，但是<span class="code"><font color="#0000ff">\b</font></span>并不匹配这些单词分隔符中的任何一个，它<strong>只匹配一个位置</strong>。（如果需要更精确的说法，<span class="code"><font color="#0000ff">\b</font></span>匹配这样的位置：它的前一个字符和后一个字符不全是<span class="code"><font color="#0000ff">\w</font></span>）</p>
		<p>假如你要找的是<span class="desc"><u>hi后面不远处跟着一个Lucy</u></span>，你应该用<span class="regex"><font color="#ff0000">\bhi\b.*\bLucy\b</font></span>。</p>
		<p>这里，<span class="part"><font color="#008000">.</font></span>是另一个元字符，匹配<span class="desc"><u>除了换行符以外的任意字符</u></span>。<span class="part"><font color="#008000">*</font></span>同样是元字符，不过它代表的不是字符，也不是位置，而是数量--它指定*<span class="desc"><u>前边的内容可以重复任意次以使整个表达式得到匹配</u></span>。因此，<span class="part"><font color="#008000">.*</font></span>连在一起就意味着<span class="desc"><u>任意数量的不包含换行的字符</u></span>。现在<span class="regex"><font color="#ff0000">\bhi\b.*\bLucy\b</font></span>的意思就很明显了：<span class="desc"><u>先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词</u></span>。</p>
		<p>如果同时使用其它的一些元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">0\d\d-\d\d\d\d\d\d\d\d</font>
				</span>匹配这样的字符串：<span class="desc"><u>以0开头，然后是两个数字，然后是一个连字号“-”，最后是8个数字</u></span>(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。</p>
		<p>这里的<span class="part"><font color="#008000">\d</font></span>是一个新的元字符，匹配<span class="desc"><u>任意的数字(0，或1，或2，或……)</u></span>。<span class="part"><font color="#008000">-</font></span>不是元字符，只匹配它本身——连字号。</p>
		<p>为了避免那么多烦人的重复，我们也可以这样写这个表达式：<span class="regex"><font color="#ff0000">0\d{2}-\d{8}</font></span></p>
		<p>这里<span class="part"><font color="#008000">\d</font></span>后面的<span class="part"><font color="#008000">{2}</font></span>(<span class="part"><font color="#008000">{8}</font></span>)的意思是前面<span class="part"><font color="#008000">\d</font></span><span class="desc"><u>必须连续重复匹配2次(8次)</u></span>。</p>
		<h2 id="h5">测试正则表达式</h2>
		<p>如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以很有必要创建一种工具来测试正则表达式。</p>
		<p>由于在不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是Microsoft .Net 2.0下正则表达式的行为，所以，我向你介绍一个.Net下的工具<a href="http://www.dotnet2themax.com/blogs/fbalena/PermaLink,guid,13bce26d-7755-441e-92b3-1eb5f9e859f9.aspx">Regex Tester</a>。首先你确保已经安装了<a title="转到下载.Net Framework 2.0的页面" href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5">.Net Framework 2.0</a>，然后<a title="本地下载Regex Tester, 75KB" href="http://www.unibetter.com/deerchao/downloads/RegexTester.zip">下载Regex Tester</a>，下载完后打开压缩包,直接运行RegexTester.exe。</p>
		<p>下面是Regex Tester运行时的截图：</p>
		<p>
				<img alt="Regex Tester运行时的截图" src="http://www.w3pop.com/sucai/regular_expression/zhengzhe-biaodashi-jiaocheng-se_files/RegexTester.jpg" />
		</p>
		<h2 id="h6">元字符</h2>
		<p>现在你已经知道几个很有用的元字符了，如<span class="code"><font color="#0000ff">\b</font></span>,<span class="code"><font color="#0000ff">.</font></span>,<span class="code"><font color="#0000ff">*</font></span>，还有<span class="code"><font color="#0000ff">\d</font></span>.当然还有更多的元字符，比如<span class="code"><font color="#0000ff">\s</font></span>匹配<span class="desc"><u>任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等</u></span>。<span class="code"><font color="#0000ff">\w</font></span>匹配<span class="desc"><u>字母或数字或下划线或汉字</u></span>。</p>
		<p>下面来试试更多的例子：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\ba\w*\b</font>
				</span>匹配<span class="desc"><u>以字母<span class="part"><font color="#008000">a</font></span>开头的单词——先是某个单词开始处(<span class="part"><font color="#008000">\b</font></span>)，然后是字母<span class="part"><font color="#008000">a</font></span>,然后是任意数量的字母或数字(<span class="part"><font color="#008000">\w*</font></span>)，最后是单词结束处(<span class="part"><font color="#008000">\b</font></span>)</u></span>（好吧，现在我们说说这里的单词是什么意思吧：就是几个连续的<span class="code"><font color="#0000ff">\w</font></span>。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大）。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\d+</font>
				</span>匹配<span class="desc"><u>1个或更多连续的数字</u></span>。这里的<span class="part"><font color="#008000">+</font></span>是和<span class="code"><font color="#0000ff">*</font></span>类似的元字符，不同的是<span class="code"><font color="#0000ff">*</font></span>匹配<span class="desc"><u>重复任意次(可能是0次)</u></span>，而<span class="code"><font color="#0000ff">+</font></span>则匹配<span class="desc"><u>重复1次或更多次</u></span>。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\b\w{6}\b</font>
				</span>匹配<span class="desc"><u>刚好6个字母/数字的单词</u></span>。</p>
		<table cellspacing="0">
				<caption>表1.常用的元字符</caption>
				<tbody>
						<tr>
								<th>代码</th>
								<th>说明</th>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">.</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配除换行符以外的任意字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\w</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配字母或数字或下划线或汉字</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\s</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配任意的空白符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\d</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配数字</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\b</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配单词的开始或结束</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">^</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配字符串的开始</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">$</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配字符串的结束</u>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p>元字符<span class="code"><font color="#0000ff">^</font></span>（和6在同一个键位上的符号）以及<span class="code"><font color="#0000ff">$</font></span>和<span class="code"><font color="#0000ff">\b</font></span>有点类似，都匹配一个位置。<span class="code"><font color="#0000ff">^</font></span>匹配你要用来查找的字符串的开头，<span class="code"><font color="#0000ff">$</font></span>匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：<span class="regex"><font color="#ff0000">^\d{5,12}$</font></span>。</p>
		<p>这里的<span class="part"><font color="#008000">{5,12}</font></span>和前面介绍过的<span class="part"><font color="#008000">{2}</font></span>是类似的，只不过<span class="part"><font color="#008000">{2}</font></span>匹配<span class="desc"><u>只能不多不少重复2次</u></span>，<span class="part"><font color="#008000">{5,12}</font></span>则是<span class="desc"><u>必须重复最少5次，最多12次</u></span>，否则都不匹配。</p>
		<p>因为使用了<span class="part"><font color="#008000">^</font></span>和<span class="part"><font color="#008000">$</font></span>，所以输入的整个字符串都要用来和<span class="part"><font color="#008000">\d{5,12}</font></span>来匹配，也就是说整个输入<span class="desc"><u>必须是5到12个数字</u></span>，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。</p>
		<p>和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，<span class="code"><font color="#0000ff">^</font></span>和<span class="code"><font color="#0000ff">$</font></span>的意义就变成了<span class="desc"><u>匹配行的开始处和结束处</u></span>。</p>
		<h2 id="h7">字符转义</h2>
		<p>如果你想查找元字符本身的话，比如你查找<span class="desc"><u>.</u></span>,或者<span class="desc"><u>*</u></span>,就出现了问题：你没法指定它们，因为它们会被解释成其它的意思。这时你就必须使用<span class="code"><font color="#0000ff">\</font></span>来取消这些字符的特殊意义。因此，你应该使用<span class="regex"><font color="#ff0000">\.</font></span>和<span class="regex"><font color="#ff0000">\*</font></span>。当然，要查找<span class="desc"><u>\</u></span>本身，你也得用<span class="regex"><font color="#ff0000">\\</font></span>.</p>
		<p>例如：<span class="regex"><font color="#ff0000">www\.unibetter\.com</font></span>匹配<span class="desc"><u>www.unibetter.com</u></span>，<span class="regex"><font color="#ff0000">c:\\windows</font></span>匹配<span class="desc"><u>c:\windows</u></span>,<span class="regex"><font color="#ff0000">2\^8</font></span>匹配<span class="desc"><u>2^8</u></span>(通常这是2的8次方的书写方式)。</p>
		<h2 id="h8">重复</h2>
		<p>你已经看过了前面的<span class="code"><font color="#0000ff">*</font></span>,<span class="code"><font color="#0000ff">+</font></span>,<span class="code"><font color="#0000ff">{2}</font></span>,<span class="code"><font color="#0000ff">{5,12}</font></span>这几个匹配重复的方式了。下面是正则表达式中所有指定重复的方式：</p>
		<table cellspacing="0">
				<caption>表2.常用的限定符</caption>
				<tbody>
						<tr>
								<th>代码/语法</th>
								<th>说明</th>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">*</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复零次或更多次</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">+</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复一次或更多次</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">?</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复零次或一次</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">{n}</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复n次</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">{n,}</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复n次或更多次</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">{n,m}</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复n到m次</u>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p>下面是一些使用重复的例子：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">Windows\d+</font>
				</span>匹配<span class="desc"><u>Windows后面跟1个或更多数字</u></span></p>
		<p>
				<span class="regex">
						<font color="#ff0000">13\d{9}</font>
				</span>匹配<span class="desc"><u>以13后面跟9个数字(中国的手机号)</u></span></p>
		<p>
				<span class="regex">
						<font color="#ff0000">^\w+</font>
				</span>匹配<span class="desc"><u>一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)</u></span></p>
		<h2 id="h9">字符类</h2>
		<p>要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集的元字符，但是如果你想匹配没有预定义元字符的字符集比如元音字母(a,e,i,o,u),怎么办？</p>
		<p>很简单，你只需要在中括号里列出它们就行了，像<span class="regex"><font color="#ff0000">[aeiou]</font></span>就匹配<span class="desc"><u>任何一个元音字母</u></span>，<span class="regex"><font color="#ff0000">[.?!]</font></span>匹配<span class="desc"><u>标点符号(.或?或!)</u></span>(英文语句通常只以这三个标点结束)。注意，我们不需要写成[\.\?!]。</p>
		<p>我们也可以轻松地指定一个字符<span class="name"><strong>范围</strong></span>，像<span class="regex"><font color="#ff0000">[0-9]</font></span>代表的含意与<span class="regex"><font color="#ff0000">\d</font></span>就是完全一致的：<span class="desc"><u>一位数字</u></span>，同理<span class="regex"><font color="#ff0000">[a-z0-9A-Z_]</font></span>也完全等同于<span class="code"><font color="#0000ff">\w</font></span>（如果只考虑英文的话）。</p>
		<p>下面是一个更复杂的表达式：<span class="regex"><font color="#ff0000">\(?0\d{2}[) -]?\d{8}</font></span>。</p>
		<p>这个表达式可以匹配<span class="desc"><u>几种格式的电话号码</u></span>，像<span class="string"><em>(010)88886666</em></span>，或<span class="string"><em>022-22334455</em></span>，或<span class="string"><em>02912345678</em></span>等。我们对它进行一些分析吧：首先是一个转义字符<span class="part"><font color="#008000">\(</font></span>,它能出现0次或1次(<span class="part"><font color="#008000">?</font></span>),然后是一个<span class="part"><font color="#008000">0</font></span>，后面跟着2个数字(<span class="part"><font color="#008000">{2}</font></span>)，然后是<span class="part"><font color="#008000">)</font></span>或<span class="part"><font color="#008000">-</font></span>或<span class="part"><font color="#008000">空格</font></span>中的一个，它出现1次或不出现(<span class="part"><font color="#008000">?</font></span>)，最后是8个数字(<span class="part"><font color="#008000">\d{8}</font></span>)。不幸的是，它也能匹配<span class="string"><em>010)12345678</em></span>或<span class="string"><em>(022-87654321</em></span>这样的“不正确”的格式。要解决这个问题，请在本教程的下面查找答案。</p>
		<h2 id="h10">反义</h2>
		<p>有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到<span class="name"><strong>反义</strong></span>：</p>
		<table cellspacing="0">
				<caption>表3.常用的反义代码</caption>
				<tbody>
						<tr>
								<th>代码/语法</th>
								<th>说明</th>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\W</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配任意不是字母，数字，下划线，汉字的字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\S</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配任意不是空白符的字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\D</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配任意非数字的字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\B</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配不是单词开头或结束的位置</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">[^x]</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配除了x以外的任意字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">[^aeiou]</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配除了aeiou这几个字母以外的任意字符</u>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p>例子：<span class="regex"><font color="#ff0000">\S+</font></span>匹配<span class="desc"><u>不包含空白符的字符串</u></span>。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">&lt;a[^&gt;]+&gt;</font>
				</span>匹配<span class="desc"><u>用尖括号括起来的以a开头的字符串</u></span>。</p>
		<h2 id="h11">替换</h2>
		<p>好了，现在终于到了解决3位或4位区号问题的时间了。正则表达式里的<span class="name"><strong>替换</strong></span>指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用<span class="code"><font color="#0000ff">|</font></span>把不同的规则分隔开。听不明白？没关系，看例子：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">0\d{2}-\d{8}|0\d{3}-\d{7}</font>
				</span>这个表达式能<span class="desc"><u>匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)</u></span>。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}</font>
				</span>这个表达式<span class="desc"><u>匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔</u></span>。你可以试试用替换|把这个表达式扩展成也支持4位区号的。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\d{5}-\d{4}|\d{5}</font>
				</span>这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：<strong>使用替换时，顺序是很重要的</strong>。如果你把它改成<span class="regex"><font color="#ff0000">\d{5}|\d{5}-\d{4}</font></span>的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配替换时，将会从左到右地测试每个分枝条件，如果满足了某个分枝的话，就不会去管其它的替换条件了。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">Windows98|Windows2000|WindosXP</font>
				</span>这个例子是为了告诉你替换不仅仅能用于两种规则，也能用于更多种规则。</p>
		<h2 id="h12">分组</h2>
		<p>我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复一个字符串又该怎么办？你可以用小括号来指定<span class="name"><strong>子表达式</strong></span>(也叫做<span class="name"><strong>分组</strong></span>)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。</p>
		<p>
				<span class="regex">
						<font color="#ff0000">(\d{1,3}\.){3}\d{1,3}</font>
				</span>是一个<span class="desc"><u>简单的IP地址匹配</u></span>表达式。要理解这个表达式，请按下列顺序分析它：<span class="part"><font color="#008000">\d{1,3}</font></span>匹配<span class="desc"><u>1到3位的数字</u></span>，<span class="part"><font color="#008000">(\d{1,3}\.}{3}</font></span>匹配<span class="desc"><u>三位数字加上一个英文句号(这个整体也就是这个<span class="name"><strong>分组</strong></span>)重复3次</u></span>，最后再加上<span class="desc"><u>一个一到三位的数字</u></span>(<span class="part"><font color="#008000">\d{1,3}</font></span>)。</p>
		<p>不幸的是，它也将匹配<span class="string"><em>256.300.888.999</em></span>这种不可能存在的IP地址(IP地址中每个数字都不能大于255)。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：<span class="regex"><font color="#ff0000">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)</font></span>。</p>
		<p>理解这个表达式的关键是理解<span class="part"><font color="#008000">2[0-4]\d|25[0-5]|[01]?\d\d?</font></span>，这里我就不细说了，你自己应该能分析得出来它的意义。</p>
		<h2 id="h13">后向引用</h2>
		<p>使用小括号指定一个子表达式后，<strong>匹配这个子表达式的文本</strong>可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个<span class="name"><strong>组号</strong></span>，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。</p>
		<p>
				<span class="name">
						<strong>后向引用</strong>
				</span>用于重复搜索前面某个分组匹配的文本。例如，<span class="part"><font color="#008000">\1</font></span>代表<span class="desc"><u>分组1匹配的文本</u></span>。难以理解？请看示例：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\b(\w+)\b\s+\1\b</font>
				</span>可以用来匹配<span class="desc"><u>重复的单词</u></span>，像<span class="string"><em>go go</em></span>, <span class="string"><em>kitty kitty</em></span>。首先是<span class="desc"><u>一个单词</u></span>，也就是<span class="desc"><u>单词开始处和结束处之间的多于一个的字母或数字</u></span>(<span class="part"><font color="#008000">\b(\w+)\b</font></span>)，然后是<span class="desc"><u>1个或几个空白符</u></span>(<span class="part"><font color="#008000">\s+</font></span>，最后是<span class="desc"><u>前面匹配的那个单词</u></span>(<span class="part"><font color="#008000">\1</font></span>)。</p>
		<p>你也可以自己指定子表达式的组号或<span class="name"><strong>组名</strong></span>。要指定一个子表达式的组名，请使用这样的语法：<span class="code"><font color="#0000ff">(?&lt;Word&gt;\w+)</font></span>,这样就把<span class="part"><font color="#008000">\w+</font></span>的组名指定为<span class="part"><font color="#008000">Word</font></span>了。要反向引用这个分组<span class="name"><strong>捕获</strong></span>的内容，你可以使用<span class="code"><font color="#0000ff">\k&lt;Word&gt;</font></span>,所以上一个例子也可以写成这样：<span class="regex"><font color="#ff0000">\b(?&lt;Word&gt;\w+)\b\s*\k&lt;Word&gt;\b</font></span>。</p>
		<p>使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：</p>
		<table cellspacing="0">
				<caption>表4.分组语法</caption>
				<tbody>
						<tr>
								<th colspan="2">捕获</th>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配exp,并捕获文本到自动命名的组里</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?&lt;name&gt;exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?:exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配exp,不捕获匹配的文本</u>
										</span>
								</td>
						</tr>
						<tr>
								<th colspan="2">位置指定</th>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?=exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配exp前面的位置</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?&lt;=exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配exp后面的位置</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?!exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配后面跟的不是exp的位置</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?&lt;!exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>匹配前面不是exp的位置</u>
										</span>
								</td>
						</tr>
						<tr>
								<th colspan="2">注释</th>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?#comment)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>这种类型的组不对正则表达式的处理产生任何影响，只是为了提供让人阅读注释</u>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<p>我们已经讨论了前两种语法。第三个<span class="code"><font color="#0000ff">(?:exp)</font></span>不会改变正则表达式的处理方式，只是这样的组匹配的内容<span class="desc"><u>不会像前两种那样被捕获到某个组里面</u></span>。</p>
		<h2 id="h14">位置指定</h2>
		<p>接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们用于指定一个位置，就像<span class="code"><font color="#0000ff">\b</font></span>,<span class="code"><font color="#0000ff">^</font></span>,<span class="code"><font color="#0000ff">$</font></span>那样，因此它们也被称为<span class="name"><strong>零宽断言</strong></span>。最好还是拿例子来说明吧：</p>
		<p>
				<span class="code">
						<font color="#0000ff">(?=exp)</font>
				</span>也叫<span class="name"><strong>零宽先行断言</strong></span>，它<span class="desc"><u>匹配文本中的某些位置，这些位置的后面能匹配给定的后缀exp</u></span>。比如<span class="regex"><font color="#ff0000">\b\w+(?=ing\b)</font></span>，匹配<span class="desc"><u>以ing结尾的单词的前面部分(除了ing以外的部分)</u></span>，如果在查找<span class="string"><em>I'm singing while you're dancing.</em></span>时，它会匹配<span class="desc"><u>sing</u></span>和<span class="desc"><u>danc</u></span>。</p>
		<p>
				<span class="code">
						<font color="#0000ff">(?&lt;=exp)</font>
				</span>也叫<span class="name"><strong>零宽后行断言</strong></span>，它<span class="desc"><u>匹配文本中的某些位置，这些位置的前面能给定的前缀匹配exp</u></span>。比如<span class="regex"><font color="#ff0000">(?&lt;=\bre)\w+\b</font></span>会匹配<span class="desc"><u>以re开头的单词的后半部分(除了re以外的部分)</u></span>，例如在查找<span class="string"><em>reading a book</em></span>时，它匹配<span class="desc"><u>ading</u></span>。</p>
		<p>假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：<span class="regex"><font color="#ff0000">((?&lt;=\d)\d{3})*\b</font></span>。请仔细分析这个表达式，它可能不像你第一眼看出来的那么简单。</p>
		<p>下面这个例子同时使用了前缀和后缀：<span class="regex"><font color="#ff0000">(?&lt;=\s)\d+(?=\s)</font></span>匹配<span class="desc"><u>以空白符间隔的数字(再次强调，不包括这些空白符)</u></span>。</p>
		<h2 id="h15">负向位置指定</h2>
		<p>前面我们提到过怎么查找<strong>不是某个字符或不在某个字符类里</strong>的字符的方法(反义)。但是如果我们只是想要<strong>确保某个字符没有出现，但并不想去匹配它</strong>时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">\b\w*q[^u]\w*\b</font>
				</span>匹配<span class="desc"><u>包含<strong>后面不是字母u的字母q</strong>的单词</u></span>。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像<strong>Iraq</strong>,<strong>Benq</strong>，这个表达式就会出错。这是因为<span class="part"><font color="#008000">[^u]</font></span>总是匹配一个字符，所以如果q是单词的最后一个字符的话，后面的<span class="part"><font color="#008000">[^u]</font></span>将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的<span class="part"><font color="#008000">\w+\b</font></span>将会匹配下一个单词，于是<span class="regex"><font color="#ff0000">\b\w*q[^u]\w*\b</font></span>就能匹配整个<span class="string"><em>Iraq fighting</em></span>。<span class="name"><strong>负向位置指定</strong></span>能解决这样的问题，因为它只匹配一个位置，并不<strong>消费</strong>任何字符。现在，我们可以这样来解决这个问题：<span class="regex"><font color="#ff0000">\b\w*q(?!u)\w*\b</font></span>。</p>
		<p>
				<span class="name">
						<strong>零宽负向先行断言</strong>
				</span>
				<span class="code">
						<font color="#0000ff">(?!exp)</font>
				</span>，只会匹配<span class="desc"><u><span class="name"><strong>后缀</strong></span>exp不存在的位置</u></span>。<span class="regex"><font color="#ff0000">\d{3}(?!\d)</font></span>匹配<span class="desc"><u>三位数字，而且这三位数字的后面不能是数字</u></span>。</p>
		<p>同理，我们可以用<span class="code"><font color="#0000ff">(?&lt;!exp)</font></span>,<span class="name"><strong>零宽负向后行断言</strong></span>来查找<span class="desc"><u>前缀exp不存在的位置</u></span>：<span class="regex"><font color="#ff0000">(?&lt;![a-z])\d{7}</font></span>匹配<span class="desc"><u>前面不是小写字母的七位数字</u></span>(实验时发现错误？注意你的“区分大小写”先项是否选中)。</p>
		<p>一个更复杂的例子：<span class="regex"><font color="#ff0000">(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</font></span>匹配<span class="desc"><u>不包含属性的简单HTML标签内里的内容</u></span>。<span class="code"><font color="#0000ff">(&lt;?(\w+)&gt;)</font></span>指定了这样的前缀：<span class="desc"><u>被尖括号括起来的单词</u></span>(比如可能是&lt;b&gt;)，然后是<span class="part"><font color="#008000">.*</font></span>(任意的字符串),最后是一个后缀<span class="part"><font color="#008000">(?=&lt;\/\1&gt;)</font></span>。注意后缀里的<span class="part"><font color="#008000">\/</font></span>，它用到了前面提过的字符转义；<span class="part"><font color="#008000">\1</font></span>则是一个反向引用，引用的正是<span class="desc"><u>捕获的第一组</u></span>，前面的<span class="part"><font color="#008000">(\w+)</font></span>匹配的内容，这样如果前缀实际上是&lt;b&gt;的话，后缀就是&lt;/b&gt;了。整个表达式匹配的是&lt;b&gt;和&lt;/b&gt;之间的内容(再次提醒，不包括前缀和后缀本身)。</p>
		<h2 id="h16">注释</h2>
		<p>小括号的另一种用途是能过语法<span class="code"><font color="#0000ff">(?#comment)</font></span>来包含注释。例如：<span class="regex"><font color="#ff0000">2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)</font></span>。</p>
		<p>要包含注释的话，最好是启用“忽略模式里的空白符”选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。</p>
		<p>例如，我们可以前面的一个表达式写成这样：</p>
		<pre>      (?&lt;=    # 查找前缀，但不包含它
      &lt;(\w+)&gt; # 查找尖括号括起来的字母或数字(标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?=     # 查找后缀，但不包含它
      &lt;\/\1&gt;  # 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签
      )       # 后缀结束
    </pre>
		<h2 id="h17">贪婪与懒惰</h2>
		<p>当正则表达式中包含能接受重复的限定符(指定数量的代码，例如*,{5,12}等)时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配<strong>尽可能多</strong>的字符。考虑这个表达式：<span class="regex"><font color="#ff0000">a.*b</font></span>，它将会匹配<span class="desc"><u>最长的以a开始，以b结束的字符串</u></span>。如果用它来搜索<span class="string"><em>aabab</em></span>的话，它会匹配整个字符串<span class="desc"><u>aabab</u></span>。这被称为<span class="name"><strong>贪婪</strong></span>匹配。</p>
		<p>有时，我们更需要<span class="name"><strong>懒惰</strong></span>匹配，也就是匹配<strong>尽可能少</strong>的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号<span class="code"><font color="#0000ff">?</font></span>。这样<span class="regex"><font color="#ff0000">.*?</font></span>就意味着<span class="desc"><u>匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复</u></span>。现在看看懒惰版的例子吧：</p>
		<p>
				<span class="regex">
						<font color="#ff0000">a.*?b</font>
				</span>匹配<span class="desc"><u>最短的，以a开始，以b结束的字符串</u></span>。如果把它应用于<span class="string"><em>aabab</em></span>的话，它会匹配<span class="desc"><u>aab</u></span>和<span class="desc"><u>ab</u></span>（为什么第一个匹配是aab而不是ab？简单地说，最先开始的区配最有最大的优先权——The Match That Begins Earliest Wins）。</p>
		<table cellspacing="0">
				<caption>表5.懒惰限定符</caption>
				<tbody>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">*?</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复任意次，但尽可能少重复</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">+?</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复1次或更多次，但尽可能少重复</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">??</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复0次或1次，但尽可能少重复</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">{n,m}?</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复n到m次，但尽可能少重复</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">{n,}?</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>重复n次以上，但尽可能少重复</u>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<h2 id="h18">平衡组</h2>
		<p>如果想要匹配可嵌套的层次性结构的话，就得使用平衡组了。举个例子吧，如何把“xx &lt;aa &lt;bbb&gt; &lt;bbb&gt; aa&gt; yy”这样的字符串里，最长的括号内的内容捕获出来？</p>
		<p>这里需要用到以下的语法构造：</p>
		<ul>
				<li>
						<span class="code">
								<font color="#0000ff">(?&lt;group&gt;)</font>
						</span>把捕获的内容命名为group,并压入堆栈 
</li>
				<li>
						<span class="code">
								<font color="#0000ff">(?&lt;-group&gt;)</font>
						</span>从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败 
</li>
				<li>
						<span class="code">
								<font color="#0000ff">(?(group)yes|no)</font>
						</span>如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分 
</li>
				<li>
						<span class="code">
								<font color="#0000ff">(?!)</font>
						</span>零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败 </li>
		</ul>
		<p>如果你不是一个程序员（或者你是一个对堆栈的概念不熟的程序员），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个（或再写一个） "group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配 no部分。</p>
		<p>我们需要做的是每碰到了左括号，就在黑板上写一个"group"，每碰到一个右括号，就擦掉一个，到了最后就看看黑板上还有没有－如果有那就证明左括号比右括号多，那匹配就应该失败（为了能看得更清楚一点，我用了(?'group')的语法）：</p>
		<pre>&lt;                         #最外层的左括号
    [^&lt;&gt;]*                #最外层的左括号后面的不是括号的内容
    (
        (
            (?'Open'&lt;)    #碰到了左括号，在黑板上写一个"Open"
            [^&lt;&gt;&gt;]*       #匹配左括号后面的不是括号的内容
        )+
        (
            (?'-Open'&gt;)   #碰到了右括号，擦掉一个"Open"
            [^&lt;&gt;]*        #匹配右括号后面不是括号的内容
        )+
    )*
    (?(Open)(?!))         #在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败
&gt;                         #最外层的右括号</pre>
		<h2 id="h19">还有些什么东西没提到</h2>
		<p>我已经描述了构造正则表达式的大量元素，还有一些我没有提到的东西。下面是未提到的元素的列表，包含语法和简单的说明。你可以在网上找到更详细的参考资料 来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关于.net下正则表达式详细的文档。</p>
		<table cellspacing="0">
				<caption>表6.尚未详细讨论的语法</caption>
				<tbody>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\a</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>报警字符(打印它的效果是电脑嘀一声)</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\b</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>通常是单词分界位置，但如果在字符类里使用代表退格</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\t</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>制表符，Tab</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\r</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>回车</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\v</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>竖向制表符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\f</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>换页符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\n</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>换行符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\e</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>Escape</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\0nn</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>ASCII代码中八进制代码为nn的字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\xnn</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>ASCII代码中十六进制代码为nn的字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\unnnn</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>Unicode代码中十六进制代码为nnnn的字符</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\cN</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>ASCII控制字符。比如\cC代表Ctrl+C</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\A</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>字符串开头(类似^，但不受处理多行选项的影响)</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\Z</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>字符串结尾或行尾(不受处理多行选项的影响)</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\z</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>字符串结尾(类似$，但不受处理多行选项的影响)</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\G</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>当前搜索的开头</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">\p{name}</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>Unicode中命名为name的字符类，例如\p{IsGreek}</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?&gt;exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>贪婪子表达式</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?&lt;x&gt;-&lt;y&gt;exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>平衡组</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?im-nsx:exp)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>在子表达式exp中改变处理选项</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?im-nsx)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>为表达式后面的部分改变处理选项</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?(exp)yes|no)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?(exp)yes)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>同上，只是使用空表达式作为no</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?(name)yes|no)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no</u>
										</span>
								</td>
						</tr>
						<tr>
								<td>
										<span class="code">
												<font color="#0000ff">(?(name)yes)</font>
										</span>
								</td>
								<td>
										<span class="desc">
												<u>同上，只是使用空表达式作为no</u>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<h2 id="reference">一些我认为你可能已经知道的术语的参考</h2>
		<dl>
				<dt>字符 
</dt>
				<dd>程序处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。 
</dd>
				<dt>字符串 
</dt>
				<dd>0个或更多个字符的序列。 
</dd>
				<dt>文本 
</dt>
				<dd>文字，字符串。 
</dd>
				<dt>匹配 
</dt>
				<dd>符合规则，检验是否符合规则，符合规则的部分。 </dd>
		</dl>
		<h2 id="h21">网上的资源及本文参考文献</h2>
		<ul>
				<li>
						<a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsreconintroductiontoregularexpressions.asp">微软的正则表达式教程</a>
				</li>
				<li>
						<a href="http://www.regular-expressions.info/">专业的正则表达式教学网站(英文)</a>
				</li>
				<li>
						<a href="http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx">关于.Net下的平衡组的详细讨论（英文）</a>
				</li>
				<li>
						<a href="http://www.oreilly.com/catalog/regex2/">Mastering Regular Expressions (Second Edition)</a>
				</li>
		</ul>
		<h2 id="h22">第二版更新说明</h2>
		<ul>
				<li>修正了几个细节上的错误和不准确的地方 
</li>
				<li>增加了对处理中文时的一些说明 
</li>
				<li>更改了几个术语的翻译（采用了MSDN的翻译方式） 
</li>
				<li>增加了平衡组的介绍 
</li>
				<li>放弃了对The Regulator的介绍，改用Regex Tester </li>
		</ul>
		<p>Updated on: 2006-10-12</p>
		<p>讨论，指教，请到<a href="http://www.unibetter.com/blogs/blogdeerchao/archive/2006/03/27/zhengzhe-jiaocheng.aspx">这里</a>。</p>
		<h2>附加：常用正则</h2>
		<p>匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br /><br />匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br /><br />应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br /><br />String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}<br /><br />匹配空行的正则表达式：\n[\s| ]*\r<br /><br />匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ <br /><br />匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br /><br />应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：<br /><br />String.prototype.trim = function()<br />{<br />return this.replace(/(^\s*)|(\s*$)/g, "");<br />}<br /><br />利用正则表达式分解和转换IP地址：<br /><br />下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：<br /><br />function IP2V(ip)<br />{<br />re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br />throw new Error("Not a valid IP address!")<br />}<br />}<br /><br />不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：<br /><br />var ip="10.100.20.168"<br />ip=ip.split(".")<br />alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<br /><br />匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br /><br />匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?<br /><br />利用正则表达式去除字串中重复的字符的算法程序：[注：此程序不正确，原因见本贴回复]<br /><br />var s="abacabefgeeii"<br />var s1=s.replace(/(.).*\1/g,"$1")<br />var re=new RegExp("["+s1+"]","g")<br />var s2=s.replace(re,"") <br />alert(s1+s2) //结果为：abcefgi<br /><br />我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。<br /><br />得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1<br /><br />s="http://www.9499.net/page1.htm"<br />s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<br />alert(s)<br /><br />利用正则表达式限制网页表单里的文本框输入内容：<br /><br />用 正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"<br /><br />用 正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"<br /><br />用 正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"<br /><br />用 正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"</p>
<img src ="http://www.blogjava.net/junky/aggbug/90046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-26 10:17 <a href="http://www.blogjava.net/junky/archive/2006/12/26/90046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS常见函数</title><link>http://www.blogjava.net/junky/archive/2006/12/04/85427.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 04 Dec 2006 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/04/85427.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/85427.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/04/85427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/85427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/85427.html</trackback:ping><description><![CDATA[
		<div class="code_title">
				<span>
						<span>    </span>
				</span>
		</div>
		<div class="code_div">
				<div class="dp-highlighter">
						<ol class="dp-j">
								<li class="">
										<span>
										</span>
										<span class="number">1</span>
										<span>.常规函数   </span>
								</li>
								<li class="alt">
										<span>　　javascript常规函数包括以下</span>
										<span class="number">9</span>
										<span>个函数：   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">1</span>
										<span>)alert函数：显示一个警告对话框，包括一个OK按钮。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">2</span>
										<span>)confirm函数：显示一个确认对话框，包括OK、Cancel按钮。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">3</span>
										<span>)escape函数：将字符转换成Unicode码。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">4</span>
										<span>)eval函数：计算表达式的结果。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">5</span>
										<span>)isNaN函数：测试是(</span>
										<span class="keyword">true</span>
										<span>)否(</span>
										<span class="keyword">false</span>
										<span>)不是一个数字。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">6</span>
										<span>)parseFloat函数：将字符串转换成符点数字形式。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">7</span>
										<span>)parseInt函数：将符串转换成整数数字形式(可指定几进制)。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">8</span>
										<span>)prompt函数：显示一个输入对话框，提示等待用户输入。例如：   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">9</span>
										<span>)unescape函数：解码由escape函数编码的字符。   </span>
								</li>
								<li class="alt">
										<span>　　</span>
										<span class="number">2</span>
										<span>.数组函数   </span>
								</li>
								<li class="">
										<span>　　javascript数组函数包括以下</span>
										<span class="number">4</span>
										<span>个函数：   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">1</span>
										<span>)join函数：转换并连接数组中的所有元素为一个字符串。例:   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>　　　　function JoinDemo()   </span>
								</li>
								<li class="alt">
										<span>　　　　{   </span>
								</li>
								<li class="">
										<span>　　　　　var a, b;   </span>
								</li>
								<li class="alt">
										<span>　　　　　a = </span>
										<span class="keyword">new</span>
										<span> Array(</span>
										<span class="number">0</span>
										<span>,</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">2</span>
										<span>,</span>
										<span class="number">3</span>
										<span>,</span>
										<span class="number">4</span>
										<span>);   </span>
								</li>
								<li class="">
										<span>　　　　　b = a.join(</span>
										<span class="string">"-"</span>
										<span>);</span>
										<span class="comment">//分隔符 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>　　　　　</span>
										<span class="keyword">return</span>
										<span>(b);</span>
										<span class="comment">//返回的b=="0-1-2-3-4" </span>
										<span>  </span>
								</li>
								<li class="">
										<span>　　　　}    </span>
								</li>
								<li class="alt">
										<span>　   </span>
								</li>
								<li class="">
										<span>　(</span>
										<span class="number">2</span>
										<span>)langth函数：返回数组的长度。例：   </span>
								</li>
								<li class="alt">
										<span>　　　　    </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function LengthDemo()   </span>
								</li>
								<li class="">
										<span>　　　　{   </span>
								</li>
								<li class="alt">
										<span>　　　　　var a, l;   </span>
								</li>
								<li class="">
										<span>　　　　　a = </span>
										<span class="keyword">new</span>
										<span> Array(</span>
										<span class="number">0</span>
										<span>,</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">2</span>
										<span>,</span>
										<span class="number">3</span>
										<span>,</span>
										<span class="number">4</span>
										<span>);   </span>
								</li>
								<li class="alt">
										<span>　　　　　l = a.length;   </span>
								</li>
								<li class="">
										<span>　　　　　</span>
										<span class="keyword">return</span>
										<span>(l);</span>
										<span class="comment">//l==5 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>　　　　}    </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">3</span>
										<span>)reverse函数：将数组元素顺序颠倒。例：   </span>
								</li>
								<li class="">
										<span>　　　    </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function ReverseDemo()   </span>
								</li>
								<li class="alt">
										<span>　　　{   </span>
								</li>
								<li class="">
										<span>　　　　var a, l;   </span>
								</li>
								<li class="alt">
										<span>　　　　a = </span>
										<span class="keyword">new</span>
										<span> Array(</span>
										<span class="number">0</span>
										<span>,</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">2</span>
										<span>,</span>
										<span class="number">3</span>
										<span>,</span>
										<span class="number">4</span>
										<span>);   </span>
								</li>
								<li class="">
										<span>　　　　l = a.reverse();   </span>
								</li>
								<li class="alt">
										<span>　　　　</span>
										<span class="keyword">return</span>
										<span>(l);   </span>
								</li>
								<li class="">
										<span>　　　}    </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">4</span>
										<span>)sort函数：将数组元素重新排序。例：   </span>
								</li>
								<li class="">
										<span>　　　　    </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function SortDemo()   </span>
								</li>
								<li class="alt">
										<span>　　　　{   </span>
								</li>
								<li class="">
										<span>　　　　　var a, l;   </span>
								</li>
								<li class="alt">
										<span>　　　　　a = </span>
										<span class="keyword">new</span>
										<span> Array(</span>
										<span class="string">"X"</span>
										<span> ,</span>
										<span class="string">"y"</span>
										<span> ,</span>
										<span class="string">"d"</span>
										<span>, </span>
										<span class="string">"Z"</span>
										<span>, </span>
										<span class="string">"v"</span>
										<span>,</span>
										<span class="string">"m"</span>
										<span>,</span>
										<span class="string">"r"</span>
										<span>);   </span>
								</li>
								<li class="">
										<span>　　　　　l = a.sort();   </span>
								</li>
								<li class="alt">
										<span>　　　　　</span>
										<span class="keyword">return</span>
										<span>(l);   </span>
								</li>
								<li class="">
										<span>　　　　}    </span>
								</li>
								<li class="alt">
										<span>　　</span>
										<span class="number">3</span>
										<span>.日期函数   </span>
								</li>
								<li class="">
										<span>　　javascript日期函数包括以下</span>
										<span class="number">20</span>
										<span>个函数：   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">1</span>
										<span>)getDate函数：返回日期的“日”部分，值为</span>
										<span class="number">1</span>
										<span>～</span>
										<span class="number">31</span>
										<span>。例：   </span>
								</li>
								<li class="">
										<span>　　　    </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function DateDemo()   </span>
								</li>
								<li class="alt">
										<span>　　　{   </span>
								</li>
								<li class="">
										<span>　　　　var d, s = </span>
										<span class="string">"Today's date is: "</span>
										<span>;   </span>
								</li>
								<li class="alt">
										<span>　　　　d = </span>
										<span class="keyword">new</span>
										<span> Date();   </span>
								</li>
								<li class="">
										<span>　　　　s += (d.getMonth() + </span>
										<span class="number">1</span>
										<span>) + </span>
										<span class="string">"/"</span>
										<span>;   </span>
								</li>
								<li class="alt">
										<span>　　　　s += d.getDate() + </span>
										<span class="string">"/"</span>
										<span>;   </span>
								</li>
								<li class="">
										<span>　　　　s += d.getYear();   </span>
								</li>
								<li class="alt">
										<span>　　　　</span>
										<span class="keyword">return</span>
										<span>(s);   </span>
								</li>
								<li class="">
										<span>　　　}    </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">2</span>
										<span>)getDay函数：返回星期几，值为</span>
										<span class="number">0</span>
										<span>～</span>
										<span class="number">6</span>
										<span>，其中</span>
										<span class="number">0</span>
										<span>表示星期日，</span>
										<span class="number">1</span>
										<span>表示星期一，...，</span>
										<span class="number">6</span>
										<span>表示星期六。例：   </span>
								</li>
								<li class="">
										<span>　　　    </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function DateDemo()   </span>
								</li>
								<li class="alt">
										<span>　　　{   </span>
								</li>
								<li class="">
										<span>　　　　var d, day, x, s = </span>
										<span class="string">"Today is: "</span>
										<span>;   </span>
								</li>
								<li class="alt">
										<span>　　　　var x = </span>
										<span class="keyword">new</span>
										<span> Array(</span>
										<span class="string">"Sunday"</span>
										<span>, </span>
										<span class="string">"Monday"</span>
										<span>, </span>
										<span class="string">"Tuesday"</span>
										<span>);   </span>
								</li>
								<li class="">
										<span>　　　　var x = x.concat(</span>
										<span class="string">"Wednesday"</span>
										<span>,</span>
										<span class="string">"Thursday"</span>
										<span>, </span>
										<span class="string">"Friday"</span>
										<span>);   </span>
								</li>
								<li class="alt">
										<span>　　　　var x = x.concat(</span>
										<span class="string">"Saturday"</span>
										<span>);   </span>
								</li>
								<li class="">
										<span>　　　　d = </span>
										<span class="keyword">new</span>
										<span> Date();   </span>
								</li>
								<li class="alt">
										<span>　　　　day = d.getDay();   </span>
								</li>
								<li class="">
										<span>　　　　</span>
										<span class="keyword">return</span>
										<span>(s += x[day]);   </span>
								</li>
								<li class="alt">
										<span>　　　}    </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">3</span>
										<span>)getHouse函数：返回日期的“小时”部分，值为</span>
										<span class="number">0</span>
										<span>～</span>
										<span class="number">23</span>
										<span>。例。   </span>
								</li>
								<li class="alt">
										<span>　　　    </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function TimeDemo()   </span>
								</li>
								<li class="">
										<span>　　　{   </span>
								</li>
								<li class="alt">
										<span>　　　　var d, s = </span>
										<span class="string">"The current local time is: "</span>
										<span>;   </span>
								</li>
								<li class="">
										<span>　　　　var c = </span>
										<span class="string">":"</span>
										<span>;   </span>
								</li>
								<li class="alt">
										<span>　　　　d = </span>
										<span class="keyword">new</span>
										<span> Date();   </span>
								</li>
								<li class="">
										<span>　　　　s += d.getHours() + c;   </span>
								</li>
								<li class="alt">
										<span>　　　　s += d.getMinutes() + c;   </span>
								</li>
								<li class="">
										<span>　　　　s += d.getSeconds() + c;   </span>
								</li>
								<li class="alt">
										<span>　　　　s += d.getMilliseconds();   </span>
								</li>
								<li class="">
										<span>　　　　</span>
										<span class="keyword">return</span>
										<span>(s);   </span>
								</li>
								<li class="alt">
										<span>　　　}    </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">4</span>
										<span>)getMinutes函数：返回日期的“分钟”部分，值为</span>
										<span class="number">0</span>
										<span>～</span>
										<span class="number">59</span>
										<span>。见上例。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">5</span>
										<span>)getMonth函数：返回日期的“月”部分，值为</span>
										<span class="number">0</span>
										<span>～</span>
										<span class="number">11</span>
										<span>。其中</span>
										<span class="number">0</span>
										<span>表示</span>
										<span class="number">1</span>
										<span>月，</span>
										<span class="number">2</span>
										<span>表示</span>
										<span class="number">3</span>
										<span>月，...，</span>
										<span class="number">11</span>
										<span>表示</span>
										<span class="number">12</span>
										<span>月。见前面的例子。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">6</span>
										<span>)getSeconds函数：返回日期的“秒”部分，值为</span>
										<span class="number">0</span>
										<span>～</span>
										<span class="number">59</span>
										<span>。见前面的例子。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">7</span>
										<span>)getTime函数：返回系统时间。   </span>
								</li>
								<li class="">
										<span>　　　    </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function GetTimeTest()   </span>
								</li>
								<li class="alt">
										<span>　　　{   </span>
								</li>
								<li class="">
										<span>　　　　var d, s, t;   </span>
								</li>
								<li class="alt">
										<span>　　　　var MinMilli = </span>
										<span class="number">1000</span>
										<span> * </span>
										<span class="number">60</span>
										<span>;   </span>
								</li>
								<li class="">
										<span>　　　　var HrMilli = MinMilli * </span>
										<span class="number">60</span>
										<span>;   </span>
								</li>
								<li class="alt">
										<span>　　　　var DyMilli = HrMilli * </span>
										<span class="number">24</span>
										<span>;   </span>
								</li>
								<li class="">
										<span>　　　　d = </span>
										<span class="keyword">new</span>
										<span> Date();   </span>
								</li>
								<li class="alt">
										<span>　　　　t = d.getTime();   </span>
								</li>
								<li class="">
										<span>　　　　s = </span>
										<span class="string">"It's been "</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>　　　　s += Math.round(t / DyMilli) + </span>
										<span class="string">" days since 1/1/70"</span>
										<span>;   </span>
								</li>
								<li class="">
										<span>　　　　</span>
										<span class="keyword">return</span>
										<span>(s);   </span>
								</li>
								<li class="alt">
										<span>　　　}    </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">8</span>
										<span>)getTimezoneOffset函数：返回此地区的时差(当地时间与GMT格林威治标准时间的地区时差)，单位为分钟。   </span>
								</li>
								<li class="alt">
										<span>　　　    </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function TZDemo()   </span>
								</li>
								<li class="">
										<span>　　　{   </span>
								</li>
								<li class="alt">
										<span>　　　　var d, tz, s = </span>
										<span class="string">"The current local time is "</span>
										<span>;   </span>
								</li>
								<li class="">
										<span>　　　　d = </span>
										<span class="keyword">new</span>
										<span> Date();   </span>
								</li>
								<li class="alt">
										<span>　　　　tz = d.getTimezoneOffset();   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>　　　　</span>
										<span class="keyword">if</span>
										<span> (tz 的链接点的名称，另一个函数link设定的URL地址。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">2</span>
										<span>)big函数：将字体加到一号，与...标签结果相同。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">3</span>
										<span>)blink函数：使字符串闪烁，与...标签结果相同。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">4</span>
										<span>)bold函数：使字体加粗，与...标签结果相同。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">5</span>
										<span>)charAt函数：返回字符串中指定的某个字符。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">6</span>
										<span>)fixed函数：将字体设定为固定宽度字体，与...标签结果相同。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">7</span>
										<span>)fontcolor函数：设定字体颜色，与标签结果相同。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">8</span>
										<span>)fontsize函数：设定字体大小，与标签结果相同。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">9</span>
										<span>)indexOf函数：返回字符串中第一个查找到的下标index，从左边开始查找。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">10</span>
										<span>)italics函数：使字体成为斜体字，与...标签结果相同。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">11</span>
										<span>)lastIndexOf函数：返回字符串中第一个查找到的下标index，从右边开始查找。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">12</span>
										<span>)length函数：返回字符串的长度。(不用带括号)   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">13</span>
										<span>)link函数：产生一个超级链接，相当于设定的URL地址。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">14</span>
										<span>)small函数：将字体减小一号，与...标签结果相同。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">15</span>
										<span>)strike函数：在文本的中间加一条横线，与...标签结果相同。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">16</span>
										<span>)sub函数：显示字符串为下标字(subscript)。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">17</span>
										<span>)substring函数：返回字符串中指定的几个字符。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">18</span>
										<span>)sup函数：显示字符串为上标字(superscript)。   </span>
								</li>
								<li class="alt">
										<span>　　(</span>
										<span class="number">19</span>
										<span>)toLowerCase函数：将字符串转换为小写。   </span>
								</li>
								<li class="">
										<span>　　(</span>
										<span class="number">20</span>
										<span>)toUpperCase函数：将字符串转换为大写。   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//校验是否全由数字组成 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isDigit(s)   </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>var patrn=/^[</span>
										<span class="number">0</span>
										<span>-</span>
										<span class="number">9</span>
										<span>]{</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">20</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//校验登录名：只能输入5-20个以字母开头、可带数字、“_”、“.”的字串 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isRegisterUserName(s)   </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>var patrn=/^[a-zA-Z]{</span>
										<span class="number">1</span>
										<span>}([a-zA-Z0-</span>
										<span class="number">9</span>
										<span>]|[._]){</span>
										<span class="number">4</span>
										<span>,</span>
										<span class="number">19</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//校验用户姓名：只能输入1-30个以字母开头的字串 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isTrueName(s)   </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>var patrn=/^[a-zA-Z]{</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">30</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//校验密码：只能输入6-20个字母、数字、下划线 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isPasswd(s)   </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>var patrn=/^(\w){</span>
										<span class="number">6</span>
										<span>,</span>
										<span class="number">20</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//校验普通电话、传真号码：可以“+”开头，除数字外，可含有“-” </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isTel(s)   </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="comment">//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; </span>
										<span>  </span>
								</li>
								<li class="">
										<span>var patrn=/^[+]{</span>
										<span class="number">0</span>
										<span>,</span>
										<span class="number">1</span>
										<span>}(\d){</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">3</span>
										<span>}[ ]?([-]?((\d)|[ ]){</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">12</span>
										<span>})+$/;   </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>}   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="comment">//校验手机号码：必须以数字开头，除数字外，可含有“-” </span>
										<span>  </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function isMobil(s)   </span>
								</li>
								<li class="alt">
										<span>{   </span>
								</li>
								<li class="">
										<span>var patrn=/^[+]{</span>
										<span class="number">0</span>
										<span>,</span>
										<span class="number">1</span>
										<span>}(\d){</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">3</span>
										<span>}[ ]?([-]?((\d)|[ ]){</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">12</span>
										<span>})+$/;   </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>}   </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="comment">//校验邮政编码 </span>
										<span>  </span>
								</li>
								<li class="">
										<span>  </span>
								</li>
								<li class="alt">
										<span> 程序代码   </span>
								</li>
								<li class="">
										<span>function isPostalCode(s)   </span>
								</li>
								<li class="alt">
										<span>{   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//var patrn=/^[a-zA-Z0-9]{3,12}$/; </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>var patrn=/^[a-zA-Z0-</span>
										<span class="number">9</span>
										<span> ]{</span>
										<span class="number">3</span>
										<span>,</span>
										<span class="number">12</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="comment">//校验搜索关键字 </span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isSearch(s)   </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>var patrn=/^[^`~!@#$%^&amp;*()+=|\\\][\]\{\}:;\'\,.&lt;&gt;/?]{</span>
										<span class="number">1</span>
										<span>}[^`~!@$%^&amp;()+=|\\\][\]\{\}:;\'\,.&lt;&gt;?]{</span>
										<span class="number">0</span>
										<span>,</span>
										<span class="number">19</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>  </span>
								</li>
								<li class="">
										<span> 程序代码   </span>
								</li>
								<li class="alt">
										<span>function isIP(s) </span>
										<span class="comment">//by zergling </span>
										<span>  </span>
								</li>
								<li class="">
										<span>{   </span>
								</li>
								<li class="alt">
										<span>var patrn=/^[</span>
										<span class="number">0</span>
										<span>-</span>
										<span class="number">9</span>
										<span>.]{</span>
										<span class="number">1</span>
										<span>,</span>
										<span class="number">20</span>
										<span>}$/;   </span>
								</li>
								<li class="">
										<span>
										</span>
										<span class="keyword">if</span>
										<span> (!patrn.exec(s)) </span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">false</span>
										<span>  </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="keyword">return</span>
										<span> </span>
										<span class="keyword">true</span>
										<span>  </span>
								</li>
								<li class="">
										<span>}   </span>
								</li>
								<li class="alt">
										<span>    </span>
								</li>
						</ol>
				</div>
		</div>
		<script><![CDATA[ender_code();]]&gt;</script>
<img src ="http://www.blogjava.net/junky/aggbug/85427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-04 17:53 <a href="http://www.blogjava.net/junky/archive/2006/12/04/85427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iframe高度自动调整</title><link>http://www.blogjava.net/junky/archive/2006/10/27/77591.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Fri, 27 Oct 2006 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/10/27/77591.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/77591.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/10/27/77591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/77591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/77591.html</trackback:ping><description><![CDATA[&lt;iframe src="default.ASP"  style="width: 100% ; border: 0px" frameborder=0 scrolling=yes name=right onload="init()" border="0"&gt;&lt;/iframe&gt;<br />&lt;script&gt;<br />var lastHeight;<br />function init() {<br />    autojudge();<br />    lastHeight= right.document.body.scrollHeight;<br />    setInterval(function(){<br />        if(right.document.body.scrollHeight!=lastHeight) {<br />            autojudge();<br />            lastHeight= right.document.body.scrollHeight;<br />            }<br />        },1);<br />}<br />function autojudge(){<br />    document.all('right').height=right.document.body.scrollHeight + 20;<br />    }<br />&lt;/script&gt; <br /><br /><img src ="http://www.blogjava.net/junky/aggbug/77591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-10-27 12:03 <a href="http://www.blogjava.net/junky/archive/2006/10/27/77591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript方法和技巧大全</title><link>http://www.blogjava.net/junky/archive/2006/10/25/77238.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 25 Oct 2006 09:18:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/10/25/77238.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/77238.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/10/25/77238.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/77238.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/77238.html</trackback:ping><description><![CDATA[
		<p>这篇介绍<a href="http://www.knowsky.com/article.asp?typeid=36"><font color="#000000">javascript</font></a>方面的日志，我在是Clang上看到的。作者介绍挺全面的，所以转载过来让感兴趣的朋友看一下。呵呵～～～</p>
		<p>有些时候你精通一门语言，但是会发现你其实整天在和其它语言打交道，也许你以为这些微不足道，不至于影响你的开发进度，但恰恰是这些你不重视的东西会浪费你很多时间，我一直以为我早在几年前就已经精通JavaScript了，直到目前，我才越来越觉得JavaScript远比我想象的复杂和强大，我开始崇拜它，就像崇拜所有OOP语言一样～<br />趁着节日的空隙，把有关JavaScript的方法和技巧整理下，让每个在为JavaScript而烦恼的人明白，JavaScript就这么回事！并希望JavaScript还可以成为你的朋友，让你豁然开朗，在项目中更好的应用～</p>
		<p>适合阅读范围：对JavaScript一无所知～离精通只差一步之遥的人<br />基础知识：HTML</p>
		<p>
				<br />JavaScript就这么回事1：基础知识 </p>
		<p>1 创建脚本块</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: JavaScript code goes here<br />3: &lt;/script&gt; </p>
		<p> </p>
		<p>2 隐藏脚本代码</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: document.write(“Hello”);<br />4: // --&gt;<br />5: &lt;/script&gt; </p>
		<p>
				<br />在不支持JavaScript的浏览器中将不执行相关代码</p>
		<p>3 浏览器不支持的时候显示</p>
		<p>1: &lt;noscript&gt;<br />2: Hello to the non-JavaScript browser.<br />3: &lt;/noscript&gt; </p>
		<p> </p>
		<p>4 链接外部脚本文件</p>
		<p>1: &lt;script language=”JavaScript” src="/”filename.js"”&gt;&lt;/script&gt; </p>
		<p>
				<br />5 注释脚本</p>
		<p>1: // This is a comment<br />2: document.write(“Hello”); // This is a comment<br />3: /*<br />4: All of this<br />5: is a comment<br />6: */ </p>
		<p> </p>
		<p>6 输出到浏览器</p>
		<p>1: document.write(“&lt;strong&gt;Hello&lt;/strong&gt;”); </p>
		<p> </p>
		<p>7 定义变量</p>
		<p>1: var myVariable = “some value”; </p>
		<p> </p>
		<p>8 字符串相加</p>
		<p>1: var myString = “String1” + “String2”; </p>
		<p> </p>
		<p>9 字符串搜索</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: var myVariable = “Hello there”;<br />4: var therePlace = myVariable.search(“there”);<br />5: document.write(therePlace);<br />6: // --&gt;<br />7: &lt;/script&gt; </p>
		<p> </p>
		<p>10 字符串替换</p>
		<p>1: thisVar.replace(“Monday”,”Friday”); </p>
		<p>
				<br />11 格式化字串</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: var myVariable = “Hello there”;<br />4: document.write(myVariable.big() + “&lt;br&gt;”);<br />5: document.write(myVariable.blink() + “&lt;br&gt;”);<br />6: document.write(myVariable.bold() + “&lt;br&gt;”);<br />7: document.write(myVariable.fixed() + “&lt;br&gt;”);<br />8: document.write(myVariable.fontcolor(“red”) + “&lt;br&gt;”);<br />9: document.write(myVariable.fontsize(“18pt”) + “&lt;br&gt;”);<br />10: document.write(myVariable.italics() + “&lt;br&gt;”);<br />11: document.write(myVariable.small() + “&lt;br&gt;”);<br />12: document.write(myVariable.strike() + “&lt;br&gt;”);<br />13: document.write(myVariable.sub() + “&lt;br&gt;”);<br />14: document.write(myVariable.sup() + “&lt;br&gt;”);<br />15: document.write(myVariable.toLowerCase() + “&lt;br&gt;”);<br />16: document.write(myVariable.toUpperCase() + “&lt;br&gt;”);<br />17: <br />18: var firstString = “My String”;<br />19: var finalString = firstString.bold().toLowerCase().fontcolor(“red”);<br />20: // --&gt;<br />21: &lt;/script&gt; </p>
		<p> </p>
		<p>12 创建数组</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: var myArray = new Array(5);<br />4: myArray[0] = “First Entry”;<br />5: myArray[1] = “Second Entry”;<br />6: myArray[2] = “Third Entry”;<br />7: myArray[3] = “Fourth Entry”;<br />8: myArray[4] = “Fifth Entry”;<br />9: var anotherArray = new Array(“First Entry”,”Second Entry”,”Third Entry”,”Fourth Entry”,”Fifth Entry”);<br />10: // --&gt;<br />11: &lt;/script&gt; </p>
		<p> </p>
		<p>13 数组排序</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: var myArray = new Array(5);<br />4: myArray[0] = “z”;<br />5: myArray[1] = “c”;<br />6: myArray[2] = “d”;<br />7: myArray[3] = “a”;<br />8: myArray[4] = “q”;<br />9: document.write(myArray.sort());<br />10: // --&gt;<br />11: &lt;/script&gt; </p>
		<p> </p>
		<p>14 分割字符串</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: var myVariable = “a,b,c,d”;<br />4: var stringArray = myVariable.split(“,”);<br />5: document.write(stringArray[0]);<br />6: document.write(stringArray[1]);<br />7: document.write(stringArray[2]);<br />8: document.write(stringArray[3]);<br />9: // --&gt;<br />10: &lt;/script&gt; </p>
		<p> </p>
		<p>15 弹出警告信息</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: window.alert(“Hello”);<br />4: // --&gt;<br />5: &lt;/script&gt; </p>
		<p> </p>
		<p>16 弹出确认框</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: var result = window.confirm(“Click OK to continue”);<br />4: // --&gt;<br />5: &lt;/script&gt; </p>
		<p> </p>
		<p>17 定义函数</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: &lt;!--<br />3: function multiple(number1,number2) { <br />4: var result = number1 * number2;<br />5: return result;<br />6: }<br />7: // --&gt;<br />8: &lt;/script&gt; </p>
		<p> </p>
		<p>18 调用JS函数</p>
		<p>1: &lt;a href=”#” onClick=”functionName()”&gt;Link text&lt;/a&gt;<br />2: &lt;a href="/”javascript:functionName"()”&gt;Link text&lt;/a&gt; </p>
		<p> </p>
		<p>19 在页面加载完成后执行函数</p>
		<p>1: &lt;body onLoad=”functionName();”&gt;<br />2: Body of the page<br />3: &lt;/body&gt; </p>
		<p>
				<br />20 条件判断</p>
		<p>1: &lt;script&gt;<br />2: &lt;!--<br />3: var userChoice = window.confirm(“Choose OK or Cancel”);<br />4: var result = (userChoice == true) ? “OK” : “Cancel”;<br />5: document.write(result);<br />6: // --&gt;<br />7: &lt;/script&gt; </p>
		<p> </p>
		<p>21 指定次数循环</p>
		<p>1: &lt;script&gt;<br />2: &lt;!--<br />3: var myArray = new Array(3);<br />4: myArray[0] = “Item 0”;<br />5: myArray[1] = “Item 1”;<br />6: myArray[2] = “Item 2”;<br />7: for (i = 0; i &lt; myArray.length; i++) { <br />8: document.write(myArray[i] + “&lt;br&gt;”);<br />9: }<br />10: // --&gt;<br />11: &lt;/script&gt; </p>
		<p> </p>
		<p>22 设定将来执行</p>
		<p>1: &lt;script&gt;<br />2: &lt;!--<br />3: function hello() { <br />4: window.alert(“Hello”);<br />5: }<br />6: window.setTimeout(“hello()”,5000);<br />7: // --&gt;<br />8: &lt;/script&gt; </p>
		<p> </p>
		<p>23 定时执行函数</p>
		<p>1: &lt;script&gt;<br />2: &lt;!--<br />3: function hello() { <br />4: window.alert(“Hello”);<br />5: window.setTimeout(“hello()”,5000);<br />6: }<br />7: window.setTimeout(“hello()”,5000);<br />8: // --&gt;<br />9: &lt;/script&gt; </p>
		<p> </p>
		<p>24 取消定时执行</p>
		<p>1: &lt;script&gt;<br />2: &lt;!--<br />3: function hello() { <br />4: window.alert(“Hello”);<br />5: }<br />6: var myTimeout = window.setTimeout(“hello()”,5000);<br />7: window.clearTimeout(myTimeout);<br />8: // --&gt;<br />9: &lt;/script&gt; </p>
		<p> </p>
		<p>25 在页面卸载时候执行函数</p>
		<p>1: &lt;body onUnload=”functionName();”&gt;<br />2: Body of the page<br />3: &lt;/body&gt; </p>
		<p>JavaScript就这么回事2：浏览器输出 </p>
		<p>
				<br />26 访问document对象</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var myURL = document.URL;<br />3: window.alert(myURL);<br />4: &lt;/script&gt; </p>
		<p> </p>
		<p>27 动态输出HTML</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: document.write(“&lt;p&gt;Here’s some information about this document:&lt;/p&gt;”);<br />3: document.write(“&lt;ul&gt;”);<br />4: document.write(“&lt;li&gt;Referring Document: “ + document.referrer + “&lt;/li&gt;”);<br />5: document.write(“&lt;li&gt;Domain: “ + document.domain + “&lt;/li&gt;”);<br />6: document.write(“&lt;li&gt;URL: “ + document.URL + “&lt;/li&gt;”);<br />7: document.write(“&lt;/ul&gt;”);<br />8: &lt;/script&gt; </p>
		<p>
				<br />28 输出换行</p>
		<p>1: document.writeln(“&lt;strong&gt;a&lt;/strong&gt;”);<br />2: document.writeln(“b”); </p>
		<p> </p>
		<p>29 输出日期</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var thisDate = new Date();<br />3: document.write(thisDate.toString());<br />4: &lt;/script&gt; </p>
		<p> </p>
		<p>30 指定日期的时区</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var myOffset = -2;<br />3: var currentDate = new Date();<br />4: var userOffset = currentDate.getTimezoneOffset()/60;<br />5: var timeZoneDifference = userOffset - myOffset;<br />6: currentDate.setHours(currentDate.getHours() + timeZoneDifference);<br />7: document.write(“The time and date in Central Europe is: “ + currentDate.toLocaleString());<br />8: &lt;/script&gt; </p>
		<p>
				<br />31 设置日期输出格式</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var thisDate = new Date();<br />3: var thisTimeString = thisDate.getHours() + “:” + thisDate.getMinutes();<br />4: var thisDateString = thisDate.getFullYear() + “/” + thisDate.getMonth() + “/” + thisDate.getDate();<br />5: document.write(thisTimeString + “ on “ + thisDateString);<br />6: &lt;/script&gt; </p>
		<p>
				<br />32 读取URL参数</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var urlParts = document.URL.split(“?”);<br />3: var parameterParts = urlParts[1].split(“&amp;”);<br />4: for (i = 0; i &lt; parameterParts.length; i++) { <br />5: var pairParts = parameterParts[i].split(“=”);<br />6: var pairName = pairParts[0];<br />7: var pairValue = pairParts[1];<br />8: document.write(pairName + “ ：“ +pairValue );<br />9: }<br />10: &lt;/script&gt; </p>
		<p>你还以为HTML是无状态的么？</p>
		<p>33 打开一个新的document对象</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: function newDocument() { <br />3: document.open();<br />4: document.write(“&lt;p&gt;This is a New Document.&lt;/p&gt;”);<br />5: document.close();<br />6: }<br />7: &lt;/script&gt; </p>
		<p> </p>
		<p>34 页面跳转</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: window.location = “http://www.liu21st.com/”;<br />3: &lt;/script&gt; </p>
		<p> </p>
		<p>35 添加网页加载进度窗口</p>
		<p>1: &lt;html&gt;<br />2: &lt;head&gt;<br />3: &lt;script language='javaScript'&gt;<br />4: var placeHolder = window.open('holder.html','placeholder','width=200,height=200');<br />5: &lt;/script&gt;<br />6: &lt;title&gt;The Main Page&lt;/title&gt;<br />7: &lt;/head&gt;<br />8: &lt;body onLoad='placeHolder.close()'&gt;<br />9: &lt;p&gt;This is the main page&lt;/p&gt;<br />10: &lt;/body&gt;<br />11: &lt;/html&gt; </p>
		<p> </p>
		<p>JavaScript就这么回事3：图像 </p>
		<p> </p>
		<p>36 读取图像属性</p>
		<p>1: &lt;img src="/”image1.jpg"” name=”myImage”&gt;<br />2: &lt;a href=”# ” onClick=”window.alert(document.myImage.width)”&gt;Width&lt;/a&gt;<br />3: </p>
		<p>
				<br />37 动态加载图像</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: myImage = new Image;<br />3: myImage.src = “Tellers1.jpg”;<br />4: &lt;/script&gt; </p>
		<p>
				<br />38 简单的图像替换</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: rollImage = new Image;<br />3: rollImage.src = “rollImage1.jpg”;<br />4: defaultImage = new Image;<br />5: defaultImage.src = “image1.jpg”;<br />6: &lt;/script&gt;<br />7: &lt;a href="/”myUrl"” onMouseOver=”document.myImage.src = rollImage.src;”<br />8: onMouseOut=”document.myImage.src = defaultImage.src;”&gt;<br />9: &lt;img src="/”image1.jpg"” name=”myImage” width=100 height=100 border=0&gt; </p>
		<p>
				<br />39 随机显示图像</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var imageList = new Array;<br />3: imageList[0] = “image1.jpg”;<br />4: imageList[1] = “image2.jpg”;<br />5: imageList[2] = “image3.jpg”;<br />6: imageList[3] = “image4.jpg”;<br />7: var imageChoice = Math.floor(Math.random() * imageList.length);<br />8: document.write(‘&lt;img src=”’ + imageList[imageChoice] + ‘“&gt;’);<br />9: &lt;/script&gt; </p>
		<p>
				<br />40 函数实现的图像替换</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var source = 0;<br />3: var replacement = 1;<br />4: function createRollOver(originalImage,replacementImage) { <br />5: var imageArray = new Array;<br />6: imageArray[source] = new Image;<br />7: imageArray[source].src = originalImage;<br />8: imageArray[replacement] = new Image;<br />9: imageArray[replacement].src = replacementImage;<br />10: return imageArray;<br />11: }<br />12: var rollImage1 = createRollOver(“image1.jpg”,”rollImage1.jpg”);<br />13: &lt;/script&gt;<br />14: &lt;a href=”#” onMouseOver=”document.myImage1.src = rollImage1[replacement].src;”<br />15: onMouseOut=”document.myImage1.src = rollImage1[source].src;”&gt;<br />16: &lt;img src="/”image1.jpg"” width=100 name=”myImage1” border=0&gt;<br />17: &lt;/a&gt; </p>
		<p>
				<br />41 创建幻灯片</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var imageList = new Array;<br />3: imageList[0] = new Image;<br />4: imageList[0].src = “image1.jpg”;<br />5: imageList[1] = new Image;<br />6: imageList[1].src = “image2.jpg”;<br />7: imageList[2] = new Image;<br />8: imageList[2].src = “image3.jpg”;<br />9: imageList[3] = new Image;<br />10: imageList[3].src = “image4.jpg”;<br />11: function slideShow(imageNumber) { <br />12: document.slideShow.src = imageList[imageNumber].src;<br />13: imageNumber += 1;<br />14: if (imageNumber &lt; imageList.length) { <br />15: window.setTimeout(“slideShow(“ + imageNumber + “)”,3000);<br />16: }<br />17: }<br />18: &lt;/script&gt;<br />19: &lt;/head&gt;<br />20: &lt;body onLoad=”slideShow(0)”&gt;<br />21: &lt;img src="/”image1.jpg"” width=100 name=”slideShow”&gt; </p>
		<p>
				<br />42 随机广告图片</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var imageList = new Array;<br />3: imageList[0] = “image1.jpg”;<br />4: imageList[1] = “image2.jpg”;<br />5: imageList[2] = “image3.jpg”;<br />6: imageList[3] = “image4.jpg”;<br />7: var urlList = new Array;<br />8: urlList[0] = “http://some.host/”;<br />9: urlList[1] = “http://another.host/”;<br />10: urlList[2] = “http://somewhere.else/”;<br />11: urlList[3] = “http://right.here/”;<br />12: var imageChoice = Math.floor(Math.random() * imageList.length);<br />13: document.write(‘&lt;a href=”’ + urlList[imageChoice] + ‘“&gt;&lt;img src=”’ + imageList[imageChoice] + ‘“&gt;&lt;/a&gt;’);<br />14: &lt;/script&gt; </p>
		<p>JavaScript就这么回事4：表单 </p>
		<p>
				<br />还是先继续写完JS就这么回事系列吧～<br />43 表单构成</p>
		<p>1: &lt;form method=”post” action=”target.html” name=”thisForm”&gt;<br />2: &lt;input type=”text” name=”myText”&gt;<br />3: &lt;select name=”mySelect”&gt;<br />4: &lt;option value=”1”&gt;First Choice&lt;/option&gt;<br />5: &lt;option value=”2”&gt;Second Choice&lt;/option&gt;<br />6: &lt;/select&gt;<br />7: &lt;br&gt;<br />8: &lt;input type=”submit” value=”Submit Me”&gt;<br />9: &lt;/form&gt; </p>
		<p>
				<br />44 访问表单中的文本框内容</p>
		<p>1: &lt;form name=”myForm”&gt;<br />2: &lt;input type=”text” name=”myText”&gt;<br />3: &lt;/form&gt;<br />4: &lt;a href='#' onClick='window.alert(document.myForm.myText.value);'&gt;Check Text Field&lt;/a&gt; </p>
		<p>
				<br />45 动态复制文本框内容</p>
		<p>1: &lt;form name=”myForm”&gt;<br />2: Enter some Text: &lt;input type=”text” name=”myText”&gt;&lt;br&gt;<br />3: Copy Text: &lt;input type=”text” name=”copyText”&gt;<br />4: &lt;/form&gt;<br />5: &lt;a href=”#” onClick=”document.myForm.copyText.value =<br />6: document.myForm.myText.value;”&gt;Copy Text Field&lt;/a&gt; </p>
		<p>
				<br />46 侦测文本框的变化</p>
		<p>1: &lt;form name=”myForm”&gt;<br />2: Enter some Text: &lt;input type=”text” name=”myText” onChange=”alert(this.value);”&gt;<br />3: &lt;/form&gt; </p>
		<p>
				<br />47 访问选中的Select</p>
		<p>1: &lt;form name=”myForm”&gt;<br />2: &lt;select name=”mySelect”&gt;<br />3: &lt;option value=”First Choice”&gt;1&lt;/option&gt;<br />4: &lt;option value=”Second Choice”&gt;2&lt;/option&gt;<br />5: &lt;option value=”Third Choice”&gt;3&lt;/option&gt;<br />6: &lt;/select&gt;<br />7: &lt;/form&gt;<br />8: &lt;a href='#' onClick='alert(document.myForm.mySelect.value);'&gt;Check Selection List&lt;/a&gt; </p>
		<p>
				<br />48 动态增加Select项</p>
		<p>1: &lt;form name=”myForm”&gt;<br />2: &lt;select name=”mySelect”&gt;<br />3: &lt;option value=”First Choice”&gt;1&lt;/option&gt;<br />4: &lt;option value=”Second Choice”&gt;2&lt;/option&gt;<br />5: &lt;/select&gt;<br />6: &lt;/form&gt;<br />7: &lt;script language=”JavaScript”&gt;<br />8: document.myForm.mySelect.length++;<br />9: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].text = “3”;<br />10: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].value = “Third Choice”;<br />11: &lt;/script&gt; </p>
		<p>
				<br />49 验证表单字段</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: function checkField(field) { <br />3: if (field.value == “”) { <br />4: window.alert(“You must enter a value in the field”);<br />5: field.focus();<br />6: }<br />7: }<br />8: &lt;/script&gt;<br />9: &lt;form name=”myForm” action=”target.html”&gt;<br />10: Text Field: &lt;input type=”text” name=”myField”onBlur=”checkField(this)”&gt;<br />11: &lt;br&gt;&lt;input type=”submit”&gt;<br />12: &lt;/form&gt; </p>
		<p>
				<br />50 验证Select项</p>
		<p>1: function checkList(selection) { <br />2: if (selection.length == 0) { <br />3: window.alert(“You must make a selection from the list.”);<br />4: return false;<br />5: }<br />6: return true;<br />7: } </p>
		<p>
				<br />51 动态改变表单的action</p>
		<p>1: &lt;form name=”myForm” action=”login.html”&gt;<br />2: Username: &lt;input type=”text” name=”username”&gt;&lt;br&gt;<br />3: Password: &lt;input type=”password” name=”password”&gt;&lt;br&gt;<br />4: &lt;input type=”button” value=”Login” onClick=”this.form.submit();”&gt;<br />5: &lt;input type=”button” value=”Register” onClick=”this.form.action = ‘register.html’; this.form.submit();”&gt;<br />6: &lt;input type=”button” value=”Retrieve Password” onClick=”this.form.action = ‘password.html’; this.form.submit();”&gt;<br />7: &lt;/form&gt; </p>
		<p>
				<br />52 使用图像按钮</p>
		<p>1: &lt;form name=”myForm” action=”login.html”&gt;<br />2: Username: &lt;input type=”text” name=”username”&gt;&lt;br&gt;<br />3: Password: &lt;input type=”password”name=”password”&gt;&lt;br&gt;<br />4: &lt;input type=”image” src="/”login.gif"” value=”Login”&gt;<br />5: &lt;/form&gt;<br />6: </p>
		<p>
				<br />53 表单数据的加密</p>
		<p>1: &lt;SCRIPT LANGUAGE='JavaScript'&gt;<br />2: &lt;!--<br />3: function encrypt(item) { <br />4: var newItem = '';<br />5: for (i=0; i &lt; item.length; i++) { <br />6: newItem += item.charCodeAt(i) + '.';<br />7: }<br />8: return newItem;<br />9: }<br />10: function encryptForm(myForm) { <br />11: for (i=0; i &lt; myForm.elements.length; i++) { <br />12: myForm.elements[i].value = encrypt(myForm.elements[i].value);<br />13: }<br />14: }<br />15: <br />16: //--&gt;<br />17: &lt;/SCRIPT&gt;<br />18: &lt;form name='myForm' onSubmit='encryptForm(this); window.alert(this.myField.value);'&gt;<br />19: Enter Some Text: &lt;input type=text name=myField&gt;&lt;input type=submit&gt;<br />20: &lt;/form&gt; </p>
		<p> </p>
		<p>
				<br />JavaScript就这么回事5：窗口和框架 </p>
		<p>
				<br />54 改变浏览器状态栏文字提示</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: window.status = “A new status message”;<br />3: &lt;/script&gt; </p>
		<p>
				<br />55 弹出确认提示框</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var userChoice = window.confirm(“Click OK or Cancel”);<br />3: if (userChoice) { <br />4: document.write(“You chose OK”);<br />5: } else { <br />6: document.write(“You chose Cancel”);<br />7: }<br />8: &lt;/script&gt; </p>
		<p>
				<br />56 提示输入</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var userName = window.prompt(“Please Enter Your Name”,”Enter Your Name Here”);<br />3: document.write(“Your Name is “ + userName);<br />4: &lt;/script&gt; </p>
		<p>
				<br />57 打开一个新窗口</p>
		<p>1: //打开一个名称为myNewWindow的浏览器新窗口<br />2: &lt;script language=”JavaScript”&gt;<br />3: window.open(“http://www.liu21st.com/”,”myNewWindow”);<br />4: &lt;/script&gt; </p>
		<p>
				<br />58 设置新窗口的大小</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300');<br />3: &lt;/script&gt; </p>
		<p>
				<br />59 设置新窗口的位置</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300,left=200,screenX=200,top=100,screenY=100');<br />3: &lt;/script&gt; </p>
		<p>
				<br />60 是否显示工具栏和滚动栏</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: window.open(“http: </p>
		<p>
				<br />61 是否可以缩放新窗口的大小</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: window.open('http://www.liu21st.com/' , 'myNewWindow', 'resizable=yes' );&lt;/script&gt; </p>
		<p>
				<br />62 加载一个新的文档到当前窗口</p>
		<p>1: &lt;a href='#' onClick='document.location = '125a.html';' &gt;Open New Document&lt;/a&gt; </p>
		<p>
				<br />63 设置页面的滚动位置</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: if (document.all) { //如果是IE浏览器则使用scrollTop属性<br />3: document.body.scrollTop = 200;<br />4: } else { //如果是NetScape浏览器则使用pageYOffset属性<br />5: window.pageYOffset = 200;<br />6: }&lt;/script&gt; </p>
		<p>
				<br />64 在IE中打开全屏窗口</p>
		<p>1: &lt;a href='#' onClick=”window.open('http://www.juxta.com/','newWindow','fullScreen=yes');”&gt;Open a full-screen window&lt;/a&gt; </p>
		<p>
				<br />65 新窗口和父窗口的操作</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: //定义新窗口<br />3: var newWindow = window.open(“128a.html”,”newWindow”);<br />4: newWindow.close(); //在父窗口中关闭打开的新窗口<br />5: &lt;/script&gt;<br />6: 在新窗口中关闭父窗口<br />7: window.opener.close() </p>
		<p>
				<br />66 往新窗口中写内容</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var newWindow = window.open(“”,”newWindow”);<br />3: newWindow.document.open();<br />4: newWindow.document.write(“This is a new window”);<br />5: newWIndow.document.close();<br />6: &lt;/script&gt; </p>
		<p>
				<br />67 加载页面到框架页面</p>
		<p>1: &lt;frameset cols=”50%,*”&gt;<br />2: &lt;frame name=”frame1” src="/”135a.html"”&gt;<br />3: &lt;frame name=”frame2” src="/”about:blank"”&gt;<br />4: &lt;/frameset&gt;<br />5: 在frame1中加载frame2中的页面<br />6: parent.frame2.document.location = “135b.html”; </p>
		<p>
				<br />68 在框架页面之间共享脚本<br />如果在frame1中html文件中有个脚本</p>
		<p>1: function doAlert() { <br />2: window.alert(“Frame 1 is loaded”);<br />3: } </p>
		<p>那么在frame2中可以如此调用该方法</p>
		<p>1: &lt;body onLoad=”parent.frame1.doAlert();”&gt;<br />2: This is frame 2.<br />3: &lt;/body&gt; <br />69 数据公用<br />可以在框架页面定义数据项，使得该数据可以被多个框架中的页面公用</p>
		<p>1: &lt;script language=”JavaScript”&gt;<br />2: var persistentVariable = “This is a persistent value”;<br />3: &lt;/script&gt;<br />4: &lt;frameset cols=”50%,*”&gt;<br />5: &lt;frame name=”frame1” src="/”138a.html"”&gt;<br />6: &lt;frame name=”frame2” src="/”138b.html"”&gt;<br />7: &lt;/frameset&gt; <br />这样在frame1和frame2中都可以使用变量persistentVariable <br />70 框架代码库<br />根据以上的一些思路，我们可以使用一个隐藏的框架页面来作为整个框架集的代码库1: &lt;frameset cols=”0,50%,*”&gt;<br />2: &lt;frame name=”codeFrame” src="/”140code.html"”&gt;<br />3: &lt;frame name=”frame1” src="/”140a.html"”&gt;<br />4: &lt;frame name=”frame2” src="/”140b.html"”&gt;<br />5: &lt;/frameset&gt; </p>
<img src ="http://www.blogjava.net/junky/aggbug/77238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-10-25 17:18 <a href="http://www.blogjava.net/junky/archive/2006/10/25/77238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js开发笔记</title><link>http://www.blogjava.net/junky/archive/2006/10/23/76811.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 23 Oct 2006 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/10/23/76811.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/76811.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/10/23/76811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/76811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/76811.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. Prototype是什么?																																		或许你还没有用过它， prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端， 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。				如果你最近体验了这个程序包，...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2006/10/23/76811.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/76811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-10-23 18:36 <a href="http://www.blogjava.net/junky/archive/2006/10/23/76811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSS属性列表</title><link>http://www.blogjava.net/junky/archive/2006/09/15/69824.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Fri, 15 Sep 2006 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/09/15/69824.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/69824.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/09/15/69824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/69824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/69824.html</trackback:ping><description><![CDATA[
		<table class="p2" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td valign="top" width="32%">
										<font color="#cc3399">属性名称</font>
										<br />
										<br />
										<font color="#336633">字体属性（Font）</font>
										<br />font-family<br />font-style<br />font-variant<br />font-weight<br />font-size<br /><br /><br /><font color="#336633">颜色和背景属性</font><br />Color<br />Background-color<br />Background-image<br />Background-repeat<br />Background-attachment<br />Background-position<br /><br /><br /><font color="#336633">文本属性</font><br />Word-spacing<br />Letter-spacing<br />Text-decoration<br /><br />Vertical-align<br /><br />Text-transform<br /><br />Text-align<br />Text-indent<br />Line-height<br /><br /><br /><font color="#336633">边距属性</font><br />Margin-top<br />Margin-right<br />Margin-bottom<br />Margin-left<br /><br /><font color="#336633">填充距属性</font><br />Padding-top<br />Padding-right<br />Padding-bottom<br />Padding-left<br /><br /><font color="#336633">边框属性</font><br />Border-top-width<br />Border-right-width<br />Border-bottom-width<br />Border-left-width<br />Border-width <br />Border-color<br />Border-style<br />Border-top<br />Border-right<br />Border-bottom<br />Border-left<br />Width<br />Height<br />Float<br />Clear <br /><br /><font color="#336633">分级属性</font><br />Display<br />White-space <br />List-style-type<br />List-style-image<br />List-style-position<br />List-style<br /><br /><font color="#336633">鼠标（Cursor）属性</font></td>
								<td valign="top" align="left" width="20%">
										<font color="#cc3399">属性含义</font>
										<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 /><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 />怎样处理空白<br />加项目编号<br />加图案<br />第二行起始位置<br />一次定义列表<br /><br /><br />自动<br />定位“十”字<br />默认指针<br />手形<br />移动<br />箭头朝右方<br />箭头朝右上方<br />箭头朝左上方<br />箭头朝上方<br />箭头朝右下方<br />箭头朝左下方<br />箭头朝下方<br />箭头朝左方<br />文本“I”形<br />等待<br />帮助<br /></td>
								<td valign="top" width="48%">
										<font color="#cc3399">属性值</font>
										<br />
										<br />
										<br />所有的字体<br />Normal、italic、oblique<br />Normal、small-caps<br />Normal、bold、bolder、lithter等<br />Absolute-size、relative-size、length、percentage等<br /><br /><br />颜色<br />颜色<br />路径<br />Repeat-x、repeat-y、no-repeat<br />Scroll、Fixed<br />Percentage、length、top、left、<br />right、bottom等<br /><br /><br />Normal <length>&lt;length&gt;<br />同上<br />None|underline|overline|line-<br />through|blink<br />Baseline|sub|super|top|text-top|middle|bottom|text-bottom|<br />Capitalize|uppercase|<br />lowercase|none<br />Left|right|center|justify<br />&lt;length&gt;|&lt;percentage&gt;<br />Normal|&lt;number&gt;|&lt;length&gt;|<br />&lt;percentage&gt;<br /><br /><br />Length|percentage|auto<br />同上<br />同上<br />同上<br /><br /><br />Length|percentage<br />同上<br />同上<br />同上<br /><br /><br />Thin|medium|thick|length<br />同上<br />同上<br />同上<br />同上<br />Color<br />None|dotted|dash|solid等<br />Border-top-width|color等<br />同上<br />同上<br />同上<br />Length|percentage|auto<br />Length|auto<br />Left|right|none<br />Left|right|none|both<br /><br /><br />Block、inline、list-item、none<br />Normal、pre、nowrap<br />Disc、circle、square等<br /><url>&lt;url&gt;|none<br />Inside、outside<br /><keyword>&lt;keyword&gt;|&lt;position&gt;<positon>|&lt;url&gt;<br /><br /><br />Auto<br />Crosshair <url><br />Default<br />Hand<br />Move<br />e-resize<br />Ne-resize <br />Nw-resize<br />n-resize<br />Se-resize<br />Sw-resize<br />s-resize<br />w-resize<br />Text<br />Wait<br />Help</url></positon></keyword></url></length></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/junky/aggbug/69824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-09-15 10:38 <a href="http://www.blogjava.net/junky/archive/2006/09/15/69824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Lucene搜索Java源代码</title><link>http://www.blogjava.net/junky/archive/2006/08/30/66747.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 30 Aug 2006 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/08/30/66747.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/66747.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/08/30/66747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/66747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/66747.html</trackback:ping><description><![CDATA[   某些网站允许软件开发社团通过发布开发者指南、白皮书、FAQs【常见问题解答】和源代码以实现信息的共享。随着信息量的增长，和几个开发者贡献出自己的知识库，于是网站提供搜索引擎来搜索站点上现有的所有信息。虽然这些搜索引擎对文本文件的搜索可以做的很好，但对开发者搜索源代码做了比较严格的限制。搜索引擎认为源代码就是纯文本文件，因此，在这一点上，与成熟的可以处理大量源文件的工具――grep相比没有什么不同。<br /><br />在这篇文章中，我推荐使用Lucene，它是基于Java的开源搜索引擎，通过提取和索引相关的源码元素来搜索源代码。这里，我仅限定搜索Java源代码。然而，Lucene同样可以做到对其他编程语言的源代码的搜索。<br /><br />文章给出了在Lucene环境下搜索引擎重点方面的简短概述。要了解更多细节信息，参考Resources部分。<br /><br /><span style="COLOR: red">版权声明：任何获得Matrix授权的网站，转载时请务必保留以下作者信息和链接</span><br />作者:Renuka;<a href="http://www.matrix.org.cn/user.shtml?username=Knightchen" target="_new">Knightchen</a>(作者的blog:<a href="http://blog.matrix.org.cn/page/Knightchen" target="_new">http://blog.matrix.org.cn/page/Knightchen</a>)<br />原文:<a href="http://www.matrix.org.cn/resource/article/44/44362_Lucene+Java.html" target="_new">http://www.matrix.org.cn/resource/article/44/44362_Lucene+Java.html</a><br />关键字:Lucene;Java<br /><br /><b><span style="FONT-SIZE: 16px">概述</span></b><br />Lucene是最流行的开源搜索引擎库之一。它由能文本索引和搜索的核心API组成。Lucene能够对给出一组文本文件创建索引并且允许你用复杂的查询来搜索这些索引，例如：+title:Lucene -content:Search、search AND Lucene、+search +code。在进入搜索细节之前，先让我来介绍一下Lucene的一些功能。<br /><br /><b>在Lucene中索引文本</b><br /><br />搜索引擎对所有需要被搜索的数据进行扫描并将其存储到能有效获取的一个结构里。这个最有名的结构被称为倒排索引。例如，现在考虑对一组会议记录进行索引。首先，每个会议记录的文件被分为几个独立的部分或者域：如标题、作者、email、摘要和内容。其次，每一域的内容被标记化并且提取出关键字或者术语。这样就可以建立如下表所示会议记录的倒排索引。<br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_04_18_233312_oAicLXxFcL.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br />        ....                  <br /><br />对于域中的每一术语而言，上图存储了两方面的内容：该术语在文件中出现的数量（即频率【DF】）以及包含该术语的每一文件的ID。对于每个术语保存的其它细节：例如术语在每个文件中出现的次数以及出现的位置也被保存起来。无论如何，对于我们非常重要的一点是要知道：利用Lucene检索文件意味着将其保存为一种特定格式，该格式允许高效率查询及获取。<br /><br /><b>分析被索引的文本</b><br /><br />Lucene使用分析器来处理被索引的文本。在将其存入索引之前，分析器用于将文本标记化、摘录有关的单词、丢弃共有的单词、处理派生词（把派生词还原到词根形式，意思是把bowling、bowler和bowls还原为bowl）和完成其它要做的处理。Lucene提供的通用分析器是：<br />&amp;#61548;        SimpleAnalyzer：用字符串标记一组单词并且转化为小写字母。<br />&amp;#61548;        StandardAnalyzer：用字符串标记一组单词，可识别缩写词、email地址、主机名称等等。并丢弃基于英语的stop words (a, an, the, to)等、处理派生词。<br /><br /><b>检索（搜索索引）</b><br />索引结构建立后，可以通过指定被搜索的字段和术语构造复杂的查询来对索引进行检索。例如，用户查询abstract：system AND email:abc@mit.edu得到的结果是所有在摘要中包含system、在email地址中有abc@mit.edu的文件。也就是说，如果在前面倒排索引表的基础上搜索就返回Doc15。与查询匹配的文件是按照术语在文件中出现的次数以及包含该术语的文档的数量进行排列的。Lucene执行一种顺序排列机制并且提供了给我们更改它的弹性。<br /><br /><b><span style="FONT-SIZE: 16px">源代码搜索引擎</span></b><br /><br />现在我们知道了关于搜索引擎的基本要点，下面让我们看一看用于搜索源代码的搜索引擎应如何实现。下文中展示在搜索Java示例代码时，开发者主要关注以下Java类：<br />继承一个具体类或实现一个接口。<br />调用特定的方法。<br />使用特定的Java类。<br /><br />综合使用上述部分的组合可以满足开发者获取他们正在寻找相关代码的需要。因此搜索引擎应该允许开发者对这些方面进行单个或组合查询。IDEs【集成开发环境】有另一个局限性：大部分可使用的工具仅仅基于上述标准之一来支持搜索源代码。在搜索中，缺乏组合这些标准进行查询的灵活性。<br /><br />现在我们开始建立一个支持这些要求的源代码搜索引擎。<br /><br /><b>编写源代码分析器</b><br />第一步先写一个分析器，用来提取或去除源代码元素，确保建立最佳的索引并且仅包含相关方面的代码。在Java语言中的关键字--public,null,for,if等等，在每个.java文件中它们都出现了，这些关键字类似于英语中的普通单词（the,a,an,of）。因而，分析器必须把这些关键字从索引中去掉。<br /><br />我们通过继承Lucene的抽象类Analyzer来建立一个Java源代码分析器。下面列出了JavaSourceCodeAnalyzer类的源代码，它实现了tokenStream（String，Reader）方法。这个类定义了一组【stop words】，它们能够在索引过程中，使用Lucene提供的StopFilter类来被去除。tokenStream方法用于检查被索引的字段。如果该字段是“comment”，首先要利用LowerCaseTokenizer类将输入项标记化并转换成小写字母，然后利用StopFilter类除去英语中的【stop words】（有限的一组英语【stop words】），再利用PorterStemFilter移除通用的语形学以及词尾后缀。如果被索引的内容不是“comment”，那么分析器就利用LowerCaseTokenizer类将输入项标记化并转换成小写字母，并且利用StopFilter类除去Java关键字。<br /><br /><pre class="overflow">package com.infosys.lucene.code JavaSourceCodeAnalyzer.;<br /><br />import java.io.Reader;<br />import java.util.Set;<br />import org.apache.lucene.analysis.*;<br /><br />public class JavaSourceCodeAnalyzer extends Analyzer {<br />      private Set javaStopSet;<br />      private Set englishStopSet;<br />      private static final String[] JAVA_STOP_WORDS = {<br />         "public","private","protected","interface",<br />            "abstract","implements","extends","null""new",<br />           "switch","case", "default" ,"synchronized" ,<br />            "do", "if", "else", "break","continue","this",<br />           "assert" ,"for","instanceof", "transient",<br />            "final", "static" ,"void","catch","try",<br />            "throws","throw","class", "finally","return",<br />            "const" , "native", "super","while", "import",<br />            "package" ,"true", "false" };<br />     private static final String[] ENGLISH_STOP_WORDS ={<br />            "a", "an", "and", "are","as","at","be" "but",<br />            "by", "for", "if", "in", "into", "is", "it",<br />            "no", "not", "of", "on", "or", "s", "such",<br />            "that", "the", "their", "then", "there","these",<br />            "they", "this", "to", "was", "will", "with" };<br />     public SourceCodeAnalyzer(){<br />            super();<br />            javaStopSet = StopFilter.makeStopSet(JAVA_STOP_WORDS);<br />            englishStopSet = StopFilter.makeStopSet(ENGLISH_STOP_WORDS);<br />     }<br />     public TokenStream tokenStream(String fieldName, Reader reader) {<br />            if (fieldName.equals("comment"))<br />                     return   new PorterStemFilter(new StopFilter(<br />                        new LowerCaseTokenizer(reader),englishStopSet));<br />            else<br />                     return   new StopFilter(<br />                   new LowerCaseTokenizer(reader),javaStopSet);<br />     }<br />}</pre><br /><br /><b>编写类JavaSourceCodeIndexer</b><br />第二步生成索引。用来建立索引的非常重要的类有IndexWriter、Analyzer、Document和Field。对每一个源代码文件建立Lucene的一个Document实例。解析源代码文件并且摘录出与代码相关的语法元素，主要包括：导入声明、类名称、所继承的类、实现的接口、实现的方法、方法使用的参数和每个方法的代码等。然后把这些句法元素添加到Document实例中每个独立的Field实例中。然后使用存储索引的IndexWriter实例将Document实例添加到索引中。<br /><br />下面列出了JavaSourceCodeIndexer类的源代码。该类使用了JavaParser类解析Java文件和摘录语法元素，也可以使用Eclipse3.0 ASTParser。这里就不探究JavaParser类的细节了，因为其它解析器也可以用于提取相关源码元素。在源代码文件提取元素的过程中，创建Filed实例并添加到Document实例中。<br /><pre class="overflow">import org.apache.lucene.document.*;<br />import org.apache.lucene.index.*;<br />import com.infosys.lucene.code.JavaParser.*;<br /><br />public class JavaSourceCodeIndexer {<br />    private static JavaParser parser = new JavaParser();<br />        private static final String IMPLEMENTS = "implements";<br />        private static final String IMPORT = "import";<br />        ...<br />        public static void main(String[] args) {<br />                File indexDir = new File("C:\\Lucene\\Java");<br />                File dataDir = new File("C:\\JavaSourceCode ");<br />                IndexWriter writer = new IndexWriter(indexDir,<br />                    new JavaSourceCodeAnalyzer(), true);<br />                indexDirectory(writer, dataDir);<br />                writer.close();<br />        }<br />        public static void indexDirectory(IndexWriter writer, File dir){<br />            File[] files = dir.listFiles();<br />            for (int i = 0; i &lt; files.length; i++) {<br />                    File f = files[i];<br />                // Create a Lucene Document<br />                Document doc = new Document();<br />                //  Use JavaParser to parse file<br />                parser.setSource(f);<br />                addImportDeclarations(doc, parser);<br />                        addComments(doc, parser);<br />                 // Extract Class elements Using Parser<br />                JClass cls = parser.getDeclaredClass();<br />                addClass(doc, cls);<br />                 // Add field to the Lucene Document<br />                       doc.add(Field.UnIndexed(FILENAME, f.getName()));<br />                writer.addDocument(doc);<br />                    }<br />        }<br />        private static void addClass(Document doc, JClass cls) {<br />                   //For each class add Class Name field<br />            doc.add(Field.Text(CLASS, cls.className));<br />            String superCls = cls.superClass;<br />            if (superCls != null)<br />                   //Add the class it extends as extends field<br />        doc.add(Field.Text(EXTENDS, superCls));<br />            // Add interfaces it implements<br />            ArrayList interfaces = cls.interfaces;<br />            for (int i = 0; i &lt; interfaces.size(); i++)<br />                doc.add(Field.Text(IMPLEMENTS, (String) interfaces.get(i)));<br />                    //Add details  on methods declared<br />            addMethods(cls, doc);<br />            ArrayList innerCls = cls.innerClasses;<br />                   for (int i = 0; i &lt; innerCls.size(); i++)<br />                addClass(doc, (JClass) innerCls.get(i));<br />         }<br />        private static void addMethods(JClass cls, Document doc) {<br />            ArrayList methods = cls.methodDeclarations;<br />            for (int i = 0; i &lt; methods.size(); i++) {<br />                       JMethod method = (JMethod) methods.get(i);<br />                // Add method name field<br />                doc.add(Field.Text(METHOD, method.methodName));<br />                // Add return type field<br />                doc.add(Field.Text(RETURN, method.returnType));<br />                ArrayList params = method.parameters;<br />                for (int k = 0; k &lt; params.size(); k++)<br />                // For each method add parameter types<br />                    doc.add(Field.Text(PARAMETER, (String)params.get(k)));<br />                String code = method.codeBlock;<br />                if (code != null)<br />                //add the method code block<br />                    doc.add(Field.UnStored(CODE, code));<br />            }<br />        }<br />        private static void addImportDeclarations(Document doc, JavaParser parser) {<br />                   ArrayList imports = parser.getImportDeclarations();<br />            if (imports == null)     return;<br />            for (int i = 0; i &lt; imports.size(); i++)<br />                    //add import declarations as keyword<br />                doc.add(Field.Keyword(IMPORT, (String) imports.get(i)));<br />        }<br />}</pre><br /><br />Lucene有四种不同的字段类型：Keyword，UnIndexed，UnStored和Text，用于指定建立最佳索引。<br />&amp;#61548;        Keyword字段是指不需要分析器解析但需要被编入索引并保存到索引中的部分。JavaSourceCodeIndexer类使用该字段来保存导入类的声明。<br />&amp;#61548;        UnIndexed字段是既不被分析也不被索引，但是要被逐字逐句的将其值保存到索引中。由于我们一般要存储文件的位置但又很少用文件名作为关键字来搜索，所以用该字段来索引Java文件名。<br />&amp;#61548;        UnStored字段和UnIndexed字段相反。该类型的Field要被分析并编入索引，但其值不会被保存到索引中。由于存储方法的全部源代码需要大量的空间。所以用UnStored字段来存储被索引的方法源代码。可以直接从Java源文件中取出方法的源代码，这样作可以控制我们的索引的大小。<br />&amp;#61548;        Text字段在索引过程中是要被分析、索引并保存的。类名是作为Text字段来保存。下表展示了JavaSourceCodeIndexer类使用Field字段的一般情况。<br /><br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_04_18_221908_sCgiFmFeXU.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />1.<br />   用Lucene建立的索引可以用Luke预览和修改，Luke是用于理解索引很有用的一个开源工具。图1中是Luke工具的一张截图，它显示了JavaSourceCodeIndexer类建立的索引。<br /><br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" height="450" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_04_18_222240_ErfFkeOnkl.gif" width="377" onload="javascript:imgLoad(this);" border="0" resized="1" /><br />图1：在Luke中索引截图<br /><br />如图所见，导入类的声明没有标记化或分析就被保存了。类名和方法名被转换为小写字母后，才保存的。<br /><br /><b>查询Java源代码</b><br />建立多字段索引后，可以使用Lucene来查询这些索引。它提供了这两个重要类分别是IndexSearcher和QueryParser，用于搜索文件。QueryParser类则用于解析由用户输入的查询表达式，同时IndexSearcher类在文件中搜索满足查询条件的结果。下列表格显示了一些可能发生的查询及它的含义：<br /><img style="DISPLAY: inline" onclick="javascript:imgClick(this);" alt="image" src="http://www.matrix.org.cn/resource/upload/forum/2006_04_18_222549_hKsRfvcSpg.jpg" onload="javascript:imgLoad(this);" border="0" resized="0" /><br /><br />用户通过索引不同的语法元素组成有效的查询条件并搜索代码。下面列出了用于搜索的示例代码。<br /><pre class="overflow">public class JavaCodeSearch {<br />public static void main(String[] args) throws Exception{<br />    File indexDir = new File(args[0]);<br />    String q =  args[1]; //parameter:JGraph code:insert<br />    Directory fsDir = FSDirectory.getDirectory(indexDir,false);<br />    IndexSearcher is = new IndexSearcher(fsDir);<br /><br />    PerFieldAnalyzerWrapper analyzer = new<br />        PerFieldAnalyzerWrapper( new<br />                JavaSourceCodeAnalyzer());<br /><br />    analyzer.addAnalyzer("import", new KeywordAnalyzer());<br />    Query query = QueryParser.parse(q, "code", analyzer);<br />    long start = System.currentTimeMillis();<br />    Hits hits = is.search(query);<br />    long end = System.currentTimeMillis();<br />    System.err.println("Found " + hits.length() +<br />                " docs in " + (end-start) + " millisec");<br />    for(int i = 0; i &lt; hits.length(); i++){<br />    Document doc = hits.doc(i);<br />        System.out.println(doc.get("filename")<br />                + " with a score of " + hits.score(i));<br />    }<br />    is.close();<br />}<br />}</pre><br /><br />IndexSearcher实例用FSDirectory来打开包含索引的目录。然后使用Analyzer实例分析搜索用的查询字符串，以确保它与索引（还原词根，转换小写字母，过滤掉，等等）具有同样的形式。为了避免在查询时将Field作为一个关键字索引，Lucene做了一些限制。Lucene用Analyzer分析在QueryParser实例里传给它的所有字段。为了解决这个问题，可以用Lucene提供的PerFieldAnalyzerWrapper类为查询中的每个字段指定必要的分析。因此，查询字符串import：org.w3c.* AND code:Document将用KeywordAnalyzer来解析字符串org.w3c.*并且用JavaSourceCodeAnalyzer来解析Document。QueryParser实例如果查询没有与之相符的字段，就使用默认的字段：code，使用PerFieldAnalyzerWrapper来分析查询字符串，并返回分析后的Query实例。IndexSearcher实例使用Query实例并返回一个Hits实例，它包含了满足查询条件的文件。<br /><br /><b><span style="FONT-SIZE: 16px">结束语</span></b><br /><br />这篇文章介绍了Lucene——文本搜索引擎，其可以通过加载分析器及多字段索引来实现源代码搜索。文章只介绍了代码搜索引擎的基本功能，同时在源码检索中使用愈加完善的分析器可以提高检索性能并获得更好的查询结果。这种搜索引擎可以允许用户在软件开发社区搜索和共享源代码。<br /><br /><b>资源</b><br /><a href="http://www.onjava.com/onjava/2006/01/18/examples/src.zip" target="_new">这篇文章的示例Sample code</a><br />Matrix:<a href="http://www.matrix.org.cn/" target="_new">http://www.matrix.org.cn</a><br />Onjava:<a href="http://www.onjava.com/" target="_new">http://www.onjava.com/</a><br />Lucene home page <br />"Introduction to Text Indexing with Apache Jakarta Lucene:" 这是篇简要介绍使用Lucene的文章。 <br />Lucene in Action: 在使用Lucene方面进行了深入地讲解。 <br /><img src ="http://www.blogjava.net/junky/aggbug/66747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-08-30 23:50 <a href="http://www.blogjava.net/junky/archive/2006/08/30/66747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>值得收藏的javascript精华代码</title><link>http://www.blogjava.net/junky/archive/2006/05/30/49135.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 30 May 2006 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/30/49135.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/49135.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/30/49135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/49135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/49135.html</trackback:ping><description><![CDATA[
		<p>
				<span style="FONT-SIZE: 9pt">1.oncontextmenu="window.event.returnvalue=false"将彻底屏蔽鼠标右键<br />&lt;tableborderoncontextmenu=return(false)&gt;&lt;td&gt;no&lt;/table&gt;可用于table <br />2.&lt;bodyonselectstart="returnfalse"&gt;取消选取、防止复制<br /><br />3.onpaste="returnfalse"不准粘贴<br /><br />4.oncopy="returnfalse;"oncut="returnfalse;"防止复制<br /><br />5.&lt;linkrel="shortcuticon"href="favicon.ico"&gt;ie地址栏前换成自己的图标<br /><br />6.&lt;linkrel="bookmark"href="favicon.ico"&gt;可以在收藏夹中显示出你的图标<br /><br />7.&lt;inputstyle="ime-mode:disabled"&gt;关闭输入法<br /><br />8.永远都会带着框架<br />&lt;scriptlanguage="javascript"&gt;&lt;!--<br />if(window==top)top.location.href="frames.htm";//frames.htm为框架网页<br />//--&gt;&lt;/script&gt;<br /><br />9.防止被人frame<br />&lt;scriptlanguage=javascript&gt;&lt;!--<br />if(top.location!=self.location)top.location=self.location;<br />//--&gt;&lt;/script&gt;<br /><br />10.&lt;noscript&gt;&lt;iframesrc=*.html&gt;&lt;/iframe&gt;&lt;/noscript&gt;网页将不能被另存为<br /><br />11.&lt;inputtype=buttonvalue=查看网页源代码<br />onclick="window.location=view-source:+&lt;img src="pic/url.gif" <br />align=absmiddle border=0&gt;http://www.csdn.net/";;&gt;<br /><br />12.怎样通过asp的手段来检查来访者是否用了代理<br />&lt;%ifrequest.servervariables("http_x_forwarded_for")&lt;&gt;""then<br />response.write"&lt;fontcolor=#ff0000&gt;您通过了代理服务器，"&amp;_<br />"真实的ip为"&amp;request.servervariables("http_x_forwarded_for")<br />endif<br />%&gt;<br /><br />13.取得控件的绝对位置<br /><br />//javascript<br />&lt;scriptlanguage="javascript"&gt;<br />functiongetie(e){<br />vart=e.offsettop;<br />varl=e.offsetleft;<br />while(e=e.offsetparent){<br />t+=e.offsettop;<br />l+=e.offsetleft;<br />}<br />alert("top="+t+"\nleft="+l);<br />}<br />&lt;/script&gt;<br /><br />//vbscript<br />&lt;scriptlanguage="vbscript"&gt;&lt;!--<br />functiongetie()<br />dimt,l,a,b<br />seta=document.all.img1<br />t=document.all.img1.offsettop<br />l=document.all.img1.offsetleft<br />whilea.tagname&lt;&gt;"body"<br />seta=a.offsetparent<br />t=t+a.offsettop<br />l=l+a.offsetleft<br />wend<br />msgbox"top="&amp;t&amp;chr(13)&amp;"left="&amp;l,64,"得到控件的位置"<br />endfunction<br />--&gt;&lt;/script&gt;<br /><br />14.光标是停在文本框文字的最后<br />&lt;scriptlanguage="javascript"&gt;<br />functioncc()<br />{<br />vare=event.srcelement;<br />varr=e.createtextrange();<br />r.movestart(character,e.value.length);<br />r.collapse(true);<br />r.select();<br />}<br />&lt;/script&gt;<br />&lt;inputtype=textname=text1value="123"onfocus="cc()"&gt;<br /><br />15.判断上一页的来源<br />asp:<br />request.servervariables("http_referer")<br /><br />javascript:<br />document.referrer<br /><br />16.最小化、最大化、关闭窗口<br />&lt;objectid=hh1classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;paramname="command"value="minimize"&gt;&lt;/object&gt;<br />&lt;objectid=hh2classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;paramname="command"value="maximize"&gt;&lt;/object&gt;<br />&lt;objectid=hh3classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"&gt;<br />&lt;paramname="command"value="close"&gt;&lt;/object&gt;<br /><br />&lt;inputtype=buttonvalue=最小化onclick=hh1.click()&gt;<br />&lt;inputtype=buttonvalue=最大化onclick=hh2.click()&gt;<br />&lt;inputtype=buttonvalue=关闭onclick=hh3.click()&gt;<br />本例适用于ie<br /><br />17.<br />&lt;%<br />定义数据库连接的一些常量<br />constadopenforwardonly=0游标只向前浏览记录，不支持分页、recordset、bookmark<br />constadopenkeyset=1键集游标，其他用户对记录说做的修改将反映到记录集中，但其他<br />用户增加或删除记录不会反映到记录集中。支持分页、recordset、bookmark<br />constadopendynamic=2动态游标功能最强，但耗资源也最多。用户对记录说做的修改，<br />增加或删除记录都将反映到记录集中。支持全功能浏览(access不支持)。<br />constadopenstatic=3静态游标，只是数据的一个快照，用户对记录说做的修改，增加<br />或删除记录都不会反映到记录集中。支持向前或向后移动<br /><br />constadlockreadonly=1锁定类型，默认的，只读，不能作任何修改<br />constadlockpessimistic=2当编辑时立即锁定记录，最安全的方式<br />constadlockoptimistic=3只有在调用update方法时才锁定记录集，而在此前的其他<br />操作仍可对当前记录进行更改、插入和删除等<br />constadlockbatchoptimistic=4当编辑时记录不会被锁定，而更改、插入和删除是<br />在批处理方式下完成的<br /><br />constadcmdtext=&amp;h0001<br />constadcmdtable=&amp;h0002<br />%&gt;<br /><br />18.网页不会被缓存<br />htm网页<br />&lt;metahttp-equiv="pragma"content="no-cache"&gt;<br />&lt;metahttp-equiv="cache-control"content="no-cache,must-revalidate"&gt;<br />&lt;metahttp-equiv="expires"content="wed,26feb199708:21:57gmt"&gt;<br />或者&lt;metahttp-equiv="expires"content="0"&gt;<br />asp网页<br />response.expires=-1<br />response.expiresabsolute=now()-1<br />response.cachecontrol="no-cache"<br />php网页<br />header("expires:mon,26jul199705:00:00gmt");<br />header("cache-control:no-cache,must-revalidate");<br />header("pragma:no-cache");<br /><br /><br />19.检查一段字符串是否全由数字组成<br />&lt;scriptlanguage="javascript"&gt;&lt;!--<br />functionchecknum(str){returnstr.match(/\d/)==null}<br />alert(checknum("1232142141"))<br />alert(checknum("123214214a1"))<br />//--&gt;&lt;/script&gt;<br /><br />20.获得一个窗口的大小<br />document.body.clientwidth,document.body.clientheight<br /><br />21.怎么判断是否是字符<br />if(/[^\x00-\xff]/g.test(s))alert("含有汉字");<br />elsealert("全是字符");<br /><br />22.textarea自适应文字行数的多少<br />&lt;textarearows=1 name=s1 cols=27 onpropertychange="this.style.posheight=<br />this.scrollheight"&gt;<br />&lt;/textarea&gt;<br /><br />23.日期减去天数等于第二个日期<br />&lt;scriptlanguage=javascript&gt;<br />functioncc(dd,dadd)<br />{<br />//可以加上错误处理<br />vara=newdate(dd)<br />a=a.valueof()<br />a=a-dadd*24*60*60*1000<br />a=newdate(a)<br />alert(a.getfullyear()+"年"+(a.getmonth()+1)+"月"+a.getdate()+"日")<br />}<br />cc("12/23/2002",2)<br />&lt;/script&gt;<br /><br />24.选择了哪一个radio<br />&lt;html&gt;&lt;scriptlanguage="vbscript"&gt;<br />functioncheckme()<br />foreachobinradio1<br />ifob.checkedthenwindow.alertob.value<br />next<br />endfunction<br />&lt;/script&gt;&lt;body&gt;<br />&lt;input name="radio1" type="radio" value="style" checked&gt;style<br />&lt;input name="radio1" type="radio" value="barcode"&gt;barcode<br />&lt;input type="button" value="check"onclick="checkme()"&gt;<br />&lt;/body&gt;&lt;/html&gt;<br /><br />25.获得本页url的request.servervariables("")集合<br />response.write"&lt;tableborder=1&gt;&lt;!--tableheader--&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;variables<br />&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;value&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;"<br />foreachobinrequest.servervariables<br />response.write"&lt;tr&gt;&lt;td&gt;"&amp;ob&amp;"&lt;/td&gt;&lt;td&gt;"&amp;request.servervariables(ob)&amp;"<br />&lt;/td&gt;&lt;/tr&gt;"<br />next<br />response.write"&lt;/table&gt;"<br /><br />26.<br />本机ip&lt;%=request.servervariables("remote_addr")%&gt;<br />服务器名&lt;%=request.servervariables("server_name")%&gt;<br />服务器ip&lt;%=request.servervariables("local_addr")%&gt;<br />服务器端口&lt;%=request.servervariables("server_port")%&gt;<br />服务器时间&lt;%=now%&gt;<br />iis版本&lt;%=request.servervariables"server_software")%&gt;<br />脚本超时时间&lt;%=server.scripttimeout%&gt;<br />本文件路径&lt;%=server.mappath(request.servervariables("script_name"))%&gt;<br />服务器cpu数量&lt;%=request.servervariables("number_of_processors")%&gt;<br />服务器解译引擎&lt;%=scriptengine&amp;"/" &amp; scriptenginemajorversion &amp;"." &amp; <br />scriptengineminorversion &amp; "." &amp; scriptenginebuildversion%&gt;<br />服务器操作系统&lt;%=request.servervariables("os")%&gt;<br /><br />27.enter键可以让光标移到下一个输入框<br />&lt;input onkeydown="if(event.keycode==13)event.keycode=9"&gt;<br /><br />28.检测某个网站的链接速度：<br />把如下代码加入&lt;body&gt;区域中:<br />&lt;scriptlanguage=javascript&gt;<br />tim=1<br />setinterval("tim++",100)<br />b=1<br /><br />varautourl=newarray()<br />autourl[1]="&lt; src="pic/url.gif" align=absmiddle border=0&gt;www.njcatv.net"<br />autourl[2]="javacool.3322.net"<br />autourl[3]="&lt; src="pic/url.gif" align=absmiddle border=0&gt;www.sina.com.cn"<br />autourl[4]="www.nuaa.edu.cn"<br />autourl[5]="&lt; src="pic/url.gif" align=absmiddle border=0&gt;www.cctv.com"<br /><br />functionbutt(){<br />document.write("&lt;formname=autof&gt;")<br />for(vari=1;i&lt;autourl.length;i++)<br />document.write("&lt;inputtype=textname=txt"+i+"size=10value=测试中……&gt;=》<br />&lt;inputtype=textname=url"+i+"size=40&gt;=》<br />&lt;inputtype=buttonvalue=goonclick=window.open(this.form.url"+i+".value)&gt;&lt;br/&gt;")<br />document.write("&lt;inputtype=submitvalue=刷新&gt;&lt;/form&gt;")<br />}<br />butt()<br />functionauto(url){<br />document.forms[0]["url"+b].value=url<br />if(tim&gt;200)<br />{document.forms[0]["txt"+b].value="链接超时"}<br />else<br />{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}<br />b++<br />}<br />functionrun(){for(vari=1;i&lt;autourl.length;i++)document.write<br />("&lt;imgsrc=http://"+autourl+"/"+math.random()+"width=1height=<br />1onerror=auto(&lt; src="pic/url.gif" align=absmiddle border=0&gt;<br />http://";;;+autourl+")&gt;")}<br />run()&lt;/script&gt;<br /><br /><br />29.各种样式的光标<br />auto：标准光标<br />default：标准箭头<br />hand：手形光标<br />wait：等待光标<br />text：i形光标<br />vertical-text：水平i形光标<br />no-drop：不可拖动光标<br />not-allowed：无效光标<br />help：?帮助光标<br />all-scroll：三角方向标<br />move：移动标<br />crosshair：十字标<br />e-resize<br />n-resize<br />nw-resize<br />w-resize<br />s-resize<br />se-resize<br />sw-resize<br /><br />1.本地无缓存，每次自动刷新<br />response.expires=0<br />response.addheader"pragma","no-cache"<br />response.addheader"cache-control","private"<br /><br />2.修改contenttype并下载gif等格式<br />&lt;%<br />functiondl(f,n)<br />onerrorresumenext<br /><br />sets=createobject("adodb.stream")<br />s.mode=3<br />s.type=1<br />s.open<br />s.loadfromfile(server.mappath(f))<br />iferr.number&gt;0then<br />response.writeerr.number&amp;":"&amp;err.description<br />else<br />response.contenttype="application/x-gzip"<br />response.addheader"content-disposition:","attachment;filename="&amp;n<br />response.binarywrite(s.read(s.size))<br />endif<br />endfunction<br /><br />calldl("012922501.gif","t1.gif")<br />%&gt;<br /><br /><br />19.检查一段字符串是否全由数字组成<br />&lt;scriptlanguage="javascript"&gt;&lt;!--<br />functionchecknum(str){return!/\d/.test(str)}<br />alert(checknum("1232142141"))<br />alert(checknum("123214214a1"))<br />//--&gt;&lt;/script&gt;<br /><br />20.获得一个窗口的大小<br />document.body.clientwidth,document.body.clientheight<br />document.body.offsetwidth,document.body.offsetheight<br />有时还需要知道window.screentop,window.screenleft<br /><br />21.怎么判断是否含有汉字<br />if(escape(str).indexof("%u")!=-1)alert("含有汉字");<br />elsealert("全是字符");<br /><br />22.textarea自适应文字行数的多少<br />ie5.5+可以用overflow-y:visible<br />&lt;textarearows=1name=s1cols=27style="overflow-y:visible"&gt;<br />&lt;/textarea&gt;<br /><br />23.日期减去天数等于第二个日期<br />&lt;scriptlanguage=javascript&gt;<br />functioncc(dd,dadd)<br />{<br />//可以加上错误处理<br />vard=newdate(dd.replace("-","/"))<br />d.setdate(d.getdate()+dadd)<br />alert(d.getfullyear()+"年"+(d.getmonth()+1)+"月"+d.getdate()+"日")<br />}<br />cc("2002-2-28",2)<br />&lt;/script&gt; </span>
		</p>
<img src ="http://www.blogjava.net/junky/aggbug/49135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-30 23:35 <a href="http://www.blogjava.net/junky/archive/2006/05/30/49135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>