﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-时间-文章分类-Java</title><link>http://www.blogjava.net/lvq810/category/31962.html</link><description>世间最可贵的就是“今”，最易丧失得也是“今”。因为它最容易丧失，所以更觉得它宝贵。</description><language>zh-cn</language><lastBuildDate>Wed, 30 Sep 2009 19:27:59 GMT</lastBuildDate><pubDate>Wed, 30 Sep 2009 19:27:59 GMT</pubDate><ttl>60</ttl><item><title>EL表达式语言</title><link>http://www.blogjava.net/lvq810/articles/290599.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Mon, 10 Aug 2009 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/290599.html</guid><description><![CDATA[一、EL简介<br />
&nbsp; 1.语法结构<br />
&nbsp;&nbsp;&nbsp; ${expression}<br />
&nbsp; 2.[]与.运算符<br />
&nbsp;&nbsp;&nbsp; EL 提供.和[]两种运算符来存取数据。<br />
&nbsp;&nbsp;&nbsp; 当要存取的属性名称中包含一些特殊字符，如.或?等并非字母或数字的符号，就一定要使用 []。例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${user.My-Name}应当改为${user["My-Name"] }<br />
&nbsp;&nbsp;&nbsp; 如果要动态取值时，就可以用[]来做，而.无法做到动态取值。例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${sessionScope.user[data]}中data 是一个变量<br />
&nbsp; 3.变量<br />
&nbsp;&nbsp;&nbsp; EL存取变量数据的方法很简单，例如：${username}。它的意思是取出某一范围中名称为username的变量。<br />
&nbsp;&nbsp;&nbsp; 因为我们并没有指定哪一个范围的username，所以它会依序从Page、Request、Session、Application范围查找。<br />
&nbsp;&nbsp;&nbsp; 假如途中找到username，就直接回传，不再继续找下去，但是假如全部的范围都没有找到时，就回传null。<br />
&nbsp;&nbsp;&nbsp; 属性范围在EL中的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PageScope<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestScope<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionScope<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application&nbsp;&nbsp;&nbsp;&nbsp; ApplicationScope<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
二、EL隐含对象<br />
&nbsp; 1.与范围有关的隐含对象<br />
&nbsp; 与范围有关的EL 隐含对象包含以下四个：pageScope、requestScope、sessionScope 和applicationScope；<br />
&nbsp; 它们基本上就和JSP的pageContext、request、session和application一样；<br />
&nbsp; 在EL中，这四个隐含对象只能用来取得范围属性值，即getAttribute(String name)，却不能取得其他相关信息。<br />
&nbsp;<br />
&nbsp; 例如：我们要取得session中储存一个属性username的值，可以利用下列方法：<br />
&nbsp;&nbsp;&nbsp; session.getAttribute("username") 取得username的值，<br />
&nbsp; 在EL中则使用下列方法<br />
&nbsp;&nbsp;&nbsp; ${sessionScope.username}<br />
<br />
&nbsp; 2.与输入有关的隐含对象<br />
&nbsp; 与输入有关的隐含对象有两个：param和paramValues，它们是EL中比较特别的隐含对象。<br />
&nbsp;<br />
&nbsp; 例如我们要取得用户的请求参数时，可以利用下列方法：<br />
&nbsp;&nbsp;&nbsp; request.getParameter(String name)<br />
&nbsp;&nbsp;&nbsp; request.getParameterValues(String name)<br />
&nbsp; 在EL中则可以使用param和paramValues两者来取得数据。<br />
&nbsp;&nbsp;&nbsp; ${param.name}<br />
&nbsp;&nbsp;&nbsp; ${paramValues.name}<br />
<br />
&nbsp; 3.其他隐含对象<br />
&nbsp;<br />
&nbsp; cookie<br />
&nbsp; JSTL并没有提供设定cookie的动作，<br />
&nbsp; 例：要取得cookie中有一个设定名称为userCountry的值，可以使用${cookie.userCountry}来取得它。<br />
<br />
&nbsp; header和headerValues<br />
&nbsp; header 储存用户浏览器和服务端用来沟通的数据<br />
&nbsp; 例：要取得用户浏览器的版本，可以使用${header["User-Agent"]}。<br />
&nbsp; 另外在鲜少机会下，有可能同一标头名称拥有不同的值，此时必须改为使用headerValues 来取得这些值。<br />
<br />
&nbsp; initParam<br />
&nbsp; initParam取得设定web站点的环境参数(Context)<br />
&nbsp; 例：一般的方法String userid = (String)application.getInitParameter("userid");<br />
&nbsp;&nbsp;&nbsp; 可以使用 ${initParam.userid}来取得名称为userid<br />
<br />
&nbsp; pageContext<br />
&nbsp; pageContext取得其他有关用户要求或页面的详细信息。<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.queryString}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得请求的参数字符串<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.requestURL}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得请求的URL，但不包括请求之参数字符串<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.contextPath}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 服务的web application 的名称<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.method}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得HTTP 的方法(GET、POST)<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.protocol}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得使用的协议(HTTP/1.1、HTTP/1.0)<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.remoteUser}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得用户名称<br />
&nbsp;&nbsp;&nbsp; ${pageContext.request.remoteAddr }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得用户的IP 地址<br />
&nbsp;&nbsp;&nbsp; ${pageContext.session.new}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 判断session 是否为新的<br />
&nbsp;&nbsp;&nbsp; ${pageContext.session.id}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取得session 的ID<br />
&nbsp;&nbsp;&nbsp; ${pageContext.servletContext.serverInfo}&nbsp;&nbsp; 取得主机端的服务信息<br />
<br />
三、EL运算符<br />
&nbsp; 1.算术运算符有五个：+、-、*或$、/或div、%或mod<br />
&nbsp; 2.关系运算符有六个：==或eq、!=或ne、&lt;或lt、&gt;或gt、&lt;=或le、&gt;=或ge<br />
&nbsp; 3.逻辑运算符有三个：&amp;&amp;或and、||或or、!或not<br />
&nbsp; 4.其它运算符有三个：Empty运算符、条件运算符、()运算符<br />
&nbsp;&nbsp;&nbsp; 例：${empty param.name}、${A?B:C}、${A*(B+C)}<br />
&nbsp;<br />
四、EL函数(functions)。<br />
&nbsp; 语法：ns:function( arg1, arg2, arg3 &#8230;. argN)<br />
&nbsp; 其中ns为前置名称(prefix)，它必须和taglib 指令的前置名称一置<br />
<br />
<p>补充：<br />
&lt;%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"
%&gt;<br />
FOREACH:<br />
&lt;c:forEach
items="${messages}"<br />
var="item"<br />
begin="0"<br />
end="9"<br />
step="1"<br />
varStatus="var"&gt;<br />
&#8230;&#8230;<br />
&lt;/c:forEach&gt;</p>
<p>OUT:<br />
&lt;c:out value="/${logininfo.username}"/&gt;<br />
&lt;c:out&gt;将value
中的内容输出到当前位置，这里也就是把logininfo 对象的<br />
username属性值输出到页面当前位置。<br />
${&#8230;&#8230;}是JSP2.0
中的Expression
Language（EL）的语法。它定义了一个表达式，<br />
其中的表达式可以是一个常量（如上），也可以是一个具体的表达语句（如forEach循环体中<br />
的情况）。典型案例如下：<br />
&#216;
${logininfo.username}<br />
这表明引用logininfo 对象的username
属性。我们可以通过&#8220;.&#8221;操作符引<br />
用对象的属性，也可以用&#8220;[]&#8221;引用对象属性，如${logininfo[username]}<br />
与${logininfo.username}达到了同样的效果。<br />
&#8220;[]&#8221;引用方式的意义在于，如果属性名中出现了特殊字符，如&#8220;.&#8221;或者&#8220;-&#8221;，<br />
此时就必须使用&#8220;[]&#8221;获取属性值以避免语法上的冲突（系统开发时应尽量避免<br />
这一现象的出现）。<br />
与之等同的JSP
Script大致如下：<br />
LoginInfo logininfo
=<br />
(LoginInfo)session.getAttribute(&#8220;logininfo&#8221;);<br />
String username =
logininfo.getUsername();<br />
可以看到，EL大大节省了编码量。<br />
这里引出的另外一个问题就是，EL 将从哪里找到logininfo
对象，对于<br />
${logininfo.username}这样的表达式而言，首先会从当前页面中寻找之前是<br />
否定义了变量logininfo，如果没有找到则依次到Request、Session、<br />
Application
范围内寻找，直到找到为止。如果直到最后依然没有找到匹配的<br />
变量，则返回null.<br />
如果我们需要指定变量的寻找范围，可以在EL表达式中指定搜寻范围：<br />
${pageScope.logininfo.username}<br />
${requestScope.logininfo.username}<br />
${sessionScope.logininfo.username}<br />
${applicationScope.logininfo.username}<br />
在Spring
中，所有逻辑处理单元返回的结果数据，都将作为Attribute 被放<br />
置到HttpServletRequest 对象中返回（具体实现可参见Spring
源码中<br />
org.springframework.web.servlet.view.InternalResourceView.<br />
exposeModelAsRequestAttributes方法的实现代码），也就是说Spring<br />
MVC
中，结果数据对象默认都是requestScope。因此，在Spring MVC
中，<br />
以下寻址方法应慎用：<br />
${sessionScope.logininfo.username}<br />
${applicationScope.logininfo.username}<br />
&#216;
${1＋2}<br />
结果为表达式计算结果，即整数值3。<br />
&#216;
${i&gt;1}<br />
如果变量值i&gt;1的话，将返回bool类型true。与上例比较，可以发现EL会自<br />
动根据表达式计算结果返回不同的数据类型。<br />
表达式的写法与java代码中的表达式编写方式大致相同。</p>
<p>IF / CHOOSE:<br />
&lt;c:if test="${var.index % 2 ==
0}"&gt;<br />
*<br />
&lt;/c:if&gt;<br />
判定条件一般为一个EL表达式。<br />
&lt;c:if&gt;并没有提供else子句，使用的时候可能有些不便，此时我们可以通过&lt;c:choose&gt;<br />
tag来达到类似的目的：<br />
&lt;c:choose&gt;<br />
&lt;c:when
test="${var.index % 2 ==
0}"&gt;<br />
*<br />
&lt;/c:when&gt;<br />
&lt;c:otherwise&gt;<br />
!<br />
&lt;/c:otherwise&gt;<br />
&lt;/c:choose&gt;<br />
类似Java
中的switch
语句，&lt;c:choose&gt;提供了复杂判定条件下的简化处理手法。其<br />
中&lt;c:when&gt;子句类似case子句，可以出现多次。上面的代码，在奇数行时输出&#8220;*&#8221;号，<br />
而偶数行时输出&#8220;!&#8221;。</p>
<p>1、EL表达式用${}表示,可用在所有的HTML和JSP标签中 作用是代替JSP页面中复杂的JAVA代码.&nbsp;</p>
<p>2、EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}.
${param}表示返回请求参数中单个字符串的值.
${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量.
sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量.</p>
<p>3、&lt;%@&nbsp; page isELIgnored="true"%&gt;
表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.</p>
<p>4、EL语言可显示 逻辑表达式如${true and false}结果是false&nbsp;&nbsp;&nbsp; 关系表达式如${5&gt;6} 结果是false&nbsp;&nbsp;&nbsp;&nbsp;
算术表达式如 ${5+5} 结果是10</p>
<p>5、EL中的变量搜索范围是:page request session application&nbsp;&nbsp; 点运算符(.)和"[ ]"都是表示获取变量的值.区别是[
]可以显示非词类的变量</p>
&nbsp;
<img src ="http://www.blogjava.net/lvq810/aggbug/290599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2009-08-10 23:53 <a href="http://www.blogjava.net/lvq810/articles/290599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的文件ContentType类型</title><link>http://www.blogjava.net/lvq810/articles/284993.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Wed, 01 Jul 2009 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/284993.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Tomcat根目录下的\conf\web.xml文件Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-mapping&gt;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/lvq810/articles/284993.html'>阅读全文</a><img src ="http://www.blogjava.net/lvq810/aggbug/284993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2009-07-01 17:52 <a href="http://www.blogjava.net/lvq810/articles/284993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LookupDispatchAction,EventDispatchAction和MappingDispatchAction使用中的区别</title><link>http://www.blogjava.net/lvq810/articles/256662.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Wed, 25 Feb 2009 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/256662.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->java.lang.Object&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts.action.Action&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/lvq810/articles/256662.html'>阅读全文</a><img src ="http://www.blogjava.net/lvq810/aggbug/256662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2009-02-25 17:42 <a href="http://www.blogjava.net/lvq810/articles/256662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Java NIO原理和使用</title><link>http://www.blogjava.net/lvq810/articles/254369.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Thu, 12 Feb 2009 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/254369.html</guid><description><![CDATA[Java NIO非堵塞应用通常适用用在I/O读写等方面，我们知道，系统运行的性能瓶颈通常在I/O读写，包括对端口和文件的操作上，过去，在打开一个I/O通道后，read()将一直等待在端口一边读取字节内容，如果没有内容进来，read()也是傻傻的等，这会影响我
们程序继续做其他事情，那么改进做法就是开设线程，让线程去等待，但是这样做也是相当耗费资源的。
<p align="left">Java NIO非堵塞技术实际是采取Reactor模式，或者说是Observer模式为我们监察I/O端口，如果有内容进来，会自动通知我们，这样，我们就不必开启多个线程死等，从外界看，实现了流畅的I/O读写，不堵塞了。</p>
<p align="left">Java NIO出现不只是一个技术性能的提高，你会发现网络上到处在介绍它，因为它具有里程碑意义，从JDK1.4开始，Java开始提高性能相关的功能，从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。</p>
<p align="left">如
果你至今还是在怀疑Java的性能，说明你的思想和观念已经完全落伍了，Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并
发等新性能的支持，Java应用在游戏等适时领域方面的机会已经成熟，Java在稳定自己中间件地位后，开始蚕食传统C的领域。</p>
<p align="left">本文主要简单介绍NIO的基本原理，在下一篇文章中，将结合Reactor模式和著名线程大师<a href="http://gee.cs.oswego.edu/dl/">Doug
Lea</a>的一篇文章深入讨论。</p>
<p align="left">NIO主要原理和适用。</p>
<p align="left">NIO
有一个主要的类Selector,这个类似一个观察者，只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情，当有
事件发生时，他会通知我们，传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后，我们从
这个Channel中读取数据，放心，包准能够读到，接着我们可以处理这些数据。</p>
<p align="left">Selector内部原理实际是在做一个对所注册的channel的轮询访问，不断的轮询(目前就这一个算法)，一旦轮询到一个channel有所注册的事情发生，比如数据来了，他就会站起来报告，交出一把钥匙，让我们通过这把钥匙来读取这个channel的内容。</p>
<p align="left">了解了这个基本原理，我们结合代码看看使用，在使用上，也在分两个方向，一个是线程处理，一个是用非线程，后者比较简单，看下面代码：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.nio.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.nio.channels.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.nio.channels.spi.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.net.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;Administrator<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@version</span><span style="color: #008000;"><br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;NBTest&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;Creates&nbsp;new&nbsp;NBTest&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;NBTest()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;startServer()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;channels&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nKeys&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;currentSelector&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使用Selector</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Selector&nbsp;selector&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Selector.open();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;建立Channel&nbsp;并绑定到9000端口</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocketChannel&nbsp;ssc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ServerSocketChannel.open();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InetSocketAddress&nbsp;address&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InetSocketAddress(InetAddress<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getLocalHost(),&nbsp;</span><span style="color: #000000;">9000</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssc.socket().bind(address);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;使设定non-blocking的方式。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssc.configureBlocking(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;向Selector注册Channel及我们有兴趣的事件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionKey&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ssc.register(selector,&nbsp;SelectionKey.OP_ACCEPT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printKeyInfo(s);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;不断的轮询</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest:&nbsp;Starting&nbsp;select</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Selector通过select方法通知我们我们感兴趣的事件发生了。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nKeys&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;selector.select();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果有我们注册的事情发生了，它的传回值就会大于0</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(nKeys&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest:&nbsp;Number&nbsp;of&nbsp;keys&nbsp;after&nbsp;select&nbsp;operation:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;nKeys);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Selector传回一组SelectionKeys<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;我们从这些key中的channel()方法中取得我们刚刚注册的channel。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&nbsp;selectedKeys&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;selector.selectedKeys();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;selectedKeys.iterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(i.hasNext())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(SelectionKey)&nbsp;i.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printKeyInfo(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest:&nbsp;Nr&nbsp;Keys&nbsp;in&nbsp;selector:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 style="color: #000000;">+</span><span style="color: #000000;">&nbsp;selector.keys().size());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;一个key被处理完成后，就都被从就绪关键字（ready&nbsp;keys）列表中除去</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i.remove();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(s.isAcceptable())&nbsp;{<br />
&nbsp;&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 style="color: #008000;">//</span><span style="color: #008000;">&nbsp;从channel()中取得我们刚刚注册的channel。</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((ServerSocketChannel)&nbsp;s.channel())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.accept().socket();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketChannel&nbsp;sc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;socket.getChannel();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sc.configureBlocking(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sc.register(selector,&nbsp;SelectionKey.OP_READ<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 style="color: #000000;">|</span><span style="color: #000000;">&nbsp;SelectionKey.OP_WRITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">++</span><span style="color: #000000;">channels);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest:&nbsp;Channel&nbsp;not&nbsp;acceptable</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest:&nbsp;Select&nbsp;finished&nbsp;without&nbsp;any&nbsp;keys.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;debug(String&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printKeyInfo(SelectionKey&nbsp;sk)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Att:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(sk.attachment()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">no</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">yes</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Read:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;sk.isReadable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Acpt:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;sk.isAcceptable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Cnct:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;sk.isConnectable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Wrt:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;sk.isWritable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Valid:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;sk.isValid();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Ops:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;sk.interestOps();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args&nbsp;the&nbsp;command&nbsp;line&nbsp;arguments<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;args[])&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NBTest&nbsp;nbTest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NBTest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nbTest.startServer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<p align="left">这是一个守候在端口9000的noblock server例子，如果我们编制一个客户端程序，就可以对它进行互动操作，或者使用telnet
主机名 9000 可以链接上。</p>
<img src ="http://www.blogjava.net/lvq810/aggbug/254369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2009-02-12 13:17 <a href="http://www.blogjava.net/lvq810/articles/254369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE常用Jar包含义</title><link>http://www.blogjava.net/lvq810/articles/247629.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Sun, 21 Dec 2008 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/247629.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/247629.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/247629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/247629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/247629.html</trackback:ping><description><![CDATA[<strong>commons-digester.jar</strong><br />
Digester基于规则的XML文档解析,主要用于XML到Java对象的映射<br />
<strong>commons-beanutils.jar</strong> <br />
提供对Java 反射和自省API的包装<br />
<strong>aspectjweaver.jar<br />
</strong>用于在Spring 2.0中集成AspectJ AspectJ LTW织入器<br />
<strong>ognl.jar <br />
</strong>OGNL是Object-Graph Navigation Language的缩写，它是一种功能强大的表达式语言（Expression
Language，简称为EL），通过它简单一致的表达式语法，可以存取对象的任意属性，调用对象的方法，遍历整个对象的结构图，实现字段类型转化等功
能。它使用相同的表达式去存取对象的属性<br />
<br />
hibernate2依赖的一些包 <br />
<strong>hibernate2.jar</strong> <br />
Hibernate的库，没有什么可说的，必须使用的jar包<br />
<strong>cglib-asm.jar</strong><br />
CGLIB库，Hibernate用它来实现PO字节码的动态生成，非常核心的库，必须使用的jar包<br />
<strong>dom4j.jar</strong><br />
dom4j是一个Java的XML API，类似于jdom，用来读写XML文件的。dom4j是一个非常非常优秀的Java XML
API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。在IBM
developerWorks上面可以找到一篇文章，对主流的Java XML
API进行的性能、功能和易用性的评测，dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j，直到现在。如今你可以看到越
来越多的Java软件都在使用dom4j来读写XML，特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar
包，Hibernate用它来读写配置文件。<br />
<strong>odmg.jar<br />
</strong>ODMG是一个ORM的规范，Hibernate实现了ODMG规范，这是一个核心的库，必须使用的jar包<br />
<strong>commons-collections.jar</strong> <br />
Apache Commons包中的一个，包含了一些Apache开发的集合类，功能比java.util.*强大。必须使用的jar包<br />
<strong>commons-beanutils.jar</strong> <br />
Apache Commons包中的一个，包含了一些Bean工具类类。必须使用的jar包<br />
<strong>commons-lang.jar<br />
</strong>Apache Commons包中的一个，包含了一些数据类型工具类，是java.lang.*的扩展。必须使用的jar包<br />
<strong>commons-logging.jar<br />
</strong>Apache Commons包中的一个，包含了日志功能，必须使用的jar包。这个包本身包含了一个Simple
Logger，但是功能很弱。在运行的时候它会先在CLASSPATH找log4j，如果有，就使用log4j，如果没有，就找JDK1.4带的
java.util.logging，如果也找不到就用Simple
Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾，当初Apache极力游说Sun把log4j加入JDK1.4，
然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了，因此拒绝了Apache的要求，使用自己的java.util.logging，这个包
的功能比log4j差的很远，性能也一般。<br />
后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的
log程序，底层的Logger是可以切换的，你可以选择log4j，java.util.logging或者它自带的Simple
Logger。不过我仍然强烈建议使用log4j，因为log4j性能很高，log输出信息时间几乎等于System.out，而处理一条log平均只需
要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件，你只需要到Apache
网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。<br />
使用Hibernate必须的jar包就是以上的这几个，剩下的都是可选的<br />
<strong>ant.jar<br />
</strong>Ant编译工具的jar包，用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码，那么就没有什么用，可选的jar包<br />
<strong>optional.jar <br />
</strong>Ant的一个辅助包<br />
<strong>c3p0.jar</strong> <br />
C3PO是一个数据库连接池，Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池，就需要这个jar包。<br />
<strong>proxool.jar<br />
</strong>也是一个连接池，同上<br />
<strong>commons-pool.jar,</strong><strong>commons-dbcp.jar<br />
</strong>DBCP数据库连接池，Apache的Jakarta组织开发的，Tomcat4的连接池也是DBCP。 <br />
实际上Hibernate自己也实现了一个非常非常简单的数据库连接池，加上上面3个，你实际上可以在Hibernate上选择4种不同的数据库连接池，
选择哪一个看个人的偏好，不过DBCP可能更通用一些。另外强调一点，如果在EJB中使用Hibernate，一定要用App
Server的连接池，不要用以上4种连接池，否则容器管理事务不起作用<br />
<strong>connector.jar<br />
</strong>JCA 规范，如果你在App Server上把Hibernate配置为Connector的话，就需要这个jar。不过实际上一般App Server肯定会带上这个包，所以实际上是多余的包<br />
<strong>jaas.jar<br />
</strong>JAAS是用来进行权限验证的，已经包含在JDK1.4里面了。所以实际上是多余的包。<br />
<strong>jcs.jar <br />
</strong>如果你准备在Hibernate中使用JCS的话，那么必须包括它，否则就不用。<br />
<strong>jdbc2_0-stdext.jar<br />
</strong>JDBC2.0的扩展包，一般来说数据库连接池会用上它。不过App Server都会带上，所以也是多余的。<br />
<strong>jta.jar<br />
</strong>JTA规范，当Hibernate使用JTA的时候需要，不过App Server都会带上，所以也是多余的。<br />
<strong>junit.jar</strong><br />
Junit包，当你运行Hibernate自带的测试代码的时候需要，否则就不用。<br />
<strong>xalan.jar, xerces.jar, xml-apis.jar<br />
</strong>Xerces是XML解析器，Xalan是格式化器，xml-apis实际上是JAXP。一般App
Server都会带上，JDK1.4也包含了解析器，不过不是Xerces，是Crimson，效率比较差，不过Hibernate用XML只不过是读取
配置文件，性能没什么紧要的，所以也是多余的<br />
<strong>antlr.jar</strong> <br />
语法生成工具<br />
<br />
spring 相关jar包作用：<br />
除了spring.jar文件，Spring还包括有其它13个独立的jar包，各自包含着对应的Spring组件，用户可以根据自己的需要来选择组合自己的jar包，而不必引入整个spring.jar的所有类文件。<br />
<strong>(1) spring-core.jar</strong><br />
这个jar文件包含Spring框架基本的核心工具类，Spring其它组件要都要使用到这个包里的类，是其它组件的基本核心，当然你也可以在自己的应用系统中使用这些工具类。<br />
<strong>(2) spring-beans.jar<br />
</strong>这个jar文件是所有应用都要用到的，它包含访问配置文件、创建和管理bean以及进行Inversion of Control /
Dependency
Injection（IoC/DI）操作相关的所有类。如果应用只需基本的IoC/DI支持，引入spring-core.jar及spring-
beans.jar文件就可以了。<br />
<strong>(3) spring-aop.jar<br />
</strong>这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性，如声明型事务管理（Declarative Transaction Management），也要在应用里包含这个jar包。<br />
<strong>(4) spring-context.jar<br />
</strong>　　这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring
ApplicationContext特性时所需的全部类，JDNI所需的全部类，UI方面的用来与模板（Templating）引擎如
Velocity、FreeMarker、JasperReports集成的类，以及校验Validation方面的相关类。<br />
<strong>(5) spring-dao.jar<br />
</strong>　　这个jar文件包含Spring DAO、Spring Transaction进行数据访问的所有类。为了使用声明型事务支持，还需在自己的应用里包含spring-aop.jar。<br />
<strong>(6) spring-hibernate.jar<br />
</strong>　　这个jar文件包含Spring对Hibernate 2及Hibernate 3进行封装的所有类。<br />
<strong>(7) spring-jdbc.jar<br />
</strong>　　这个jar文件包含对Spring对JDBC数据访问进行封装的所有类。<br />
<strong>(8) spring-orm.jar<br />
</strong>　　这个jar文件包含Spring对DAO特性集进行了扩展，使其支持
iBATIS、JDO、OJB、TopLink，因为Hibernate已经独立成包了，现在不包含在这个包里了。这个jar文件里大部分的类都要依赖
spring-dao.jar里的类，用这个包时你需要同时包含spring-dao.jar包。<br />
<strong>(9) spring-remoting.jar</strong><br />
这个jar文件包含支持EJB、JMS、远程调用Remoting（RMI、Hessian、Burlap、Http Invoker、JAX-RPC）方面的类。<br />
<strong>(10) spring-support.jar<br />
</strong>　　这个jar文件包含支持缓存Cache（ehcache）、JCA、JMX、邮件服务（Java Mail、COS Mail）、任务计划Scheduling（Timer、Quartz）方面的类。<br />
<strong>(11) spring-web.jar<br />
</strong>　　这个jar文件包含Web应用开发时，用到Spring框架时所需的核心类，包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。<br />
<strong>(12) spring-webmvc.jar<br />
</strong>　　这个jar文件包含Spring
MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、
XSLT相关类。当然，如果你的应用使用了独立的MVC框架，则无需这个JAR文件里的任何类。<br />
<strong>(13) spring-mock.jar</strong><br />
这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类，这样测试就更加简单。模拟HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便的。<br />
jstl相关jar包简介<br />
由于要搭SSH框架，面对那么多包，都不知道干嘛的，于是就把每个包的作用都查过去，有点无聊，呵呵。<br />
<br />
<strong>mail.jar</strong> <br />
java发送电子邮件 ,里面包含了activation.jar和mail.jar两个包.通过里面的类的调用便可以达到发送电子邮件的目的.里面.......<br />
<strong>dom.jar</strong> <br />
文档对象模型&#8221;(DOM)允许开发者在 XML 结构内引用、检索和更改 XML 结构中的各项元素。<br />
<strong>jaxen-full.jar</strong><br />
jaxen是一个用Java开发的XPath 引擎,支持JDOM, dom4j。<br />
<strong>jaxp-api.jar</strong> <br />
JAXP是Java API for XML Processing的英文字头缩写,中文含义是:用于XML文档处理的使用Java语言编写的编程接口<br />
<strong>jadb2_0-stdxt.jar</strong> <br />
javax.sql包，可以查下java API。<br />
<strong>jstl.jar</strong><br />
<strong>sax.jar</strong> <br />
SAX是一个用于处理XML事件驱动的&#8220;推&#8221;模型，虽然它不是W3C标准，但它却是一个得到了广泛认可的API<br />
<strong>saxpath.jar</strong> <br />
SAXPath is an event-based API for XPath parsers, that is, for parsers
which parse XPath expressions. SAXPath is intended to be for XPath what
SAX is for XML<br />
<strong>standard.jar</strong> <br />
标准标签库包。jstl核心的两个包之一。<br />
<strong>xalan.jar</strong> <br />
Xalan是将可扩展标记语言(XML)转换为超文本链接标识语言(HTML)或其它类型XML文档的规范<br />
<strong>xercesImpl.jar</strong> <br />
实现解析XML文件的功能很方便,我们可以通过下载第三方的一些工具包如xml-<strong>apis.jar,xercesImpl.jar</strong> <br />
Xerces是一个与可扩展标记语言(XML)兼容的语法分析器。Xerces分析器可处理Java和C++,它采用互联网联盟XML、文件对象...Xerces-C是用可移植的C++子集编写的XML分析器。Xerces-C允许对XML数据进行读写操作<br />
如果要使用JSTL,则必须将jstl.jar和standard.jar文件放到classpath中,如果你还需要使用XML
processing及Database access
(SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。
<img src ="http://www.blogjava.net/lvq810/aggbug/247629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-12-21 16:35 <a href="http://www.blogjava.net/lvq810/articles/247629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]﻿Spring2提供的Remote包学习笔记</title><link>http://www.blogjava.net/lvq810/articles/238533.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Tue, 04 Nov 2008 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/238533.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/238533.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/238533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/238533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/238533.html</trackback:ping><description><![CDATA[原文出自：http://www.blogjava.net/xmatthew/archive/2008/11/02/238208.html&nbsp;&nbsp;&nbsp; 作者：xmatthew<br />
<br />
Spring2 针对远程访问服务，提供的一个remote包。其的的是提供一套统一的远程服务发布功能。<br />
先来看一下Spring2支持那些远程服务功能:<br />
&nbsp;&nbsp;&nbsp; 1. RMI服务<br />
&nbsp;&nbsp;&nbsp; 2. Hessian或者Burlap通过HTTP远程调用服务<br />
&nbsp;&nbsp;&nbsp; 3. HTTP调用器暴露服务<br />
<br />
下面用一个例子，来看一下Spring2 是怎样对这些服务进行统一的封装和管理。<br />
<br />
先看一下服务器端的源代码<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IBookService&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;getById(String&nbsp;id);<br />
<br />
}<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Book&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;author;<br />
<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookService&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IBookService&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Book&nbsp;getById(String&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;BookStore.getById(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}&nbsp;&nbsp; <br />
</span></div>
<br />
客户端源代码<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookQueryService&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;IBookService&nbsp;bookService;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAccountService(IBookService&nbsp;bookService)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.bookService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bookService;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Book&nbsp;getBookById(String&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;bookService.getById(id);<br />
&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">客户端调用示例</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
<br />
&nbsp;&nbsp;ClassPathXmlApplicationContext&nbsp;context;<br />
&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;BookQueryService&nbsp;bookQueryService&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(BookQueryService)&nbsp;context.getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">bookQueryService</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;book&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bookQueryService.getBookById(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
}</span></div>
<br />
使用Spring2 发布 RMI服务示例<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">服务器端配置:<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.BookService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="org.springframework.remoting.rmi.RmiServiceExporter"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;does&nbsp;not&nbsp;necessarily&nbsp;have&nbsp;to&nbsp;be&nbsp;the&nbsp;same&nbsp;name&nbsp;as&nbsp;the&nbsp;bean&nbsp;to&nbsp;be&nbsp;exported&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceName"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="service"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="registryPort"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="1800"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
客户端配置:<br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.client.BookQueryService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.remoting.rmi.RmiProxyFactoryBean"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceUrl"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="rmi://localhost:1800/bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span></div>
<br />
使用Spring2 发布 基于Http的Hessian服务示例<br />
注： Hessian提供一种基于HTTP的二进制远程协议。它是由Caucho创建的，可以在 http://www.caucho.com 找到更多有关Hessian的信息。<br />
&nbsp;<br />
首为使用Hessian，需要为其配置Spring 的 DispatcherServlet<br />
把下面的配置加入到web.xml中<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">remoting</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">org.springframework.web.servlet.DispatcherServlet</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">remoting</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/remoting/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">服务器端配置:<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.BookService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="/bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.remoting.caucho.HessianServiceExporter"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="service"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
客户端配置:<br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.client.BookQueryService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.remoting.caucho.HessianProxyFactoryBean"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceUrl"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="http://localhost:8080/bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span></div>
<br />
使用Spring2 发布 基于Http的Burlap服务示例<br />
&nbsp;Burlap，它是一个基于XML的Hessian替代方案。它的配置方法和上述Hessian的一样。只要把 Hessian 换成 Burlap 就行了。<br />
&nbsp;服务器端使用:<br />
&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.remoting.caucho.BurlapServiceExporter 发布服务<br />
&nbsp;客户端使用:<br />
&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.remoting.caucho.BurlapProxyFactoryBean<br />
<br />
使用Spring2 发布 基于HTTP调用器暴露服务<br />
和使用自身序列化机制的轻量级协议Burlap和Hessian相反，Spring HTTP调用器使用标准Java序列化机制来通过HTTP暴露业务.<br />
但其配置与Burlap和Hessian很相近<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">服务器端配置:<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.BookService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="/bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="service"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
客户端配置:<br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.client.BookQueryService"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceUrl"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="http://localhost:8080/bookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lvq810/aggbug/238533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-11-04 12:05 <a href="http://www.blogjava.net/lvq810/articles/238533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.5 版本的Spring MVC应用 Hello world!</title><link>http://www.blogjava.net/lvq810/articles/230385.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Mon, 22 Sep 2008 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/230385.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/230385.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/230385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/230385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/230385.html</trackback:ping><description><![CDATA[由于<span class="hilite1">Spring</span> <span class="hilite2">2</span>.<span class="hilite3">5</span>全面支持annotation方式，因此大大减少了XML的配置，提高了程序代码的维护和生产效率。下面是我做的一个简单的<span class="hilite6">Hello</span> <span class="hilite7">World!</span>，使用<span class="hilite1">Spring</span> mvc。所有配置全部用annotation，大家可以看看是多么的简单。
<br />
<br />
首先还是配置好web.xml文件，主要添加的代码有：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;1.&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.util.Log4jConfigListener&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;6.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.context.ContextLoaderListener&nbsp;&nbsp;<br />
&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;12.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">welcome-file-list</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">welcome-file</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">index.jsp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">welcome-file</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;15.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">welcome-file-list</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;16.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;17.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;18.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">sim</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.servlet.DispatcherServlet&nbsp;&nbsp;<br />
&nbsp;&nbsp;21.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;22.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;23.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;24.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;25.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">sim</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;26.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">*.html</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;27.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp; <br />
</span></div>
<br />
以上的配置和以前是一样的，所以没什么好说的。
<br />
然后接着我们建立一个applicationContext.xml，作为<span class="hilite1">SPRING</span>的配置文件。以往版本里面<span class="hilite1">SPRING</span>的
这个配置文件往往随着程序的增加而越来越臃肿，就我本人来说就十分不喜欢这种方式。因为程序员需要花费大量的时间去管理和维护自己的XML文件，大大的减
少了程序员的生产效率。并且由于大量的XML文件，使得新加入团队的人员学习成本的增加，往往造成了很多工时上的浪费。终于，<span class="hilite2">2</span>.<span class="hilite3">5</span>版本开始支持了annotation，使得这个问题可以得到一定的解决。那么好，下面我们来看看现在的配置文件。
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;1.&nbsp;</span><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;2.&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:context</span><span style="color: #0000ff;">="http://www.springframework.org/schema/context"</span><span style="color: #ff0000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-2.5.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">context:annotation-config&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;10.&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp; <br />
</span></div>
<br />
很好，很强大，简单一句话搞定。
<br />
搞定了IOC的配置文件，那么我们需要一个MVC的配置XML，如果没有annotation，那么这个文件一样会越来越臃肿。然后现在呢？
<br />
sim-servlet.xml
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;1.&nbsp;</span><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;2.&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;">&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:p</span><span style="color: #0000ff;">="http://www.springframework.org/schema/p"</span><span style="color: #ff0000;">&nbsp;xmlns:context</span><span style="color: #0000ff;">="http://www.springframework.org/schema/context"</span><span style="color: #ff0000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context&nbsp;http://www.springframework.org/schema/context/spring-context-2.5.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;The&nbsp;controllers&nbsp;are&nbsp;autodetected&nbsp;POJOs&nbsp;labeled&nbsp;with&nbsp;the&nbsp;@Controller&nbsp;annotation.&nbsp;<br />
&nbsp;&nbsp;&nbsp;9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">context:component-scan&nbsp;</span><span style="color: #ff0000;">base-package</span><span style="color: #0000ff;">="com.sofmit.sim.wr.web"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;12.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;This&nbsp;bean&nbsp;configures&nbsp;the&nbsp;'prefix'&nbsp;and&nbsp;'suffix'&nbsp;properties&nbsp;of&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;InternalResourceViewResolver,&nbsp;which&nbsp;resolves&nbsp;logical&nbsp;view&nbsp;names&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;15.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;returned&nbsp;by&nbsp;Controllers.&nbsp;For&nbsp;example,&nbsp;a&nbsp;logical&nbsp;view&nbsp;name&nbsp;of&nbsp;"vets"&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;16.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;will&nbsp;be&nbsp;mapped&nbsp;to&nbsp;"/WEB-INF/jsp/vets.jsp".&nbsp;&nbsp;<br />
&nbsp;&nbsp;17.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;18.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #ff0000;">19.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="color: #ff0000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;20.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p:prefix</span><span style="color: #0000ff;">="/WEB-INF/jsp/"</span><span style="color: #ff0000;">&nbsp;p:suffix</span><span style="color: #0000ff;">=".jsp"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;21.&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp; <br />
</span></div>
<br />
同样十分简单，在这里只需要指定好CONTROLLER的包就可以了。
<br />
<br />
现在配置已经全部OK了，是不是感觉很轻松？哈哈，原来annotation真是如此美妙，为我们节约了大量的配置XML的时间。
<br />
下面就只需要一个controller和一个JSP页面就可以完成我们这儿APPLICATION了，那么我们继续。
<br />
首先就是controller的定义。
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;*&nbsp;com.sofmit.sim.wr.web&nbsp;<br />
&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;*&nbsp;Hello.java&nbsp;<br />
&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.sofmit.sim.wr.web;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.stereotype.Controller;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.ui.Model;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.bind.annotation.RequestMapping;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.bind.annotation.RequestMethod;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">&nbsp;<br />
&nbsp;&nbsp;13.&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;TianYe&nbsp;<br />
&nbsp;&nbsp;14.&nbsp;&nbsp;*&nbsp;2008-2-14&nbsp;<br />
&nbsp;&nbsp;15.&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">.&nbsp;@Controller&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">17</span><span style="color: #000000;">.&nbsp;@RequestMapping(</span><span style="color: #000000;">"</span><span style="color: #000000;">/hello.html</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">18</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Hello&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">19</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;RequestMethod.GET)&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">21</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;sayHello(Model&nbsp;model){&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">22</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.addAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">say</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">23</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">test</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">24</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">25</span><span style="color: #000000;">.&nbsp;}&nbsp; <br />
</span></div>
<br />
在这里面，使用@Controller定义此类是一个<span class="hilite1">Spring</span> MVC的controller。然后定义好访问的路径"/<span class="hilite6">hello</span>.html"。在方法上面定义好通过GET方式访问时调用我们的say<span class="hilite6">Hello</span>方法，在方法中定义好要传给JSP页面的变量"say"以及内容"<span class="hilite6">hello</span>"，然后定位到页面"test"。
<br />
一个简单的controller就实现了。
<br />
<br />
剩下的就没有什么技术含量了，就是一个简单的JSP页面。
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;1.&nbsp;</span><span style="background-color: #ffff00; color: #000000;">&lt;%</span><span style="background-color: #f5f5f5; color: #000000;">@&nbsp;taglib&nbsp;prefix</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">c</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;uri</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">http://java.sun.com/jsp/jstl/core</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #ffff00; color: #000000;">%&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;2.&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h2</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Test&nbsp;Page&nbsp;say:${say}</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h2</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp; <br />
</span></div>
<br />
<img src ="http://www.blogjava.net/lvq810/aggbug/230385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-09-22 11:39 <a href="http://www.blogjava.net/lvq810/articles/230385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中基于Session的在线用户统计分析</title><link>http://www.blogjava.net/lvq810/articles/229503.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Wed, 17 Sep 2008 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/229503.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/229503.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/229503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/229503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/229503.html</trackback:ping><description><![CDATA[JSP作为后起之秀能够在服务器编程环境中占据一定地位，是和它良好支持一系列业界标准密切相关的。Session就是它提供的基础设施之一。作为一个程
序员，你可以不介意具体在客户端是如何实现，就方便的实现简单的基于session的用户管理。现在对于处理在线用户，有几种不同的处理方法。<br />
<br />
一种是页面刷新由用户控制，服务器端控制一个超时时间比如30分钟，到了时间之后用户没有动作就被踢出。这种方法的优点是，如果用户忘了退出，可以防止
别人恶意操作。缺点是，如果你在做一件很耗时间的事情，超过了这个时间限制，submit的时候可能要再次面临登陆。如果原来的叶面又是强制失效的话，就
有可能丢失你做的工作。在实现的角度来看，这是最简单的，Server端默认实现的就是这样的模式。<br />
<br />
另一种方式是，站点采用框架结
构，有一个Frame或者隐藏的iframe在不断刷新，这样你永远不会被踢出，但是服务器端为了判断你是否在线，需要定一个发呆时间，如果超过这个发呆
时间你除了这个自动刷新的页面外没有刷新其他页面的话，就认为你已经不在线了。采取这种方式的典型是xici.net。
他的优点是可以可以利用不断的刷新实现一些类似server-push的功能，比如网友之间发送消息。<br />
<br />
不管哪一种模式，为了实现浏览当前所有的在线用户，还需要做一些额外的工作。servlet API中没有得到Session列表的API。<br />
<br />
可以利用的是Listener. Servlet
2.2和2.3规范在这里略微有一些不一样。2.2中HttpSessionBindingListener可以实现当一个HTTPSession中的
Attribute变化的时候通知你的类。而2.3中还引入了HttpSessionAttributeListener.鉴于我使用的环境是
Visual age for java 4和JRun server 3.1,他们还不直接支持Servlet
2.3的编程，这里我用的是HttpSessionBindingListener.<br />
<br />
需要做的事情包括做一个新的类来实现HttpSessionBindingListener接口。这个接口有两个方法：<br />
<br />
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
    <tbody>
        <tr>
            <td>public void valueBound(HttpSessionBindingEvent event)<br />
            public void valueUnbound(HttpSessionBindingEvent event)</td>
        </tr>
    </tbody>
</table>
<br />
当你执行Session.addAttribute(String,Object)的时候，如果你已经把一个实现了
HttpSessionBindingListener接口的类加入为Attribute,Session会通知你的类，调用你的valueBound方
法。相反，Session.removeAttribute方法对应的是valueUndound方法。<br />
<br />
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
    <tbody>
        <tr>
            <td>public class HttpSessionBinding implements javax.servlet.http.HttpSessionBindingListener <br />
            {<br />
            ServletContext application = null;<br />
            <br />
            public HttpSessionBinding(ServletContext application)<br />
            {<br />
            super();<br />
            if (application ==null)<br />
            throw new IllegalArgumentException("Null application is not accept.");<br />
            this.application = application;<br />
            }<br />
            <br />
            public void valueBound(javax.servlet.http.HttpSessionBindingEvent e) <br />
            { <br />
            Vector activeSessions = (Vector) application.getAttribute("activeSessions");<br />
            if (activeSessions == null)<br />
            {<br />
            activeSessions = new Vector();<br />
            }<br />
            <br />
            JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");<br />
            if (sessionUser != null)<br />
            {<br />
            activeSessions.add(e.getSession());<br />
            }<br />
            application.setAttribute("activeSessions",activeSessions);<br />
            }<br />
            <br />
            public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e) <br />
            {<br />
            JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");<br />
            if (sessionUser == null)<br />
            {<br />
            Vector activeSessions = (Vector) application.getAttribute("activeSessions");<br />
            if (activeSessions != null)<br />
            {<br />
            activeSessions.remove(e.getSession().getId());<br />
            application.setAttribute("activeSessions",activeSessions);<br />
            }<br />
            }<br />
            }<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
假设其中的JDBCUser类是一个任意User类。在执行用户登录时，把User类和HttpSessionBinding类都加入到Session中去。<br />
<br />
这样，每次用户登录后，在application中的attribute "activeSessions"这个vector中都会增加一条记录。每当session超时，valueUnbound被触发，在这个vector中删去将要被超时的session.<br />
<br />
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
    <tbody>
        <tr>
            <td>public void login()<br />
            throws ACLException,SQLException,IOException<br />
            {<br />
            /* get JDBC User Class */<br />
            if (user != null)<br />
            {<br />
            logout();<br />
            }<br />
            {<br />
            // if session time out, or user didn't login, save the target url temporary.<br />
            <br />
            JDBCUserFactory uf = new JDBCUserFactory();<br />
            <br />
            if ( (this.request.getParameter("userID")==null) || (this.request.getParameter("password")==null) )<br />
            {<br />
            throw new ACLException("Please input a valid userName and password.");<br />
            }<br />
            <br />
            JDBCUser user = (JDBCUser) uf.UserLogin(<br />
            this.request.getParameter("userID"),<br />
            this.request.getParameter("password") );<br />
            user.touchLoginTime();<br />
            this.session.setAttribute("user",user);<br />
            this.session.setAttribute("BindingNotify",new HttpSessionBinding(application));<br />
            }<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
Login的时候，把User和这个BindingNotofy目的的类都加入到session中去。logout的时候，就要主动在activeSessions这个vector中删去这个session.<br />
<br />
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
    <tbody>
        <tr>
            <td>public void logout()<br />
            throws SQLException,ACLException<br />
            {<br />
            if (this.user == null &amp;&amp; this.session.getAttribute("user")==null)<br />
            {<br />
            return;<br />
            }<br />
            <br />
            Vector activeSessions = (Vector) this.application.getAttribute("activeSessions");<br />
            if (activeSessions != null)<br />
            {<br />
            activeSessions.remove(this.session);<br />
            application.setAttribute("activeSessions",activeSessions);<br />
            }<br />
            <br />
            java.util.Enumeration e = this.session.getAttributeNames();<br />
            <br />
            while (e.hasMoreElements())<br />
            {<br />
            String s = (String)e.nextElement();<br />
            this.session.removeAttribute(s);<br />
            }<br />
            this.user.touchLogoutTime();<br />
            this.user = null;<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
这两个函数位于一个HttpSessionManager类中.这个类引用了jsp里面的application全局对象。这个类的其他代码和本文无关且相当长，我就不贴出来了。<br />
<br />
下面来看看jsp里面怎么用。<br />
<br />
假设一个登录用的表单被提交到doLogin.jsp, 表单中包含UserName和password域。节选部分片段：<br />
<br />
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
    <tbody>
        <tr>
            <td>＜%<br />
            HttpSessionManager hsm = new HttpSessionManager(application,request,response);<br />
            try<br />
            {<br />
            hsm.login();<br />
            }<br />
            catch ( UserNotFoundException e)<br />
            {<br />
            response.sendRedirect("InsufficientPrivilege.jsp?detail=User%20does%20not%20exist.");<br />
            return;<br />
            }<br />
            catch ( InvalidPasswordException e2)<br />
            { <br />
            response.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");<br />
            return;<br />
            }<br />
            catch ( Exception e3)<br />
            {<br />
            %＞ Error:＜%=e3.toString() %＞＜br＞<br />
            Press ＜a href="login.jsp"＞Here＜/a＞ to relogin.<br />
            ＜% return;<br />
            }<br />
            response.sendRedirect("index.jsp");<br />
            %＞</td>
        </tr>
    </tbody>
</table>
<br />
再来看看现在我们怎么得到一个当前在线的用户列表。<br />
<br />
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
    <tbody>
        <tr>
            <td>＜body bgcolor="#FFFFFF"＞<br />
            ＜table cellspacing="0" cellpadding="0" width="100%"＞<br />
            <br />
            ＜tr ＞<br />
            ＜td style="width:24px"＞SessionId<br />
            ＜/td＞<br />
            ＜td style="width:80px" ＞User<br />
            ＜/td＞<br />
            ＜td style="width:80px" ＞Login Time<br />
            ＜/td＞<br />
            ＜td style="width:80px" ＞Last access Time<br />
            ＜/td＞<br />
            ＜/tr＞<br />
            ＜%<br />
            Vector activeSessions = (Vector) application.getAttribute("activeSessions");<br />
            if (activeSessions == null)<br />
            {<br />
            activeSessions = new Vector();<br />
            application.setAttribute("activeSessions",activeSessions);<br />
            }<br />
            <br />
            Iterator it = activeSessions.iterator();<br />
            while (it.hasNext())<br />
            {<br />
            HttpSession sess = (HttpSession)it.next();<br />
            JDBCUser sessionUser = (JDBCUser)sess.getAttribute("user");<br />
            String userId = (sessionUser!=null)?sessionUser.getUserID():"None";<br />
            %＞<br />
            ＜tr＞<br />
            ＜td nowrap=''＞＜%= sess.getId() %＞＜/td＞<br />
            ＜td nowrap=''＞＜%= userId %＞＜/td＞<br />
            ＜td nowrap=''＞<br />
            ＜%= BeaconDate.getInstance( new java.util.Date(sess.getCreationTime())).getDateTimeString()%＞＜/td＞<br />
            ＜td class="＜%= stl %＞3" nowrap=''＞<br />
            ＜%= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%＞＜/td＞<br />
            ＜/tr＞<br />
            ＜%<br />
            }<br />
            %＞<br />
            ＜/table＞<br />
            ＜/body＞</td>
        </tr>
    </tbody>
</table>
<br />
以上的代码从application中取出activeSessions，并且显示出具体的时间。其中BeaconDate类假设为格式化时间的类。<br />
<br />
这样，我们得到了一个察看在线用户的列表的框架。至于在线用户列表分页等功能，与本文无关，不予讨论。<br />
<br />
这是一个非刷新模型的例子，依赖于session的超时机制。我的同事sonymusic指出很多时候由于各个厂商思想的不同，这有可能是不可信赖的。
考虑到这种需求，需要在每个叶面刷新的时候都判断当前用户距离上次使用的时间是否超过某一个预定时间值。这实质上就是自己实现session超时。如果需
要实现刷新模型，就必须使用这种每个叶面进行刷新判断的方法。
<br />
<img src ="http://www.blogjava.net/lvq810/aggbug/229503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-09-17 18:10 <a href="http://www.blogjava.net/lvq810/articles/229503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>110个知名Java项目集锦 </title><link>http://www.blogjava.net/lvq810/articles/227026.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Thu, 04 Sep 2008 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/227026.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/227026.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/227026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/227026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/227026.html</trackback:ping><description><![CDATA[<div class="postText">
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <th>项目名称</th>
            <th colspan="3" rowspan="111">&nbsp;</th>
            <th>项目描述<a href="http://andyluo.blogjava.net/"><font color="#ffffff"></font></a></th>
        </tr>
        <tr>
            <td><a title="Homepage for ASM" href="http://asm.objectweb.org/" target="_blank">ASM</a> </td>
            <td style="font-size: 75%;">Java bytecode manipulation framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for AspectWerkz" href="http://aspectwerkz.codehaus.org/" target="_blank">AspectWerkz</a> </td>
            <td style="font-size: 75%;">AspectWerkz - Dynamic AOP for Java</td>
        </tr>
        <tr>
            <td><a title="Homepage for Axis" href="http://ws.apache.org/axis/" target="_blank">Axis</a> </td>
            <td style="font-size: 75%;">Axis - an implementation of the SOAP (Simple Object
            Access Protocol) submission to W3C</td>
        </tr>
        <tr>
            <td><a title="Homepage for Batik" href="http://xml.apache.org/batik/" target="_blank">Batik</a> </td>
            <td style="font-size: 75%;">Batik SVG Toolkit - Toolkit using images in the
            Scalable Vector Graphics (SVG) format</td>
        </tr>
        <tr>
            <td><a title="Homepage for BCEL" href="http://jakarta.apache.org/bcel" target="_blank">BCEL</a> </td>
            <td style="font-size: 75%;">Byte Code Engineering Library - Analyze, create and
            manipulate Java class files</td>
        </tr>
        <tr>
            <td><a title="Homepage for BeanUtils" href="http://jakarta.apache.org/commons/beanutils/" target="_blank">BeanUtils</a>
            </td>
            <td style="font-size: 75%;">BeanUtils - Utilities for working with
            JavaBeans</td>
        </tr>
        <tr>
            <td><a title="Homepage for Catalina" href="http://jakarta.apache.org/tomcat/" target="_blank">Catalina</a> </td>
            <td style="font-size: 75%;">Catalina - Servlet and JSP based web server</td>
        </tr>
        <tr>
            <td><a title="Homepage for Cayenne" href="http://objectstyle.org/cayenne/" target="_blank">Cayenne</a> </td>
            <td style="font-size: 75%;">Professional Object Relational Mapping</td>
        </tr>
        <tr>
            <td><a title="Homepage for CGLIB" href="http://cglib.sourceforge.net/" target="_blank">CGLIB</a> </td>
            <td style="font-size: 75%;">CGLIB - Dynamic byte code generator<a href="http://andyluo.blogjava.net/"><font color="#ffffff">http://andyluo.blogjava.net</font></a></td>
        </tr>
        <tr>
            <td><a title="Homepage for Chain" href="http://jakarta.apache.org/commons/chain/" target="_blank">Chain</a> </td>
            <td style="font-size: 75%;">Chain - Implementation of the GoF "Chain of
            Responsibility" pattern</td>
        </tr>
        <tr>
            <td><a title="Homepage for Checkstyle" href="http://checkstyle.sourceforge.net/" target="_blank">Checkstyle</a> </td>
            <td style="font-size: 75%;">Checkstyle - Development tool to help writing Java
            code that adheres to a coding standard</td>
        </tr>
        <tr>
            <td><a title="Homepage for CLI" href="http://jakarta.apache.org/commons/cli/" target="_blank">CLI</a> </td>
            <td style="font-size: 75%;">Command Line Library - Simple API for working with
            the command line arguments and options</td>
        </tr>
        <tr>
            <td><a title="Homepage for Codec" href="http://jakarta.apache.org/commons/codec/" target="_blank">Codec</a> </td>
            <td style="font-size: 75%;">Commons Codec - Encoders and decoders like Base64,
            Hex, phonetic encodings and URLs</td>
        </tr>
        <tr>
            <td><a title="Homepage for Collections" href="http://jakarta.apache.org/commons/collections/" target="_blank">Collections</a> </td>
            <td style="font-size: 75%;">Collections - Filling the holes left in Sun's
            Collections API</td>
        </tr>
        <tr>
            <td><a title="Homepage for Configuration" href="http://jakarta.apache.org/commons/configuration/" target="_blank">Configuration</a> </td>
            <td style="font-size: 75%;">Commons Configuration - Generic API enabling
            configuration from a variety of sources</td>
        </tr>
        <tr>
            <td><a title="Homepage for DBCP" href="http://jakarta.apache.org/commons/dbcp/" target="_blank">DBCP</a> </td>
            <td style="font-size: 75%;">DBCP - Connection pooling implementations</td>
        </tr>
        <tr>
            <td><a title="Homepage for DBUtils" href="http://jakarta.apache.org/commons/dbutils/" target="_blank">DBUtils</a>
            </td>
            <td style="font-size: 75%;">DbUtils - Set of classes designed to make working
            with JDBC easier</td>
        </tr>
        <tr>
            <td><a title="Homepage for Digester" href="http://jakarta.apache.org/commons/digester/" target="_blank">Digester</a>
            </td>
            <td style="font-size: 75%;">Struts Digester - Configure an XML/Java mapping with
            actions when patterns are recognized</td>
        </tr>
        <tr>
            <td><a title="Homepage for Discovery" href="http://jakarta.apache.org/commons/discovery/" target="_blank">Discovery</a>
            </td>
            <td style="font-size: 75%;">Discovery - Discovering, or finding, implementations
            for pluggable interfaces</td>
        </tr>
        <tr>
            <td><a title="Homepage for DNSJava" href="http://www.xbill.org/dnsjava" target="_blank">DNSJava</a> </td>
            <td style="font-size: 75%;">DNS in Java - Supporting common record types,
            queries, zone transfers and dynamic updates</td>
        </tr>
        <tr>
            <td><a title="Homepage for doclet" href="http://java.sun.com/j2se/1.5.0/docs/guide/javadoc" target="_blank">doclet</a> </td>
            <td style="font-size: 75%;">JavaDoc Doclet - Custom output from the types methods
            and fields in a source tree.</td>
        </tr>
        <tr>
            <td><a title="Homepage for Dom4j" href="http://www.dom4j.org/" target="_blank">Dom4j</a> </td>
            <td style="font-size: 75%;">DOM4J - XML, XPath and XSLT library</td>
        </tr>
        <tr>
            <td><a title="Homepage for DTDParser" href="http://wutka.com/dtdparser.html" target="_blank">DTDParser</a> </td>
            <td style="font-size: 75%;">DTDParse DTD Library - You can use this library to
            parse a DTD</td>
        </tr>
        <tr>
            <td><a title="Homepage for EL" href="http://jakarta.apache.org/commons/el/" target="_blank">EL</a> </td>
            <td style="font-size: 75%;">EL - The JSP 2.0 Expression Language Interpreter from
            Apache</td>
        </tr>
        <tr>
            <td><a title="Homepage for fastutil" href="http://fastutil.dsi.unimi.it/" target="_blank">fastutil</a> </td>
            <td style="font-size: 75%;">FastUtil - Type-specific maps sets and lists with a
            small memory footprint and fast access</td>
        </tr>
        <tr>
            <td><a title="Homepage for FileUpload" href="http://jakarta.apache.org/commons/fileupload/" target="_blank">FileUpload</a> </td>
            <td style="font-size: 75%;">HTTP File Upload Library - Add robust, fast file
            upload capability to your web applications</td>
        </tr>
        <tr>
            <td><a title="Homepage for FreeMarker" href="http://freemarker.sourceforge.net/" target="_blank">FreeMarker</a> </td>
            <td style="font-size: 75%;">HTML Template Engine<a href="http://andyluo.blogjava.net/"><font color="#ffffff">http://andyluo.blogjava.net</font></a></td>
        </tr>
        <tr>
            <td><a title="Homepage for GJT" href="http://www.gjt.org/" target="_blank">GJT</a>
            </td>
            <td style="font-size: 75%;">Giant Java Tree - Java library consisting entirely of
            open source components</td>
        </tr>
        <tr>
            <td><a title="Homepage for gnu-regex" href="http://www.cacas.org/java/gnu/regexp" target="_blank">gnu-regex</a> </td>
            <td style="font-size: 75%;">GNU Regular Expressions - Implementation of a
            traditional (non-POSIX) NFA regex engine</td>
        </tr>
        <tr>
            <td><a title="Homepage for Groovy" href="http://groovy.codehaus.org/" target="_blank">Groovy</a> </td>
            <td style="font-size: 75%;">Groovy - Scripting Language</td>
        </tr>
        <tr>
            <td><a title="Homepage for Hibernate" href="http://www.hibernate.org/" target="_blank">Hibernate</a> </td>
            <td style="font-size: 75%;">Hibernate - Relational Persistence For Idiomatic
            Java</td>
        </tr>
        <tr>
            <td><a title="Homepage for HiveMind" href="http://jakarta.apache.org/hivemind/" target="_blank">HiveMind</a> </td>
            <td style="font-size: 75%;">HiveMind - A services and configuration
            microkernel</td>
        </tr>
        <tr>
            <td><a title="Homepage for HSQLDB" href="http://hsqldb.sourceforge.net/" target="_blank">HSQLDB</a> </td>
            <td style="font-size: 75%;">HSQLDB - The Java SQL relational database</td>
        </tr>
        <tr>
            <td><a title="Homepage for HTMLParser" href="http://htmlparser.sourceforge.net/" target="_blank">HTMLParser</a> </td>
            <td style="font-size: 75%;">HTML Parser - Java library used to parse
            HTML</td>
        </tr>
        <tr>
            <td><a title="Homepage for HTTPClient" href="http://jakarta.apache.org/commons/httpclient/" target="_blank">HTTPClient</a> </td>
            <td style="font-size: 75%;">HTTP Client - Fills holes left by the java.net
            package, including most recent HTTP standards</td>
        </tr>
        <tr>
            <td><a title="Homepage for Informa" href="http://informa.sourceforge.net/" target="_blank">Informa</a> </td>
            <td style="font-size: 75%;">Informa - News aggregation library</td>
        </tr>
        <tr>
            <td><a title="Homepage for IO" href="http://jakarta.apache.org/commons/io/" target="_blank">IO</a> </td>
            <td style="font-size: 75%;">Commons-IO - Utility classes, stream implementations,
            file filters and endian classes for IO</td>
        </tr>
        <tr>
            <td><a title="Homepage for iText" href="http://www.lowagie.com/iText/" target="_blank">iText</a> </td>
            <td style="font-size: 75%;">iText - Generates PDF o&#173;n the fly</td>
        </tr>
        <tr>
            <td><a title="Homepage for J2EE" href="http://java.sun.com/j2ee/1.4/docs" target="_blank">J2EE</a> </td>
            <td style="font-size: 75%;">Java 2 Platform, Enterprise Edition</td>
        </tr>
        <tr>
            <td><a title="Homepage for J2SE" href="http://java.sun.com/j2se/1.5.0/docs" target="_blank">J2SE</a> </td>
            <td style="font-size: 75%;">Java2 Standard Edition v5</td>
        </tr>
        <tr>
            <td><a title="Homepage for JAI" href="http://java.sun.com/products/java-media/jai" target="_blank">JAI</a> </td>
            <td style="font-size: 75%;">Java Advanced Imaging - Network-enabled, scalable,
            platform-independent image processing</td>
        </tr>
        <tr>
            <td><a title="Homepage for Jalopy" href="http://jalopy.sourceforge.net/" target="_blank">Jalopy</a> </td>
            <td style="font-size: 75%;">Jalopy Source Formatter - Formats Java source code
            according to widely configurable rules</td>
        </tr>
        <tr>
            <td><a title="Homepage for Jasper" href="http://jakarta.apache.org/tomcat/" target="_blank">Jasper</a> </td>
            <td style="font-size: 75%;">Jasper - Tomcat JSP engine<a href="http://andyluo.blogjava.net/"><font color="#ffffff">http://andyluo.blogjava.net</font></a></td>
        </tr>
        <tr>
            <td><a title="Homepage for JasperReports" href="http://jasperreports.sourceforge.net/" target="_blank">JasperReports</a>
            </td>
            <td style="font-size: 75%;">JasperReports - Free Java reporting library</td>
        </tr>
        <tr>
            <td><a title="Homepage for Java3d" href="http://java.sun.com/products/java-media/3D" target="_blank">Java3d</a> </td>
            <td style="font-size: 75%;">Java3D - Object-oriented interfaces that support a
            simple, high-level programming mode</td>
        </tr>
        <tr>
            <td><a title="Homepage for JavaComm" href="http://java.sun.com/products/javacomm/" target="_blank">JavaComm</a> </td>
            <td style="font-size: 75%;">Java Communications - API for technologies such as
            voice mail, fax and smartcards</td>
        </tr>
        <tr>
            <td><a title="Homepage for JavaGroups" href="http://www.javagroups.com/" target="_blank">JavaGroups</a> </td>
            <td style="font-size: 75%;">JavaGroups - Reliable multicast communication enable
            processes to send messages to each other</td>
        </tr>
        <tr>
            <td><a title="Homepage for Jaxen" href="http://jaxen.codehaus.org/" target="_blank">Jaxen</a> </td>
            <td style="font-size: 75%;">Jaxen XPath Processor - Object model walker; evaluate
            XPath expressions in dom4j and JDOM</td>
        </tr>
        <tr>
            <td><a title="Homepage for JAXME" href="http://ws.apache.org/jaxme/" target="_blank">JAXME</a> </td>
            <td style="font-size: 75%;">JaxMe 2 - Open source implementation of
            JAXB</td>
        </tr>
        <tr>
            <td><a title="Homepage for JClassLib" href="http://www.ej-technologies.com/products/jclasslib/overview.html" target="_blank">JClassLib</a> </td>
            <td style="font-size: 75%;">JClassLib - Library for reading, modifing and writing
            Java class files and bytecode</td>
        </tr>
        <tr>
            <td><a title="Homepage for JCommon" href="http://www.jfree.org/jcommon" target="_blank">JCommon</a> </td>
            <td style="font-size: 75%;">JCommon - Collection of useful classes used by
            JFreeChart, JFreeReport and other projects</td>
        </tr>
        <tr>
            <td><a title="Homepage for JCrontab" href="http://jcrontab.sourceforge.net/" target="_blank">JCrontab</a> </td>
            <td style="font-size: 75%;">JCronTab - Scheduler written in Java, provide a fully
            functional schedules for Java projects</td>
        </tr>
        <tr>
            <td><a title="Homepage for JDIC" href="https://jdic.dev.java.net/" target="_blank">JDIC</a> </td>
            <td style="font-size: 75%;">JDIC - JDesktop Integration Components</td>
        </tr>
        <tr>
            <td><a title="Homepage for JDNC" href="https://jdnc.dev.java.net/" target="_blank">JDNC</a> </td>
            <td style="font-size: 75%;">JDNC - JDesktop Network Components</td>
        </tr>
        <tr>
            <td><a title="Homepage for JDO" href="http://java.sun.com/products/jdo" target="_blank">JDO</a> </td>
            <td style="font-size: 75%;">Java Data Objects - Direct storage of Java domain
            model instances into a database</td>
        </tr>
        <tr>
            <td><a title="Homepage for JDOM" href="http://www.jdom.org/" target="_blank">JDOM</a> </td>
            <td style="font-size: 75%;">JDOM XML Library - For accessing, manipulating and
            outputting XML data from Java code.</td>
        </tr>
        <tr>
            <td><a title="Homepage for JetSpeed" href="http://portals.apache.org/jetspeed-1/" target="_blank">JetSpeed</a> </td>
            <td style="font-size: 75%;">JetSpeed - Java Portal Server</td>
        </tr>
        <tr>
            <td><a title="Homepage for JEXL" href="http://jakarta.apache.org/commons/jexl/" target="_blank">JEXL</a> </td>
            <td style="font-size: 75%;">Java Expression Language - is an embedable expression
            language engine</td>
        </tr>
        <tr>
            <td><a title="Homepage for JFreeChart" href="http://www.jfree.org/jfreechart" target="_blank">JFreeChart</a> </td>
            <td style="font-size: 75%;">JFreeChart - Free library for generating charts,
            including pie, bar, line and areas charts</td>
        </tr>
        <tr>
            <td><a title="Homepage for JGroups" href="http://www.jgroups.org/" target="_blank">JGroups</a> </td>
            <td style="font-size: 75%;">JGroups - Multicast communication toolkit</td>
        </tr>
        <tr>
            <td><a title="Homepage for JMeter" href="http://jakarta.apache.org/jmeter/" target="_blank">JMeter</a> </td>
            <td style="font-size: 75%;">JMeter - Load testing applcation</td>
        </tr>
        <tr>
            <td><a title="Homepage for JMF" href="http://java.sun.com/products/java-media/jmf/" target="_blank">JMF</a> </td>
            <td style="font-size: 75%;">Java Media Framework - Library for audio, video and
            other time-based media</td>
        </tr>
        <tr>
            <td><a title="Homepage for JMock" href="http://jmock.codehaus.org/" target="_blank">JMock</a> </td>
            <td style="font-size: 75%;">JMock - Testing library</td>
        </tr>
        <tr>
            <td><a title="Homepage for JSF" href="http://java.sun.com/j2ee/javaserverfaces" target="_blank">JSF</a> </td>
            <td style="font-size: 75%;">JavaServer Faces - Web Framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for JSword" href="http://www.crosswire.org/jsword" target="_blank">JSword</a> </td>
            <td style="font-size: 75%;">JSword - Bible software in Java, compatible with the
            Sword project for C/C++</td>
        </tr>
        <tr>
            <td><a title="Homepage for JTidy" href="http://jtidy.sourceforge.net/" target="_blank">JTidy</a> </td>
            <td style="font-size: 75%;">JTidy - HTML syntax checker</td>
        </tr>
        <tr>
            <td><a title="Homepage for JUnit" href="http://www.junit.org/" target="_blank">JUnit</a> </td>
            <td style="font-size: 75%;">JUnit - Regression testing framework used by the
            developer who implements unit tests in Java</td>
        </tr>
        <tr>
            <td><a title="Homepage for JXPath" href="http://jakarta.apache.org/commons/jxpath/" target="_blank">JXPath</a> </td>
            <td style="font-size: 75%;">JXPath Library - Simple interpreter of an expression
            language called XPath</td>
        </tr>
        <tr>
            <td><a title="Homepage for Lang" href="http://jakarta.apache.org/commons/lang/" target="_blank">Lang</a> </td>
            <td style="font-size: 75%;">Lang - Utilities including Enums, String
            manipulation, reflection, serialization and more</td>
        </tr>
        <tr>
            <td><a title="Homepage for Log4J" href="http://logging.apache.org/log4j/" target="_blank">Log4J</a> </td>
            <td style="font-size: 75%;">Log4J - Fast logging API that lets you configure
            logging at runtime</td>
        </tr>
        <tr>
            <td><a title="Homepage for Logging" href="http://jakarta.apache.org/commons/logging/" target="_blank">Logging</a>
            </td>
            <td style="font-size: 75%;">Commons Logging - Simple wrapper API around multiple
            logging APIs</td>
        </tr>
        <tr>
            <td><a title="Homepage for Lucene" href="http://jakarta.apache.org/lucene/" target="_blank">Lucene</a> </td>
            <td style="font-size: 75%;">Lucene - high-performance, full-featured text search
            engine written entirely in Java</td>
        </tr>
        <tr>
            <td><a title="Homepage for Math" href="http://jakarta.apache.org/commons/math/" target="_blank">Math</a> </td>
            <td style="font-size: 75%;">Math - Library of lightweight, self-contained
            mathematics and statistics components</td>
        </tr>
        <tr>
            <td><a title="Homepage for Net" href="http://jakarta.apache.org/commons/net/" target="_blank">Net</a> </td>
            <td style="font-size: 75%;">Network Library - Support for Finger, Whois, TFTP,
            Telnet, FTP, NNTP, etc developed by ORO</td>
        </tr>
        <tr>
            <td><a title="Homepage for OJB" href="http://db.apache.org/ojb/" target="_blank">OJB</a> </td>
            <td style="font-size: 75%;">OJB - O/R tool that allows transparent
            persistence</td>
        </tr>
        <tr>
            <td><a title="Homepage for OpenJMS" href="http://openjms.sourceforge.net/" target="_blank">OpenJMS</a> </td>
            <td style="font-size: 75%;">Open source JMS server</td>
        </tr>
        <tr>
            <td><a title="Homepage for ORO" href="http://jakarta.apache.org/oro/" target="_blank">ORO</a> </td>
            <td style="font-size: 75%;">ORO - Text processing library</td>
        </tr>
        <tr>
            <td><a title="Homepage for OSCache" href="http://www.opensymphony.com/oscache/" target="_blank">OSCache</a> </td>
            <td style="font-size: 75%;">OSCache - A high performance J2EE caching
            framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for PJA" href="http://www.eteks.com/pja/en/" target="_blank">PJA</a> </td>
            <td style="font-size: 75%;">Pure Java AWT - Toolkit for drawing graphics without
            any native graphics resources</td>
        </tr>
        <tr>
            <td><a title="Homepage for PMD" href="http://pmd.sourceforge.net/" target="_blank">PMD</a> </td>
            <td style="font-size: 75%;">PMD - Scans Java source code for potential
            problems</td>
        </tr>
        <tr>
            <td><a title="Homepage for POI" href="http://jakarta.apache.org/poi/" target="_blank">POI</a> </td>
            <td style="font-size: 75%;">POI - Java OLE 2 Manipulator</td>
        </tr>
        <tr>
            <td><a title="Homepage for Pool" href="http://jakarta.apache.org/commons/pool/" target="_blank">Pool</a> </td>
            <td style="font-size: 75%;">Commons Pooling - provides an generic, configurable
            Object-pooling API</td>
        </tr>
        <tr>
            <td><a title="Homepage for Primitives" href="http://jakarta.apache.org/commons/primitives/" target="_blank">Primitives</a> </td>
            <td style="font-size: 75%;">Primitives - Collection of types and utilities
            optimized for working with Java primitives</td>
        </tr>
        <tr>
            <td><a title="Homepage for Proxool" href="http://proxool.sourceforge.net/" target="_blank">Proxool</a> </td>
            <td style="font-size: 75%;">Java connection pool</td>
        </tr>
        <tr>
            <td><a title="Homepage for Quartz" href="http://www.opensymphony.com/quartz" target="_blank">Quartz</a> </td>
            <td style="font-size: 75%;">Quartz - J2EE open source job scheduler</td>
        </tr>
        <tr>
            <td><a title="Homepage for Regexp" href="http://jakarta.apache.org/regexp" target="_blank">Regexp</a> </td>
            <td style="font-size: 75%;">Jakarta Regular Expressions - Java RegEx library
            under BSD style license</td>
        </tr>
        <tr>
            <td><a title="Homepage for Rhino" href="http://www.mozilla.org/rhino" target="_blank">Rhino</a> </td>
            <td style="font-size: 75%;">Mozilla JavaScript - open-source implementation of
            JavaScript written entirely in Java</td>
        </tr>
        <tr>
            <td><a title="Homepage for Seraph" href="http://opensource.atlassian.com/seraph/" target="_blank">Seraph</a> </td>
            <td style="font-size: 75%;">Seraph - Atlassian Security Framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for SiteMesh" href="http://www.opensymphony.com/sitemesh" target="_blank">SiteMesh</a> </td>
            <td style="font-size: 75%;">A web-page layout and decoration framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for Slide" href="http://jakarta.apache.org/slide/" target="_blank">Slide</a> </td>
            <td style="font-size: 75%;">Slide - Content repository, can serve as a basis for
            CMS</td>
        </tr>
        <tr>
            <td><a title="Homepage for SOAP" href="http://ws.apache.org/soap/" target="_blank">SOAP</a> </td>
            <td style="font-size: 75%;">Apache Soap - implementation of the SOAP submission
            to W3C</td>
        </tr>
        <tr>
            <td><a title="Homepage for Speedo" href="http://speedo.objectweb.org/" target="_blank">Speedo</a> </td>
            <td style="font-size: 75%;">OSS JDO implementation<a href="http://andyluo.blogjava.net/"><font color="#ffffff">http://andyluo.blogjava.net</font></a></td>
        </tr>
        <tr>
            <td><a title="Homepage for Spring" href="http://www.springframework.org/" target="_blank">Spring</a> </td>
            <td style="font-size: 75%;">Server Side alternative to J2EE APIs</td>
        </tr>
        <tr>
            <td><a title="Homepage for Struts" href="http://struts.apache.org/" target="_blank">Struts</a> </td>
            <td style="font-size: 75%;">Jakarta Struts - open source framework for building
            web applications</td>
        </tr>
        <tr>
            <td><a title="Homepage for Tapestry" href="http://jakarta.apache.org/tapestry/" target="_blank">Tapestry</a> </td>
            <td style="font-size: 75%;">Tapestry - Web Framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for Turbine" href="http://jakarta.apache.org/turbine/" target="_blank">Turbine</a> </td>
            <td style="font-size: 75%;">Turbine - Servlet based framework allowing developers
            to quickly build secure web applications</td>
        </tr>
        <tr>
            <td><a title="Homepage for UDDI4J" href="http://uddi4j.sourceforge.net/" target="_blank">UDDI4J</a> </td>
            <td style="font-size: 75%;">UDDI4J - Library that provides an API to interact
            with a UDDI registry</td>
        </tr>
        <tr>
            <td><a title="Homepage for Validator" href="http://jakarta.apache.org/commons/validator/" target="_blank">Validator</a>
            </td>
            <td style="font-size: 75%;">Validtator - Validate data from user input</td>
        </tr>
        <tr>
            <td><a title="Homepage for Velocity" href="http://jakarta.apache.org/velocity/" target="_blank">Velocity</a> </td>
            <td style="font-size: 75%;">Velocity - Support for clean, quick MVC web
            development and support for the Struts framework</td>
        </tr>
        <tr>
            <td><a title="Homepage for Village" href="http://share.whichever.com/village" target="_blank">Village</a> </td>
            <td style="font-size: 75%;">Village - API that sits o&#173;n top of the JDBC to make
            it easier to interact with a JDBC</td>
        </tr>
        <tr>
            <td><a title="Homepage for WebWork 2" href="http://www.opensymphony.com/webwork/" target="_blank">WebWork 2</a> </td>
            <td style="font-size: 75%;">Next generation of WebWork</td>
        </tr>
        <tr>
            <td><a title="Homepage for Xalan" href="http://xml.apache.org/xalan-j/" target="_blank">Xalan</a> </td>
            <td style="font-size: 75%;">Xalan - XSLT processor for transforming XML documents
            into HTML, text, or XML</td>
        </tr>
        <tr>
            <td><a title="Homepage for XDoclet" href="http://xdoclet.sourceforge.net/" target="_blank">XDoclet</a> </td>
            <td style="font-size: 75%;">XDoclet - Code generation engine</td>
        </tr>
        <tr>
            <td><a title="Homepage for Xerces" href="http://xml.apache.org/xerces2-j" target="_blank">Xerces</a> </td>
            <td style="font-size: 75%;">Xerces2 - The next generation of high performance,
            XML parsers in the Apache Xerces family</td>
        </tr>
        <tr>
            <td><a title="Homepage for XMLBeans" href="http://xmlbeans.apache.org/" target="_blank">XMLBeans</a> </td>
            <td style="font-size: 75%;">XMLBeans - XML-Java binding tool<a href="http://andyluo.blogjava.net/"><font color="#ffffff">http://andyluo.blogjava.net</font></a></td>
        </tr>
        <tr>
            <td><a title="Homepage for XMLPull" href="http://www.xmlpull.org/" target="_blank">XMLPull</a> </td>
            <td style="font-size: 75%;">XMLPull - Defines a simple pull parsing API that does
            pull XML parsing from J2ME to J2EE</td>
        </tr>
        <tr>
            <td><a title="Homepage for XMLRPC" href="http://ws.apache.org/xmlrpc/" target="_blank">XMLRPC</a> </td>
            <td style="font-size: 75%;">XML-RPC - Implementation of XML-RPC, using XML over
            HTTP to implement remote procedure calls</td>
        </tr>
        <tr>
            <td><a title="Homepage for XNI" href="http://xml.apache.org/xerces2-j" target="_blank">XNI</a> </td>
            <td style="font-size: 75%;">Xerces Native Interface - Framework for streaming a
            document and constructing generic parsers</td>
        </tr>
        <tr>
            <td><a title="Homepage for XOM" href="http://www.cafeconleche.org/XOM/" target="_blank">XOM</a> </td>
            <td style="font-size: 75%;">XML Object Model - Tree-based API for processing XML
            that strives for correctness and simplicity.</td>
        </tr>
        <tr>
            <td><a title="Homepage for XStream" href="http://xstream.codehaus.org/" target="_blank">XStream</a> </td>
            <td style="font-size: 75%;">XML serialization</td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/lvq810/aggbug/227026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-09-04 17:37 <a href="http://www.blogjava.net/lvq810/articles/227026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中ThreadLocal的设计与使用</title><link>http://www.blogjava.net/lvq810/articles/213404.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Tue, 08 Jul 2008 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/213404.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/213404.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/213404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/213404.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/213404.html</trackback:ping><description><![CDATA[<div class="content-body">早在Java
1.2推出之时，Java平台中就引入了一个新的支持：java.lang.ThreadLocal，给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序，虽然ThreadLocal非常有用，但是似乎现在了解它、使用它的朋友还不多。
<br />
<br />
ThreadLocal是什么 <br />
<br />
ThreadLocal并非是一个线程的本地实现版本，它并不是一个Thread，而是thread
local
variable（线程局部变量）。也许把它命名为ThreadLocalVar更加合适。线程局部变量（ThreadLocal）其实的功用非常简单，就是为每一个使用该变量的线程都提供一个变量值的副本，是每一个线程都可以独立地改变自己的副本，而不会和其它线程的副本冲突。从线程的角度看，就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明，在其它的一些语言编译器实现（如IBM
XL
FORTRAN）中，它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持，而是提供了一个ThreadLocal的类来提供支持，所以，在Java中编写线程局部变量的代码相对比较笨拙，这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。
<br />
<br />
ThreadLocal的设计 <br />
<br />
首先看看ThreadLocal的接口： <br />
<br />
Object get() ;
<br />
<br />
// 返回当前线程的线程局部变量副本 protected Object initialValue(); //
返回该线程局部变量的当前线程的初始值 <br />
<br />
void set(Object value); <br />
<br />
// 设置当前线程的线程局部变量副本的值
<br />
<br />
ThreadLocal有3个方法，其中值得注意的是initialValue()，该方法是一个protected的方法，显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值，这个方法是一个延迟调用方法，在一个线程第1次调用get()或者set(Object)时才执行，并且仅执行1次。ThreadLocal中的确实实现直接返回一个null：
<br />
<br />
protected Object initialValue() { return null; }
<br />
<br />
ThreadLocal是如何做到为每一个线程维护变量的副本的呢？其实实现的思路很简单，在ThreadLocal类中有一个Map，用于存储每一个线程的变量的副本。比如下面的示例实现：
<br />
<br />
<br />
public class ThreadLocal<br />
<br />
{<br />
<br />
private Map values =
Collections.synchronizedMap(new HashMap());<br />
<br />
public Object
get()<br />
<br />
{<br />
<br />
Thread curThread = Thread.currentThread();<br />
<br />
Object o
= values.get(curThread);<br />
<br />
if (o == null &amp;&amp;
!values.containsKey(curThread))<br />
<br />
{<br />
<br />
o =
initialValue();<br />
<br />
values.put(curThread, o);<br />
<br />
}<br />
<br />
return
o;<br />
<br />
}<br />
<br />
<br />
public void set(Object
newValue)<br />
<br />
{<br />
<br />
values.put(Thread.currentThread(),
newValue);<br />
<br />
}<br />
<br />
<br />
public Object
initialValue()<br />
<br />
{<br />
<br />
return
null;<br />
<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
当然，这并不是一个工业强度的实现，但JDK中的ThreadLocal的实现总体思路也类似于此。
<br />
<br />
ThreadLocal的使用
<br />
<br />
如果希望线程局部变量初始化其它值，那么需要自己实现ThreadLocal的子类并重写该方法，通常使用一个内部匿名类对ThreadLocal进行子类化，比如下面的例子，SerialNum类为每一个类分配一个序号
<br />
<br />
<br />
public class SerialNum<br />
<br />
{<br />
<br />
// The next serial number to
be assigned<br />
<br />
<br />
private static int nextSerialNum = 0;<br />
<br />
private
static ThreadLocal serialNum = new ThreadLocal()<br />
<br />
{<br />
<br />
protected
synchronized Object initialValue()<br />
<br />
{<br />
<br />
return new
Integer(nextSerialNum++);<br />
<br />
}<br />
<br />
};<br />
<br />
<br />
public static int
get()<br />
<br />
{<br />
<br />
return ((Integer)
(serialNum.get())).intValue();<br />
<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
<br />
SerialNum类的使用将非常地简单，因为get()方法是static的，所以在需要获取当前线程的序号时，简单地调用：
<br />
<br />
int serial = SerialNum.get(); <br />
<br />
即可。
<br />
<br />
在线程是活动的并且ThreadLocal对象是可访问的时，该线程就持有一个到该线程局部变量副本的隐含引用，当该线程运行结束后，该线程拥有的所以线程局部变量的副本都将失效，并等待垃圾收集器收集。
<br />
<br />
ThreadLocal与其它同步机制的比较
<br />
<br />
ThreadLocal和其它同步机制相比有什么优势呢？ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突，在普通的同步机制中，是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的，使用这种同步机制需要很细致地分析在什么时候对变量进行读写，什么时候需要锁定某个对象，什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问，ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本，从而隔离了多个线程的数据，每一个线程都拥有自己的变量副本，从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象，在编写多线程代码时，可以把不安全的整个变量封装进ThreadLocal，或者把该对象的特定于线程的状态封装进ThreadLocal。
<br />
<br />
由于ThreadLocal中可以持有任何类型的对象，所以使用ThreadLocal
get当前线程的值是需要进行强制类型转换。但随着新的Java版本（1.5）将模版的引入，新的支持模版参数的ThreadLocal类将从中受益。也可以减少强制类型转换，并将一些错误检查提前到了编译期，将一定程度地简化ThreadLocal的使用。
<br />
<br />
总结
<br />
<br />
当然ThreadLocal并不能替代同步机制，两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问，是为了多个线程之间进行通信的有效方式；而ThreadLocal是隔离多个线程的数据共享，从根本上就不在多个线程之间共享资源（变量），这样当然不需要对多个线程进行同步了。所以，如果你需要进行多个线程之间进行通信，则使用同步机制；如果需要隔离多个线程之间的共享冲突，可以使用ThreadLocal，这将极大地简化你的程序，使程序更加易读、简洁。</div>
<img src ="http://www.blogjava.net/lvq810/aggbug/213404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-07-08 19:08 <a href="http://www.blogjava.net/lvq810/articles/213404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的(PO,VO,TO,BO,DAO,POJO)解释</title><link>http://www.blogjava.net/lvq810/articles/212410.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Thu, 03 Jul 2008 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/212410.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/212410.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/212410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/212410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/212410.html</trackback:ping><description><![CDATA[<p>PO(persistant&nbsp;object)&nbsp;持久对象 <br />
在o/r映射的时候出现的概念，如果没有o/r映射，没有这个概念存在了。通常对
应数据模型(数据库),本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录，
多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 <br />
<br />
VO(value&nbsp;object)&nbsp;值对象 <br />
通常用于业务层之间的数据传递，和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。&nbsp;</p>
<p>TO(Transfer&nbsp;Object)，数据传输对象<br />
在应用程序不同tie(关系)之间传输的对象&nbsp;<br />
<br />
BO(business&nbsp;object)&nbsp;业务对象 <br />
从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。&nbsp; <br />
<br />
POJO(plain&nbsp;ordinary&nbsp;java&nbsp;object)&nbsp;简单无规则java对象<br />
纯
的传统意义的java对象。就是说在一些Object/Relation&nbsp;Mapping工具中，能够做到维护数据库表记录的
persisent&nbsp;object完全是一个符合Java&nbsp;Bean规范的纯Java对象，没有增加别的属性和方法。我的理解就是最基本的
Java&nbsp;Bean，只有属性字段及setter和getter方法！。 <br />
<br />
DAO(data&nbsp;access&nbsp;object)&nbsp;数据访问对象 <br />
是
一个sun的一个标准j2ee设计模式，这个模式中有个接口就是DAO，它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使
用，DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合VO,
提供数据库的CRUD操作...&nbsp; <br />
<br />
O/R&nbsp;Mapper&nbsp;对象/关系&nbsp;映射&nbsp;&nbsp; <br />
定义好所有的mapping之后，这个O/R&nbsp;Mapper可以帮我们做很多的工作。通过这些mappings,这个O/R&nbsp;Mapper可以生成所有的关于对象保存，删除，读取的SQL语句，我们不再需要写那么多行的DAL代码了。&nbsp; <br />
<br />
实体Model(实体模式) <br />
DAL(数据访问层) <br />
IDAL(接口层) <br />
DALFactory(类工厂) <br />
BLL(业务逻辑层)&nbsp; <br />
BOF&nbsp;&nbsp;&nbsp;&nbsp;Business&nbsp;Object&nbsp;Framework&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业务对象框架 <br />
SOA&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;Orient&nbsp;Architecture&nbsp;&nbsp;&nbsp;&nbsp;面向服务的设计 <br />
EMF&nbsp;&nbsp;&nbsp;&nbsp;Eclipse&nbsp;Model&nbsp;Framework&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eclipse建模框架</p>
<img src ="http://www.blogjava.net/lvq810/aggbug/212410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-07-03 19:31 <a href="http://www.blogjava.net/lvq810/articles/212410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp 列出服务器环境变量 </title><link>http://www.blogjava.net/lvq810/articles/209099.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Thu, 19 Jun 2008 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/209099.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/209099.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/209099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/209099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/209099.html</trackback:ping><description><![CDATA[<p>
<table style="border-collapse: collapse;" align="center" border="1" bordercolor="#99ccff" cellpadding="2" cellspacing="0" width="90%">
    <tbody>
        <tr>
            <td align="center" bgcolor="#99ccff" width="50%"><font color="#ffffff">服务器环境变量</font></td>
            <td align="center" bgcolor="#99ccff" height="16"><font color="#ffffff">功能简述</font></td>
        </tr>
        <tr>
            <td width="50%">localhost　</td>
            <td height="4">服务器的域名</td>
        </tr>
        <tr>
            <td width="50%">192.168.0.5　</td>
            <td height="4">服务器的IP地址</td>
        </tr>
        <tr>
            <td width="50%">Windows XP　</td>
            <td height="4">服务器操作系统</td>
        </tr>
        <tr>
            <td width="50%">1.6.0　</td>
            <td height="4">服务器 Java 虚拟机版本</td>
        </tr>
        <tr>
            <td width="50%">2.5　</td>
            <td height="4">服务器支持的 Servlet API 版本</td>
        </tr>
        <tr>
            <td width="50%">2.1　</td>
            <td height="4">服务器支持的 JSP API 版本</td>
        </tr>
        <tr>
            <td width="50%">Apache Tomcat/6.0.16　</td>
            <td height="4">服务器软件的名称及版本(建议 Tomcat 6.0)</td>
        </tr>
        <tr>
            <td width="50%">8080　</td>
            <td height="5">服务器正在运行的端口</td>
        </tr>
        <tr>
            <td width="50%">pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386
            i86</td>
            <td height="5">服务器 CPU 类型</td>
        </tr>
        <tr>
            <td width="50%">D:"Java"Tomcat6.0.16"webapps"ROOT"env.jsp　</td>
            <td height="4">请求的物理路径</td>
        </tr>
        <tr>
            <td width="50%">null　</td>
            <td height="4">在域名根目录外的到被请求页面的路径</td>
        </tr>
        <tr>
            <td width="50%">GET　</td>
            <td height="4">发出request的方式</td>
        </tr>
        <tr>
            <td width="50%">null　</td>
            <td height="4">通过使用GET方法提交的任何数据</td>
        </tr>
        <tr>
            <td width="50%">/env.jsp　</td>
            <td height="4">程序被调用的路径</td>
        </tr>
        <tr>
            <td width="50%">127.0.0.1　</td>
            <td height="4">发出request请求的远端机器的名称</td>
        </tr>
        <tr>
            <td width="50%">127.0.0.1　</td>
            <td height="5">发出request请求的远端机器的IP名称</td>
        </tr>
        <tr>
            <td width="50%">Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR
            2.0.50727; .NET CLR 1.1.4322)　</td>
            <td height="4">客户请求的浏览器类型</td>
        </tr>
    </tbody>
</table>
</p>
<p>页面源代码：</p>
<p>env.jsp</p>
<blockquote>
<p>&lt;%--<br />
env.jsp<br />
检测服务器信息<br />
@version: 1.00<br />
Note:<br />
TODO:<br />
Date:
2005-10-10<br />
@author: BeanSoft<br />
--%&gt;<br />
&lt;%@ page language="java"
contentType="text/html; charset=GBK"<br />
pageEncoding="GBK"%&gt; </p>
<p>&lt;html&gt;<br />
&lt;style&gt;<br />
a:hover{color:orange}<br />
&lt;/style&gt;<br />
&lt;title&gt;服务器环境变量&lt;/title&gt;<br />
&lt;body&gt;
</p>
<p>&lt;p&gt;&amp;nbsp;<br />
&lt;table width=90% border="1" align="center"
cellpadding="2" cellspacing="0" bordercolor="#99CCFF" style="border-collapse:
collapse"&gt;<br />
&lt;tr&gt;<br />
&lt;td width="50%" align="center"
bgcolor="#99CCFF"&gt;&lt;font
color="#FFFFFF"&gt;服务器环境变量&lt;/font&gt;&lt;/td&gt;<br />
&lt;td height="16"
align="center" bgcolor="#99CCFF"&gt;&lt;font
color="#FFFFFF"&gt;功能简述&lt;/font&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%= request.getServerName()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;服务器的域名&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%= java.net.InetAddress.getLocalHost().getHostAddress()
%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;服务器的IP地址&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=System.getProperty("os.name")%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;服务器操作系统&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=System.getProperty("java.version")%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;服务器 Java 虚拟机版本&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=application.getMajorVersion() + "." +
application.getMinorVersion()%&gt;　&lt;/td&gt;<br />
&lt;td height="4"&gt;服务器支持的
Servlet API 版本&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;服务器支持的 JSP API
版本&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=application.getServerInfo()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;服务器软件的名称及版本(建议<br />
Tomcat
6.0)&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getServerPort()%&gt;　&lt;/td&gt;<br />
&lt;td
height="5"&gt;服务器正在运行的端口&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=System.getProperty("sun.cpu.isalist")%&gt;&lt;/td&gt;<br />
&lt;td
height="5"&gt;服务器 CPU 类型&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getRealPath(request.getServletPath())%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;请求的物理路径&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getPathInfo()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;在域名根目录外的到被请求页面的路径&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getMethod()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;发出request的方式&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getQueryString()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;通过使用GET方法提交的任何数据&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getServletPath()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;程序被调用的路径&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getRemoteHost()%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;发出request请求的远端机器的名称&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getRemoteAddr()%&gt;　&lt;/td&gt;<br />
&lt;td
height="5"&gt;发出request请求的远端机器的IP名称&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td
width="50%"&gt;&lt;%=request.getHeader("User-Agent")%&gt;　&lt;/td&gt;<br />
&lt;td
height="4"&gt;客户请求的浏览器类型&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
</blockquote>
<img src ="http://www.blogjava.net/lvq810/aggbug/209099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-06-19 10:39 <a href="http://www.blogjava.net/lvq810/articles/209099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp内部对象</title><link>http://www.blogjava.net/lvq810/articles/209094.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Thu, 19 Jun 2008 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/209094.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/209094.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/209094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/209094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/209094.html</trackback:ping><description><![CDATA[<span id="ShowBody" style="font-size: 12px; line-height: 15px;">1．1&nbsp;&nbsp;out(向客户端输出各种数据类型)<br />
重要方法：<br />
-- out.print(类型)&nbsp;&nbsp;或&nbsp;&nbsp;out.println(类型)：换行输出<br />
-- out.newLine()：输出一个换行符号<br />
-- out.flush()：输出缓冲区的数据<br />
-- out.close()：关闭输出流<br />
-- out.clearBuffer()：清除缓冲区里的数据，并把数据写到客户端<br />
-- out.clear()：清除缓冲区里的数据，但不把数据写到客户端<br />
-- out.getBufferSize()：获得缓冲区的大小，缓冲区的大小可用&lt;%@page&nbsp;&nbsp;buffer=&#8221;size&#8221;%&gt;设置<br />
-- out.getRemaining()：获得缓冲区没有使用的空间的大小<br />
-- out.isAutoFlush()：返回布尔值，若auto&nbsp;&nbsp;flush则返回true，否则返回false。是否auto&nbsp;&nbsp;fush我们可用%@page&nbsp;&nbsp;is&nbsp;&nbsp;AutoFlush=&#8221;true/false&#8221;%来设置<br />
注意：中文显示问题<br />
-- 若是直接赋值的中文字符串，用&lt;%@&nbsp;&nbsp;page&nbsp;&nbsp;contentType=&#8221;text/html;charset=gb2312&#8221;%&gt;就可正常显示。但不能用getStr(String&nbsp;&nbsp;name)函数或类似的函数转换内码，否则不能正常显示中文。<br />
-- 若是request传过来的中文字符串，必须要用getStr(String&nbsp;&nbsp;name)函数或类似的函数转换内码，否则不能正常显示中文。<br />
如：String&nbsp;&nbsp;aa=str;<br />
byte[]&nbsp;&nbsp;aa=aa.getBytes(&#8220;ISO8859-1&#8221;);<br />
String&nbsp;&nbsp;bb=new&nbsp;&nbsp;String(aa);<br />
-- 在不同平台、不同的服务器jsp中文问题的解决方法各不相同，可自行试验。<br />
1．2&nbsp;&nbsp;request（接受客户端输入的信息）<br />
作用：主要用于接受客户端通过http协议连接传输到服务器端的数据。<br />
方法：<br />
-- getCookies()：返回客户端的cookie对象，结果是一个cookie数组<br />
-- getHeader(String&nbsp;&nbsp;name)：获得http协议定义的传送文件头信息，<br />
如：request.getHeader(&#8220;User-agent&#8221;)返回客户端浏览器的版本号、类型<br />
-- getAttribute(String&nbsp;&nbsp;name)：返回name指定的属性值，若不存在指定的属性，就返回空值(null)。<br />
-- getattributeNames()：返回request对象所有属性的名字，结果集是一个Enumeration（枚举）类的实例<br />
-- getHeaderNames()：返回所有request&nbsp;&nbsp;header的名字，结果集是一个Enumeration（枚举）类的实例<br />
-- getHeaders(String&nbsp;&nbsp;name)：返回指定名字的request&nbsp;&nbsp;header的所有值，结果集是一个Enumeration（枚举）类的实例<br />
-- getMethod()：获得客户端向服务器端传送数据的方法有GET、POST、PUT等类型<br />
-- getParameter(String&nbsp;&nbsp;name)：获得客户端传送给服务器端的参数值，该参数由name指定<br />
-- get&nbsp;&nbsp;parameterNames()：获得客户端传送给服务器端的所有的参数名，结果集是一个Enumeration（枚举）类的实例<br />
-- getParameterValues(String&nbsp;&nbsp;name)：获得指定参数所有值<br />
-- getQueryString()获得查询字符串，该串由客户端以GET方法向服务器端传送<br />
-- getRequestURI()：获得发出请求字符串的客户端地址<br />
-- getServletPath()：获得客户端所请求的脚本文件的文件路径<br />
-- setAttribute(String&nbsp;&nbsp;name,Java.lang.Object&nbsp;&nbsp;o)：设定名字为name的request参数值，该值由Object类型的o指定<br />
-- getServerName()：获得服务器的名字<br />
-- getServerPort()：获得服务器的端口号<br />
-- getRemoteAddr()：获得客户端的IP地址<br />
-- getRemoteHost()：获得客户端电脑的名字，若失败，则返回客户端电脑的IP地址<br />
-- getProtocol()：获取客户端向服务器端传送数据所依据的协议名称，如http/1.1<br />
1．3&nbsp;&nbsp;application（保存用户信息）<br />
作用：一旦创建，除非服务器关闭，否则将一直保持下去<br />
application.setAttribute(&#8220;name&#8221;,val)<br />
request.setAttribute(&#8220;name&#8221;,val)<br />
方法：<br />
-- getAttribute(String&nbsp;&nbsp;name)：返回由name指定名字的application对象属性的值，这是个Object对象<br />
-- getattributeNames()：返回所有application对象属性的名字，结果集是一个Enumeration（枚举）类的实例<br />
-- getInitParameter(String&nbsp;&nbsp;name)：&nbsp;&nbsp;返回application栽个属性的初始值，此属性由name指定<br />
-- getServerInfo()：获得当前版本Servlet编译器的信息<br />
-- setAttribute(String&nbsp;&nbsp;name,Object&nbsp;&nbsp;object)：用object来初始化某个属性，该属性由name指定<br />
例：简单计数器（E:"app"java"tomcat322"webapps"myjsp"&nbsp;&nbsp;count.jsp）<br />
1．4&nbsp;&nbsp;response(控制http连接)<br />
作用：向客户端发送数据，如Cookie、HTTP文件关信息等。<br />
方法：<br />
-- addCookie(Cookie&nbsp;&nbsp;cookie)：添加1个Cookie对象，用来保存客户端的用户信息。用request的getcookies()方法可获得这个Cookie<br />
如：&lt;%&nbsp;&nbsp;Cookie&nbsp;&nbsp;mycookie=new&nbsp;&nbsp;Cookie(&#8220;uname&#8221;,&#8221;wsr&#8221;);<br />
response.addCookie(mycookie);<br />
Cookie&nbsp;&nbsp;delmycookie=new&nbsp;&nbsp;cookie(&#8220;mycookie&#8221;,null);<br />
delmycookie&nbsp;&nbsp;.setMaxAge(0);<br />
delmycookie&nbsp;&nbsp;.setPath(/&#8221;);<br />
response.addCookie(delmycookie);<br />
%&gt;<br />
-- addHeader(String&nbsp;&nbsp;name,String&nbsp;&nbsp;value)：添加HTTP文件头，该header将会传到客户端，若同名的header存在，原来的header会被覆盖<br />
-- containsHeader(String&nbsp;&nbsp;name)：判断指定名字的HTTP文件头是否存在并返回布尔值<br />
-- sendError(int&nbsp;&nbsp;sc)：向客户端发送错误信息，如：505：服务器内部错误；404：网页找不到错误<br />
如：response.sendError(response.SC_NO_CONTENT)；<br />
-- setHeader(String&nbsp;&nbsp;name,String&nbsp;&nbsp;value)：设定指定名字的HTTP文件头的值，若该值存在，它将会被新值覆盖<br />
如1：让网页每隔5秒刷新一次<br />
&lt;%&nbsp;&nbsp;response.setHeader(&#8220;Refresh&#8221;,&#8221;5&#8221;);%&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;current&nbsp;&nbsp;dateis:&lt;%=new&nbsp;&nbsp;Date()%&gt;<br />
如2：利用response对象设定HTTP头<br />
&lt;%&nbsp;&nbsp;response.setContentType(&#8220;Application/pdf&#8221;);<br />
response.setHeader(&#8220;content-disposition&#8221;,&#8221;attachment;filename="&#8221;syntax.pdf"&#8221;&#8221;);<br />
%&gt;<br />
-- sendRedirect(&#8220;<a href="http://www.foo.com/path/error.html%E2%80%9D" target="_blank">http://www.foo.com/path/error.html&#8221;</a>)：重定向功能<br />
1．5&nbsp;&nbsp;exception(处理异常和错误)&nbsp;&nbsp;<br />
作用：处理JSP文件在执行时所有发生的错误和异常。有3个内建方法。<br />
注意：必须在&lt;%@&nbsp;&nbsp;page&nbsp;&nbsp;isErrorPage=&#8221;true&#8221;%&gt;的情况下才可以使用Exception对象<br />
-- getMessage()：返回错误信息<br />
-- printStackTrace()：以标准错误的形式输出一个错误和错误的堆栈<br />
-- toString()：以字符串的形式返回1个对异常的描述<br />
1．6&nbsp;&nbsp;session（保存用户信息）<br />
作用：分别保存每一个用户的信息<br />
session.putValue(&#8220;name&#8221;,val)<br />
session.getValue(&#8220;name&#8221;)<br />
注意<img onmousewheel="return bbimg(this)" alt="" src="http://bbs.ccidnet.com/images/smilies/se.gif" onload="javascript:if(this.width />screen.width-500)this.style.width=screen.width-500;">ssion中保存和检索的信息不能是基本数据类型，而必须是JAVA的相应的Object对象。<br />
方法：<br />
-- getAttribute(String&nbsp;&nbsp;name)：获得指定名字的属性，若该属性不存在，将返回null<br />
-- getattributeNames()：返回session对象中存储的第一个属性对象，结果集是一个Enumeration类的实例<br />
-- getCreationTime()：返回该session对象创建的时间，以毫秒计，从1970年1月1日起<br />
-- getId()：每生成一个session对象，服务器都会给其一个不会重复的编号，此方法返回当前session的编号<br />
-- getLastAccessedTime()：返回当前session对象最后1次被操作的时间，返回自1970年1月1日起至今的毫秒数<br />
-- getMaxInactiveInterval()：获得session对象的生存时间<br />
-- removeAttribute(String&nbsp;&nbsp;name)：删除指定的属性（包括属性名、属性值）<br />
-- setAttribute(String&nbsp;&nbsp;name,Java.lang.Object&nbsp;&nbsp;value)：设定指定名字的属性值，并将其存储在session对象中</span>
<img src ="http://www.blogjava.net/lvq810/aggbug/209094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-06-19 10:32 <a href="http://www.blogjava.net/lvq810/articles/209094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>比较java.io.Externalizable和java.io.Serializable[转] </title><link>http://www.blogjava.net/lvq810/articles/208865.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Wed, 18 Jun 2008 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/208865.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/208865.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/208865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/208865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/208865.html</trackback:ping><description><![CDATA[<p align="left">即使你没有用过对象序列化（serialization），你可能也知道它。但你是否知道 Java 还支持另外一种形式的对象持久化，外部化（externalization）？</p>
<p align="left">下面是序列化和外部化在代码级的关联方式：</p>
<p align="left">public interface Serializable
{} </p>
<p align="left">public interface Externalizable
extends Serializable {<br />
&nbsp;&nbsp;void readExternal(ObjectInput
in);<br />
&nbsp;&nbsp;void writeExternal(ObjectOutput
out);<br />
} </p>
<p align="left"><strong>序列化和外部化的主要区别</strong></p>
<p align="left">外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。</p>
<p align="left">通过Serializable接口对对象序列化的支持是内建于核心 API
的，但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java
已经具有了对序列化的内建支持，也就是说只要制作自己的类java.io.Serializable，Java
就会试图存储和重组你的对象。如果使用外部化，你就可以选择完全由自己完成读取和写出的工作，Java 对外部化所提供的唯一支持是接口：</p>
<p align="left">voidreadExternal(ObjectInput in)<br />
void writeExternal(ObjectOutput
out) </p>
<p align="left">现在如何实现readExternal() 和writeExternal() 就完全看你自己了。</p>
<p align="left">序列化会自动存储必要的信息，用以反序列化被存储的实例，而外部化则只保存被存储的类的标识。当你通过
java.io.Serializable接口序列化一个对象时，有关类的信息，比如它的属性和这些属性的类型，都与实例数据一起被存储起来。在选择走
Externalizable这条路时，Java 只存储有关每个被存储类型的非常少的信息。</p>
<p align="left"><strong>每个接口的优点和缺点</strong></p>
<p align="left"><strong>Serializable</strong><strong>接口</strong></p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>优点：</strong>内建支持</p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>优点：</strong>易于实现</p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>缺点：</strong>占用空间过大</p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>缺点：</strong>由于额外的开销导致速度变比较慢</p>
<p align="left"><strong>Externalizable</strong><strong>接口</strong></p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>优点：</strong>开销较少（程序员决定存储什么）</p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>优点：</strong>可能的速度提升</p>
<p align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong>缺点：</strong>虚拟机不提供任何帮助，也就是说所有的工作都落到了开发人员的肩上。</p>
<p align="left">在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案，但是它可能会导致出现不可接受的性能问题或空间问题；在出现这些问题的情况下，Externalizable可能是一条可行之路。</p>
<p align="left">要记住一点，如果一个类是可外部化的（Externalizable），那么Externalizable方法将被用于序列化类的实例，即使这个类型提供了Serializable方法：</p>
<p align="left">private void writeObject()<br />
private void readObject()</p>
<p align="left">本文作者：David Petersheim是Genscape公司的应用程序开发部主任。他设计和开发用于获取和处理实时能源数据的服务器端应用程序。</p>
<p align="left"></p>
<br />
<img src ="http://www.blogjava.net/lvq810/aggbug/208865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-06-18 14:38 <a href="http://www.blogjava.net/lvq810/articles/208865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入研究java.lang.Process类[转]</title><link>http://www.blogjava.net/lvq810/articles/205919.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Wed, 04 Jun 2008 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/lvq810/articles/205919.html</guid><wfw:comment>http://www.blogjava.net/lvq810/comments/205919.html</wfw:comment><comments>http://www.blogjava.net/lvq810/articles/205919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lvq810/comments/commentRss/205919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lvq810/services/trackbacks/205919.html</trackback:ping><description><![CDATA[<p><font color="#008000"><font size="3"><strong><font color="#ff0000">前言：</font></strong>Java
的类库日益庞大，所包含的类和接口也不计其数。但其中有一些非常重要的类和接口，是Java类库中的核心部分。常见的有String、Object、
Class、Collection、ClassLoader、Runtime、Process...，熟悉这些类是学好Java的基础。而这些类一般不容
易理解，需要做深入的研究和实践才能掌握。下面是我对这些类理解和使用的一些总结。欢迎你在阅读后将你宝贵的意见和读后感留下！ </font></font>
</p>
<p>&nbsp;
</p>
<p><font color="#0000ff" size="3"><strong><font color="#ff0000">一、概述</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process类是一个抽象类（所有的方法均是抽象的），封装了一个进程（即一个执行程序）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁（杀掉）进程的方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程，并返回 Process 子类的一个实例，该实例可用来控制进程并获取相关信息。 </font>
</p>
<p><font color="#0000ff" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作，比如，本机窗口进程，守护进程，Microsoft Windows 上的
Win16/DOS 进程，或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io（即
stdin，stdout，stderr）操作都将通过三个流
(getOutputStream()，getInputStream()，getErrorStream())
重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小，如果读写子
进程的输出流或输入流迅速出现失败，则可能导致子进程阻塞，甚至产生死锁。 </font>
</p>
<p><font color="#0000ff" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当没有 Process 对象的更多引用时，不是删掉子进程，而是继续异步执行子进程。 </font>
</p>
<p>&nbsp;
</p>
<p><font color="#ff0000" size="3"><strong>二、API预览</strong></font><br />
&nbsp;destroy() <br />
&nbsp;&nbsp; 杀掉子进程。 <br />
&nbsp;exitValue() <br />
&nbsp;&nbsp; 返回子进程的出口值。 <br />
&nbsp;InputStream getErrorStream() <br />
&nbsp;&nbsp; 获得子进程的错误流。 <br />
&nbsp;InputStream getInputStream() <br />
&nbsp;&nbsp; 获得子进程的输入流。 <br />
&nbsp;OutputStream getOutputStream() <br />
&nbsp;&nbsp; 获得子进程的输出流。 <br />
&nbsp;waitFor() <br />
&nbsp;&nbsp; 导致当前线程等待，如果必要，一直要等到由该 Process 对象表示的进程已经终止。
</p>
<p>&nbsp;
</p>
<p><font color="#ff0000" size="3"><strong>三、如何创建Process对象，一般有一下两种方法：</strong></font>
</p>
<p><strong></strong>&nbsp;
</p>
<p>1、每个 ProcessBuilder 实例管理一个进程属性集。start() 方法利用这些属性创建一个新的 Process
实例。start()
方法可以从同一实例重复调用，以利用相同的或相关的属性创建新的子进程。（ProcessBuilder这个是JDK5中新添加的final类，详细请参
看&#8220;深入研究java.lang.ProcessBuilder类&#8221;一文。
</p>
<p>&nbsp;
</p>
<p>2、Runtime.exec() 方法创建一个本机进程，并返回 Process 子类的一个实例。详细请参看&#8220;深入研究java.lang.Runtime类&#8221;一文。
</p>
<p>&nbsp;
</p>
<p><font color="#ff0000" size="3"><strong>四、官方API文档。</strong></font>
</p>
<p>&nbsp;
</p>
<h2><font size="-1">java.lang</font> <br />
类 Process</h2>
<pre><a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html"  中的类="">java.lang.Object</a><br />
<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="继承者" src="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/resources/inherit.gif"  ?="" /><strong>java.lang.Process</strong>
</pre>
<hr />
<dl><dt>
<pre>public abstract class <strong>Process</strong><dt>extends <a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html"  中的类="">Object</a></dt></pre>
</dt></dl>
<p><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/ProcessBuilder.html#start%28%29"><code><font face="新宋体">ProcessBuilder.start()</font></code></a> 和 <a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Runtime.html#exec%28java.lang.String%5B%5D,"  java.io.file)?="" java.lang.string[],=""><code><font face="新宋体">Runtime.exec</font></code></a> 方法创建一个本机进程，并返回 <code><font face="新宋体">Process</font></code> 子类的一个实例，该实例可用来控制进程并获取相关信息。<code><font face="新宋体">Process</font></code> 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁（杀掉）进程的方法。
</p>
<p>创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作，比如，本机窗口进程，守护进程，Microsoft Windows
上的 Win16/DOS 进程，或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io（即
stdin，stdout，stderr）操作都将通过三个流 (<a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#getOutputStream%28%29"><code><font face="新宋体">getOutputStream()</font></code></a>，<a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#getInputStream%28%29"><code><font face="新宋体">getInputStream()</font></code></a>，<a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#getErrorStream%28%29"><code><font face="新宋体">getErrorStream()</font></code></a>) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小，如果读写子进程的输出流或输入流迅速出现失败，则可能导致子进程阻塞，甚至产生死锁。
</p>
<p>当没有 <code><font face="新宋体">Process</font></code> 对象的更多引用时，不是删掉子进程，而是继续异步执行子进程。
</p>
<p>对于带有 <code><font face="新宋体">Process</font></code> 对象的 Java 进程，没有必要异步或并发执行由 <code><font face="新宋体">Process</font></code> 对象表示的进程。
</p>
<p>
</p>
<p>
</p>
<dl><dt><strong>从以下版本开始：</strong>
</dt><dd>JDK1.0
</dd><dt><strong>另请参见：</strong>
</dt><dd><a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/ProcessBuilder.html"  中的类=""><code><font face="新宋体">ProcessBuilder</font></code></a>, <a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Runtime.html#exec%28java.lang.String%5B%5D,"  java.io.file)?="" java.lang.string[],=""><code><font face="新宋体">Runtime.exec(String[], String[], File)</font></code></a></dd></dl><font face="新宋体">
<hr />
</font>
<p><!-- ======== CONSTRUCTOR summary="=======" --><a name="constructor_summary"><!-- --></a>
</p>
<table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
    <tbody>
        <tr class="TableHeadingColor" bgcolor="#ccccff">
            <th colspan="2" align="left"><font size="+2"><strong>构造方法摘要</strong></font></th>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#Process%28%29"><font face="新宋体">Process</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
        </tr>
    </tbody>
</table>
&nbsp; <!-- ========== METHOD summary="==========" --><a name="method_summary"><!-- --></a>
<table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
    <tbody>
        <tr class="TableHeadingColor" bgcolor="#ccccff">
            <th colspan="2" align="left"><font size="+2"><strong>方法摘要</strong></font></th>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td align="right" valign="top" width="1%"><font face="新宋体 size=-1"><code>abstract &nbsp;void</code></font></td>
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#destroy%28%29"><font face="新宋体">destroy</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;杀掉子进程。</td>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td align="right" valign="top" width="1%"><font face="新宋体 size=-1"><code>abstract &nbsp;int</code></font></td>
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#exitValue%28%29"><font face="新宋体">exitValue</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回子进程的出口值。</td>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td align="right" valign="top" width="1%"><font size="-1"><code><font face="新宋体">abstract &nbsp;</font><a title="java.io" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/io/InputStream.html"  中的类=""><font face="新宋体">InputStream</font></a></code></font></td>
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#getErrorStream%28%29"><font face="新宋体">getErrorStream</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获得子进程的错误流。</td>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td align="right" valign="top" width="1%"><font size="-1"><code><font face="新宋体">abstract &nbsp;</font><a title="java.io" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/io/InputStream.html"  中的类=""><font face="新宋体">InputStream</font></a></code></font></td>
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#getInputStream%28%29"><font face="新宋体">getInputStream</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获得子进程的输入流。</td>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td align="right" valign="top" width="1%"><font size="-1"><code><font face="新宋体">abstract &nbsp;</font><a title="java.io" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/io/OutputStream.html"  中的类=""><font face="新宋体">OutputStream</font></a></code></font></td>
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#getOutputStream%28%29"><font face="新宋体">getOutputStream</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;获得子进程的输出流。</td>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td align="right" valign="top" width="1%"><font face="新宋体 size=-1"><code>abstract &nbsp;int</code></font></td>
            <td><code><strong><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Process.html#waitFor%28%29"><font face="新宋体">waitFor</font></a></strong><font face="新宋体">()</font></code> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导致当前线程等待，如果必要，一直要等到由该 <code><font face="新宋体">Process</font></code> 对象表示的进程已经终止。</td>
        </tr>
    </tbody>
</table>
&nbsp;<a name="methods_inherited_from_class_java"  .lang.="" object=""><!-- --></a>
<table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
    <tbody>
        <tr class="TableSubHeadingColor" bgcolor="#eeeeff">
            <th align="left"><strong>从类 java.lang.<a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html"  中的类="">Object</a> 继承的方法</strong></th>
        </tr>
        <tr class="TableRowColor" bgcolor="white">
            <td><code><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#clone%28%29"><font face="新宋体">clone</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#equals%28java.lang.Object%29"><font face="新宋体">equals</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#finalize%28%29"><font face="新宋体">finalize</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#getClass%28%29"><font face="新宋体">getClass</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#hashCode%28%29"><font face="新宋体">hashCode</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#notify%28%29"><font face="新宋体">notify</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#notifyAll%28%29"><font face="新宋体">notifyAll</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#toString%28%29"><font face="新宋体">toString</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#wait%28%29"><font face="新宋体">wait</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#wait%28long%29"><font face="新宋体">wait</font></a><font face="新宋体">, </font><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Object.html#wait%28long,"  int)=""><font face="新宋体">wait</font></a></code></td>
        </tr>
    </tbody>
</table>
&nbsp;
<p><!-- ========= CONSTRUCTOR detail="=======" --><a name="constructor_detail"><!-- --></a>
</p>
<table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
    <tbody>
        <tr class="TableHeadingColor" bgcolor="#ccccff">
            <th align="left"><font size="+2"><strong>构造方法详细信息</strong></font></th>
        </tr>
    </tbody>
</table>
<a name="Process"  ()=""><!-- --></a>
<h3>Process</h3>
<pre>public <strong>Process</strong>()</pre>
<p><!-- ============ METHOD detail="=========" --><a name="method_detail"><!-- --></a>
</p>
<table summary="" border="1" cellpadding="3" cellspacing="0" width="100%">
    <tbody>
        <tr class="TableHeadingColor" bgcolor="#ccccff">
            <th align="left"><font size="+2"><strong>方法详细信息</strong></font></th>
        </tr>
    </tbody>
</table>
<a name="getOutputStream"  ()=""><!-- --></a>
<h3>getOutputStream</h3>
<pre>public abstract <a title="java.io" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/io/OutputStream.html"  中的类="">OutputStream</a> <strong>getOutputStream</strong>()</pre>
<dl><dd>获得子进程的输出流。输出流被传送给由该 <code><font face="新宋体">Process</font></code> 对象表示的进程的标准输入流。
<p>实现注意事项：对输出流进行缓冲是一个好主意。
</p>
<p>
</p>
</dd><dd>
<dl><dt><strong>返回：</strong>
</dt><dd>连接到子进程正常输入的输出流。</dd></dl></dd></dl>
<hr />
<a name="getInputStream"  ()=""><!-- --></a>
<h3>getInputStream</h3>
<pre>public abstract <a title="java.io" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/io/InputStream.html"  中的类="">InputStream</a> <strong>getInputStream</strong>()</pre>
<dl><dd>获得子进程的输入流。输入流获得由该 <code><font face="新宋体">Process</font></code> 对象表示的进程的标准输出流。
<p>实现注意事项：对输入流进行缓冲是一个好主意。
</p>
<p>
</p>
</dd><dd>
<dl><dt><strong>返回：</strong>
</dt><dd>连接到子进程正常输出的输入流。
</dd><dt><strong>另请参见：</strong>
</dt><dd><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/ProcessBuilder.html#redirectErrorStream%28%29"><code><font face="新宋体">ProcessBuilder.redirectErrorStream()</font></code></a></dd></dl></dd></dl><font face="新宋体">
<hr />
</font><a name="getErrorStream"  ()=""><!-- --></a>
<h3>getErrorStream</h3>
<pre>public abstract <a title="java.io" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/io/InputStream.html"  中的类="">InputStream</a> <strong>getErrorStream</strong>()</pre>
<dl><dd>获得子进程的错误流。错误流获得由该 <code><font face="新宋体">Process</font></code> 对象表示的进程的错误输出流传送的数据。
<p>实现注意事项：对输入流进行缓冲是一个好主意。
</p>
<p>
</p>
</dd><dd>
<dl><dt><strong>返回：</strong>
</dt><dd>连接到子进程错误流的输入流。
</dd><dt><strong>另请参见：</strong>
</dt><dd><a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/ProcessBuilder.html#redirectErrorStream%28%29"><code><font face="新宋体">ProcessBuilder.redirectErrorStream()</font></code></a></dd></dl></dd></dl><font face="新宋体">
<hr />
</font><a name="waitFor"  ()=""><!-- --></a>
<h3>waitFor</h3>
<pre>public abstract int <strong>waitFor</strong>()<br />
throws <a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/InterruptedException.html"  中的类="">InterruptedException</a></pre>
<dl><dd>导致当前线程等待，如果必要，一直要等到由该 <code><font face="新宋体">Process</font></code> 对象表示的进程已经终止。如果已终止该子进程，此方法立即返回。如果没有终止该子进程，调用的线程将被阻塞，直到退出子进程。
<p>
</p>
</dd><dd>
<dl><dt><strong>返回：</strong>
</dt><dd>进程的出口值。根据惯例，<code><font face="新宋体">0</font></code> 表示正常终止。
</dd><dt><strong>抛出：</strong>
</dt><dd><code><a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/InterruptedException.html"  中的类=""><font face="新宋体">InterruptedException</font></a></code> - 如果当前线程在等待时被另一线程 <a href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/Thread.html#interrupt%28%29"><code><font face="新宋体">中断</font></code></a>，则停止等待，抛出 <a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/InterruptedException.html"  中的类=""><code><font face="新宋体">InterruptedException</font></code></a>。</dd></dl></dd></dl>
<hr />
<a name="exitValue"  ()=""><!-- --></a>
<h3>exitValue</h3>
<pre>public abstract int <strong>exitValue</strong>()</pre>
<dl><dd>返回子进程的出口值。
<p>
</p>
</dd><dd>
<dl><dt><strong>返回：</strong>
</dt><dd>此 <code><font face="新宋体">Process</font></code> 对象表示的子进程的出口值。根据惯例，值 <code><font face="新宋体">0</font></code> 表示正常终止。
</dd><dt><strong>抛出：</strong>
</dt><dd><code><a title="java.lang" href="mk:@MSITStore:E:%5Cleizhimin%5Cj2sdk_help%5Cjdk%201.5%20API%E4%B8%AD%E6%96%87%E7%89%88%28%E5%85%A8%29%5B%E9%9B%B7%E6%99%BA%E6%B0%91-lavasfot%5D.chm::/jdk150/api/java/lang/IllegalThreadStateException.html"  中的类=""><font face="新宋体">IllegalThreadStateException</font></a></code> - 如果此 <code><font face="新宋体">Process</font></code> 对象表示的子进程尚未终止。</dd></dl></dd></dl>
<hr />
<a name="destroy"  ()=""><!-- --></a>
<h3>destroy</h3>
<pre>public abstract void <strong>destroy</strong>()</pre>
<dl><dd>杀掉子进程。强制终止此 <code><font face="新宋体">Process</font></code> 对象表示的子进程。</dd></dl>
<p>&nbsp;
</p>
<img src ="http://www.blogjava.net/lvq810/aggbug/205919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lvq810/" target="_blank">lvq810</a> 2008-06-04 20:47 <a href="http://www.blogjava.net/lvq810/articles/205919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>