﻿<?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-Jacally-文章分类-Java</title><link>http://www.blogjava.net/jacally/category/19412.html</link><description>Java原生态</description><language>zh-cn</language><lastBuildDate>Wed, 19 Mar 2008 03:22:10 GMT</lastBuildDate><pubDate>Wed, 19 Mar 2008 03:22:10 GMT</pubDate><ttl>60</ttl><item><title>[导入]WebService开发笔记 2 -- VS 2005 访问WebServcie更简单</title><link>http://www.blogjava.net/jacally/articles/186656.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Sun, 16 Mar 2008 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/186656.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/186656.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/186656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/186656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/186656.html</trackback:ping><description><![CDATA[<br />
网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp; 作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp; 链接：<a style="color: red" href="http://lib.javaeye.com/blog/170628">http://lib.javaeye.com/blog/170628</a>&nbsp; 发表时间: 2008年03月12日 <br />
<br />
声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！ <br />
<br />
1.首先在vs中新建项目 <br />
<img alt="" src="http://lib.javaeye.com/upload/picture/pic/9222/0f3a1ad5-34c4-35b0-94d0-52d6cd25e7a1.jpg?1205321363" /> <br />
<br />
2.添加web引用.... <br />
<img alt="" src="http://lib.javaeye.com/upload/picture/pic/9220/e5e21986-a77f-3918-8b12-8290e62456a1.jpg?1205321362" /> <br />
<br />
3.输入WebService地址：http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl最后点击&#8220;添加引用&#8221; <br />
<img alt="" src="http://lib.javaeye.com/upload/picture/pic/9218/d394c612-a53d-340a-bc28-fb405952b9b8.jpg?1205321361" /> <br />
<br />
4.创建一个简单的form <br />
<img alt="" src="http://lib.javaeye.com/upload/picture/pic/9216/7be4342c-d86e-3dec-a7fd-325a2257f0b7.jpg?1205321360" /> <br />
<br />
5.编写按钮事件代码 <br />
<br />
<pre class="c#" name="code">using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Text;<br />
using System.Net;<br />
<br />
using System.Windows.Forms;<br />
<br />
<br />
using WindowsApplication1.WebReference;<br />
<br />
namespace WindowsApplication1<br />
{<br />
public partial class Form1 : Form<br />
{<br />
WindowsApplication1.WebReference.WebServiceSampleImplService service = null;<br />
<br />
public Form1()<br />
{<br />
<br />
InitializeComponent();<br />
}<br />
<br />
private void button1_Click(object sender, EventArgs e)<br />
{<br />
<br />
<br />
String str = "";<br />
<br />
try<br />
{<br />
str = service.say("Libin");<br />
<br />
}<br />
catch (Exception we)<br />
{<br />
str = we.Message;<br />
}<br />
<br />
//MessageBox.Show(str);<br />
<br />
textBox1.Text = str ;<br />
<br />
<br />
}<br />
<br />
private void Form1_Load(object sender, EventArgs e)<br />
{<br />
service = new WebServiceSampleImplService();<br />
<br />
label1.Text = "WS.url:" + service.Url + "\r\n";<br />
<br />
}<br />
<br />
private void button2_Click(object sender, EventArgs e)<br />
{<br />
String str = "";<br />
<br />
try<br />
{<br />
User user = new User();<br />
user.id = 1;<br />
user.name = "Libin";<br />
str = "userName:" + service.sayUserName(user);<br />
<br />
}<br />
catch (Exception we)<br />
{<br />
str = we.Message;<br />
}<br />
<br />
//MessageBox.Show(str);<br />
<br />
textBox1.Text = str;<br />
}<br />
<br />
private void button3_Click(object sender, EventArgs e)<br />
{<br />
<br />
String str = "";<br />
try<br />
{<br />
<br />
Object[]  users = service.findUsers();<br />
for (int i = 0; i &lt; users.Length; i++)<br />
{<br />
User user = (User)users[i];<br />
str += "id:"+user.id + "  name:" + user.name + "\r\n";<br />
}<br />
<br />
}<br />
catch (Exception we)<br />
{<br />
str = we.Message;<br />
}<br />
<br />
//MessageBox.Show(str);<br />
<br />
textBox1.Text = str;<br />
}<br />
}<br />
}</pre>
<br />
<br />
6.最后点击调试运行，或按F5运行，通过点击按钮就可以看到调用WebService的运行结果了 <br />
<img alt="" src="http://lib.javaeye.com/upload/picture/pic/9214/d4de199c-d6e7-3e39-a69f-494a38b972c9.jpg?1205321360" /> <br />
<span style="color: red"><a style="color: red" href="http://lib.javaeye.com/blog/170628#comments">本文的讨论也很精彩，浏览讨论&gt;&gt;</a> </span><br />
<br />
<br />
<span style="color: #e28822">JavaEye推荐</span> <br />
<a href="/adverts/41" target="_blank"><span style="font-weight: bold; color: red">中国领先的电子商务网站－淘宝网招贤纳士，诚聘Java工程师</span></a> <br />
<br />
<br />
<br />
文章来源:<a href="http://lib.javaeye.com/blog/170628">http://lib.javaeye.com/blog/170628</a> 
<img src ="http://www.blogjava.net/jacally/aggbug/186656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2008-03-16 21:41 <a href="http://www.blogjava.net/jacally/articles/186656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单</title><link>http://www.blogjava.net/jacally/articles/186655.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Sun, 16 Mar 2008 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/186655.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/186655.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/186655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/186655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/186655.html</trackback:ping><description><![CDATA[现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作。下面就将我们在开发中摸索的一点经验教训总结以下，以供大家参考. <br />
<br />
我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate; <br />
1.首先集成Apacha CXF WebService 到 Spring 框架中; <br />
apache cxf 下载地址:<a href="http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip" target="_blank">http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip</a> <br />
在spring context配置文件中引入以下cxf配置 <br />
<pre class="xml" name="code">	&lt;import resource="classpath*:META-INF/cxf/cxf.xml" /&gt;<br />
&lt;import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" /&gt;<br />
&lt;import resource="classpath*:META-INF/cxf/cxf-servlet.xml" /&gt;<br />
</pre>
<br />
在web.xml中添加过滤器: <br />
<pre class="xml" name="code">	&lt;servlet&gt;<br />
&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
org.apache.cxf.transport.servlet.CXFServlet<br />
&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;CXFServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
</pre>
<br />
<br />
2.开发服务端WebService接口: <br />
<pre class="java" name="code">/**<br />
* WebService接口定义类.<br />
* <br />
* 使用@WebService将接口中的所有方法输出为Web Service.<br />
* 可用annotation对设置方法、参数和返回值在WSDL中的定义.<br />
*/<br />
@WebService<br />
public interface WebServiceSample {<br />
<br />
<br />
/**<br />
* 一个简单的方法,返回一个字符串<br />
* @param hello<br />
* @return<br />
*/<br />
String say(String hello);<br />
<br />
/**<br />
* 稍微复杂一些的方法,传递一个对象给服务端处理<br />
* @param user<br />
* @return<br />
*/<br />
String sayUserName(<br />
@WebParam(name = "user") <br />
UserDTO user);<br />
<br />
/**<br />
* 最复杂的方法,返回一个List封装的对象集合<br />
* @return<br />
*/<br />
public <br />
@WebResult(partName="o")<br />
ListObject findUsers();<br />
<br />
}<br />
</pre>
<br />
由简单到复杂定义了三个接口,模拟业务需求; <br />
<br />
3.实现接口 <br />
<pre class="java" name="code">/**<br />
* WebService实现类.<br />
* <br />
* 使用@WebService指向Interface定义类即可.<br />
*/<br />
@WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")<br />
public class WebServiceSampleImpl implements WebServiceSample {<br />
<br />
public String sayUserName(UserDTO user) {<br />
return "hello "+user.getName();<br />
}<br />
<br />
public String say(String hello) {<br />
return "hello "+hello;<br />
}<br />
<br />
public ListObject findUsers() {<br />
ArrayList&lt;Object&gt; list = new ArrayList&lt;Object&gt;();<br />
<br />
list.add(instancUser(1,"lib"));<br />
list.add(instancUser(2,"mld"));<br />
list.add(instancUser(3,"lq"));<br />
list.add(instancUser(4,"gj"));<br />
ListObject o = new ListObject();<br />
o.setList(list);<br />
return o;<br />
}<br />
<br />
private UserDTO instancUser(Integer id,String name){<br />
UserDTO user = new UserDTO();<br />
user.setId(id);<br />
user.setName(name);<br />
return user;<br />
}<br />
}<br />
</pre>
<br />
<br />
4.依赖的两个类:用户对象与List对象 <br />
<pre class="java" name="code">/**<br />
* Web Service传输User信息的DTO.<br />
* <br />
* 分离entity类与web service接口间的耦合，隔绝entity类的修改对接口的影响.<br />
* 使用JAXB 2.0的annotation标注JAVA-XML映射，尽量使用默认约定.<br />
* <br />
*/<br />
@XmlAccessorType(XmlAccessType.FIELD)<br />
@XmlType(name = "User")<br />
public class UserDTO {<br />
<br />
protected Integer id;<br />
<br />
protected String name;<br />
<br />
public Integer getId() {<br />
return id;<br />
}<br />
<br />
public void setId(Integer value) {<br />
id = value;<br />
}<br />
<br />
public String getName() {<br />
return name;<br />
}<br />
<br />
public void setName(String value) {<br />
name = value;<br />
}<br />
}<br />
</pre>
<br />
关于List对象,参照了<a href="http://www.javaeye.com/post/253814" target="_blank">有关JWS的一个问题</a>中的描述:DK6.0 自带的WebService中 WebMethod的参数好像不能是ArrayList 或者其他List <br />
传递List需要将List 包装在其他对象内部才行 (个人理解 如有不对请指出) ,我在实践中也遇到了此类问题.通过以下封装的对象即可以传递List对象. <br />
<pre class="java" name="code">/**<br />
* &lt;p&gt;Java class for listObject complex type.<br />
* <br />
* &lt;p&gt;The following schema fragment specifies the expected content contained within this class.<br />
* <br />
* &lt;pre&gt;<br />
* &lt;complexType name="listObject"&gt;<br />
*   &lt;complexContent&gt;<br />
*     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;<br />
*       &lt;sequence&gt;<br />
*         &lt;element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/&gt;<br />
*       &lt;/sequence&gt;<br />
*     &lt;/restriction&gt;<br />
*   &lt;/complexContent&gt;<br />
* &lt;/complexType&gt;<br />
* &lt;/pre&gt;<br />
* <br />
* <br />
*/<br />
@XmlAccessorType(XmlAccessType.FIELD)<br />
@XmlType(name = "listObject", propOrder = { "list" })<br />
public class ListObject {<br />
<br />
@XmlElement(nillable = true)<br />
protected List&lt;Object&gt; list;<br />
<br />
/**<br />
* Gets the value of the list property.<br />
* <br />
* &lt;p&gt;<br />
* This accessor method returns a reference to the live list,<br />
* not a snapshot. Therefore any modification you make to the<br />
* returned list will be present inside the JAXB object.<br />
* This is why there is not a &lt;CODE&gt;set&lt;/CODE&gt; method for the list property.<br />
* <br />
* &lt;p&gt;<br />
* For example, to add a new item, do as follows:<br />
* &lt;pre&gt;<br />
*    getList().add(newItem);<br />
* &lt;/pre&gt;<br />
* <br />
* <br />
* &lt;p&gt;<br />
* Objects of the following type(s) are allowed in the list<br />
* {@link Object }<br />
* <br />
* <br />
*/<br />
public List&lt;Object&gt; getList() {<br />
if (list == null) {<br />
list = new ArrayList&lt;Object&gt;();<br />
}<br />
return this.list;<br />
}<br />
<br />
public void setList(ArrayList&lt;Object&gt; list) {<br />
this.list = list;<br />
}<br />
<br />
}<br />
</pre>
<br />
<br />
5.WebService 服务端 spring 配置文件 ws-context.xml <br />
<pre class="xml" name="code">&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xmlns:jaxws="http://cxf.apache.org/jaxws"<br />
xsi:schemaLocation="http://cxf.apache.org/jaxws <a href="http://cxf.apache.org/schemas/jaxws.xsd">http://cxf.apache.org/schemas/jaxws.xsd</a> <br />
<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>  <br />
http://www.springframework.org/schema/beans/spring-beans.xsd"<br />
default-autowire="byName" default-lazy-init="true"&gt;<br />
<br />
&lt;jaxws:endpoint id="webServiceSample"<br />
address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/&gt;<br />
<br />
&lt;/beans&gt;<br />
</pre>
<br />
<br />
WebService 客户端 spring 配置文件 wsclient-context.xml <br />
<pre class="xml" name="code">&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xmlns:jaxws="http://cxf.apache.org/jaxws"<br />
xsi:schemaLocation="http://cxf.apache.org/jaxws <br />
<a href="http://cxf.apache.org/schemas/jaxws.xsd">http://cxf.apache.org/schemas/jaxws.xsd</a> <br />
<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>  <br />
http://www.springframework.org/schema/beans/spring-beans.xsd"<br />
default-autowire="byName" default-lazy-init="true"&gt;<br />
<br />
&lt;!-- ws client --&gt;<br />
&lt;bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"<br />
factory-bean="identityValidateServiceClientFactory" factory-method="create" /&gt;<br />
<br />
&lt;bean id="identityValidateServiceClientFactory"<br />
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"&gt;<br />
&lt;property name="serviceClass"<br />
value="cn.org.coral.admin.service.IdentityValidateService" /&gt;<br />
&lt;property name="address"<br />
value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;/beans&gt;<br />
</pre>
<br />
6.发布到tomcat服务器以后通过以下地址即可查看自定义的webservice接口生成的wsdl: <br />
http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl <br />
<br />
7.调用WebService接口的Junit单元测试程序 <br />
<pre class="java" name="code">package test.coral.sample;<br />
<br />
import org.springframework.test.AbstractDependencyInjectionSpringContextTests;<br />
<br />
import cn.org.coral.biz.examples.webservice.WebServiceSample;<br />
import cn.org.coral.biz.examples.webservice.dto.UserDTO;<br />
<br />
public class TestWebServiceSample extends<br />
AbstractDependencyInjectionSpringContextTests {<br />
WebServiceSample webServiceSampleClient;<br />
<br />
public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {<br />
this.webServiceSampleClient = webServiceSampleClient;<br />
}<br />
<br />
@Override<br />
protected String[] getConfigLocations() {<br />
setAutowireMode(AUTOWIRE_BY_NAME);<br />
//spring 客户端配置文件保存位置<br />
return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };<br />
}<br />
<br />
public void testWSClinet(){<br />
Assert.hasText(webServiceSampleClient.say(" world"));<br />
}<br />
}<br />
<br />
</pre>
<img src ="http://www.blogjava.net/jacally/aggbug/186655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2008-03-16 21:40 <a href="http://www.blogjava.net/jacally/articles/186655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]CAS 单点登录安装笔记4 -- asp.net client端的设置</title><link>http://www.blogjava.net/jacally/articles/186657.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Sun, 02 Mar 2008 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/186657.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/186657.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/186657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/186657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/186657.html</trackback:ping><description><![CDATA[<br />
网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
链接：<a href="http://lib.javaeye.com/blog/166619" style="color: red;">http://lib.javaeye.com/blog/166619</a>&nbsp;
发表时间: 2008年03月02日
<br />
<br />
声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
<br />
<br />
CAS 单点登录安装笔记4
<br />
--- asp.net client端的设置
<br />
<br />
1、首先修改web.Config文件，加入以下设置：
<br />
<pre name="code" class="xml">&lt;authentication mode="Forms" &gt;<br />
&lt;forms name="casauth" loginUrl="login.aspx" /&gt;<br />
&lt;/authentication&gt;<br />
&lt;authorization&gt;<br />
&lt;deny users="?" /&gt;<br />
&lt;/authorization&gt;<br />
</pre>
<br />
本人对.net不是很熟悉，感觉这里的配置类似java web应用程序中的过滤器，当用户访问web页时首先跳转到login.aspx页面进行验证。
<br />
<br />
2、加入以下c#代码到login.aspx页面的加载事件中：
<br />
<pre name="code" class="c#">    //CAS 身份验证 服务器地址<br />
private const string CASHOST = "https://sso.gzps.net:8443/cas/";<br />
<br />
protected void Page_Load(object sender, EventArgs e)<br />
{<br />
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();<br />
<br />
// Look for the "ticket=" after the "?" in the URL<br />
string tkt = Request.QueryString["ticket"];<br />
<br />
// This page is the CAS service=, but discard any query string residue<br />
string service = Request.Url.GetLeftPart(UriPartial.Path);<br />
<br />
// First time through there is no ticket=, so redirect to CAS login<br />
if (tkt == null || tkt.Length == 0)<br />
{<br />
string redir = CASHOST + "login?" +<br />
"service=" + service;<br />
Response.Redirect(redir);<br />
return;<br />
}<br />
<br />
// Second time (back from CAS) there is a ticket= to validate<br />
string validateurl = CASHOST + "serviceValidate?" +<br />
"ticket=" + tkt + "&amp;"+<br />
"service=" + service;<br />
StreamReader Reader = new StreamReader( new WebClient().OpenRead(validateurl));<br />
string resp = Reader.ReadToEnd();<br />
// I like to have the text in memory for debugging rather than parsing the stream<br />
<br />
// Some boilerplate to set up the parse.<br />
NameTable nt = new NameTable();<br />
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);<br />
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);<br />
XmlTextReader reader = new XmlTextReader(resp, XmlNodeType.Element, context);<br />
<br />
string netid = null;<br />
<br />
// A very dumb use of XML. Just scan for the "user". If it isn't there, its an error.<br />
while (reader.Read())<br />
{<br />
if (reader.IsStartElement()) {<br />
string tag = reader.LocalName;<br />
if (tag=="user")<br />
netid = reader.ReadString();<br />
}<br />
}<br />
// if you want to parse the proxy chain, just add the logic above<br />
reader.Close();<br />
// If there was a problem, leave the message on the screen. Otherwise, return to original page.<br />
if (netid == null)<br />
{<br />
Label1.Text = "CAS returned to this application, but then refused to validate your identity.";<br />
}<br />
else<br />
{<br />
Session["UserName"] = netid;<br />
Label1.Text = "Welcome " + netid;<br />
FormsAuthentication.RedirectFromLoginPage(netid, false); // set netid in ASP.NET blocks<br />
}<br />
<br />
}<br />
}<br />
</pre>
<br />
<br />
以上代码参照了ja-sig网站的解决方案：<a href="http://www.ja-sig.org/wiki/display/CASC/ASP.NET+Forms+Authentication" target="_blank">http://www.ja-sig.org/wiki/display/CASC/ASP.NET+Forms+Authentication</a>
<br />
<br />
3、以为这样就可以了，运行时可以跳到sso服务器进行验证，但跳转以后报以下错误：
<br />
" System.Net.WebException。 基础连接已关闭。 无法建立与远程服务器信任关系 "。
<br />
应该与CAS Server端安装了数字证书，而.net Client端并没有安装相应的证书有关。
<br />
可以通过<a href="http://hi.baidu.com/wjmd521/blog/item/d0244e60edc9a045ebf8f898.html" target="_blank">配置IIS服务器，支持HTTPS SSL协议实现安全数据交换</a>中介绍的步骤导入CAS 服务端的数字证书,或者通过<a href="http://support.microsoft.com/kb/823177/" target="_blank">http://support.microsoft.com/kb/823177/</a>上介绍的解决方案进行处理：
<br />
实现类
<br />
<pre name="code" class="c#">using System.Net;<br />
using System.Security.Cryptography.X509Certificates;<br />
<br />
public class MyPolicy : ICertificatePolicy {<br />
public bool CheckValidationResult(<br />
ServicePoint srvPoint<br />
, X509Certificate certificate<br />
, WebRequest request<br />
, int certificateProblem) {<br />
<br />
//Return True to force the certificate to be accepted.<br />
return true;<br />
<br />
} // end CheckValidationResult<br />
} // class MyPolicy<br />
<br />
</pre>
<br />
客户端代码中包含下列代码：
<br />
<pre name="code" class="#c">   System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();<br />
</pre>
<br />
<br />
所有代码见附件WebSite.rar,将其部署到你的IIS服务器就可以了。
<br />
关于IIS服务器的设置见<a href="http://tech.163.com/special/00091PDS/aspnet.html" target="_blank">asp.net一夜速成教程</a>
<br />
<span style="color: red;">
<a href="http://lib.javaeye.com/blog/166619#comments" style="color: red;">本文的讨论也很精彩，浏览讨论&gt;&gt;</a>
</span>
<br />
<br />
<br />
<span style="color: rgb(226, 136, 34);">JavaEye推荐</span>
<br />
<a href="/adverts/41" target="_blank"><span style="color: red; font-weight: bold;">中国领先的电子商务网站－淘宝网招贤纳士，诚聘Java工程师</span></a>
<br />
<br />
<br />
<br />
文章来源:<a href="http://lib.javaeye.com/blog/166619">http://lib.javaeye.com/blog/166619</a>
<img src ="http://www.blogjava.net/jacally/aggbug/186657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2008-03-02 11:52 <a href="http://www.blogjava.net/jacally/articles/186657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]CAS 单点登录安装笔记3 -- 与acegi集成</title><link>http://www.blogjava.net/jacally/articles/186658.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Thu, 28 Feb 2008 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/186658.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/186658.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/186658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/186658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/186658.html</trackback:ping><description><![CDATA[<br />
网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
链接：<a href="http://lib.javaeye.com/blog/165980" style="color: red;">http://lib.javaeye.com/blog/165980</a>&nbsp;
发表时间: 2008年02月28日
<br />
<br />
声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
<br />
<br />
CAS 单点登录安装笔记3
<br />
-- 与acegi集成
<br />
<br />
在我的项目中应用了acigi安全框架,以下是结合yale cas单点登录系统进行的相关配置
<br />
<pre name="code" class="xml">
&lt;!-- =========  Acegi as a CAS Client的配置============= --&gt;
&lt;bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.cas.CasProcessingFilter"&gt;
&lt;property name="authenticationManager"
ref="authenticationManager" /&gt;
&lt;property name="authenticationFailureUrl"
value="/login.do?login_error=1" /&gt;
&lt;property name="defaultTargetUrl" value="/main.do" /&gt;
&lt;property name="filterProcessesUrl"&gt;
&lt;value&gt;/j_acegi_cas_security_check&lt;/value&gt;
&lt;/property&gt;
&lt;property name="rememberMeServices" ref="rememberMeServices" /&gt;
&lt;property name="exceptionMappings"&gt;
&lt;value&gt;
org.acegisecurity.AuthenticationServiceException=/login.do?login_error=user_not_found_error
org.acegisecurity.BadCredentialsException=/login.do?login_error=user_psw_error
org.acegisecurity.concurrent.ConcurrentLoginException=/login.do?login_error=too_many_user_error
org.acegisecurity.DisabledException=/login.do?login_error=disabled_user_error
&lt;/value&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"&gt;
&lt;property name="authenticationEntryPoint"&gt;
&lt;ref local="casProcessingFilterEntryPoint"/&gt;
&lt;/property&gt;
&lt;property name="accessDeniedHandler"&gt;
&lt;bean
class="org.acegisecurity.ui.AccessDeniedHandlerImpl"&gt;
&lt;property name="errorPage"
value="/errors/accessDenied.jsp" /&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;!-- cas config --&gt;
&lt;bean id="casProcessingFilterEntryPoint" class="org.acegisecurity.ui.cas.CasProcessingFilterEntryPoint"&gt;
&lt;property name="loginUrl"&gt;&lt;value&gt;https://sso.gzps.net:8443/cas/login&lt;/value&gt;&lt;/property&gt;
&lt;property name="serviceProperties"&gt;&lt;ref local="serviceProperties"/&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"&gt;
&lt;property name="providers"&gt;
&lt;list&gt;
&lt;ref local="casAuthenticationProvider"/&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="casAuthenticationProvider" class="org.acegisecurity.providers.cas.CasAuthenticationProvider"&gt;
&lt;property name="casAuthoritiesPopulator"&gt;&lt;ref bean="casAuthoritiesPopulator"/&gt;&lt;/property&gt;
&lt;property name="casProxyDecider"&gt;&lt;ref local="casProxyDecider"/&gt;&lt;/property&gt;
&lt;property name="ticketValidator"&gt;&lt;ref local="casProxyTicketValidator"/&gt;&lt;/property&gt;
&lt;property name="statelessTicketCache"&gt;&lt;ref local="statelessTicketCache"/&gt;&lt;/property&gt;
&lt;property name="key"&gt;&lt;value&gt;my_password_for_this_auth_provider_only&lt;/value&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="casProxyTicketValidator" class="org.acegisecurity.providers.cas.ticketvalidator.CasProxyTicketValidator"&gt;
&lt;property name="casValidate"&gt;&lt;value&gt;https://sso.gzps.net:8443/cas/proxyValidate&lt;/value&gt;&lt;/property&gt;
&lt;property name="serviceProperties"&gt;&lt;ref local="serviceProperties"/&gt;&lt;/property&gt;
&lt;/bean&gt;
&lt;!--
&lt;bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.AcceptAnyCasProxy" /&gt;
--&gt;
&lt;bean id="casProxyDecider" class="org.acegisecurity.providers.cas.proxy.RejectProxyTickets" /&gt;
&lt;bean id="serviceProperties" class="org.acegisecurity.ui.cas.ServiceProperties"&gt;
&lt;property name="service"&gt;
&lt;value&gt;http://localhost:8080/aio/j_acegi_cas_security_check&lt;/value&gt;
&lt;/property&gt;
&lt;property name="sendRenew"&gt;
&lt;value&gt;false&lt;/value&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="statelessTicketCache" class="org.acegisecurity.providers.cas.cache.EhCacheBasedTicketCache"&gt;
&lt;property name="cache"&gt;
&lt;bean class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;
&lt;property name="cacheManager"&gt;
&lt;bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/&gt;
&lt;/property&gt;
&lt;property name="cacheName" value="userCache"/&gt;
&lt;/bean&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;bean id="casAuthoritiesPopulator" class="org.acegisecurity.providers.cas.populator.DaoCasAuthoritiesPopulator"&gt;<br />
&lt;property name="userDetailsService"&gt;&lt;ref local="userDetailsService"/&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;bean id="casProcessingFilter" class="org.acegisecurity.ui.cas.CasProcessingFilter"&gt;<br />
&lt;property name="authenticationManager"&gt;&lt;ref local="authenticationManager"/&gt;&lt;/property&gt;<br />
&lt;property name="authenticationFailureUrl"&gt;&lt;value&gt;/casfailed.jsp&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name="defaultTargetUrl"&gt;&lt;value&gt;/&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name="filterProcessesUrl"&gt;&lt;value&gt;/j_acegi_cas_security_check&lt;/value&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
<br />
&lt;!-- ======================================================= --&gt;<br />
<br />
</pre>
<br />
<span style="color: red;">
<a href="http://lib.javaeye.com/blog/165980#comments" style="color: red;">本文的讨论也很精彩，浏览讨论&gt;&gt;</a>
</span>
<br />
<br />
<br />
<span style="color: #e28822;">JavaEye推荐</span>
<br />
<a href="/adverts/41" target="_blank"><span style="color: red; font-weight: bold;">中国领先的电子商务网站－淘宝网招贤纳士，诚聘Java工程师</span></a>
<br />
<br />
<br />
<br />
文章来源:<a href="http://lib.javaeye.com/blog/165980">http://lib.javaeye.com/blog/165980</a> 
<img src ="http://www.blogjava.net/jacally/aggbug/186658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2008-02-28 23:39 <a href="http://www.blogjava.net/jacally/articles/186658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]CAS 单点登录安装笔记2 -- 配置CAS,访问自己的用户表</title><link>http://www.blogjava.net/jacally/articles/186659.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Wed, 27 Feb 2008 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/186659.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/186659.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/186659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/186659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/186659.html</trackback:ping><description><![CDATA[<br />
网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
链接：<a href="http://lib.javaeye.com/blog/165538" style="color: red;">http://lib.javaeye.com/blog/165538</a>&nbsp;
发表时间: 2008年02月27日
<br />
<br />
声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
<br />
<br />
CAS 单点登录安装笔记2
<br />
<br />
<br />
1.修改cas/webapp/WEB-INF/deployerConfigContext.xml
<br />
加入以下定义:
<br />
<pre name="code" class="xml">	&lt;!-- 数据源定义 --&gt;<br />
&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"&gt;<br />
&lt;property name="driverClassName" value="${db.driver}" /&gt;<br />
&lt;property name="url" value="${db.url}" /&gt;<br />
&lt;property name="username" value="${db.username}" /&gt;<br />
&lt;property name="password" value="${db.password}" /&gt;       <br />
&lt;/bean&gt;<br />
&lt;!-- <br />
passwordEncoder　使用Md5算法加密 <br />
--&gt;<br />
&lt;bean id="passwordEncoder"<br />
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName"&gt;   <br />
&lt;constructor-arg value="MD5"/&gt;<br />
&lt;/bean&gt;<br />
</pre>
<br />
<br />
2.屏蔽原有验证方法:
<br />
<pre name="code" class="xml">				&lt;!-- <br />
&lt;bean<br />
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /&gt;<br />
--&gt;<br />
</pre>
<br />
<br />
3.加入通过访问数据库进行验证的handler:
<br />
<pre name="code" class="xml">				&lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&gt;<br />
&lt;property name="sql" value="select password from CORE_USERS where logid=?" /&gt;<br />
&lt;property name="passwordEncoder" ref="passwordEncoder"/&gt;<br />
&lt;property name="dataSource" ref="dataSource" /&gt;<br />
&lt;/bean&gt;	<br />
</pre>
<br />
<br />
4.修改cas\webapp\WEB-INF\cas.properties,定义数据库连接资源,本例子是连接的oracle数据库
<br />
<pre name="code" class="properties">db.driver=oracle.jdbc.driver.OracleDriver<br />
db.url=jdbc\:oracle\:thin\:@192.168.1.1\:1521\:xxxx<br />
db.username=xxxx<br />
db.password=xxxx<br />
</pre>
<br />
<br />
5.增加相关jar包到cas\webapp\WEB-INF\lib\目录下:
<br />
cas-server-support-jdbc-3.2.jar (cas连接数据库的支持包)
<br />
ojdbc14.jar (连接oracle数据的jdbc驱动程序)
<br />
<span style="color: red;">
<a href="http://lib.javaeye.com/blog/165538#comments" style="color: red;">本文的讨论也很精彩，浏览讨论&gt;&gt;</a>
</span>
<br />
<br />
<br />
<span style="color: #e28822;">JavaEye推荐</span>
<br />
<a href="/adverts/41" target="_blank"><span style="color: red; font-weight: bold;">中国领先的电子商务网站－淘宝网招贤纳士，诚聘Java工程师</span></a>
<br />
<br />
<br />
<br />
文章来源:<a href="http://lib.javaeye.com/blog/165538">http://lib.javaeye.com/blog/165538</a> 
<img src ="http://www.blogjava.net/jacally/aggbug/186659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2008-02-27 17:46 <a href="http://www.blogjava.net/jacally/articles/186659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]CAS 单点登录安装笔记1 -- 基本设置与数字证书的安装</title><link>http://www.blogjava.net/jacally/articles/186660.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Tue, 26 Feb 2008 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/186660.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/186660.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/186660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/186660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/186660.html</trackback:ping><description><![CDATA[<br />
网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
作者: <a href="http://lib.javaeye.com">jacally</a>&nbsp;
链接：<a href="http://lib.javaeye.com/blog/165196" style="color: red;">http://lib.javaeye.com/blog/165196</a>&nbsp;
发表时间: 2008年02月26日
<br />
<br />
声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
<br />
<br />
安装JA-SIG SSO系统笔记1
<br />
<br />
(关于配置访问数据库的用户表见<a href="http://lib.javaeye.com/blog/165538" target="_blank">安装JA-SIG SSO系统笔记2</a>)
<br />
(与acegi结合配置见<a href="http://lib.javaeye.com/blog/165980" target="_blank">安装JA-SIG SSO系统笔记3</a>)
<br />
(ASP.NET client端的设置见<a href="http://lib.javaeye.com/blog/166619" target="_blank">安装JA-SIG SSO系统笔记4</a>)
<br />
<br />
ps:配置中的文件路径根据自己的实际情况的设定
<br />
<br />
1.安装JA-SIG 到 TOMCAT;
<br />
JA-SIG下载地址:
<br />
<a href="http://www.ja-sig.org/products/cas/downloads/index.html" target="_blank">http://www.ja-sig.org/products/cas/downloads/index.html</a>
<br />
<br />
2.生成数字证书,见批处理文件"cas 生成数字证书.bat";
<br />
<br />
3.配置Tomcat的HTTPS服务,修改server.xml
<br />
<pre name="code" class="xml">		&lt;Connector protocol="org.apache.coyote.http11.Http11Protocol"<br />
port="8443" minSpareThreads="5" maxSpareThreads="75"<br />
enableLookups="true" disableUploadTimeout="true" <br />
acceptCount="100"  maxThreads="200"<br />
scheme="https" secure="true" SSLEnabled="true"<br />
keystoreFile="C:/Documents and Settings/Administrator/.keystore" keystorePass="changeit"<br />
truststoreFile="D:/Java/jdk1.6.0_02/jre/lib/security/cacerts"<br />
clientAuth="false" sslProtocol="TLS"/&gt;<br />
</pre>
<br />
<br />
4.导出 SERVER 的证书，用来给所有需要用到的客户端导入,见"导出 cas 数字证书.bat"
<br />
<br />
5.在客户端的 JVM 里导入信任的 SERVER 的证书 ( 根据情况有可能需要管理员权限 ),见"导入 cas 证书.bat"；
<br />
<br />
5.修改客户端服务程序,加入cas过滤器,修改web.xml
<br />
<pre name="code" class="xml">	&lt;!-- CAS --&gt;<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;CAS Filter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;<br />
&lt;param-value&gt;https://sso.gzps.net:8443/cas/login&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;<br />
&lt;param-value&gt;https://sso.gzps.net:8443/cas/serviceValidate&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;<br />
&lt;param-value&gt;88.148.29.54:8080&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;CAS Filter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;	<br />
<br />
</pre>
<br />
<span style="color: red;">
<a href="http://lib.javaeye.com/blog/165196#comments" style="color: red;">本文的讨论也很精彩，浏览讨论&gt;&gt;</a>
</span>
<br />
<br />
<br />
<span style="color: #e28822;">JavaEye推荐</span>
<br />
<a href="/adverts/41" target="_blank"><span style="color: red; font-weight: bold;">中国领先的电子商务网站－淘宝网招贤纳士，诚聘Java工程师</span></a>
<br />
<br />
<br />
<br />
文章来源:<a href="http://lib.javaeye.com/blog/165196">http://lib.javaeye.com/blog/165196</a> 
<img src ="http://www.blogjava.net/jacally/aggbug/186660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2008-02-26 16:35 <a href="http://www.blogjava.net/jacally/articles/186660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 插件集合</title><link>http://www.blogjava.net/jacally/articles/127889.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Tue, 03 Jul 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/127889.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/127889.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/127889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/127889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/127889.html</trackback:ping><description><![CDATA[JSBuilder:<br><strong>http://download.macromedia.com/pub/labs/jseclipse/autoinstall/</strong>&nbsp;<br>xfire:<br>&nbsp;<a href="http://dist.codehaus.org/xfire/update/">ttp://dist.codehaus.org/xfire/update/</a><br>m2eclipse:<br><a href="http://m2eclipse.codehaus.org/">http://m2eclipse.codehaus.org/</a>
<img src ="http://www.blogjava.net/jacally/aggbug/127889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-07-03 16:43 <a href="http://www.blogjava.net/jacally/articles/127889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用java.util.Collections.sort方法排序</title><link>http://www.blogjava.net/jacally/articles/107198.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Thu, 29 Mar 2007 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/107198.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/107198.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/107198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/107198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/107198.html</trackback:ping><description><![CDATA[利用java.util.Collections.sort方法排序<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">所有选项集合</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;lsDefineOptions&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ArrayList();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_98_842_Open_Image onclick="this.style.display='none'; Codehighlighter1_98_842_Open_Text.style.display='none'; Codehighlighter1_98_842_Closed_Image.style.display='inline'; Codehighlighter1_98_842_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_98_842_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_842_Closed_Text.style.display='none'; Codehighlighter1_98_842_Open_Image.style.display='inline'; Codehighlighter1_98_842_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">lsOptions.size();j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_98_842_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_98_842_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;option&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Element)&nbsp;lsOptions.get(j);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;option.getAttributeValue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">label</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;option.getAttributeValue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">index</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;flowstate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;option.getAttributeValue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">flowstate</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;querySql&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;option.getChildText(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">query-sql</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&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">操作项对象</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></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;SearchOptionDefine&nbsp;defineOption&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SearchOptionDefine();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defineOption.setLabel(label);<br><img id=Codehighlighter1_537_598_Open_Image onclick="this.style.display='none'; Codehighlighter1_537_598_Open_Text.style.display='none'; Codehighlighter1_537_598_Closed_Image.style.display='inline'; Codehighlighter1_537_598_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_537_598_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_537_598_Closed_Text.style.display='none'; Codehighlighter1_537_598_Open_Image.style.display='inline'; Codehighlighter1_537_598_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&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">(StringUtils.isNotBlank(index))</span><span id=Codehighlighter1_537_598_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_537_598_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defineOption.setIndex(Integer.parseInt(index));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_642_711_Open_Image onclick="this.style.display='none'; Codehighlighter1_642_711_Open_Text.style.display='none'; Codehighlighter1_642_711_Closed_Image.style.display='inline'; Codehighlighter1_642_711_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_642_711_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_642_711_Closed_Text.style.display='none'; Codehighlighter1_642_711_Open_Image.style.display='inline'; Codehighlighter1_642_711_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&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">(StringUtils.isNotBlank(flowstate))</span><span id=Codehighlighter1_642_711_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_642_711_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defineOption.setFlowstate(Integer.parseInt(flowstate));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defineOption.setQuerySql(querySql);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.debug(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">querySql:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">querySql);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lsDefineOptions.add(defineOption);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&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">所有选项集合的排序</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.util.Collections.sort(lsDefineOptions);</span></div>
<span style="COLOR: #008000">操作项对象</span><span style="COLOR: #000000">SearchOptionDefine&nbsp;必须实现Comparable接口<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;com.mip.core.objects;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.Serializable;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_61_172_Open_Image onclick="this.style.display='none'; Codehighlighter1_61_172_Open_Text.style.display='none'; Codehighlighter1_61_172_Closed_Image.style.display='inline'; Codehighlighter1_61_172_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_61_172_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_172_Closed_Text.style.display='none'; Codehighlighter1_61_172_Open_Image.style.display='inline'; Codehighlighter1_61_172_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_61_172_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_61_172_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;p&gt;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;主题查询对象<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;&lt;/p&gt;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000">&nbsp;Libin<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;@date&nbsp;Mar&nbsp;29,&nbsp;2007<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span><span style="COLOR: #808080">@version</span><span style="COLOR: #008000">&nbsp;4.0<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span><span style="COLOR: #808080">@see</span><span style="COLOR: #008000">&nbsp;AnotherClass<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_241_1454_Open_Image onclick="this.style.display='none'; Codehighlighter1_241_1454_Open_Text.style.display='none'; Codehighlighter1_241_1454_Closed_Image.style.display='inline'; Codehighlighter1_241_1454_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_241_1454_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_241_1454_Closed_Text.style.display='none'; Codehighlighter1_241_1454_Open_Image.style.display='inline'; Codehighlighter1_241_1454_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;SearchOptionDefine&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;Serializable,Comparable&nbsp;</span><span id=Codehighlighter1_241_1454_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_241_1454_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_245_257_Open_Image onclick="this.style.display='none'; Codehighlighter1_245_257_Open_Text.style.display='none'; Codehighlighter1_245_257_Closed_Image.style.display='inline'; Codehighlighter1_245_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_245_257_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_245_257_Closed_Text.style.display='none'; Codehighlighter1_245_257_Open_Image.style.display='inline'; Codehighlighter1_245_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_245_257_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_245_257_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&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">final</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;serialVersionUID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3256440313546683697L</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_329_355_Open_Image onclick="this.style.display='none'; Codehighlighter1_329_355_Open_Text.style.display='none'; Codehighlighter1_329_355_Closed_Image.style.display='inline'; Codehighlighter1_329_355_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_329_355_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_329_355_Closed_Text.style.display='none'; Codehighlighter1_329_355_Open_Image.style.display='inline'; Codehighlighter1_329_355_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_329_355_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_329_355_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">&nbsp;A&nbsp;int&nbsp;variable&nbsp;所有状态标志</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&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">final</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ALL_STATE</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">999</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_400_437_Open_Image onclick="this.style.display='none'; Codehighlighter1_400_437_Open_Text.style.display='none'; Codehighlighter1_400_437_Closed_Image.style.display='inline'; Codehighlighter1_400_437_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_400_437_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_400_437_Closed_Text.style.display='none'; Codehighlighter1_400_437_Open_Image.style.display='inline'; Codehighlighter1_400_437_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_400_437_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_400_437_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Constructs&nbsp;a&nbsp;SearchDefine<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_467_504_Open_Image onclick="this.style.display='none'; Codehighlighter1_467_504_Open_Text.style.display='none'; Codehighlighter1_467_504_Closed_Image.style.display='inline'; Codehighlighter1_467_504_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_467_504_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_467_504_Closed_Text.style.display='none'; Codehighlighter1_467_504_Open_Image.style.display='inline'; Codehighlighter1_467_504_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;SearchOptionDefine()</span><span id=Codehighlighter1_467_504_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_467_504_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flowstate</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ALL_STATE;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_509_634_Open_Image onclick="this.style.display='none'; Codehighlighter1_509_634_Open_Text.style.display='none'; Codehighlighter1_509_634_Closed_Image.style.display='inline'; Codehighlighter1_509_634_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_509_634_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_509_634_Closed_Text.style.display='none'; Codehighlighter1_509_634_Open_Image.style.display='inline'; Codehighlighter1_509_634_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_509_634_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_509_634_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;主题查询的每一项定义:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;label:对应下拉框显示的中文名称<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;index:排序序号<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;flowstate:对应流程状态,结合流程状态来确定是否显示当前选项<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;query_sql:原生SQL语句,主题查询的条件<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;label;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Integer&nbsp;index;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;Integer&nbsp;flowstate;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;querySql;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_771_794_Open_Image onclick="this.style.display='none'; Codehighlighter1_771_794_Open_Text.style.display='none'; Codehighlighter1_771_794_Closed_Image.style.display='inline'; Codehighlighter1_771_794_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_771_794_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_771_794_Closed_Text.style.display='none'; Codehighlighter1_771_794_Open_Image.style.display='inline'; Codehighlighter1_771_794_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Integer&nbsp;getFlowstate()&nbsp;</span><span id=Codehighlighter1_771_794_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_771_794_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;flowstate;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_841_874_Open_Image onclick="this.style.display='none'; Codehighlighter1_841_874_Open_Text.style.display='none'; Codehighlighter1_841_874_Closed_Image.style.display='inline'; Codehighlighter1_841_874_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_841_874_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_841_874_Closed_Text.style.display='none'; Codehighlighter1_841_874_Open_Image.style.display='inline'; Codehighlighter1_841_874_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&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;setFlowstate(Integer&nbsp;flowstate)&nbsp;</span><span id=Codehighlighter1_841_874_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_841_874_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.flowstate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;flowstate;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_903_922_Open_Image onclick="this.style.display='none'; Codehighlighter1_903_922_Open_Text.style.display='none'; Codehighlighter1_903_922_Closed_Image.style.display='inline'; Codehighlighter1_903_922_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_903_922_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_903_922_Closed_Text.style.display='none'; Codehighlighter1_903_922_Open_Image.style.display='inline'; Codehighlighter1_903_922_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Integer&nbsp;getIndex()&nbsp;</span><span id=Codehighlighter1_903_922_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_903_922_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;index;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_961_986_Open_Image onclick="this.style.display='none'; Codehighlighter1_961_986_Open_Text.style.display='none'; Codehighlighter1_961_986_Closed_Image.style.display='inline'; Codehighlighter1_961_986_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_961_986_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_961_986_Closed_Text.style.display='none'; Codehighlighter1_961_986_Open_Image.style.display='inline'; Codehighlighter1_961_986_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&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;setIndex(Integer&nbsp;index)&nbsp;</span><span id=Codehighlighter1_961_986_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_961_986_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;index;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1014_1033_Open_Image onclick="this.style.display='none'; Codehighlighter1_1014_1033_Open_Text.style.display='none'; Codehighlighter1_1014_1033_Closed_Image.style.display='inline'; Codehighlighter1_1014_1033_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1014_1033_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1014_1033_Closed_Text.style.display='none'; Codehighlighter1_1014_1033_Open_Image.style.display='inline'; Codehighlighter1_1014_1033_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;String&nbsp;getLabel()&nbsp;</span><span id=Codehighlighter1_1014_1033_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1014_1033_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;label;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1071_1096_Open_Image onclick="this.style.display='none'; Codehighlighter1_1071_1096_Open_Text.style.display='none'; Codehighlighter1_1071_1096_Closed_Image.style.display='inline'; Codehighlighter1_1071_1096_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1071_1096_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1071_1096_Closed_Text.style.display='none'; Codehighlighter1_1071_1096_Open_Image.style.display='inline'; Codehighlighter1_1071_1096_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&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;setLabel(String&nbsp;label)&nbsp;</span><span id=Codehighlighter1_1071_1096_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1071_1096_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;label;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1127_1149_Open_Image onclick="this.style.display='none'; Codehighlighter1_1127_1149_Open_Text.style.display='none'; Codehighlighter1_1127_1149_Closed_Image.style.display='inline'; Codehighlighter1_1127_1149_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1127_1149_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1127_1149_Closed_Text.style.display='none'; Codehighlighter1_1127_1149_Open_Image.style.display='inline'; Codehighlighter1_1127_1149_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;String&nbsp;getQuerySql()&nbsp;</span><span id=Codehighlighter1_1127_1149_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1127_1149_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;querySql;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1194_1226_Open_Image onclick="this.style.display='none'; Codehighlighter1_1194_1226_Open_Text.style.display='none'; Codehighlighter1_1194_1226_Closed_Image.style.display='inline'; Codehighlighter1_1194_1226_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1194_1226_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1194_1226_Closed_Text.style.display='none'; Codehighlighter1_1194_1226_Open_Image.style.display='inline'; Codehighlighter1_1194_1226_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&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;setQuerySql(String&nbsp;query_sql)&nbsp;</span><span id=Codehighlighter1_1194_1226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1194_1226_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.querySql&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;query_sql;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_1266_1301_Open_Image onclick="this.style.display='none'; Codehighlighter1_1266_1301_Open_Text.style.display='none'; Codehighlighter1_1266_1301_Closed_Image.style.display='inline'; Codehighlighter1_1266_1301_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1266_1301_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1266_1301_Closed_Text.style.display='none'; Codehighlighter1_1266_1301_Open_Image.style.display='inline'; Codehighlighter1_1266_1301_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;compareTo(Integer&nbsp;arg0)&nbsp;</span><span id=Codehighlighter1_1266_1301_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1266_1301_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;index.compareTo(arg0);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_1339_1446_Open_Image onclick="this.style.display='none'; Codehighlighter1_1339_1446_Open_Text.style.display='none'; Codehighlighter1_1339_1446_Closed_Image.style.display='inline'; Codehighlighter1_1339_1446_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1339_1446_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1339_1446_Closed_Text.style.display='none'; Codehighlighter1_1339_1446_Open_Image.style.display='inline'; Codehighlighter1_1339_1446_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;compareTo(Object&nbsp;obj)&nbsp;</span><span id=Codehighlighter1_1339_1446_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1339_1446_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getIndex()&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;((SearchOptionDefine)obj).getIndex());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
</span>
<img src ="http://www.blogjava.net/jacally/aggbug/107198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-03-29 13:15 <a href="http://www.blogjava.net/jacally/articles/107198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>permgen space报错</title><link>http://www.blogjava.net/jacally/articles/103988.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Thu, 15 Mar 2007 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/103988.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/103988.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/103988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/103988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/103988.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html">http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html</a>
		</p>
		<p>
				<br />PermGen space的全称是Permanent Generation space,是指内存的永久保存区域<br />OutOfMemoryError: PermGen space从表面上看就是内存益出，解决方法也一定是加大<br />内存。说说为什么会内存益出：这一部分用于存放Class和Meta的信息,Class在被 Load<br />的时候被放入PermGen space区域，它和和存放Instance的Heap区域不同,GC(Garbage<br />Collection)不会在主程序运行期对PermGen space进行清理，所以如果你的APP会LOAD<br />很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进<br />行pre compile的时候。</p>
		<p>改正方法：-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m</p>
		<p>
				<br />这里以tomcat环境为例，其它WEB服务器如jboss,weblogic等是同一个道理。<br />一、java.lang.OutOfMemoryError: PermGen space</p>
		<p>PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,<br />这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen<br />space中,<br />它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运<br />行期对<br />PermGen space进行清理，所以如果你的应用中有很多CLASS的话,就很可能出现PermGen<br />space错误,<br />这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大<br />量的第三方jar, 其大小<br />超过了jvm默认的大小(4M)那么就会产生此错误信息了。<br />解决方法： 手动设置MaxPermSize大小</p>
		<p>修改TOMCAT_HOME/bin/catalina.sh<br />在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行：<br />JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m<br />建议：将相同的第三方jar文件移置到tomcat/shared/lib目录下，这样可以达到减少<br />jar 文档重复占用内存的目的。</p>
<img src ="http://www.blogjava.net/jacally/aggbug/103988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-03-15 11:56 <a href="http://www.blogjava.net/jacally/articles/103988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL语言详解(摘抄)</title><link>http://www.blogjava.net/jacally/articles/102997.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Sat, 10 Mar 2007 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/102997.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/102997.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/102997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/102997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/102997.html</trackback:ping><description><![CDATA[
		<div id="loading" style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: #cccccc 1px solid; DISPLAY: none; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: 12px; LEFT: 824px; PADDING-BOTTOM: 0px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 160px; COLOR: #000000; PADDING-TOP: 0px; BORDER-BOTTOM: #cccccc 1px solid; POSITION: absolute; TOP: 3036px; HEIGHT: 30px; BACKGROUND-COLOR: #ffffaf">正在处理您的请求...</div>
		<script language="javascript" type="text/javascript">
				<!--
		function getObject(objectId)
		{
			if(document.getElementById)
			{
				return document.getElementById(objectId)
			}
			else if(document.all&&document.all(objectId))
			{
				return document.all(objectId)
			}
			else
			{
				return false
			}
		}
		
		function hideObject(objectId)
		{
			var obj=getObject(objectId);
						
			if(obj&&obj.style)
			{
				obj.style.display="none";					
				return true
			}
			return false
		}
		
		function showObject(objectId)
		{
			var obj=getObject(objectId);
			if(obj&&obj.style)
			{
				obj.style.display="";
				return true
			}
			return false
		}
		
		function hideComment(){
			hideObject("commentForm");
			hideObject("commentform");
			return;
		}
		
		function showComment(){
			return;
		}
	//-->
		</script>
		<form language="javascript" id="Form1" name="Form1" onsubmit="javascript:return WebForm_OnSubmit();" action="193676.aspx" method="post">
				<div id="leftmenu">
						<div style="CLEAR: both">
						</div>
				</div>
				<script><![CDATA[unction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}]]&gt;</script>
				<div class="post">
						<div class="postTitle">
								<a href="http://blog.csdn.net/leek2000/archive/2004/11/24/193676.aspx">
										<img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" /> JSTL 入门：表达式语言简化对 JSP 应用的软件维护</a>
						</div>
						<div class="postText">JSP 标准标记库（JSP Standard Tag Library，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a>）是一个实现 Web 应用程序中常见的通用功能的定制标记库集，这些功能包括迭代和条件判断、数据管理格式化、<a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 操作以及数据库访问。在 developerWorks 上其新系列的第一篇文章中，软件工程师 Mark Kolb 向您展示了如何使用 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 标记来避免在 JSP 页面中使用脚本编制元素。您还将了解如何通过从表示层删除源代码来简化软件维护。最后，您将了解 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 经过简化的表达式语言，它允许在不必使用功能齐全的编程语言的情况下对 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 操作指定动态属性值。<br /><br />　　JavaServer Pages（JSP）是用于 J2EE 平台的标准表示层技术。JSP 技术提供了用于执行计算（这些计算用来动态地生成页面内容）的脚本编制元素和操作。脚本编制元素允许在 JSP 页面中包括程序源代码，在为响应用户请求而呈现页面时可以执行这些源代码。操作将计算操作封装到很象 HTML 或 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 标记的标记中，JSP 页面的模板文本通常包含这些标记。JSP 规范只将几种操作定义成了标准，但从 JSP 1.1 开始，开发人员已经能够以定制标记库的方式创建其自己的操作了。<br /><br />　　JSP 标准标记库（<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a>）是 JSP 1.2 定制标记库集，这些标记库实现大量服务器端 Java 应用程序常用的基本功能。通过为典型表示层任务（如数据格式化和迭代或条件内容）提供标准实现，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 使 JSP 作者可以专注于特定于应用程序的开发需求，而不是为这些通用操作“另起炉灶”。<br /><br />　　当然，您可以使用 JSP 脚本编制元素（scriptlet、表达式和声明）来实现此类任务。例如，可以使用三个 scriptlet 实现条件内容，清单 1 中着重显示了这三个 scriptlet。但是，因为脚本编制元素依赖于在页面中嵌入程序源代码（通常是 Java 代码），所以对于使用这些脚本编制元素的 JSP 页面，其软件维护任务的复杂度大大增加了。例如，清单 1 中的 scriptlet 示例严格地依赖于花括号的正确匹配。如果不经意间引入了一个语法错误，则条件内容中的嵌套其它 scriptlet 可能会造成严重破坏，并且在 JSP 容器编译该页面时，要使所产生的错误信息有意义可能会很困难。<br /><br /><ccid_code>　　清单 1. 通过 scriptlet 实现条件内容 &lt;% if (user.getRole() == "member")) { %&gt;</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;p&gt;Welcome, member!&lt;/p&gt;&lt;% } else { %&gt;    &lt;p&gt;Welcome, guest!&lt;/p&gt;&lt;% } %&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　修正此类问题通常需要相当丰富的编程经验。尽管通常会由十分精通页面布局和图形设计的设计人员来开发和维护 JSP，但是同一页面中的脚本编制元素出现问题时，需要程序员的介入。这种状况将单个文件中代码的责任分担给多人，因而使得开发、调试和增强此类 JSP 页面成为很麻烦的任务。通过将常用功能包装到定制标记库的标准集合中，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 使 JSP 作者可以减少对编制脚本元素的需求，甚至可以不需要它们，并避免了相关的维护成本。</ccid_code><br /><br />　　<b><a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0</b><br /><br /><ccid_code>　　<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0 发布于 2002 年 6 月，由四个定制标记库（core、format、xml 和 sql）和一对通用标记库验证器（ScriptFreeTLV 和 PermittedTaglibsTLV）组成。core 标记库提供了定制操作，通过限制了作用域的变量管理数据，以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义，format 标记库定义了用来格式化数据（尤其是数字和日期）的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记，这些标记用来操作通过 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 表示的数据，而 sql 库定义了用来查询关系数据库的操作。<br /><br />　　两个 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素 — scriptlet、表达式和声明。类似地，PermittedTaglibsTLV 验证器可以用来限制可能由应用程序的 JSP 页面访问的定制标记库集（包括 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 标记库）。<br /><br />　　尽管 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 最终将会成为 J2EE 平台的必需组件，但目前只有少数应用程序服务器包括它。<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0 的参考实现可作为 Apache 软件基金会（Apache Software Foundation）的 Jakarta Taglibs 项目（请参阅参考资料）的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器，以添加对 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 的支持。</ccid_code><br /><br />　　<b>表达式语言</b><br /><br /><ccid_code>　　在 JSP 1.2 中，可以使用静态字符串或表达式（如果允许的话）指定 JSP 操作的属性。例如，在清单 2 中，对 &lt;jsp:setProperty&gt; 操作的 name 和 property 属性指定了静态值，而用表达式指定了其 value 属性。这个操作的效果是将请求参数的当前值赋予命名的 bean 特性。以这种形式使用的表达式被称为请求时属性值（request-time attribute value），这是构建到 JSP 规范中的用于动态指定属性值的唯一机制。<br /><br />　　清单 2. 合并请求时属性值的 JSP 操作</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;jsp:setProperty name="user" property="timezonePref"                 value='&lt;%= request.getParameter("timezone") %&gt;'/&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　因为请求时属性值是用表达式指定的，所以它们往往有和其它脚本元素一样的软件维护问题。因此，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 定制标记支持另一种用于指定动态属性值的机制。可以用简化的表达式语言（EL）而不使用完整的 JSP 表达式来指定 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 操作的属性值。EL 提供了一些标识符、存取器和运算符，用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以 EcmaScript（请参阅参考资料）和 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 路径语言（<a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> Path Language，XPath）为基础，因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性，然后对它们执行简单操作；它不是编程语言，甚至不是脚本编制语言。但是，与 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 标记一起使用时，它就能使用简单而又方便的符号来表示复杂的行为。EL 表达式的格式是这样的：用美元符号（$）定界，内容包括在花括号（{}）中，如清单 3 所示。<br /><br />　　清单 3. 说明 EL 表达式定界符的 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 操作<br /><br />　　&lt;c:out value="${user.firstName}"/&gt;</ccid_code><br /><br /><ccid_code>　　此外，您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值，如清单 4 所示。单独的表达式由标识符、存取器、文字和运算符组成。标识符用来引用存储在数据中心中的数据对象。EL 有 11 个保留标识符，对应于 11 个 EL 隐式对象。假定所有其它标识符都引用限制了作用域的变量。存取器用来检索对象的特性或集合的元素。文字表示固定的值 — 数字、字符、字符串、布尔型或空值。运算符允许对数据和文字进行组合以及比较。<br /><br />　　清单 4. 组合静态文本和多个 EL 表达式以指定动态属性值<br /><br />　　&lt;c:out value="Hello ${user.firstName} ${user.lastName}"/&gt;</ccid_code><br /><br />　　<b>限制了作用域的变量</b><br /><br /><ccid_code>　　JSP API 通过 &lt;jsp:useBean&gt; 操作允许从 JSP 容器内的四个不同作用域中存储和检索数据。<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展这一能力。此外，EL 提供将这些对象作为限制了作用域的变量进行检索的内置支持。特别地，任何出现在 EL 表达式中但不对应于任何 EL 隐式对象的标识符，都被自动假定为引用存储在四个 JSP 作用域的其中某个中的对象，这四个作用域是：</ccid_code><br /><br />　　<b>·</b>页面作用域<br /><br />　　<b>·</b>请求作用域<br /><br />　　<b>·</b>会话作用域<br /><br />　　<b>·</b>应用程序作用域<br /><br /><ccid_code>　　您可能还记得，只有在为特定请求处理页面期间才能检索存储在该页面作用域中的对象。如果对象是存储在请求作用域中的，可以在处理所有参与处理某请求的页面期间检索这些对象（譬如在对某个请求的处理中遇到了一个或多个 &lt;jsp:include&gt; 或 &lt;jsp:forward&gt; 操作）。如果对象是存储在会话作用域中的，则在与 Web 应用程序的交互式会话期间，可以由用户访问的任何页面检索它（即，直到与该用户交互相关联的 HttpSession 对象无效为止）。可以由任何用户从任何页面访问存储在应用程序作用域中的对象，直到卸载 Web 应用程序本身为止（通常是由于关闭 JSP 容器所致）。<br /><br />　　通过将字符串映射为期望作用域中的对象来将对象存储到该作用域。然后，就可以通过提供相同字符串来从该作用域检索该对象。在作用域的映射中查找字符串，并返回被映射的对象。在 Servlet API 中，将此类对象称为相应作用域的属性。但是，在 EL 的上下文中，也将与属性相关联的字符串看作变量的名称，该变量通过属性映射的方式获得特定的值。<br /><br />　　在 EL 中，与隐式对象无关联的标识符被认为是存储在四个 JSP 作用域中的名称对象。首先对页面作用域检查是否存在这样的标识符，其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查，然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法，可以将 EL 标识符看作引用限制了作用域的变量。<br /><br />　　从更技术的方面来说，没有映射到隐式对象的标识符是用 PageContext 实例的 findAttribute() 方法求值的，该实例表示对页面的处理，在该页面上，当前正在处理用于请求的表达式。标识符的名称作为参数传递给这个方法，然后该方法依次在四个作用域中搜索具有相同名称的属性。并将所找到的第一个匹配项作为 findAttribute() 方法的值返回。如果未在这四个作用域中找到这样的属性，则返回 null。<br /><br />　　最终，限制了作用域的变量是四个 JSP 作用域的属性，这些属性具有可以用作 EL 标识符的名称。只要对限制了作用域的变量赋予由字母数字组成的名称，就可以通过 JSP 中提供的用于设置属性的任何机制来创建它们。这包括内置的 &lt;jsp:useBean&gt; 操作，以及由 Servlet API 中的几个类定义的 setAttribute() 方法。此外，四个 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 库中定义的许多定制标记本身就能够设置作为限制了作用域的变量使用的属性值。</ccid_code><br /><br />　　<b>隐式对象</b><br /><br />　　表 1 中列出了 11 个 EL 隐式对象的标识符。不要将这些对象与 JSP 隐式对象（一共只有九个）混淆，其中只有一个对象是它们所共有的。<br /><br />　　表 1. EL 隐式对象<br /><br />　　类别 　　　标识符　　　　　　　　　　　　 描述<br /><br />　　JSP 　　　pageContext 　　PageContext 实例对应于当前页面的处理<br /><br />　　作用域　　pageScope 　　　 与页面作用域属性的名称和值相关联的 Map 类<br /><br />　　　　　　　requestScope 　　与请求作用域属性的名称和值相关联的 Map 类<br /><br />　　　　　　　sessionScope 　　与会话作用域属性的名称和值相关联的 Map 类<br /><br />　　　　　　　applicationScope 与应用程序作用域属性的名称和值相关联的 Map 类<br /><br />　　请求参数　param　　　　　 按名称存储请求参数的主要值的 Map 类<br /><br />　　　　　　　paramValues　 将请求参数的所有值作为 String 数组存储的 Map 类<br /><br />　　请求头 　header 　　　　按名称存储请求头主要值的 Map 类<br /><br />　　　　　　　headerValues　将请求头的所有值作为 String 数组存储的 Map 类<br /><br />　　Cookie 　cookie　　　　 按名称存储请求附带的 cookie 的 Map 类<br /><br />　　初始化参数 initParam 　　按名称存储 Web 应用程序上下文初始化参数的 Map 类<br /><br />　　<ccid_code> 　　尽管 JSP 和 EL 隐式对象中只有一个公共对象（pageContext），但通过 EL 也可以访问其它 JSP 隐式对象。原因是 pageContext 拥有访问所有其它八个 JSP 隐式对象的特性。实际上，这是将它包括在 EL 隐式对象中的主要理由。<br /><br />　　其余所有 EL 隐式对象都是映射，可以用来查找对应于名称的对象。前四个映射表示先前讨论的各种属性作用域。可以用它们来查找特定作用域中的标识符，而不用依赖于 EL 在缺省情况下使用的顺序查找过程。<br /><br />　　接下来的四个映射用来获取请求参数和请求头的值。因为 HTTP 协议允许请求参数和请求头具有多个值，所以它们各有一对映射。每对中的第一个映射返回请求参数或头的主要值，通常是恰巧在实际请求中首先指定的那个值。每对中第二个映射允许检索参数或头的所有值。这些映射中的键是参数或头的名称，但这些值是 String 对象的数组，其中的每个元素都是单一参数值或头值。<br /><br />　　cookie 隐式对象提供了对由请求设置的 cookie 名称的访问。这个对象将所有与请求相关联的 cookie 名称映射到表示那些 cookie 特性的 Cookie 对象。<br /><br />　　最后一个 EL 隐式对象 initParam 是一个映射，它储存与 Web 应用程序相关联的所有上下文的初始化参数的名称和值。初始化参数是通过 web.xml 部署描述符文件指定的，该文件位于应用程序的 WEB-INF 目录中。</ccid_code><br /><br />　　<b>存取器</b><br /><br /><ccid_code>　　因为 EL 标识符是作为隐式对象或限制了作用域的变量（通过属性来实现）解析的，因此有必要将它们转换成 Java 对象。EL 可以自动包装和解包其相应的 Java 类中的基本类型（例如，可以在后台将 int 强制转换成 Integer 类，反之亦可），但大多数的标识符将成为指向完整的 Java 对象的指针。<br /><br />　　结果是，对这些对象的特性或（在对象是数组和集合的情况下）对其元素的访问通常是令人满意的。就为了实现这种用途，EL 提供了两种不同的存取器（点运算符（.）和方括号运算符（[]）），也支持通过 EL 操作特性和元素。<br /><br />　　点运算符通常用于访问对象的特性。例如，在表达式 ${user.firstName} 中，使用点运算符来访问 user 标识符所引用对象的名为 firstName 的特性。EL 使用 Java bean 约定访问对象特性，因此必须定义这个特性的 getter 方法（通常是名为 getFirstName() 的方法），以便表达式正确求值。当被访问的特性本身是对象时，可以递归地应用点运算符。例如，如果我们虚构的 user 对象有一个实现为 Java 对象的 address 特性，那么也可以用点运算符来访问这个对象的特性。例如，表达式 ${user.address.city} 将会返回这个地址对象嵌套的 city 特性。<br /><br />　　方括号运算符用来检索数组和集合的元素。在数组和有序集合（也即，实现了 java.util.List 接口的集合）的情况下，把要检索的元素的下标放在方括号中。例如，表达式 ${urls[3]} 返回 urls 标识符所引用的数组或集合的第四个元素（和 Java 语言以及 JavaScript 中一样，EL 中的下标是从零开始的）。<br /><br />　　对于实现 java.util.Map 接口的集合，方括号运算符使用关联的键查找存储在映射中的值。在方括号中指定键，并将相应的值作为表达式的值返回。例如，表达式 ${commands["dir"]} 返回与 commands 标识符所引用的 Map 中的 "dir" 键相关联的值。<br /><br />　　对于上述两种情况，都可允许表达式出现在方括号中。对嵌套表达式求值的结果将被作为下标或键，用来检索集合或数组的适当元素。和点运算符一样，方括号运算符也可以递归应用。这使得 EL 能够从多维数组、嵌套集合或两者的任意组合中检索元素。此外，点运算符和方括号运算符还可以互操作。例如，如果数组的元素本身是对象，则可以使用方括号运算符来检索该数组的元素，并结合点运算符来检索该元素的一个特性（例如 ${urls[3].protocol}）。<br /><br />　　假定 EL 充当指定动态属性值的简化语言，EL 存取器有一个有趣的功能（与 Java 语言的存取器不同），那就是它们在应用于 null 时不抛出异常。如果应用 EL 存取器的对象（例如，${foo.bar} 和 ${foo["bar"]} 中的 foo 标识符）是 null，那么应用存取器的结果也是 null。事实证明，在大多数情况下，这是一个相当有用的行为，不久您就会了解这一点。<br /><br />　　最后，点运算符和方括号运算符可能实现某种程度的互换。例如，也可以使用 ${user["firstName"]} 来检索 user 对象的 firstName 特性，正如可以用 ${commands.dir} 获取与 commands 映射中的 "dir" 键相关联的值一样。</ccid_code><br /><br />　　<b>运算符</b><br /><br /><ccid_code>　　EL 还可以通过使用标识符和存取器，遍历包含应用程序数据（通过限制了作用域的变量公开）或关于环境的信息（通过 EL 隐式对象）的对象层次结构。但是，只是访问这些数据，通常不足以实现许多 JSP 应用程序所需的表示逻辑。<br /><br />　　最终，EL 还包括了几个用来操作和比较 EL 表达式所访问数据的运算符。表 2 中汇总了这些运算符。<br /><br />　　表 2. EL 运算符<br /><br />　　类别 　　　　运算符<br /><br />　　算术运算符　　+、-、*、/（或 div）和 %（或 mod）<br /><br />　　关系运算符 　==（或 eq）、!=（或 ne）、&lt;&lt;/code&gt;（或 lt）、&gt;（或 gt）、&lt;=（或 le）和 &gt;=（或 ge）<br /><br />　　逻辑运算符　　&amp;&amp;（或 and）、||（或 or）和 !（或 not）<br /><br />　　验证运算符 　empty</ccid_code><br /><br />　　算术运算符支持数值的加法、减法、乘法和除法。还提供了一个求余运算符。注：除法和求余运算符都有替代的、非符号的名称（为的是与 XPath 保持一致）。清单 5 中显示了一个演示算术运算符用法的示例表达式。对几个 EL 表达式应用算术运算符的结果是将该算术运算符应用于这些表达式返回的数值所得的结果。<br /><br />　　清单 5. 利用算术运算符的 EL 表达式<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>${item.price * (1 + taxRate[user.address.zipcode])}</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />　　关系运算符允许比较数字或文本数据。比较的结果作为布尔值返回。逻辑运算符允许合并布尔值，返回新的布尔值。因此，可以将 EL 逻辑运算符应用于嵌套的关系或逻辑运算符的结果，如清单 6 所示。<br /><br />　　清单 6. 利用关系和逻辑运算符的 EL 表达式<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>${(x &gt;= min) &amp;&amp; (x &lt;= max)}</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />　　最后一种 EL 运算符是 empty，它对于验证数据特别有用。empty 运算符采用单个表达式作为其变量（也即，${empty input}），并返回一个布尔值，该布尔值表示对表达式求值的结果是不是“空”值。求值结果为 null 的表达式被认为是空，即无元素的集合或数组。如果参数是对长度为零的 String 求值所得的结果，则 empty 运算符也将返回 true。<br /><br />　　表 3 显示了 EL 运算符的优先级。正如清单 5 和 6 所示，可以用圆括号对表达式分组，高于普通的优先级规则。<br /><br />　　表 3. EL 运算符优先级（自顶到底，从左到右）<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>[], . () unary -、not、!、empty *、/、div、%、mod +、binary - () &lt;&lt;/code&gt;、&gt;、&lt;=、&gt;=、lt、gt、le、ge ==、!=、eq、ne &amp;&amp;、and ||、or</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />　　<b>文字</b><br /><br />　　在 EL 表达式中，数字、字符串、布尔值和 null 都可以被指定为文字值。字符串可以用单引号或双引号定界。布尔值被指定为 true 和 false。<br /><br />　　<b>Taglib 伪指令</b><br /><br />　　正如我们先前讨论的，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0 包括四个定制标记库。为了演示 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 标记和表达式语言的交互，我们将研究几个来自 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> core 库的标记。和使用任何 JSP 定制标记库一样，必须在您想要使用这个库标记的任何页面中包括 taglib 伪指令。清单 7 显示了用于这个特定库的伪指令。<br /><br />　　清单 7. 用于 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> core 库 EL 版本的 taglib 伪指令<br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　实际上，对应于 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> core 库的 taglib 伪指令有两种，因为在 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0 中，EL 是可选的。所有四个 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0 定制标记库都有使用 JSP 表达式（而不是 EL）指定动态属性值的备用版本。因为这些备用库依赖于 JSP 的更传统的请求时属性值，所以它们被称为 RT 库，而那些使用表达式语言的则被称为 EL 库。开发人员用不同的 taglib 伪指令来区分每个库的这两个版本。清单 8 显示了使用 core 库的 RT 版本的伪指令。但是，由于现在我们讨论的重点是 EL，所以首先需要这些伪指令。<br /><br />　　清单 8. 用于 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> core 库 RT 版本的 taglib 伪指令</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />　　<b>变量标记</b><br /><br /><ccid_code>　　我们首先要考虑的 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 定制标记是 &lt;c:set&gt; 操作。正如已经说明的，限制了作用域的变量在 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 中起关键作用，&lt;c:set&gt; 操作提供基于标记的机制来创建和设置限制了作用域的变量。清单 9 中显示了该操作的语法，其中 var 属性指定了限制了作用域的变量的名称，scope 属性表明了该变量驻留在哪个作用域中，value 属性指定了分配给该变量的值。如果指定变量已经存在，则简单地将所指明的值赋给它。如果不存在，则创建新的限制了作用域的变量，并用该值初始化这个变量。<br /><br />　　清单 9. &lt;c:set&gt; 操作的语法</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:set var="name" scope="scope" value="expression"/&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　scope 属性是可选的，其缺省值是 page。<br /><br />　　清单 10 中显示了 &lt;c:set&gt; 的两个示例。在第一个示例中，将会话作用域变量设置成 String 值。在第二个示例中，用表达式来设置数值：将页面作用域内名为 square 的变量赋值为名为 x 的请求参数的值的平方。<br /><br />　　清单 10. &lt;c:set&gt; 操作示例</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:set var="timezone" scope="session" value="CST"/&gt;&lt;c:set var="square" value="${param['x'] * param['x']}"/&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　您还可以将限制了作用域的变量的值指定为 &lt;c:set&gt; 操作的主体内容，而不是使用属性。使用这种方法，您可以重新编写清单 10 中的第一个示例，如清单 11 所示。此外，正如我们马上可以看到的，&lt;c:set&gt; 标记的主体内容本身也可以使用定制标记。&lt;c:set&gt; 主体内生成的所有内容都将作为一个 String 值赋给指定变量。<br /><br />　　清单 11. 通过主体内容指定 &lt;c:set&gt; 操作的值</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:set var="timezone" scope="session"&gt;CST&lt;/c:set&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> core 库包含第二个用于管理限制了作用域的变量的标记 — &lt;c:remove&gt;。顾名思义，&lt;c:remove&gt; 操作是用来删除限制了作用域的变量的，它获取两个属性。var 属性指定待删除变量的名称，scope 属性是可选的，它表示待删除变量来自哪个作用域，缺省为 page，如清单 12 所示。<br /><br />　　清单 12. &lt;c:remove&gt; 操作示例</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:remove var="timezone" scope="session"/&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />　　<b>输出</b><br /><br /><ccid_code>　　尽管 &lt;c:set&gt; 操作允许将表达式结果赋给限制了作用域的变量，但开发人员通常会希望只显示表达式的值，而不存储它。<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> &lt;c:out&gt; 定制标记承担这一任务，其语法如清单 13 所示。该标记对由其 value 属性指定的表达式进行求值，然后打印结果。如果指定了可选属性 default，那么，在对 value 属性的表达式求值所得结果为 null 或空 String 的情况下，&lt;c:out&gt; 将打印其值。<br /><br />　　清单 13. &lt;c:out&gt; 操作的语法</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:out value="expression" default="expression" escapeXml="boolean"/&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　escapeXml 属性也是可选的。它控制当用 &lt;c:out&gt; 标记输出诸如“&lt;”、“&gt;”和“&amp;”之类的字符（在 HTML 和 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 中具有特殊意义）时是否应该进行转义。如果将 escapeXml 设置为 true，则会自动将这些字符转换成相应的 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 实体（此处提到的字符分别转换成 &amp;lt;、&amp;gt; 和 &amp;amp;）。<br /><br />　　例如，假定有一个名为 user 的会话作用域变量，它是一个类的实例，该类为用户定义了两个特性：username 和 company。每当用户访问站点时，这个对象被自动分配给会话，但直到用户实际登录后，才会设置这两个特性。假定是这种方案，请考虑清单 14 中的 JSP 片段。在用户登录之后，这个片段将显示单词“Hello”，其后是他／她的用户名和一个惊叹号。但是，在用户登录之前，由这个片段生成的内容则是短语“Hello Guest!”。在这种情况下，因为 username 特性还有待初始化，所以 &lt;c:out&gt; 标记将转而打印出 default 属性的值（即字符串“Guest”）。<br /><br />　　清单 14. 带缺省内容的 &lt;c:out&gt; 操作示例 Hello</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:out value="${user.username}" default=="Guest"/&gt;!</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　接下来，考虑清单 15，它使用了 &lt;c:out&gt; 标记的 escapeXml 属性。如果在这种情况下已经将 company 特性设置成 Java String 值 "Flynn &amp; Sons"，那么，实际上该操作生成的内容将是 Flynn &amp; Sons。如果这个操作是生成 HTML 或 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 内容的 JSP 页面的一部分，那么，这个字符串中间的“&amp;”符号最终可能被解释为 HTML 或 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 控制字符，从而妨碍了对该内容的显示或解析。但是，如果将 escapeXml 属性值设置成 true，则所生成的内容将是 Flynn &amp;amp; Sons。浏览器或解析器不会因在解释时遇到这种内容而出问题。假定 HTML 和 <a href="http://www.kissjava.com/doc/javaabout/xml/index.php">XML</a> 是 JSP 应用程序中最常见的内容类型，所以 escapeXml 属性的缺省值是 true 就不足为奇了。<br /><br />　　清单 15. 禁用转义的 &lt;c:out&gt; 操作示例</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:out value="${user.company}" escapeXml=="false"/&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />　　<b>用缺省值设置变量</b><br /><br /><ccid_code>　　除了简化动态数据的显示之外，当通过 &lt;c:set&gt; 设置变量值时，&lt;c:out&gt; 指定缺省值的能力也很有用。正如清单 11 所示，用来赋给限制了作用域的变量的值可以指定为 &lt;c:set&gt; 标记的主体内容，也可以通过其值属性来指定。通过将 &lt;c:out&gt; 操作嵌套在 &lt;c:set&gt; 标记的主体内容中，变量赋值就可以利用其缺省值能力。<br /><br />　　清单 16 中说明了这种方法。外部 &lt;c:set&gt; 标记的行为非常简单：它根据其主体内容设置会话作用域 timezone 变量的值。但是，在这种情况下，主体内容是通过 &lt;c:out&gt; 操作生成的。这个嵌套操作的值属性是表达式 ${cookie['tzPref'].value}，它尝试通过 cookie 隐式对象返回名为 tzPref 的 cookie 值。（cookie 隐式对象将 cookie 名称映射到相应的 Cookie 实例，这意味着必须通过对象的 value 特性使用点运算符来检索储存在 cookie 中的实际数据。）<br /><br />　　清单 16. 合并 &lt;c:set&gt; 和 &lt;c:out&gt; 以提供缺省变量值</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:set var="timezone" scope=="session"&gt;   &lt;c:out value="${cookie['tzPref'].value}" default=="CST"/&gt;&lt;/c:set&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　但是，请考虑以下情况，用户是第一次尝试使用这段代码的 Web 应用程序。结果是，请求中没有提供名为 tzPref 的 cookie。这意味着使用隐式对象的查找将返回 null，在这种情况下整个表达式将返回 null。因为对 &lt;c:out&gt; 标记的 value 属性求值的结果是 null，所以 &lt;c:out&gt; 标记会转而输出对其 default 属性求值的结果。在这里是字符串 CST。因此，实际的结果是将 timezone 限制了作用域的变量设置成用户的 tzPref cookie 中存储的时区，或者，如果没有，则使用缺省时区 CST。</ccid_code><br /><br />　　<b>EL 和 JSP 2.0</b><br /><br /><ccid_code>　　目前，表达式语言仅可用于指定 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 定制标记中的动态属性值。但 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 1.0 表达式语言的一个扩展已经被提出，会把它包括到 JSP 2.0 中去，眼下正在进行最后评审。这个扩展将允许开发人员通过自己的定制标记来使用 EL。页面作者将可以在目前允许使用 JSP 表达式的任何地方使用 EL 表达式，譬如将动态值插入模板文本中：&lt;p&gt;Your preferred time zone is ${timezone}&lt;/p&gt;。<br /><br />　　这个 JSP 2.0 功能（就象 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 本身一样）将支持页面作者进一步减少对 JSP 编制脚本元素的依赖，从而改进 JSP 应用程序的可维护性。</ccid_code><br /><br />　　<b>结束语</b><br /><br /><ccid_code>　　EL（与四个 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 定制标记库提供的操作结合起来）允许页面作者不使用脚本元素即可实现表示层逻辑。例如，对比本文开头清单 1 中的 JSP 代码和清单 17 中显示的通过 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 实现的同样功能。（<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> core 库中其余的标记，包括 &lt;c:choose&gt; 及其子标记，将在本系列的下一篇文章中讨论。）尽管显然执行了条件逻辑，但是 <a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 版本中没有 Java 语言源代码，并且标记之间的关系（尤其是关于嵌套需求）对于任何精通 HTML 语法的人都应该是熟悉的。<br /><br />　　清单 17. 合并 &lt;c:set&gt; 和 &lt;c:out&gt; 以提供缺省变量值</ccid_code><br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="550" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" bgcolor="#e6e6e6"><pre><ccid_code>&lt;c:choose&gt;&lt;c:when test="${user.role == 'member'}"&gt;    &lt;p&gt;Welcome, member!&lt;/p&gt;  &lt;/c:when&gt;&lt;c:otherwise&gt;    &lt;p&gt;Welcome, guest!&lt;/p&gt;  &lt;/c:otherwise&gt;&lt;/c:choose&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br /><ccid_code>　　通过提供大多数 Web 应用程序常用功能的标准实现，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 有助于加速开发周期。与 EL 结合起来，<a href="http://www.kissjava.com/doc/javamore/jstl/index.php">JSTL</a> 可以不需要对表示层程序编写代码，这极大地简化了 JSP 应用程序的维护。</ccid_code><br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=193676</p><br /></div>
						<div class="postFoot">
								<script src="http://localhost:82/PromoteIcon.aspx?id=193676">
								</script>
[<a title="功能强大的网络收藏夹，一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐" href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏到我的网摘</a>]   二七老泉发表于 2004年11月24日 11:59:00 </div>
				</div>
				<link href="http://blog.csdn.net/leek2000/Services/Pingback.aspx" rel="pingback" />
				<!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/leek2000/archive/2004/11/24/193676.aspx"dc:identifier="http://blog.csdn.net/leek2000/archive/2004/11/24/193676.aspx"dc:title="JSTL 入门：表达式语言简化对 JSP 应用的软件维护"trackback:ping="http://tb.blog.csdn.net/TrackBack.aspx?PostId=193676" /></rdf:RDF>-->
				<script><![CDATA[unction hide(){showComment();}]]&gt;</script>
				<br />
				<div class="post">
						<div class="postTitle">相关文章：</div>
						<ul class="postText">
								<li>
										<a href="http://blog.csdn.net/baggio785/archive/2006/01/05/571502.aspx" target="_blank">JavaServer Pages标准标签库</a> 2006-01-05 <a href="http://blog.csdn.net/baggio785/" target="_blank">baggio785</a></li>
								<li>
										<a href="http://blog.csdn.net/hitgnu/archive/2004/10/31/161210.aspx" target="_blank">JSTL使用入门</a> 2004-10-31 <a href="http://blog.csdn.net/hitgnu/" target="_blank">hitgnu</a></li>
								<li>
										<a href="http://blog.csdn.net/jiangxigld/archive/2006/03/07/617987.aspx" target="_blank">语言的学习（6）--变量 表达式 语句</a> 2006-03-07 <a href="http://blog.csdn.net/jiangxigld/" target="_blank">jiangxigld</a></li>
								<li>
										<a href="http://blog.csdn.net/dudutu/archive/2005/08/27/466600.aspx" target="_blank">Base-Jsp-3-JSTL</a> 2005-08-27 <a href="http://blog.csdn.net/dudutu/" target="_blank">dudutu</a></li>
								<li>
										<a href="http://blog.csdn.net/seave/archive/2006/03/10/620600.aspx" target="_blank">作用域(scope)</a> 2006-03-10 <a href="http://blog.csdn.net/seave/" target="_blank">seave</a><script language="javascript" type="text/javascript"><!--
	try{
		hide();
		}
		catch(e){
		}
	//--></script></li>
						</ul>
				</div>
		</form>
<img src ="http://www.blogjava.net/jacally/aggbug/102997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-03-10 15:42 <a href="http://www.blogjava.net/jacally/articles/102997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL语法及参数 [转]</title><link>http://www.blogjava.net/jacally/articles/96691.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Tue, 30 Jan 2007 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/96691.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/96691.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/96691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/96691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/96691.html</trackback:ping><description><![CDATA[
		<p>JSTL语法及参数<br />作者 胡祥春</p>
		<p>JSTL语法及参数<br />JSTL包含以下的标签:<br />常用的标签：如&lt;c:out&gt;、&lt;c:remove&gt;、&lt;c:catch&gt;、&lt;c:set&gt;等<br />条件标签：如&lt;c:if&gt;&lt;c:when&gt;、&lt;c:choose&gt;、&lt;c:otherwise&gt;等<br />URL标签：如&lt;c:import&gt;、&lt;c:redirect&gt;和&lt;c:url&gt;等<br />XML标签：如&lt;xml:out&gt;等<br />国际化输出标签：如&lt;fmt:timeZone&gt;等<br />SQL标签：如&lt;sql:query&gt;、&lt;sql:update&gt;、&lt;sql:transaction&gt;等</p>
		<p>
				<br />一般用途的标签: <br />1．&lt;c:out&gt; <br />没有Body时的语法 <br />&lt;c:out value=”value” [escapeXml=”{true|false}”] [default=”defaultValue”]/&gt; <br />有Body时的语法 <br />&lt;c:out value=”value” [escapeXml=”{true|false}”]&gt; <br />这里是Body部分 <br />&lt;/c:out&gt; </p>
		<p> </p>
		<p>名字 类型 描述 <br />value Object 将要输出的表达式 <br />escapeXml boolean 确定以下字符:&lt;,&gt;,&amp;,’,”在字符串中是否被除数，默认为true <br />default Object 如果vaule计算后的结果是null，那么输出这个默认值 </p>
		<p> </p>
		<p>2．&lt;c:set&gt; <br />这个标签用于在某个范围(page、request、session、application等)中使用某个名字设定特定的值，或者设定某个已经存在的javabean对象的属性。他类似于&lt;%request.setAttrbute(“name”,”value”);%&gt; <br />语法1：使用value属性设定一个特定范围中的属性。 <br />&lt;c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/&gt; <br />语法2：使用value属性设定一个特定范围中的属性，并带有一个Body。 <br />&lt;c:set var=”varName” [scope=”{page|request|session|application}”]&gt; <br />Body部分 <br />&lt;/c:set&gt; <br />语法3：设置某个特定对象的一个属性。 <br />&lt;c:set value=”value” target=”target” property=”propertyName”/&gt; <br />语法4：设置某个特定对象的一个属性，并带有一个Body。 <br />&lt;c:set target=”target” property=”propertyName”&gt; <br />Body部分 <br />&lt;/c:set&gt; </p>
		<p> </p>
		<p>名字 类型 描述 <br />value Object 将要计算的表到式。 <br />var String 用于表示value 值的属性，如果要在其他标签中使用，就是通过这 个var指定的值来进行的。它相当于在标签定义了一个变量，并且这个变量只能在标签中的一个。 <br />scope String var的有效范围，可以是page|request|session|application中的一个 <br />target String 将要设置属性的对象，它必须是javabean或则java.util.Map对象 <br />property Object 待设定的Target对象中的属性名字，比如在javabean中有个name属性，提供了setUserId方法，那么这里填userId。 </p>
		<p> </p>
		<p>3．&lt;c:remove&gt; <br />&lt;c:remove var=”varName” [scope=”{page|request|session|application}”]/&gt; </p>
		<p> </p>
		<p>4．&lt;c:catch&gt; <br />这个标签相当于捕获在它里边的标签抛出的异常对象 <br />&lt;c:catch [var=”varName”]&gt; //var是异常的名字 <br />内容 <br />&lt;/c:catch&gt; </p>
		<p> </p>
		<p>条件标签 <br />1． &lt;c:if&gt; <br />语法1：无Body情况 <br />&lt;c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]/&gt; <br />语法2：有Body的情况 <br />&lt;c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]&gt; <br />Body内容 <br />&lt;/c:if&gt; </p>
		<p> </p>
		<p>名字 类型 描述 <br />test Boolean 表达式的条件，相当于if()中的条件判断语句。 <br />var String 表示这个语句的名字。 <br />scope String var这个变量的作用范围。 </p>
		<p> </p>
		<p>2．&lt;c:choose&gt; <br />语法：&lt;c:choose&gt; <br />Body内容(&lt;c:when&gt;和&lt;c:otherwise&gt;子标签) <br />&lt;/c:choose&gt; <br />注意：它的Body只能由以下元素组成: <br />1) 空格 <br />2) 0或多个&lt;c:when&gt;子标签，&lt;c:when&gt;必须在&lt;c:otherwise&gt;标签之前出现. <br />3) 0个或多个&lt;c:otherwise&gt;子标签。 </p>
		<p> </p>
		<p>3．&lt;c:when&gt; <br />代表的是&lt;c:choose&gt;的一个条件分支,只能在&lt;c:choose&gt;中使用 <br />语法：&lt;c:when test=”testCondition”&gt; //test是boolean类型,用于判断条件真假 <br />Body语句 <br />&lt;/c:when&gt; </p>
		<p> </p>
		<p>4．&lt;c:otherwise&gt; <br />代表的是&lt;c:choose&gt;中的最后选择。必须在最后出现 <br />&lt;c:otherwise&gt; <br />内容 <br />&lt;/c:otherwise&gt; </p>
		<p> </p>
		<p>迭代标签 <br />1．&lt;c:forEach&gt; <br />语法1：在Collection中迭代 <br />&lt;c:forEach[var=”varName”] items=”collection” [varStatus=”varStatusName”] <br />[begin=”begin”] [end=”end”] [step=”step”] <br />Body内容 <br />&lt;/c:foeEach&gt; </p>
		<p> </p>
		<p>语法2：迭代固定的次数. <br />&lt;c:forEach [var=”varName”] [varStatus=”varStatusName”] <br />[begin=”begin”] [end=”end”] [step=”step”] <br />Body内容 <br />&lt;/c:foeEach&gt; </p>
		<p> </p>
		<p>名字 类型 描述 <br />var String 迭代的参数，它是标签参数，在其他标签中通过它来引用这个标签中的内容。 <br />Items Collection、ArrayList、 要迭代的items集合.<br />Iterator、Map、String、 <br />Eunmeration等 <br />VarStatus String 表示迭代的状态，可以访问迭代自身的信息 <br />Begin int 表示开始迭代的位置。 <br />End int 表示结束迭代的位置。 <br />Step int 表示迭代移动的步长，默认为1。 </p>
		<p> </p>
		<p>URL相关的标签 <br />1．&lt;c:import&gt; <br />语法1：资源的内容使用String对象向外暴露 <br />&lt;c:import url=”url” [context=”context”] <br />[var=”varName”] [scope=”{page|request|session|application}”] [charEncoding=”charEncoding”]&gt; <br />内容 <br />&lt;/c:import&gt; </p>
		<p> </p>
		<p>语法2：资源的内容使用Reader对象向外暴露。 <br />&lt;c:import url=”url” [context=”context”] <br />varReader=”varReaderName” [charEncoding=”charEncoding”]&gt; <br />内容 <br />&lt;/c:import&gt; <br />名字 类型 描述 <br />url String 待导入资源的URL，可以是相对路径和绝对路径，并且可以导入其他主机资源 <br />context String 当使用相对路径访问外部context资源时，context指定了这个资源的名字。 <br />var String 参数的名字。 <br />scope String var参数的作用范围。 <br />cahrEncoding String 输入资源的字符编码。 <br />varReader String 这个参数的类型是Reader,用于读取资源。 </p>
		<p> </p>
		<p>2．&lt;c:redirct&gt; <br />语法1:没有Body的情况. <br />&lt;c:redirect url=”value” [context=”context”]/&gt; <br />语法2：有Body情况下，在Body中指定查询的参数 <br />&lt;c:redirect url=”value” [context=”context”]&gt; <br />&lt;c:param name=”name” value=”value”/&gt; <br />&lt;/c:redirect&gt; </p>
		<p> </p>
		<p>3．&lt;c:url&gt; <br />语法1：没有Body <br />&lt;c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]/&gt; <br />语法2：有Body <br />&lt;c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]&gt; <br />&lt;c:param name=”name” value=”value”/&gt; <br />&lt;/c:url&gt; </p>
		<p> </p>
		<p>名字 类型 描述 <br />value String URL值 <br />context String 当使用相对路径访问外部context资源时，context指定了这个资源的名字 <br />var String 标识这个URL标量。 <br />Scope String 变量作用范围。 </p>
		<p> </p>
		<p>SQL相关的标签 <br />1．&lt;sql:setDataSource&gt; <br />2．&lt;sql:query&gt; <br />3．&lt;sql:update&gt; <br />4．&lt;transaction&gt; <br />5．&lt;param&gt; <br /></p>
<img src ="http://www.blogjava.net/jacally/aggbug/96691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-01-30 11:49 <a href="http://www.blogjava.net/jacally/articles/96691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用java.util.Timer [转]</title><link>http://www.blogjava.net/jacally/articles/95382.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Mon, 22 Jan 2007 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/95382.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/95382.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/95382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/95382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/95382.html</trackback:ping><description><![CDATA[
		<p>在应用开发中，经常需要一些周期性的操作，比如每5分钟检查一下新邮件等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。比如下面的代码每5分钟检查一遍是否有新邮件：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">        </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> java.util.Timer timer; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        timer </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> Timer(</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">); <br /><img id="Codehighlighter1_123_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_234_Open_Text.style.display='none'; Codehighlighter1_123_234_Closed_Image.style.display='inline'; Codehighlighter1_123_234_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_123_234_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_123_234_Closed_Text.style.display='none'; Codehighlighter1_123_234_Open_Image.style.display='inline'; Codehighlighter1_123_234_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />        timer.schedule(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> java.util.TimerTask() </span>
				<span id="Codehighlighter1_123_234_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_123_234_Open_Text">
						<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_156_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_223_Open_Text.style.display='none'; Codehighlighter1_156_223_Closed_Image.style.display='inline'; Codehighlighter1_156_223_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_156_223_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_223_Closed_Text.style.display='none'; Codehighlighter1_156_223_Open_Image.style.display='inline'; Codehighlighter1_156_223_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run() </span>
						<span id="Codehighlighter1_156_223_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_156_223_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">server.checkNewMail(); 检查新邮件 </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">            }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />        }</span>
				</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">60</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">1000</span>
				<span style="COLOR: #000000">); </span>
		</div>
		<p> </p>
		<p>使用这几行代码之后，Timer本身会每隔5分钟调用一遍server.checkNewMail()方法，不需要自己启动线程。Timer本身也是多线程同步的，多个线程可以共用一个Timer，不需要外部的同步代码。<br />    在《The Java Tutorial》中有更完整的例子：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_26_844_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_844_Open_Text.style.display='none'; Codehighlighter1_26_844_Closed_Image.style.display='inline'; Codehighlighter1_26_844_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_26_844_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_844_Closed_Text.style.display='none'; Codehighlighter1_26_844_Open_Image.style.display='inline'; Codehighlighter1_26_844_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> AnnoyingBeep </span>
				<span id="Codehighlighter1_26_844_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_26_844_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Toolkit toolkit; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Timer timer; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_98_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_315_Open_Text.style.display='none'; Codehighlighter1_98_315_Closed_Image.style.display='inline'; Codehighlighter1_98_315_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_98_315_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_315_Closed_Text.style.display='none'; Codehighlighter1_98_315_Open_Image.style.display='inline'; Codehighlighter1_98_315_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> AnnoyingBeep() </span>
						<span id="Codehighlighter1_98_315_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_98_315_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    toolkit </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Toolkit.getDefaultToolkit(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Timer(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer.schedule(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> RemindTask(), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                   </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">initial delay </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">                   </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">1000</span>
								<span style="COLOR: #000000">);  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">subsequent rate </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_360_832_Open_Image" onclick="this.style.display='none'; Codehighlighter1_360_832_Open_Text.style.display='none'; Codehighlighter1_360_832_Closed_Image.style.display='inline'; Codehighlighter1_360_832_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_360_832_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_360_832_Closed_Text.style.display='none'; Codehighlighter1_360_832_Open_Image.style.display='inline'; Codehighlighter1_360_832_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> RemindTask </span>
						<span style="COLOR: #0000ff">extends</span>
						<span style="COLOR: #000000"> TimerTask </span>
						<span id="Codehighlighter1_360_832_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_360_832_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> numWarningBeeps </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">3</span>
								<span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_422_825_Open_Image" onclick="this.style.display='none'; Codehighlighter1_422_825_Open_Text.style.display='none'; Codehighlighter1_422_825_Closed_Image.style.display='inline'; Codehighlighter1_422_825_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_422_825_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_422_825_Closed_Text.style.display='none'; Codehighlighter1_422_825_Open_Image.style.display='inline'; Codehighlighter1_422_825_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> run() </span>
								<span id="Codehighlighter1_422_825_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_422_825_Open_Text">
										<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_458_564_Open_Image" onclick="this.style.display='none'; Codehighlighter1_458_564_Open_Text.style.display='none'; Codehighlighter1_458_564_Closed_Image.style.display='inline'; Codehighlighter1_458_564_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_458_564_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_458_564_Closed_Text.style.display='none'; Codehighlighter1_458_564_Open_Image.style.display='inline'; Codehighlighter1_458_564_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000"> (numWarningBeeps </span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_458_564_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_458_564_Open_Text">
												<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            toolkit.beep(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">Beep!</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        numWarningBeeps</span>
												<span style="COLOR: #000000">--</span>
												<span style="COLOR: #000000">; <br /><img id="Codehighlighter1_571_814_Open_Image" onclick="this.style.display='none'; Codehighlighter1_571_814_Open_Text.style.display='none'; Codehighlighter1_571_814_Closed_Image.style.display='inline'; Codehighlighter1_571_814_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_571_814_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_571_814_Closed_Text.style.display='none'; Codehighlighter1_571_814_Open_Image.style.display='inline'; Codehighlighter1_571_814_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span>
										</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">else</span>
										<span style="COLOR: #000000"> </span>
										<span id="Codehighlighter1_571_814_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_571_814_Open_Text">
												<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            toolkit.beep();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                System.out.println(</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">Time′s up!</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">timer.cancel(); </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">Not necessary because we call System.exit </span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            System.exit(</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">);   </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">Stops the AWT thread (and everything else) </span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
												</span>
												<span style="COLOR: #000000">        }</span>
										</span>
										<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br />这段程序，每隔3秒响铃一声，并打印出一行消息。循环3次。程序输出如下：<br />Task scheduled.<br />Beep!      <br />Beep!      //one second after the first beep<br />Beep!      //one second after the second beep<br />Time′s up! //one second after the third beep</p>
		<p>Timer类也可以方便地用来作为延迟执行，比如下面的代码延迟指定的时间（以秒为单位）执行某操作。类似电视的延迟关机功能。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/dot.gif" /> <br /><img id="Codehighlighter1_31_537_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_537_Open_Text.style.display='none'; Codehighlighter1_31_537_Closed_Image.style.display='inline'; Codehighlighter1_31_537_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_537_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_537_Closed_Text.style.display='none'; Codehighlighter1_31_537_Open_Image.style.display='inline'; Codehighlighter1_31_537_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> ReminderBeep </span>
				<span id="Codehighlighter1_31_537_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_31_537_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /> <br /><img id="Codehighlighter1_80_218_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_218_Open_Text.style.display='none'; Codehighlighter1_80_218_Closed_Image.style.display='inline'; Codehighlighter1_80_218_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_80_218_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_218_Closed_Text.style.display='none'; Codehighlighter1_80_218_Open_Image.style.display='inline'; Codehighlighter1_80_218_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> ReminderBeep(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> seconds) </span>
						<span id="Codehighlighter1_80_218_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_80_218_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    toolkit </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Toolkit.getDefaultToolkit(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Timer(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer.schedule(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> RemindTask(), seconds</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">1000</span>
								<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_263_525_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_525_Open_Text.style.display='none'; Codehighlighter1_263_525_Closed_Image.style.display='inline'; Codehighlighter1_263_525_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_263_525_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_263_525_Closed_Text.style.display='none'; Codehighlighter1_263_525_Open_Image.style.display='inline'; Codehighlighter1_263_525_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> RemindTask </span>
						<span style="COLOR: #0000ff">extends</span>
						<span style="COLOR: #000000"> TimerTask </span>
						<span id="Codehighlighter1_263_525_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_263_525_Open_Text">
								<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_292_518_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_518_Open_Text.style.display='none'; Codehighlighter1_292_518_Closed_Image.style.display='inline'; Codehighlighter1_292_518_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_292_518_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_292_518_Closed_Text.style.display='none'; Codehighlighter1_292_518_Open_Image.style.display='inline'; Codehighlighter1_292_518_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> run() </span>
								<span id="Codehighlighter1_292_518_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_292_518_Open_Text">
										<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">Time′s up!</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        toolkit.beep(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">timer.cancel(); </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">Not necessary because we call System.exit </span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        System.exit(</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">);   </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">Stops the AWT thread (and everything else) </span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        }</span>
								</span>
								<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/jacally/aggbug/95382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-01-22 17:43 <a href="http://www.blogjava.net/jacally/articles/95382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用java.util.Timer [转]</title><link>http://www.blogjava.net/jacally/articles/95383.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Mon, 22 Jan 2007 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/95383.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/95383.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/95383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/95383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/95383.html</trackback:ping><description><![CDATA[
		<p>在应用开发中，经常需要一些周期性的操作，比如每5分钟检查一下新邮件等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。比如下面的代码每5分钟检查一遍是否有新邮件：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">        </span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> java.util.Timer timer; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        timer </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> Timer(</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">); <br /><img id="Codehighlighter1_123_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_234_Open_Text.style.display='none'; Codehighlighter1_123_234_Closed_Image.style.display='inline'; Codehighlighter1_123_234_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_123_234_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_123_234_Closed_Text.style.display='none'; Codehighlighter1_123_234_Open_Image.style.display='inline'; Codehighlighter1_123_234_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />        timer.schedule(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> java.util.TimerTask() </span>
				<span id="Codehighlighter1_123_234_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_123_234_Open_Text">
						<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_156_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_223_Open_Text.style.display='none'; Codehighlighter1_156_223_Closed_Image.style.display='inline'; Codehighlighter1_156_223_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_156_223_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_156_223_Closed_Text.style.display='none'; Codehighlighter1_156_223_Open_Image.style.display='inline'; Codehighlighter1_156_223_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run() </span>
						<span id="Codehighlighter1_156_223_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_156_223_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">server.checkNewMail(); 检查新邮件 </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">            }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />        }</span>
				</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">60</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">1000</span>
				<span style="COLOR: #000000">); </span>
		</div>
		<p> </p>
		<p>使用这几行代码之后，Timer本身会每隔5分钟调用一遍server.checkNewMail()方法，不需要自己启动线程。Timer本身也是多线程同步的，多个线程可以共用一个Timer，不需要外部的同步代码。<br />    在《The Java Tutorial》中有更完整的例子：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_26_844_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_844_Open_Text.style.display='none'; Codehighlighter1_26_844_Closed_Image.style.display='inline'; Codehighlighter1_26_844_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_26_844_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_26_844_Closed_Text.style.display='none'; Codehighlighter1_26_844_Open_Image.style.display='inline'; Codehighlighter1_26_844_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> AnnoyingBeep </span>
				<span id="Codehighlighter1_26_844_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_26_844_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Toolkit toolkit; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Timer timer; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_98_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_98_315_Open_Text.style.display='none'; Codehighlighter1_98_315_Closed_Image.style.display='inline'; Codehighlighter1_98_315_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_98_315_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_315_Closed_Text.style.display='none'; Codehighlighter1_98_315_Open_Image.style.display='inline'; Codehighlighter1_98_315_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> AnnoyingBeep() </span>
						<span id="Codehighlighter1_98_315_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_98_315_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    toolkit </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Toolkit.getDefaultToolkit(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Timer(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer.schedule(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> RemindTask(), <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                   </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">,        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">initial delay </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">                   </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">1000</span>
								<span style="COLOR: #000000">);  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">subsequent rate </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_360_832_Open_Image" onclick="this.style.display='none'; Codehighlighter1_360_832_Open_Text.style.display='none'; Codehighlighter1_360_832_Closed_Image.style.display='inline'; Codehighlighter1_360_832_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_360_832_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_360_832_Closed_Text.style.display='none'; Codehighlighter1_360_832_Open_Image.style.display='inline'; Codehighlighter1_360_832_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> RemindTask </span>
						<span style="COLOR: #0000ff">extends</span>
						<span style="COLOR: #000000"> TimerTask </span>
						<span id="Codehighlighter1_360_832_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_360_832_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> numWarningBeeps </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">3</span>
								<span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_422_825_Open_Image" onclick="this.style.display='none'; Codehighlighter1_422_825_Open_Text.style.display='none'; Codehighlighter1_422_825_Closed_Image.style.display='inline'; Codehighlighter1_422_825_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_422_825_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_422_825_Closed_Text.style.display='none'; Codehighlighter1_422_825_Open_Image.style.display='inline'; Codehighlighter1_422_825_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> run() </span>
								<span id="Codehighlighter1_422_825_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_422_825_Open_Text">
										<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_458_564_Open_Image" onclick="this.style.display='none'; Codehighlighter1_458_564_Open_Text.style.display='none'; Codehighlighter1_458_564_Closed_Image.style.display='inline'; Codehighlighter1_458_564_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_458_564_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_458_564_Closed_Text.style.display='none'; Codehighlighter1_458_564_Open_Image.style.display='inline'; Codehighlighter1_458_564_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000"> (numWarningBeeps </span>
										<span style="COLOR: #000000">&gt;</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">) </span>
										<span id="Codehighlighter1_458_564_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_458_564_Open_Text">
												<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            toolkit.beep(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">Beep!</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        numWarningBeeps</span>
												<span style="COLOR: #000000">--</span>
												<span style="COLOR: #000000">; <br /><img id="Codehighlighter1_571_814_Open_Image" onclick="this.style.display='none'; Codehighlighter1_571_814_Open_Text.style.display='none'; Codehighlighter1_571_814_Closed_Image.style.display='inline'; Codehighlighter1_571_814_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_571_814_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_571_814_Closed_Text.style.display='none'; Codehighlighter1_571_814_Open_Image.style.display='inline'; Codehighlighter1_571_814_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span>
										</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">else</span>
										<span style="COLOR: #000000"> </span>
										<span id="Codehighlighter1_571_814_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_571_814_Open_Text">
												<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            toolkit.beep();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                System.out.println(</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">Time′s up!</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">timer.cancel(); </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">Not necessary because we call System.exit </span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            System.exit(</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">);   </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">Stops the AWT thread (and everything else) </span>
												<span style="COLOR: #008000">
														<br />
														<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
												</span>
												<span style="COLOR: #000000">        }</span>
										</span>
										<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br />这段程序，每隔3秒响铃一声，并打印出一行消息。循环3次。程序输出如下：<br />Task scheduled.<br />Beep!      <br />Beep!      //one second after the first beep<br />Beep!      //one second after the second beep<br />Time′s up! //one second after the third beep</p>
		<p>Timer类也可以方便地用来作为延迟执行，比如下面的代码延迟指定的时间（以秒为单位）执行某操作。类似电视的延迟关机功能。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/dot.gif" /> <br /><img id="Codehighlighter1_31_537_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_537_Open_Text.style.display='none'; Codehighlighter1_31_537_Closed_Image.style.display='inline'; Codehighlighter1_31_537_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_537_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_537_Closed_Text.style.display='none'; Codehighlighter1_31_537_Open_Image.style.display='inline'; Codehighlighter1_31_537_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> ReminderBeep </span>
				<span id="Codehighlighter1_31_537_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_31_537_Open_Text">
						<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /> <br /><img id="Codehighlighter1_80_218_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_218_Open_Text.style.display='none'; Codehighlighter1_80_218_Closed_Image.style.display='inline'; Codehighlighter1_80_218_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_80_218_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_218_Closed_Text.style.display='none'; Codehighlighter1_80_218_Open_Image.style.display='inline'; Codehighlighter1_80_218_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> ReminderBeep(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> seconds) </span>
						<span id="Codehighlighter1_80_218_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_80_218_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    toolkit </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Toolkit.getDefaultToolkit(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> Timer(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        timer.schedule(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> RemindTask(), seconds</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">1000</span>
								<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img id="Codehighlighter1_263_525_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_525_Open_Text.style.display='none'; Codehighlighter1_263_525_Closed_Image.style.display='inline'; Codehighlighter1_263_525_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_263_525_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_263_525_Closed_Text.style.display='none'; Codehighlighter1_263_525_Open_Image.style.display='inline'; Codehighlighter1_263_525_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> RemindTask </span>
						<span style="COLOR: #0000ff">extends</span>
						<span style="COLOR: #000000"> TimerTask </span>
						<span id="Codehighlighter1_263_525_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_263_525_Open_Text">
								<span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_292_518_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_518_Open_Text.style.display='none'; Codehighlighter1_292_518_Closed_Image.style.display='inline'; Codehighlighter1_292_518_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_292_518_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_292_518_Closed_Text.style.display='none'; Codehighlighter1_292_518_Open_Image.style.display='inline'; Codehighlighter1_292_518_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000"> run() </span>
								<span id="Codehighlighter1_292_518_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_292_518_Open_Text">
										<span style="COLOR: #000000">{ <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">Time′s up!</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        toolkit.beep(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">timer.cancel(); </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">Not necessary because we call System.exit </span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        System.exit(</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">);   </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">Stops the AWT thread (and everything else) </span>
										<span style="COLOR: #008000">
												<br />
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        }</span>
								</span>
								<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <img src="http://www.blogjava.net/images/dot.gif" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/jacally/aggbug/95383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-01-22 17:43 <a href="http://www.blogjava.net/jacally/articles/95383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java.util.timer在web工程中实现类似触发器的机制 [转]</title><link>http://www.blogjava.net/jacally/articles/95380.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Mon, 22 Jan 2007 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/95380.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/95380.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/95380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/95380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/95380.html</trackback:ping><description><![CDATA[
		<p>用java.util.timer在web工程中实现类似触发器的机制</p>
		<p> </p>
		<p>现在正在做的项目要实现一个定时出帐的触发器, 开始打算用spring整合的quartz工具来实现(同时spring也提供了对java.util.timer的支持),<br />spring对quartz整合的方式,是在配置文件中通过bean的property项设置一个crontrigger表达式来实现精确的时点触发,但是由于spring只有在启动的时候对注入值进行读取,这样的话就很难实现通过运行时读取配置参数,达到不用重启服务即可改变出帐时间的目的,所以只好自己寻找好一点的解决方案.</p>
		<p> </p>
		<p>在网上找到了,看了很受启发,我略做了一些修改,实现了在每个月的某一天的某一个时间进行任务操作的功能.</p>
		<p> </p>
		<p>代码及注释如下:</p>
		<p> </p>
		<p>先要实现一个系统的监听器:<br /></p>
		<p>
		</p>
		<p>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">
						<br />
						<br />
				</span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />* <br /><br />title: <br /><br /><br />* <br />description: <br /><br /><br />* <br />copyright: copyright (c)chen meng 2005<br /><br /><br />* <br />company: 陈盟 <br /><br /><br />* <br />* </span>
				<span style="COLOR: #808080">@author</span>
				<span style="COLOR: #008000"> 陈盟<br />* </span>
				<span style="COLOR: #808080">@version</span>
				<span style="COLOR: #008000"> 1.0<br />* </span>
				<span style="COLOR: #808080">@since</span>
				<span style="COLOR: #008000"> 2005-1-13 / 17:26:41<br /></span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
						<br />
				</span>
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> com.wellsoon.cttbj.vab.background;<br /><br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.date;<br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.servletcontextevent;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.servletcontextlistener;<br /><br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> settleaccountlistener </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> servletcontextlistener {<br /><br /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> java.util.timer timer </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000">;<br /><br /><br /><br /><br /></span>
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000"> <br />* @see javax.servlet.servletcontextlistener#contextinitialized(javax.servlet.servletcontextevent)<br /></span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> contextinitialized(servletcontextevent event) {<br />date taskrun </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000">;<br /><br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> todo auto-generated method stub</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">taskrun </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> date();<br />timer </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> java.util.timer(</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">);<br />event.getservletcontext().log(定时器已启动); <br /></span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">在这里每隔一分钟轮询一次出帐任务,如果任务间隔比较大的话建议把这个值设的大一点,但此设置值将间接影响可设定的触发精度.<br />timer.schedule(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> settleaccounttask(), </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">60</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">1000</span>
				<span style="COLOR: #000000">); </span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">
						<br />event.getservletcontext().log(已经添加任务调度表);<br /><br /><br /><br />}<br /><br /><br /><br /></span>
				<span style="COLOR: #008000">/*</span>
				<span style="COLOR: #008000"> <br />* @see javax.servlet.servletcontextlistener#contextdestroyed(javax.servlet.servletcontextevent)<br /></span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> contextdestroyed(servletcontextevent event) {<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> todo auto-generated method stub</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">timer.cancel();<br />event.getservletcontext().log(定时器销毁);<br /><br /><br /><br />}<br /><br /><br /><br />}<br /><br /><br /><br />接着来看settleaccounttask的实现:<br /><br /><br /><br /></span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />* <br /><br />title: <br /><br /><br />* <br />description: <br /><br /><br />* <br />copyright: copyright (c)chen meng 2005<br /><br /><br />* <br />company: 陈盟 <br /><br /><br />* <br />* </span>
				<span style="COLOR: #808080">@author</span>
				<span style="COLOR: #008000"> 陈盟<br />* </span>
				<span style="COLOR: #808080">@version</span>
				<span style="COLOR: #008000"> 1.0<br />* </span>
				<span style="COLOR: #808080">@since</span>
				<span style="COLOR: #008000"> 2005-1-13 / 17:35:55<br /></span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />
						<br />
						<br />
						<br />
				</span>
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> com.wellsoon.cttbj.vab.background;<br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.calendar;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.date;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.timertask;<br /><br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> settleaccounttask </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> timertask {<br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">boolean</span>
				<span style="COLOR: #000000"> isrunning </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">long</span>
				<span style="COLOR: #000000"> dotaskmillis </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0l</span>
				<span style="COLOR: #000000">;<br /><br /><br /><br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> run() {<br />system.out.println(dotaskmillis); <br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">下面两个值代表每月的哪一天几点进行实际任务操作.可以通过数据库查询获得</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> c_schedule_date </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">10</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> c_schedule_hour </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">;<br />calendar cal </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> calendar.getinstance();<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">如果任务量很大,在下次轮询时仍在执行上次轮询的任务,则跳过本次执行,直接错过.</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #000000">!</span>
				<span style="COLOR: #000000">isrunning) {<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">如果当前系统时间的day_of_month和hour_of_day不满足以下条件,则跳过实际操作.</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (c_schedule_date </span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000"> cal.get(calendar.day_of_month) ＆＆ c_schedule_hour </span>
				<span style="COLOR: #000000">==</span>
				<span style="COLOR: #000000"> cal.get(calendar.hour_of_day)) {<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">如果上次执行任务的时间距此次轮询时间间隔太短,则跳过实际操作.</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">((dotaskmillis </span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">60</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">60</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">1000</span>
				<span style="COLOR: #000000">) </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000"> cal.gettimeinmillis()) {<br /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 详细任务</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">isrunning </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">;<br />system.out.println(执行出帐操作);<br />dotaskmillis </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> cal.gettimeinmillis();<br />system.out.println(dotaskmillis);<br />isrunning </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">false</span>
				<span style="COLOR: #000000">;<br />}<br />}<br />} </span>
				<span style="COLOR: #0000ff">else</span>
				<span style="COLOR: #000000"> {<br />system.out.println(错过);<br />}<br />}<br />}<br /><br /></span>
		</div>
		<p>
				<br />
				<br />最后,在web.xml中加上</p>
		<p>&lt;listener&gt;<br />  &lt;listener-class&gt;<br />    com.xxx.background.settleaccountlistener<br />  &lt;/listener-class&gt;<br />&lt;/listener&gt;</p>
		<p> </p>
		<p>
				<br />就可以了.<br />如果有更好的解决方式, 希望您回复.<br /></p>
<img src ="http://www.blogjava.net/jacally/aggbug/95380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-01-22 17:35 <a href="http://www.blogjava.net/jacally/articles/95380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 5.0 中的 同步（Concurrent） [转]</title><link>http://www.blogjava.net/jacally/articles/95378.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Mon, 22 Jan 2007 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/95378.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/95378.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/95378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/95378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/95378.html</trackback:ping><description><![CDATA[
		<p>9．   同步（Concurrent）</p>
		<p>     <br />1.      Executor接口</p>
		<p>     Executor接口提供了一个类似于线程池的管理工具。用于只需要往Executor中提交Runnable对象，剩下的启动线程等工作，都会有对应的实现类来完成。ScheduledExecutorService比ExecutorService增加了，时间上的控制，即用户可以在提交的时候额外的定义该任务的启动时机，以及随后的执行间隔和延迟等。</p>
		<p>     例子：</p>
		<p>     任务：</p>
		<p>     public class ETask implements Runnable{</p>
		<p>          private int id = 0;</p>
		<p>          public ETask(int id){</p>
		<p>               this.id = id;</p>
		<p>          }</p>
		<p>          public void run(){</p>
		<p>               try{</p>
		<p>                   System.out.println(id+" Start");</p>
		<p>                   Thread.sleep(1000);</p>
		<p>                   System.out.println(id+" Do");</p>
		<p>                   Thread.sleep(1000);</p>
		<p>                   System.out.println(id+" Exit");</p>
		<p>              }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }</p>
		<p>          }</p>
		<p>     }</p>
		<p>     </p>
		<p>     测试类：</p>
		<p>     public class ETest{</p>
		<p>          public static void main(String[] args){        </p>
		<p>              ExecutorService executor = Executors.newFixedThreadPool(2);</p>
		<p>              for(int i=0;i&lt;5;i++){</p>
		<p>                   Runnable r = new ETask(i);</p>
		<p>                   executor.execute(r);</p>
		<p>              }</p>
		<p>              executor.shutdown();</p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>     输出：</p>
		<p>     0 Start</p>
		<p>     1 Start</p>
		<p>     0 Do</p>
		<p>     1 Do</p>
		<p>     0 Exit</p>
		<p>     2 Start</p>
		<p>     1 Exit</p>
		<p>     3 Start</p>
		<p>     2 Do</p>
		<p>     3 Do</p>
		<p>     2 Exit</p>
		<p>     3 Exit</p>
		<p>     4 Start</p>
		<p>     4 Do</p>
		<p>     4 Exit</p>
		<p> </p>
		<p>2.      Future和Callable</p>
		<p>     Callable是一个类似于Runnable的接口，他与Runnable的区别是，她在执行完毕之后能够返回结果。Future用于获取线程的执行结果，或者取消已向Executor的任务。当我们通过Future提供的get()方法获取任务的执行结果时，如果任务没有完成，则调用get()方法的线程将会被阻塞，知道任务完成为止。一般我们都会使用Future的实现类FutureTask。</p>
		<p>     例子：</p>
		<p>     Callable对象：</p>
		<p>     public class ETask implements Callable{</p>
		<p>          private String id = null;</p>
		<p>          public ETask(String id){</p>
		<p>               this.id = id;</p>
		<p>          }</p>
		<p>     </p>
		<p>          public String call(){</p>
		<p>              try{</p>
		<p>                   System.out.println(id+" Start");</p>
		<p>                   Thread.sleep(1000);</p>
		<p>                   System.out.println(id+" Do");</p>
		<p>                   Thread.sleep(1000);</p>
		<p>                   System.out.println(id+" Exit");           </p>
		<p>              }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }</p>
		<p>              return id;</p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>     测试类：</p>
		<p>     public class ETest{</p>
		<p>          public static void main(String[] args){        </p>
		<p>              ExecutorService executor = Executors.newFixedThreadPool(2);</p>
		<p>              for(int i=0;i&lt;5;i++){            </p>
		<p>                   try{</p>
		<p>                       Callable c = new ETask(String.valueOf(i));</p>
		<p>                        FutureTask ft = new FutureTask(c);</p>
		<p>                        executor.execute(ft);</p>
		<p>                        System.out.println("Finish:" + ft.get());          </p>
		<p>                   }catch(Exception e){</p>
		<p>                       e.printStackTrace();</p>
		<p>                   }</p>
		<p>              }</p>
		<p>               executor.shutdown();</p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>     输出：</p>
		<p>     0 Start</p>
		<p>     0 Do</p>
		<p>     0 Exit</p>
		<p>     Finish:0</p>
		<p>     1 Start</p>
		<p>     1 Do</p>
		<p>     1 Exit</p>
		<p>     Finish:1</p>
		<p>     2 Start</p>
		<p>     …</p>
		<p>3.      CompletionService和ExecutorCompletionService</p>
		<p>     CompletionService类似于一个Executor和Queue的混合。我们可以通过submit()向CompletionService提交任务，然后通过poll()来获取第一个完成的任务，也可以通过take()来阻塞等待下一个完成的任务。ExecutorCompletionService是CompletionService的实现类，他需要提供一个Executor作为构造函数的参数。</p>
		<p>     例子：</p>
		<p>     Executor executor = …;</p>
		<p>     CompletionService cs = new ExecutorCompletionService(executor);</p>
		<p>     Future fs = cs.submit(…);</p>
		<p>     Future ft = cs.take();</p>
		<p> </p>
		<p>4.      Semaphore</p>
		<p>     信号量是用于同步和互斥的低级原语。信号量提供的acquire()和release()操作，与操作系统上的p，v操作同。</p>
		<p>     例子：</p>
		<p>     缓冲区：</p>
		<p>     public class Buffer{</p>
		<p>          private Semaphore s = null;</p>
		<p>          private Semaphore p = null;</p>
		<p>          Vector&lt;Integer&gt; v = new Vector&lt;Integer&gt;();</p>
		<p>          </p>
		<p>          public Buffer(int capacity){</p>
		<p>               s = new Semaphore(capacity);</p>
		<p>              p = new Semaphore(0);</p>
		<p>          }</p>
		<p>     </p>
		<p>          public void put(int i){</p>
		<p>              try{</p>
		<p>                   s.acquire();</p>
		<p>                   v.add(new Integer(i));</p>
		<p>                   p.release();</p>
		<p>               }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }</p>
		<p>          }</p>
		<p>     </p>
		<p>          public int get(){  </p>
		<p>               int i = 0;</p>
		<p>              try{</p>
		<p>                   p.acquire();</p>
		<p>                   i = ((Integer)v.remove(0)).intValue();</p>
		<p>                   s.release();</p>
		<p>              }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }</p>
		<p>               return i;</p>
		<p>          }    </p>
		<p>     }</p>
		<p> </p>
		<p>     生产者：</p>
		<p>     public class Producer extends Thread{</p>
		<p>          private Buffer b;</p>
		<p>          private int count;</p>
		<p>          private int step;</p>
		<p>          private int id;</p>
		<p> </p>
		<p>          public Producer(Buffer b,int step,int id){</p>
		<p>               this.b =  b;</p>
		<p>              this.step = step;</p>
		<p>              this.id = id;</p>
		<p>               count = 0;</p>
		<p>          }</p>
		<p>     </p>
		<p>          public void run(){</p>
		<p>              try{</p>
		<p>                   while(true){</p>
		<p>                       System.out.println("In put");</p>
		<p>                        b.put(count);</p>
		<p>                        System.out.println("Producer "+id+":"+count);</p>
		<p>                        count++;</p>
		<p>                       Thread.sleep(step);</p>
		<p>                        System.out.println("Out put");</p>
		<p>                   }</p>
		<p>               }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }</p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>     消费者：</p>
		<p>     public class Consumer extends Thread{</p>
		<p>          private Buffer b;</p>
		<p>          private int step;</p>
		<p>          private int id;</p>
		<p>     </p>
		<p>          public Consumer(Buffer b,int step,int id){</p>
		<p>              this.b = b;</p>
		<p>               this.step = step;</p>
		<p>              this.id = id;</p>
		<p>          }</p>
		<p>          </p>
		<p>          public void run(){</p>
		<p>              try{</p>
		<p>                   while(true){</p>
		<p>                        System.out.println("In get");</p>
		<p>                       System.out.println("\t\tConsume "+id+":"+b.get());</p>
		<p>                        System.out.println("Out get");</p>
		<p>                        Thread.sleep(step);</p>
		<p>                   }</p>
		<p>               }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }    </p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>     测试程序：</p>
		<p>     public class CPTest{</p>
		<p>          public static void main(String[] args){</p>
		<p>               Buffer b = new Buffer(3);</p>
		<p>              Consumer c1 = new Consumer(b,1000,1);</p>
		<p>              Consumer c2 = new Consumer(b,1000,2);</p>
		<p>               Producer p1 = new Producer(b,100,1);</p>
		<p>              Producer p2 = new Producer(b,100,2);</p>
		<p>         </p>
		<p>              c1.start();</p>
		<p>               c2.start();</p>
		<p>              p1.start();</p>
		<p>              p2.start();</p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>5.      CyclicBarrier</p>
		<p>     CyclicBarrier可以让一组线程在某一个时间点上进行等待，当所有进程都到达该等待点后，再继续往下执行。CyclicBarrier使用完以后，通过调用reset()方法，可以重用该CyclicBarrier。线程通过调用await()来减少计数。</p>
		<p> </p>
		<p>CyclicBarrier<br /> <br /> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>     例子：</p>
		<p>     任务：</p>
		<p>     public class Task extends Thread{</p>
		<p>          private String id;</p>
		<p>          private CyclicBarrier c;</p>
		<p>          private int time;</p>
		<p>     </p>
		<p>          public Task(CyclicBarrier c,String id,int time){</p>
		<p>               this.c = c;</p>
		<p>              this.id = id;</p>
		<p>               this.time = time;</p>
		<p>          }</p>
		<p>     </p>
		<p>          public void run(){</p>
		<p>               try{</p>
		<p>                   System.out.println(id+" Start");</p>
		<p>                  Thread.sleep(time);</p>
		<p>                   System.out.println(id+" Finish");</p>
		<p>                   c.await();</p>
		<p>                   System.out.println(id+" Exit");          </p>
		<p>               }catch(Exception e){</p>
		<p>                   e.printStackTrace();</p>
		<p>              }</p>
		<p>          }    </p>
		<p>     }</p>
		<p> </p>
		<p>     测试类：</p>
		<p>     public class Test{</p>
		<p>          public static void main(String[] args){</p>
		<p>              CyclicBarrier c = new CyclicBarrier(3,new Runnable(){</p>
		<p>                   public void run(){</p>
		<p>                        System.out.println("All Work Done");</p>
		<p>                   }</p>
		<p>              });</p>
		<p>               Task t1 = new Task(c,"1",1000);</p>
		<p>              Task t2 = new Task(c,"2",3000);</p>
		<p>              Task t3 = new Task(c,"3",5000);</p>
		<p>               t1.start();</p>
		<p>              t2.start();</p>
		<p>              t3.start();        </p>
		<p>          }</p>
		<p>     }</p>
		<p> </p>
		<p>     输出结果：</p>
		<p>     1 Start</p>
		<p>     2 Start</p>
		<p>     3 Start</p>
		<p>     1 Finish</p>
		<p>     2 Finish</p>
		<p>     3 Finish</p>
		<p>     All Work Done</p>
		<p>     3 Exit</p>
		<p>     1 Exit</p>
		<p>     2 Exit</p>
		<p> </p>
		<p>6.      CountdownLatch</p>
		<p>     CountdownLatch具有与CyclicBarrier相似的功能，也能让一组线程在某个点上进行同步。但是与CyclicBarrier不同的是：1.CountdownLatch不能重用，2.线程在CountdownLatch上调用await()操作一定会被阻塞，直到计数值为0时才会被唤醒，而且计数值只能通过conutDown()方法进行减少。</p>
		<p>特别的，当CountdownLatch的值为1时，该Latch被称为“启动大门”，所有任务线程都在该Latch上await()，直到某个非任务线程调用countDown()触发，所有任务线程开始同时工作。</p>
		<p> </p>
		<p>7.      Exchanger</p>
		<p>     Exchanger是一个类似于计数值为2的CyclicBarrier。她允许两个线程在某个点上进行数据交换。</p>
		<p>       例子：</p>
		<p>     public class FillAndEmpty {</p>
		<p>         Exchanger&lt;DataBuffer&gt; exchanger = new Exchanger();</p>
		<p>         DataBuffer initialEmptyBuffer = ... a made-up type</p>
		<p>         DataBuffer initialFullBuffer = ...</p>
		<p> </p>
		<p>         public class FillingLoop implements Runnable {</p>
		<p>              public void run() {</p>
		<p>                   DataBuffer currentBuffer = initialEmptyBuffer;</p>
		<p>                   try {</p>
		<p>                       while (currentBuffer != null) {</p>
		<p>                            addToBuffer(currentBuffer);</p>
		<p>                            if (currentBuffer.full())</p>
		<p>                                 currentBuffer = exchanger.exchange(currentBuffer);</p>
		<p>                       }</p>
		<p>                   }catch(InterruptedException ex) { ... handle ... }</p>
		<p>              }</p>
		<p>         }</p>
		<p> </p>
		<p>         public class EmptyingLoop implements Runnable {</p>
		<p>              public void run() {</p>
		<p>                   DataBuffer currentBuffer = initialFullBuffer;</p>
		<p>                   try {</p>
		<p>                       while (currentBuffer != null) {</p>
		<p>                            takeFromBuffer(currentBuffer);</p>
		<p>                            if (currentBuffer.empty())</p>
		<p>                                 currentBuffer = exchanger.exchange(currentBuffer);</p>
		<p>                       }</p>
		<p>                   } catch (InterruptedException ex) { ... handle ...}</p>
		<p>              }</p>
		<p>         }</p>
		<p> </p>
		<p>         public void start() {</p>
		<p>              new Thread(new FillingLoop()).start();</p>
		<p>              new Thread(new EmptyingLoop()).start();</p>
		<p>         }</p>
		<p>     }</p>
		<p>Exchange<br /> <br /> </p>
		<p> </p>
		<p>     </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>8.      Lock，Condition</p>
		<p>     锁是最基本的同步原语。通过在锁上面调用lock()和unlock()操作，可以达到与synchronized关键字相似的效果，但是有一点要注意的是，锁必须显式释放，如果由于抛出异常，而没有释放锁，将导致死锁出现。Condition提供的await(),signal(),signal()操作，与原来的wai(),notify(),notifyAll()操作具有相似的含义。Lock的两个主要子类是ReentrantLock和ReadWriteLock。其中ReadWriteLock的作用是允许多人读，而一人写。</p>
		<p>     例子：</p>
		<p>     使用Lock和Condition的生产者，消费者问题</p>
		<p>     public class BoundedBuffer {</p>
		<p>         final Lock lock = new ReentrantLock();</p>
		<p>         final Condition notFull  = lock.newCondition(); </p>
		<p>         final Condition notEmpty = lock.newCondition(); </p>
		<p>         final Object[] items = new Object[100];</p>
		<p>         int putptr, takeptr, count;</p>
		<p>         </p>
		<p>         public void put(Object x) throws InterruptedException {</p>
		<p>              lock.lock();</p>
		<p>              try {</p>
		<p>                   while (count == items.length) </p>
		<p>                       notFull.await();</p>
		<p>                   items[putptr] = x; </p>
		<p>                   if (++putptr == items.length) </p>
		<p>                        putptr = 0;</p>
		<p>                   ++count;</p>
		<p>                   notEmpty.signal();</p>
		<p>              } finally {</p>
		<p>                   lock.unlock();</p>
		<p>               }</p>
		<p>          }</p>
		<p>     </p>
		<p>          public Object take() throws InterruptedException {</p>
		<p>               lock.lock();</p>
		<p>              try {</p>
		<p>                   while (count == 0) </p>
		<p>                       notEmpty.await();</p>
		<p>                   Object x = items[takeptr]; </p>
		<p>                   if (++takeptr == items.length) </p>
		<p>                        takeptr = 0; </p>
		<p>                   --count;</p>
		<p>                   notFull.signal();</p>
		<p>                   return x;</p>
		<p>               } finally {</p>
		<p>                   lock.unlock();</p>
		<p>              }</p>
		<p>          } </p>
		<p>     }    </p>
		<p> </p>
		<p>9.      小结：新的concurrent包提供了一个从低到高的同步操作。</p>
		<p> </p>
<img src ="http://www.blogjava.net/jacally/aggbug/95378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-01-22 17:33 <a href="http://www.blogjava.net/jacally/articles/95378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle函数列表速查 [转]</title><link>http://www.blogjava.net/jacally/articles/95369.html</link><dc:creator>Lib</dc:creator><author>Lib</author><pubDate>Mon, 22 Jan 2007 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/jacally/articles/95369.html</guid><wfw:comment>http://www.blogjava.net/jacally/comments/95369.html</wfw:comment><comments>http://www.blogjava.net/jacally/articles/95369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jacally/comments/commentRss/95369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jacally/services/trackbacks/95369.html</trackback:ping><description><![CDATA[
		<p>PL/SQL单行函数和组函数详解<br />　函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类： <br />　　 单行函数</p>
		<p>　　 组函数 </p>
		<p>　　本文将讨论如何利用单行函数以及使用规则。</p>
		<p>　　SQL中的单行函数</p>
		<p>　　SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。<br />SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)</p>
		<p>　　单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</p>
		<p>　　NULL和单行函数</p>
		<p>　　在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数：NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。</p>
		<p>　　下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿<br />column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2</p>
		<p>　　不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：<br />update empset salary=(salary+bonus)*1.1</p>
		<p>　　这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。<br />所以正确的语句是：<br />update empset salary=(salary+nvl(bonus,0)*1.1<br />单行字符串函数</p>
		<p>　　单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串</p>
		<p>　　ASCII()<br />　　c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()<br />SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122</p>
		<p>　　CHR(＜i＞)[NCHAR_CS]<br />　　i是一个数字，函数返回十进制表示的字符<br />select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B</p>
		<p>　　CONCAT(,)<br />　　c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同<br />select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda</p>
		<p>　　INITCAP()<br />　　c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。<br />select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici</p>
		<p>　　INSTR(,[,＜i＞[,]])<br />　　c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1.<br />select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2</p>
		<p>　　INSTRB(,[,i[,j])<br />　　与INSTR（）函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()</p>
		<p>　　LENGTH()<br />　　c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。<br />select LENGTH('Ipso Facto') ergo from dualergo10</p>
		<p>　　LENGTHb()<br />　　与LENGTH()一样，返回字节。</p>
		<p>　　lower()<br />　　返回c的小写字符，经常出现在where子串中<br />select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite</p>
		<p>　　LPAD(,＜i＞[,])<br />　　c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。<br />select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe</p>
		<p>　　LTRIM(,)<br />　　把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。<br />select LTRIM('Mississippi','Mis') from dualLTRppi</p>
		<p>　　RPAD(,＜i＞[,]) <br />　　在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似</p>
		<p>　　RTRIM(,)<br />　　把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
		<p>　　REPLACE(,[,])<br />　　c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。<br />select REPLACE('uptown','up','down') from dualREPLACEdowntown</p>
		<p>　　STBSTR(,＜i＞[,])<br />　　c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。<br />select SUBSTR('Message',1,4) from dualSUBSMess</p>
		<p>　　SUBSTRB(,＜i＞[,])<br />　　与SUBSTR大致相同，只是I,J是以字节计算。</p>
		<p>　　SOUNDEX()<br />　　返回与c1发音相似的词<br />select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250</p>
		<p>　　TRANSLATE(,,)<br />　　将c1中与c2相同的字符以c3代替<br />select TRANSLATE('fumble','uf','ar') test from dualTEXTramble </p>
		<p>　　TRIM([[]] from c3)<br />　　将c3串中的第一个，最后一个，或者都删除。<br />select TRIM(' space padded ') trim from dual TRIMspace padded</p>
		<p>　　UPPER()<br />　　返回c1的大写，常出现where子串中<br />select name from dual where UPPER(name) LIKE 'KI%'NAMEKING<br />单行数字函数</p>
		<p>　　单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作<br />数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</p>
		<p>　　ABS()<br />　　返回n的绝对值</p>
		<p>　　ACOS()<br />　　反余玄函数，返回-1到1之间的数。n表示弧度<br />select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 </p>
		<p>　　ASIN()<br />　　反正玄函数，返回-1到1，n表示弧度</p>
		<p>　　ATAN()<br />　　反正切函数，返回n的反正切值，n表示弧度。</p>
		<p>　　CEIL()<br />　　返回大于或等于n的最小整数。</p>
		<p>　　COS()<br />　　返回n的余玄值，n为弧度</p>
		<p>　　COSH()<br />　　返回n的双曲余玄值，n 为数字。<br />select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847</p>
		<p>　　EXP()<br />　　返回e的n次幂，e=2.71828183.</p>
		<p>　　FLOOR()<br />　　返回小于等于N的最大整数。</p>
		<p>　　LN()<br />　　返回N的自然对数，N必须大于0</p>
		<p>　　LOG(,)<br />　　返回以n1为底n2的对数</p>
		<p>　　MOD()<br />　　返回n1除以n2的余数，</p>
		<p>　　POWER(,)<br />　　返回n1的n2次方</p>
		<p>　　ROUND(,)<br />　　返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。<br />select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54</p>
		<p>　　SIGN()<br />　　如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0.</p>
		<p>　　SIN（)<br />　　返回n的正玄值,n为弧度。</p>
		<p>　　SINH()<br />　　返回n的双曲正玄值,n为弧度。</p>
		<p>　　SQRT()<br />　　返回n的平方根,n为弧度</p>
		<p>　　TAN（)<br />　　返回n的正切值,n为弧度</p>
		<p>　　TANH()<br />　　返回n的双曲正切值,n为弧度</p>
		<p>　　TRUNC(,)<br />　　返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</p>
		<p>　　单行日期函数</p>
		<p>　　单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</p>
		<p>　　ADD_MONTHS(,＜i＞)<br />　　返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</p>
		<p>　　LAST_DAY()<br />　　函数返回包含日期d的月份的最后一天 </p>
		<p>　　MONTHS_BETWEEN(,)<br />　　返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</p>
		<p>　　NEW_TIME(,,)<br />　　d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</p>
		<p>　　NEXT_DAY(,)<br />　　返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。<br />select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 </p>
		<p>　　ROUND([,])<br />　　将日期d按照fmt指定的格式舍入，fmt为字符串。</p>
		<p>　　SYADATE<br />　　函数没有参数，返回当前日期和时间。</p>
		<p>　　TRUNC([,]) <br />　　返回由fmt指定的单位的日期d.<br />单行转换函数</p>
		<p>　　单行转换函数用于操作多数据类型，在数据类型之间进行转换。</p>
		<p>　　CHARTORWID()<br />　　c 使一个字符串，函数将c转换为RWID数据类型。<br />SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') </p>
		<p>　　CONVERT(,[,])<br />　　c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</p>
		<p>　　HEXTORAW()<br />　　x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</p>
		<p>　　RAWTOHEX()<br />　　x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</p>
		<p>　　ROWIDTOCHAR()<br />　　函数将ROWID数据类型转换为CHAR数据类型。</p>
		<p>　　TO_CHAR([[,)<br />　　x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。<br />NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"</p>
		<p>　　TO_DATE([,[,）<br />　　c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</p>
		<p>　　TO_MULTI_BYTE()<br />　　c表示一个字符串，函数将c的担子截字符转换成多字节字符。</p>
		<p>　　TO_NUMBER([,[,)<br />　　c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</p>
		<p>　　TO_SINGLE_BYTE()<br />　　将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</p>
		<p>　　其它单行函数</p>
		<p>　　BFILENAME( <br />,)<br />　　dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</p>
		<p>　　DECODE(,,[,,,[])<br />　　x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</p>
		<p>　　DUMP(,[,[,[,]]])<br />　　x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</p>
		<p>　　EMPTY_BLOB()<br />　　该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</p>
		<p>　　EMPTY_CLOB()<br />　　该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</p>
		<p>　　GREATEST()<br />　　exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
		<p>　　LEAST()<br />　　exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
		<p>　　UID<br />　　该函数没有参数，返回唯一标示当前数据库用户的整数。</p>
		<p>　　USER<br />　　返回当前用户的用户名</p>
		<p>　　USERENV()<br />　　基于opt返回包含当前会话信息。opt的可选值为：</p>
		<p>　　ISDBA　 　　会话中SYSDBA脚色响应，返回TRUE <br />　　SESSIONID 　返回审计会话标示符</p>
		<p>　ENTRYID 　　返回可用的审计项标示符 <br />　　INSTANCE　　在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。<br />　　LANGUAGE　　返回语言、地域、数据库设置的字符集。<br />　　LANG　　　　返回语言名称的ISO缩写。<br />　　TERMINAL　　为当前会话使用的终端或计算机返回操作系统的标示符。</p>
		<p>　　VSIZE()<br />　　x是一个表达式。返回x内部表示的字节数。<br />SQL中的组函数</p>
		<p>　　组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</p>
		<p>　　组（多行）函数</p>
		<p>　　与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</p>
		<p>　　AVG([{DISYINCT|ALL}])<br />　　返回数值的平均值。缺省设置为ALL.<br />SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413</p>
		<p>　　COUNT({*|DISTINCT|ALL} )<br />　　返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</p>
		<p>　　MAX([{DISTINCT|ALL}])<br />　　返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</p>
		<p>　　MIN([{DISTINCT|ALL}])<br />　　返回选择列表项目的最小值。</p>
		<p>　　STDDEV([{DISTINCT|ALL}])<br />　　返回选者的列表项目的标准差，所谓标准差是方差的平方根。</p>
		<p>　　SUM([{DISTINCT|ALL}])<br />　　返回选择列表项目的数值的总和。</p>
		<p>　　VARIANCE([{DISTINCT|ALL}])<br />　　返回选择列表项目的统计方差。</p>
		<p>　　用GROUP BY给数据分组</p>
		<p>　　正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。<br />select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982</p>
		<p>　　在这个例子中，我们用state字段分类；如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。<br />select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982</p>
		<p>　　用HAVING子句限制分组数据</p>
		<p>　　现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：<br />错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</p>
		<p>　　这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：<br />SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000;</p>
		<p>　　嵌套函数</p>
		<p>　　函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。</p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/jacally/aggbug/95369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jacally/" target="_blank">Lib</a> 2007-01-22 16:45 <a href="http://www.blogjava.net/jacally/articles/95369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>