<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Kiral And Java</title>
    <description>成长需要时间的见证，做一个最伟大的程序员！</description>
    <link>http://kiral.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Java Ping</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/213487" style="color:red;">http://kiral.javaeye.com/blog/213487</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">**
	 * 能否ping通IP地址
	 * @param server IP地址
	 * @param timeout 超时时长
	 * @return true能ping通
	 */
	public static boolean pingServer(String server, int timeout) {
        BufferedReader in = null;
        Runtime r = Runtime.getRuntime();

        String pingCommand = "ping " + server + " -n 1 -w " + timeout;
        try {
            Process p = r.exec(pingCommand);
            if (p == null) {
                return false;
            }
            in = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                if (line.startsWith("Reply from")) {
                    return true;
                }
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/213487#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 15:30:14 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/213487</link>
        <guid>http://kiral.javaeye.com/blog/213487</guid>
      </item>
      <item>
        <title>使用prototype实时获取数据</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/210448" style="color:red;">http://kiral.javaeye.com/blog/210448</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
&lt;script>
  
//每隔30分钟去服务器取事件趋势信息
var eventTrendInterval =setInterval("pushEventTrend()",1800000);

//使用异步方式去服务器，获取事件趋势信息
function pushEventTrend()
{
  	var url = "${simpleUrl("/watchAction.action?cmd=queryEventTrend")}";

  	new Ajax.Updater(
  	{success: 'eventTrendDiv'},
  	url,
    {
      method:'post',
      onFailure: reportError
    });
}



function reportError(request)
{
	$("eventTrendDiv").innerHTML = "发生错误";
}

&lt;/script>

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/210448#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 11:15:34 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/210448</link>
        <guid>http://kiral.javaeye.com/blog/210448</guid>
      </item>
      <item>
        <title>常用sql</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/204270" style="color:red;">http://kiral.javaeye.com/blog/204270</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1：exec  sp_help tableName  sqlserver下查看表结构<br />2：ALTER TABLE TABLE_NAME ADD URL VARCHAR(500) 表加字段
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/204270#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 18:11:48 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/204270</link>
        <guid>http://kiral.javaeye.com/blog/204270</guid>
      </item>
      <item>
        <title>sqlserver</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/193543" style="color:red;">http://kiral.javaeye.com/blog/193543</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在XP下使用java连接sqlserver的时候，必须打SP3,SP4补丁，不然sqlserver不监听1433端口，从而连接被拒绝。
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/193543#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 10:13:33 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/193543</link>
        <guid>http://kiral.javaeye.com/blog/193543</guid>
      </item>
      <item>
        <title>再谈事务</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/191521" style="color:red;">http://kiral.javaeye.com/blog/191521</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.事务的传播类型</strong><br />当一个方法(A)中，调用了另一个具有事务的方法(B)。<br />事务的传播会有以下6中情况。<br /><br />"required"：<br />默认的事务类型。<br />如果方法A启动了事务，方法B会运行在当前方法范围内。<br />如果方法A没有启动事务，方法B将创建一个新的事务。<br /><br />"supports":<br />如果方法A启动了事务，方法B会运行在当前方法范围内。<br />如果方法A没有启动事务，方法B不在事务范围内执行。<br /><br />"mandatory":<br />强制类型。<br />如果方法A启动了事务，方法B会运行在当前方法范围内。<br />如果方法A没有启动事务,方法B抛出异常。<br /><br />"requires new"<br />如果方法A启动了事务，挂起A的事务，创建一个新的事务。<br /><br />"no supported"<br />不在事务范围内执行。<br />如果方法A启动了事务，挂起事务A,方法B不在事务内运行。<br /><br />"never"<br />不在事务范围内执行。<br />如果方法A启动了事务，方法B抛出异常。<br /><br /><strong>2。隔离级别</strong><br />"default”<br />默认的，
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/191521#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 17:27:47 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/191521</link>
        <guid>http://kiral.javaeye.com/blog/191521</guid>
      </item>
      <item>
        <title>深入osworkflow的function</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/190253" style="color:red;">http://kiral.javaeye.com/blog/190253</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.基本概念</strong><br />  osworkflow里使用自定义的function来执行业务代码，如步骤“拟稿”，当你执行提交操作的时候，可以自定义一个funciton用来保存稿件到业务数据库。<br /><br />  function分为pre-function(前置方法)和post-function（后置方法），前置函数在step和action之前执行， 后置方法在step和action之后执行。<br /><br /><strong>2.如何使用</strong><br />2.1 定义前置function<br />前置方法，放在action里results之前。<br /><pre name="code" class="xml">
&lt;action id="100" name="启动工作流">
  &lt;pre-functions>
    &lt;function type="class">
    &lt;arg name="class.name">com.opensymphony.workflow.util.Caller&lt;/arg>
    &lt;/function>
  &lt;/pre-functions>
  &lt;results>
    &lt;unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
  &lt;/results>
&lt;/action>
</pre><br /><br />2.2 定义后置function<br />后置方法，放在action里results之后。<br /><pre name="code" class="xml">
&lt;action id="100" name="启动工作流">
  &lt;results>
    &lt;unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
  &lt;/results>
  &lt;post-functions>
    &lt;function type="class">
    &lt;arg name="class.name">com.opensymphony.workflow.util.Caller&lt;/arg>
    &lt;/function>
  &lt;/post-functions>
&lt;/action>
</pre><br /><br />2.3 执行benshell<br />osworkflow支持在function里执行beanshell脚本。<br /><pre name="code" class="java">
&lt;post-functions>
  &lt;function type="beanshell">
    &lt;arg name="script"> 
      System.out.println("step is success!!!");
    &lt;/arg>
  &lt;/function>
&lt;/post-functions>
</pre> <br /><br />2.4 自定义function<br />实现FunctionProvider接口来自定义自己的function.如下：<br /><pre name="code" class="java">
public class MyFunction implements FunctionProvider {

    @SuppressWarnings("unchecked")
    public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException {
        
    }

}</pre><br />在function里你能够得到caller(调用者的名字),workflowID（工作流ID）,actionId(操作ID)。<br /><pre name="code" class="java">WorkflowEntry workflowEntry = (WorkflowEntry) transientVars.get("entry");
long workflowId = workflowEntry.getId();
BasicWorkflowContext context = (BasicWorkflowContext) transientVars.get("context");
String caller = context.getCaller();
int actionId = (Integer) transientVars.get("actionId");</pre><br /><br /><strong>3.使用spring来管理function</strong><br />osworkflow支持使用spring来管理function和condition的生命周期。<br /><br />3.1 让spring来管理function<br />在bean.xml做如下配置<br /><pre name="code" class="xml">
&lt;!-- 将工作流的function和condition交给spring管理 -->
	&lt;bean id="resolver"
		class="com.opensymphony.workflow.util.SpringTypeResolver">
	&lt;/bean>
</pre><br />这样通过byName的注入方式,注入到你的AbstractWorkflow的bean里。<br />或者<br />AbstractWorkflow workflow = new BasicWorkflow(userName);<br />workflow.setResolver(workflowTypeResolver);<br />workflow.setConfiguration(osworkflowConfiguration);<br /><br />3.2定义myFunction的bean<br />&lt;bean id="myFunction" class="MyFunction" /><br /><br />3.2配置bean的function<br /><pre name="code" class="xml">
&lt;post-functions>					
  &lt;function type="spring">				
    &lt;arg name="bean.name">myFunction&lt;/arg>
  &lt;/function>
&lt;/post-functions>
</pre><br />arg的name为bean.name<br />注意：&lt;arg name="bean.name">myFunction&lt;/arg>必须放在同一行，因为myFunction旁边有空格的话，会找不到myFunction bean。<br /><br />更多osworkflow讨论，请进入osworkflow组：<a href="http://osworkflow.group.javaeye.com/ " target="_blank">http://osworkflow.group.javaeye.com/ </a>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/190253#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 15:39:31 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/190253</link>
        <guid>http://kiral.javaeye.com/blog/190253</guid>
      </item>
      <item>
        <title>oracle10g入门</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/189786" style="color:red;">http://kiral.javaeye.com/blog/189786</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.安装oralce10g标准版，设置密码。启动oracle.<br />2.登录web客户端http://localhost:1158/em，用户名为sys,密码为安装的时候设置的。<br />3. 创建表空间，<br />   在表空间创建数据文件。<br />   创建用户，指定默认表空间。<br />4. 使用sqlplus或者plsql执行脚本。
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/189786#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 16:23:03 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/189786</link>
        <guid>http://kiral.javaeye.com/blog/189786</guid>
      </item>
      <item>
        <title>欢迎加入osworkflow组</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/189619" style="color:red;">http://kiral.javaeye.com/blog/189619</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在工作流还处于刚起步的阶段，对工作流感兴趣的人很难在一起交流，促进工作流的成长。<br />所以希望通过这个圈子，汇集对工作流感兴趣的同仁。<br /><br />osworkflow圈子主要分为技术和思想的讨论和研究 <br />技术方面： <br />1：osworkflow基本技术讨论。<br />2：osworkflow的扩展讨论。<br />3：其他工作流引擎的技术讨论。 <br /><br /><br />思想方面： <br />1：讨论各种工作流引擎的思想。<br />2：讨论工作流和实际业务的结合。<br /><br /><br />无论如何，只要你对工作流感兴趣，欢迎加入：<a href="http://osworkflow.group.javaeye.com/" target="_blank">http://osworkflow.group.javaeye.com/</a>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/189619#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 10:31:26 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/189619</link>
        <guid>http://kiral.javaeye.com/blog/189619</guid>
      </item>
      <item>
        <title>osworkflow的API封装</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/189615" style="color:red;">http://kiral.javaeye.com/blog/189615</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
    /**
     * 初始化工作流
      * @param input
     * @return
     */
    @SuppressWarnings("unchecked")
    public long doInitialize(Map input) {
        long wf_id = -1;
        try {
            wf_id = workflow.initialize(workflowName, initActionId, input);
        } catch (InvalidRoleException e) {
            logger.info("当前用户不能初始化工作流");
        } catch (Exception e) {
            throw new RuntimeException("初始化工作流出现问题：", e);
        }
        return wf_id;
    }

   /**
     * 执行动作
     */
    @SuppressWarnings("unchecked")
    public void doAction(final long workflowId, final int actionId, final Map inputs) {
        try {
            workflow.setContext();
            workflow.doAction(workflowId, actionId, inputs);
        } catch (Exception e) {
            throw new RuntimeException("执行操作失败",e);
        }
    }

   /**
    * 得到用户指定流程的有效行动
     * 
    * @param workflowId
    * @return actionID和名称的键值对
     */
    public Map&lt;Integer, String> findAvailableActions(long workflowId) {
        Map&lt;Integer, String> result = new HashMap&lt;Integer, String>();
        int[] availableActions = workflow.getAvailableActions(workflowId, null);
        WorkflowDescriptor wd = workflow
                .getWorkflowDescriptor(workflow.getWorkflowName(workflowId));
        for (int i = 0; i &lt; availableActions.length; i++) {
            int actionId = availableActions[i];
            result.put(actionId, wd.getAction(actionId).getName());
        }
        return result;
    }

    /**
     * 查询工作流描述
      * 
     */
    public WorkflowDescriptor queryWorkflowDescriptor(long workflowId) {
        return workflow.getWorkflowDescriptor(workflow.getWorkflowName(workflowId));
    }

   /**
     * 查询步骤描述，步骤描述中可以得到步骤的名称，步骤的函数
     */
    @SuppressWarnings("unchecked")
    public StepDescriptor queryStepDescriptor(int stepId) {
        return getWorkflowDescriptor().getStep(stepId);
    }

   /**
    * 查询所有步骤
     */
    @SuppressWarnings("unchecked")
    public List&lt;Step> findSteps(long workflowId) {
        Assert.isTrue(workflowId > 0, "workflowId必须大于零");
        List&lt;Step> result = new ArrayList&lt;Step>();
        List currentSteps = workflow.getCurrentSteps(workflowId);
        List historySteps = workflow.getHistorySteps(workflowId);
        result.addAll(currentSteps);
        result.addAll(historySteps);
        return result;
    }
  
    /**
     * 查询操作的名称
     */
    public String findActionName(int actionId) {
        ActionDescriptor actionDescriptor = getWorkflowDescriptor().getAction(actionId);
        return actionDescriptor == null ? null : actionDescriptor.getName();
    }
</pre><br /><br />    上面所写的workflow对象，你可以通过new BasicWorkflow(caller);得到。<br />     也可以扩展AbstractWorkflow得到<br />      <pre name="code" class="java">
/**
 * 扩展的工作流类
 */
public class ExtWorkflow extends AbstractWorkflow {

    public void setContext() {
        String caller;
        try {
            caller= //通过你的上下文获得
        } catch (Exception e) {
            caller ="";
        }
        super.context=new BasicWorkflowContext(caller);
    }

}</pre><br /><br />最后：对工作流感兴趣的同仁可以加入：<a href="http://osworkflow.group.javaeye.com/" target="_blank">http://osworkflow.group.javaeye.com/</a>讨论
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/189615#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 10:20:51 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/189615</link>
        <guid>http://kiral.javaeye.com/blog/189615</guid>
      </item>
      <item>
        <title>osworkflow如何与业务结合？</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/189594" style="color:red;">http://kiral.javaeye.com/blog/189594</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          osworkflow是一个轻量级的工作流开源框架，只提供工作流的基本功能，要实现业务功能需要做大量的扩展。<br />  <br />  <strong>1.建立工作流与业务的关系。</strong><br />  建一张流程与业务关系表，来保存工作流ID与业务ID的关系，表结构设计如下图：<br />  <img src="http://osworkflow.group.javaeye.com/upload/picture/pic/13645/04d26693-5964-3f64-bebc-4840abfe2ce9.jpg" />  <br />  一个系统可能涉及到多个业务类型要加入流程，所以表中加入了业务类型字段。当你初始化一个流程的时候，往这张表中插入工作流的流程ID，业务ID，及业务类型.这样你可以通过业务ID来查询当前这个业务所在的流程。<br /><br />  <strong>2.加入流程意见。</strong><br />  建一张流程意见表，来保存用户每个步骤输入的意见信息。表结构设计如下图：<br />  <img src="http://osworkflow.group.javaeye.com/upload/picture/pic/13647/4c6296ff-6847-3fd1-a3cd-551bbf2bdc9d.jpg" /><br />  在用户每一步执行操作的时候，往意见表中插入数据，意见表中保存了流程ID,这样可以通过流程ID，查询出意见列表。（加入流程意见不是必须的）<br /><br />  <strong>3.创建任务。</strong><br />  通过给用户发待办任务，来通知用户当前哪些事情需要他处理。表结构设计如下图：<br />  <img src="http://osworkflow.group.javaeye.com/upload/picture/pic/13649/1ebec6d4-2c3a-3e91-91fc-b9a2da4ab5d7.jpg" /><br />  每个任务都包括，业务ID,业务类型和流程ID。通过这三个字段能够判断，当前这个业务进入了那个步骤（过程），从而跳转到相应的页面。 <br />   <br />   举一个例子：如发布公告流程<br />   一共有三个步骤：  起稿->审批->完毕<br />   起稿步骤的操作是：提交。<br />   审批步骤的操作是：审批通过，驳回。<br /><br />   当用户提交公告的时候<br />   1.系统会启动流程，建立公告ID与流程ID的关系。<br />   2.用户需要在页面上输入提交意见，系统保存流程意见。<br />   3.给提交用户的人创建一个已办任务，给审核人创建一个待办任务。<br /><br />   提交公告的用户通过已办任务，能够进入公告明细页面，这个页面能够看到流程意见列表和流程跟踪。<br />   审核公告的用户通过待办任务，能够进入公告审核页面，这个页面能够公告明细，能够输入流程意见，能够执行审批通过或者驳回的操作。<br /><br />   <strong>最后：对工作流感兴趣的同仁可以加入：<a href="http://osworkflow.group.javaeye.com/" target="_blank">http://osworkflow.group.javaeye.com/</a></strong>讨论
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/189594#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 09:45:26 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/189594</link>
        <guid>http://kiral.javaeye.com/blog/189594</guid>
      </item>
      <item>
        <title>J2EE开发注意事项</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/186456" style="color:red;">http://kiral.javaeye.com/blog/186456</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.页面展现层</strong><br />1.每个input输入框都必须设置maxlength。texaArea没有maxlength这个属性，所以必须使用js来控制用户输入的长度。<br />2.对于数据显示列表，必须定义每列的宽度，必须强制截取每列的长度，在TITLE显示每列的全部数据。<br />3.必须在用户指定的分辨率下进行测试，如1024*768。<br />4.尽量在firefox下做测试，这样能尽量兼容各个浏览器。<br />5.页面上的地址原则上写绝对路径。<br /><br /><strong>2.业务展现层</strong><br />2.1 在获得数据和编辑数据的时候，必须先检查当前数据是否存在，如果不存在，则提示用户。<br />2.2 原则上调用service层，不直接调用DAO层。<br /><br /><strong>3.服务展现层</strong><br />3.1 对于多条数据库更新操作，使用事务处理。单条数据更新操作不做事务处理。<br /><br /><strong>4.数据访问层</strong><br />4.1 不涉及任何业务逻辑，只关心数据的操作。如：<br />不应该提供查询已办任务的方法，应该是通过任务状态查询
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/186456#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Apr 2008 16:44:48 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/186456</link>
        <guid>http://kiral.javaeye.com/blog/186456</guid>
      </item>
      <item>
        <title>CSS实用基础(兼容IE和FF)</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/185434" style="color:red;">http://kiral.javaeye.com/blog/185434</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.显示列表,在IE下多余的数据用点显示，在FF下直接截断</strong><br /><pre name="code" class="css">.listTable{
  table-layout:fixed;
  width:99%;
  border: 0px;
  border-collapse: collapse
}
.listTable td{
  height:23px;
  border-left-width:0px;
  border-right:1px solid #ceddef;
  padding-left:5px;
  padding-right:5px;
  white-space:nowrap;
  font: 9pt 宋体,verdana,arial;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis
}

.warp
{
white-space:normal;
word-break:break-all;
overflow:auto;
}

</pre><br /><br /><strong>2.鼠标放上去成手状</strong><br />cursor:pointer
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/185434#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 13:57:25 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/185434</link>
        <guid>http://kiral.javaeye.com/blog/185434</guid>
      </item>
      <item>
        <title>Freemark基础</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/184439" style="color:red;">http://kiral.javaeye.com/blog/184439</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Freemark 开发指南初稿<br />                                  整理:蒋江伟<br />A概念<br />最常用的3个概念<br />sequence  序列，对应java里的list、数组等非键值对的集合<br />hash      键值对的集合<br />namespace 对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源<br /><br />B指令<br />if, else, elseif<br />语法<br />&lt;#if condition><br />  ...<br />&lt;#elseif condition2><br />  ...<br />&lt;#elseif condition3><br />  ...<br />...<br />&lt;#else><br />  ...<br />&lt;/#if><br />用例<br />&lt;#if x = 1><br />  x is 1<br />&lt;/#if><br /><br />&lt;#if x = 1><br />  x is 1<br />&lt;#else><br />  x is not 1<br />&lt;/#if><br /><br />switch, case, default, break<br />语法<br />&lt;#switch value><br />  &lt;#case refValue1><br />    ...<br />    &lt;#break><br />  &lt;#case refValue2><br />    ...<br />    &lt;#break><br />  ...<br />  &lt;#case refValueN><br />    ...<br />    &lt;#break><br />  &lt;#default><br />    ...<br />&lt;/#switch><br /><br />用例<br />字符串<br />&lt;#switch being.size><br />  &lt;#case "small"><br />     This will be processed if it is small<br />     &lt;#break><br />  &lt;#case "medium"><br />     This will be processed if it is medium<br />     &lt;#break><br />  &lt;#case "large"><br />     This will be processed if it is large<br />     &lt;#break><br />  &lt;#default><br />     This will be processed if it is neither<br />&lt;/#switch><br />数字<br />&lt;#switch x><br />  &lt;#case x = 1><br />    1<br />  &lt;#case x = 2><br />    2<br />  &lt;#default><br />    d<br />&lt;/#switch><br /><br />如果x=1 输出 1 2, x=2输出 2, x=3 输出d<br /><br />list, break<br />语法<br />&lt;#list sequence as item><br />...<br />&lt;#if item = "spring">&lt;#break>&lt;/#if><br />...<br />&lt;/#list><br />关键字<br />item_index:是list当前值的下标<br />item_has_next:判断list是否还有值<br /><br />用例<br />&lt;#assign seq = ["winter", "spring", "summer", "autumn"]><br />&lt;#list seq as x><br />  ${x_index + 1}. ${x}&lt;#if x_has_next>,&lt;/#if><br />&lt;/#list><br /><br />输出<br />  1. winter,<br />  2. spring,<br />  3. summer,<br />  4. autumn   <br /><br /><br />include<br />语法<br />&lt;#include filename><br />or<br />&lt;#include filename options><br />options包含两个属性<br />encoding=”GBK” 编码格式<br />parse=true 是否作为ftl语法解析,默认是true，false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”<br />用例<br />/common/copyright.ftl包含内容<br />Copyright 2001-2002 ${me}&lt;br><br />All rights reserved.  <br />模板文件<br />&lt;#assign me = "Juila Smith"><br />&lt;h1>Some test&lt;/h1><br />&lt;p>Yeah.<br />&lt;hr><br />&lt;#include "/common/copyright.ftl" encoding=”GBK”> <br />输出结果<br />&lt;h1>Some test&lt;/h1><br />&lt;p>Yeah.<br />&lt;hr><br />Copyright 2001-2002 Juila Smith<br />All rights reserved.  <br /><br />Import<br />语法<br />&lt;#import path as hash><br />类似于java里的import,它导入文件，然后就可以在当前文件里使用被导入文件里的宏组件<br /><br />用例<br /><br />假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用<br />&lt;#import "/libs/mylib.ftl" as my><br /><br />&lt;@my.copyright date="1999-2002"/><br /><br />"my"在freemarker里被称作namespace<br /><br />compress<br />语法<br />&lt;#compress><br />  ...<br />&lt;/#compress><br />用来压缩空白空间和空白的行<br />用例<br />&lt;#assign x = "    moo  \n\n   "><br />(&lt;#compress><br />  1 2  3   4    5<br />  ${x}<br />  test only<br /><br />  I said, test only<br /><br />&lt;/#compress>)  <br />输出<br />(1 2 3 4 5<br />moo<br />test only<br />I said, test only) <br />escape, noescape<br />语法<br />&lt;#escape identifier as expression><br />  ...<br />  &lt;#noescape>...&lt;/#noescape><br />  ...<br />&lt;/#escape><br />用例<br />主要使用在相似的字符串变量输出，比如某一个模块的所有字符串输出都必须是html安全的，这个时候就可以使用该表达式<br />&lt;#escape x as x?html><br />  First name: ${firstName}<br />  &lt;#noescape>Last name: ${lastName}&lt;/#noescape><br />  Maiden name: ${maidenName}<br />&lt;/#escape><br />相同表达式  <br />  First name: ${firstName?html}<br />  Last name: ${lastName}<br />  Maiden name: ${maidenName?html}<br />assign<br />语法<br />&lt;#assign name=value><br />or<br />&lt;#assign name1=value1 name2=value2 ... nameN=valueN><br />or<br />&lt;#assign same as above... in namespacehash><br />or<br />&lt;#assign name><br />  capture this<br />&lt;/#assign><br />or<br />&lt;#assign name in namespacehash><br />  capture this<br />&lt;/#assign><br />用例<br />生成变量,并且给变量赋值<br />给seasons赋予序列值<br />&lt;#assign seasons = ["winter", "spring", "summer", "autumn"]><br /><br />给变量test加1<br />&lt;#assign test = test + 1><br /><br />给my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量<br />&lt;#import "/mylib.ftl" as my><br />&lt;#assign bgColor="red" in my><br /><br />将一段输出的文本作为变量保存在x里<br />下面的阴影部分输出的文本将被赋值给x<br />&lt;#assign x><br />  &lt;#list 1..3 as n><br />    ${n} &lt;@myMacro /><br />  &lt;/#list><br />&lt;/#assign><br />Number of words: ${x?word_list?size}<br />${x}<br /><br />&lt;#assign x>Hello ${user}!&lt;/#assign>     error<br />&lt;#assign x=” Hello ${user}!”>         true<br /><br />同时也支持中文赋值，如：<br />&lt;#assign 语法><br />  java<br />&lt;/#assign><br />${语法}<br />打印输出:<br />java<br />global<br />语法<br />&lt;#global name=value><br />or<br />&lt;#global name1=value1 name2=value2 ... nameN=valueN><br />or<br />&lt;#global name><br />  capture this<br />&lt;/#global><br /><br />全局赋值语法，利用这个语法给变量赋值，那么这个变量在所有的namespace中是可见的,如果这个变量被当前的assign语法覆盖 如&lt;#global x=2> &lt;#assign x=1> 在当前页面里x=2将被隐藏，或者通过${.global.x}来访问<br /><br />setting<br />语法<br />&lt;#setting name=value><br />用来设置整个系统的一个环境<br />locale<br />number_format<br />boolean_format<br />date_format, time_format, datetime_format<br />time_zone<br />classic_compatible<br />用例<br />假如当前是匈牙利的设置，然后修改成美国<br />${1.2}<br />&lt;#setting locale="en_US"><br />${1.2}  <br />输出<br />1,2<br />1.2<br />因为匈牙利是采用“,”作为十进制的分隔符，美国是用“.”<br /><br /><br /><br />macro, nested, return<br />语法<br /><br />&lt;#macro name param1 param2 ... paramN><br />  ...<br />  &lt;#nested loopvar1, loopvar2, ..., loopvarN><br />  ...<br />  &lt;#return><br />  ...<br />&lt;/#macro><br />用例<br />&lt;#macro test foo bar="Bar" baaz=-1><br />  Test text, and the params: ${foo}, ${bar}, ${baaz}<br />&lt;/#macro><br />&lt;@test foo="a" bar="b" baaz=5*5-2/><br />&lt;@test foo="a" bar="b"/><br />&lt;@test foo="a" baaz=5*5-2/><br />&lt;@test foo="a"/> <br />输出<br />  Test text, and the params: a, b, 23<br />  Test text, and the params: a, b, -1<br />  Test text, and the params: a, Bar, 23<br />  Test text, and the params: a, Bar, -1<br />定义循环输出的宏<br />&lt;#macro list title items><br />  &lt;p>${title?cap_first}:<br />  &lt;ul><br />    &lt;#list items as x><br />      &lt;li>${x?cap_first}<br />    &lt;/#list><br />  &lt;/ul><br />&lt;/#macro><br />&lt;@list items=["mouse", "elephant", "python"] title="Animals"/><br />输出结果<br />&lt;p>Animals:<br />  &lt;ul><br />      &lt;li>Mouse<br />      &lt;li>Elephant<br />      &lt;li>Python<br />  &lt;/ul><br />包含body的宏<br />&lt;#macro repeat count><br />  &lt;#list 1..count as x><br />    &lt;#nested x, x/2, x==count><br />  &lt;/#list><br />&lt;/#macro><br />&lt;@repeat count=4 ; c halfc last><br />  ${c}. ${halfc}&lt;#if last> Last!&lt;/#if><br />&lt;/@repeat> <br />输出<br />1. 0.5<br />  2. 1<br />  3. 1.5<br />  4. 2 Last!<br /><br /><br /><br /><br />t, lt, rt<br />语法<br />&lt;#t> 去掉左右空白和回车换行<br /><br />&lt;#lt>去掉左边空白和回车换行<br /><br />&lt;#rt>去掉右边空白和回车换行<br /><br />&lt;#nt>取消上面的效果<br /><br /><br />C一些常用方法或注意事项<br /><br /><br />表达式转换类<br />${expression}计算expression并输出<br />#{ expression }数字计算#{ expression ;format}安格式输出数字format为M和m<br />M表示小数点后最多的位数,m表示小数点后最少的位数如#{121.2322;m2M2}输出121.23<br /><br /><br /><br /><br />数字循环<br />1..5 表示从1到5，原型number..number<br />对浮点取整数<br />${123.23?int} 输出123<br />给变量默认值<br />${var?default(“hello world&lt;br>”)?html}如果var is null那么将会被hello world&lt;br>替代<br /><br />判断对象是不是null<br />    &lt;#if mouse?exists><br />      Mouse found<br />&lt;#else><br />也可以直接${mouse?if_exists})输出布尔形<br />常用格式化日期<br /> openingTime必须是Date型,详细查看freemarker文档 Reference->build-in referece->build-in for date<br /><br />${openingTime?date}<br />${openingTime?date_time}<br />${openingTime?time}<br /><br />添加全局共享变量数据模型<br />在代码里的实现<br />    cfg = Configuration.getDefaultConfiguration();<br />cfg.setSharedVariable("global", "you good"); <br />页面实现可以通过global指令,具体查看指令里的global部分<br />直接调用java对象的方法<br />${object.methed(args)}  <br /><br />字符串处理(内置方法)<br />html安全输出<br />“abc&lt;table>sdfsf”?html <br />返回安全的html输出,替换掉html代码<br />xml安全输出<br />var?xml   <br />substring的用法<br />&lt;#assign user=”hello jeen”><br />${user[0]}${user[4]} <br />${user[1..4]}<br />输出 :<br />ho<br />ello  <br />类似String.split的用法 <br /> “abc;def;ghi”?split(“;”)返回sequence<br />将字符串按空格转化成sequence,然后取sequence的长度<br />	    var?word_list  效果同 var?split(“ ”) <br />	var?word_list?size<br /><br />取得字符串长度<br />var?length<br /><br />大写输出字符<br />var?upper_case<br /><br />小写输出字符<br />var?lower_case<br /><br />首字符大写<br />var?cap_first<br /><br />首字符小写<br />var?uncap_first<br /><br />去掉字符串前后空格 <br />var?trim<br /><br />每个单词的首字符大写<br />var?capitalize<br /><br />类似String.indexof: <br />	“babcdabcd”?index_of(“abc”) 返回1<br />	“babcdabcd”?index_of(“abc”,2) 返回5<br />类似String.lastIndexOf <br />	last_index_of和String.lastIndexOf类似,同上<br /><br />下面两个可能在代码生成的时候使用（在引号前加”\”）<br />j_string: 在字符串引号前加”\”<br />	&lt;#assign beanName = 'The "foo" bean.'><br />	String BEAN_NAME = "${beanName?j_string}";<br />打印输出:<br />	String BEAN_NAME = "The \"foo\" bean.";<br />js_string:<br />	&lt;#assign user = "Big Joe's \"right hand\"."><br />&lt;script><br />  alert("Welcome ${user}!");<br />&lt;/script>  <br />打印输出<br />	alert("Welcome Big Joe\'s \"right hand\"!");<br /><br />替换字符串 replace<br />${s?replace(‘ba’, ‘XY’ )}<br />${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下:<br />•	i: 大小写不区分.<br />•	f: 只替换第一个出现被替换字符串的字符串<br />•	r:  XY是正则表达式<br />•	m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string.<br />•	s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators.<br />•	c: Permits whitespace and comments in regular expressions.<br /><br /><br />在模板里对sequences和hashes初始化<br />sequences  <br /><br />1.	[“you”,”me”,”he”] <br />2.	1..100<br />3.	[ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”},<br />{“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”},<br />]<br /><br />  <br />hashes      {“you”:”a”,”me”:”b”,”he”:”c”}<br /><br /><br />注释标志<br />&lt;#-- <br />这里是注释 <br />--><br />旧版本的freemarker采用的是&lt;#comment> 注释 &lt;/#comment>方法<br /><br />sequences内置方法<br />sequence?first<br />返回sequence的第一个值;前提条件sequence不能是null<br />sequence?last<br />	返回sequence最后一个值<br />sequence?reverse<br />	反转sequence的值<br />sequence?size<br />	返回sequence的大小<br />sequence?sort<br />	对sequence按里面的对象toString()的结果进行排序<br />sequence?sort_by(value)<br />对sequence 按里面的对象的属性value进行排序<br />如: sequence里面放入的是10 个user对象，user对象里面包含name,age等属性<br />sequence?sort_by(name) 表示所有的user按user.name进行排序<br />hashes内置方法<br />hash?keys<br />	返回hash里的所有keys, 返回结果类型sequence<br />hash?values<br />	返回hash里的所有value, 返回结果类型sequence<br />D freemarker在web开发中注意事项<br />freemarker与webwork整合<br />web中常用的几个对象<br />Freemarker的ftl文件中直接使用内部对象:<br />${Request ["a"]}<br />${RequestParameters["a"]}<br />${Session ["a"]}<br />${Application ["a"]}<br />${JspTaglibs ["a"]}<br /><br />与webwork整合之后 通过配置的servlet 已经把request,session等对象置入了数据模型中<br />在view中存在下面的对象<br />  我们可以在ftl中${req}来打印req对象<br />•	req - the current HttpServletRequest <br />•	res - the current HttpServletResponse <br />•	stack - the current OgnlValueStack <br />•	ognl - the OgnlTool instance <br />•	webwork - an instance of FreemarkerWebWorkUtil <br />•	action - the current WebWork action <br />•	exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view <br />view中值的搜索顺序<br />${name}将会以下面的顺序查找name值<br />•	freemarker variables <br />•	value stack <br />•	request attributes <br />•	session attributes <br />•	servlet context attributes <br />在模板里ftl里使用标签<br />注意，如果标签的属性值是数字，那么必须采用nubmer=123方式给属性赋值<br />JSP页面<br />&lt;%@page contentType="text/html;charset=ISO-8859-2" language="java"%><br />&lt;%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"%><br />&lt;%@taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%><br /><br />&lt;html><br />  &lt;body><br />    &lt;h1>&lt;bean:message key="welcome.title"/>&lt;/h1><br />    &lt;html:errors/><br />    &lt;html:form action="/query"><br />      Keyword: &lt;html:text property="keyword"/>&lt;br><br />      Exclude: &lt;html:text property="exclude"/>&lt;br><br />      &lt;html:submit value="Send"/><br />    &lt;/html:form><br />  &lt;/body><br />&lt;/html> <br />模板ftl页面<br />&lt;#assign html=JspTaglibs["/WEB-INF/struts-html.tld"]><br />&lt;#assign bean=JspTaglibs["/WEB-INF/struts-bean.tld"]><br /><br />&lt;html><br />  &lt;body><br />    &lt;h1>&lt;@bean.message key="welcome.title"/>&lt;/h1><br />    &lt;@html.errors/><br />    &lt;@html.form action="/query"><br />      Keyword: &lt;@html.text property="keyword"/>&lt;br><br />      Exclude: &lt;@html.text property="exclude"/>&lt;br><br />      &lt;@html.submit value="Send"/><br />    &lt;/@html.form><br />  &lt;/body><br />&lt;/html>  <br /><br /><br />如何初始化共享变量<br />1．	初始化全局共享数据模型<br />freemark在web上使用的时候对共享数据的初始化支持的不够,不能在配置初始化的时候实现，而必须通过ftl文件来初始化全局变量。这是不能满主需求的，我们需要在servlet init的时候留出一个接口来初始化系统的共享数据<br />具体到和webwork整合,因为本身webwork提供了整合servlet,如果要增加全局共享变量，可以通过修改com.opensymphony.webwork.views.freemarker.FreemarkerServlet来实现,我们可以在这个servlet初始化的时候来初始化全局共享变量<br />与webwork整合配置<br />配置web.xml<br />&lt;servlet><br />    &lt;servlet-name>freemarker&lt;/servlet-name><br />    &lt;servlet-class>com.opensymphony.webwork.views.freemarker.FreemarkerServlet&lt;/servlet-class><br />    &lt;init-param><br />      &lt;param-name>TemplatePath&lt;/param-name><br />&lt;param-value>/&lt;/param-value><br />&lt;!—模板载入文件夹，这里相对context root，递归获取该文件夹下的所有模板--><br />    &lt;/init-param><br />    &lt;init-param><br />      &lt;param-name>NoCache&lt;/param-name> &lt;!—是否对模板缓存--><br />      &lt;param-value>true&lt;/param-value><br />    &lt;/init-param><br />    &lt;init-param><br />      &lt;param-name>ContentType&lt;/param-name><br />      &lt;param-value>text/html&lt;/param-value><br />    &lt;/init-param><br />    &lt;init-param><br />&lt;param-name>template_update_delay&lt;/param-name><br />&lt;!—模板更新时间,0表示每次都更新,这个适合开发时候--><br />      &lt;param-value>0&lt;/param-value><br />    &lt;/init-param><br />    &lt;init-param><br />      &lt;param-name>default_encoding&lt;/param-name><br />      &lt;param-value>GBK&lt;/param-value><br />    &lt;/init-param><br />    &lt;init-param><br />      &lt;param-name>number_format&lt;/param-name><br />      &lt;param-value>0.##########&lt;/param-value>&lt;!—数字显示格式--><br />    &lt;/init-param><br />    &lt;load-on-startup>1&lt;/load-on-startup><br />  &lt;/servlet><br />  &lt;servlet-mapping><br />    &lt;servlet-name>freemarker&lt;/servlet-name><br />    &lt;url-pattern>*.ftl&lt;/url-pattern><br />  &lt;/servlet-mapping><br /><br />E高级方法<br />自定义方法<br />${timer("yyyy-MM-dd H:mm:ss", x)}<br />${timer("yyyy-MM-dd ", x)} <br /><br />在模板中除了可以通过对象来调用方法外（${object.methed(args)}）也可以直接调用java实现的方法，java类必须实现接口TemplateMethodModel的方法exec(List args). 下面以把毫秒的时间转换成按格式输出的时间为例子<br />public class LongToDate implements TemplateMethodModel {<br />    <br />public TemplateModel exec(List args) throws TemplateModelException {<br />SimpleDateFormat mydate = new SimpleDateFormat((String) args.get(0)));<br />        return mydate.format(new Date(Long.parseLong((String)args.get(1)));<br />    }<br />}  <br />将LongToDate对象放入到数据模型中<br />root.put("timer", new IndexOfMethod());<br />ftl模板里使用<br />&lt;#assign x = "123112455445"><br />${timer("yyyy-MM-dd H:mm:ss", x)}<br />${timer("yyyy-MM-dd ", x)} <br /><br />输出<br />2001-10-12 5:21:12<br />2001-10-12<br /><br />自定义 Transforms<br />实现自定义的&lt;@transform>文本或表达式&lt;/@transform>的功能,允许对中间的最终文本进行解析转换<br /><br />例子：实现&lt;@upcase>str&lt;/@upcase> 将str转换成STR 的功能<br /><br />代码如下：<br />import java.io.*;<br />import java.util.*;<br />import freemarker.template.TemplateTransformModel;<br /><br />class UpperCaseTransform implements TemplateTransformModel {<br /><br />    public Writer getWriter(Writer out, Map args) {<br />        return new UpperCaseWriter(out);<br />    }<br /><br />    private class UpperCaseWriter extends Writer {<br />       <br />        private Writer out;<br />           <br />        UpperCaseWriter (Writer out) {<br />            this.out = out;<br />        }<br /><br />        public void write(char[] cbuf, int off, int len)<br />                throws IOException {<br />            out.write(new String(cbuf, off, len).toUpperCase());<br />        }<br /><br />        public void flush() throws IOException {<br />            out.flush();<br />        }<br /><br />        public void close() {<br />        }<br />    }<br />}  <br />然后将此对象put到数据模型中<br />root.put("upcase", new UpperCaseTransform());<br /><br />在view(ftl)页面中可以如下方式使用<br /><br />&lt;@upcase><br />hello world<br />&lt;/@upcase><br /><br />打印输出:<br />HELLO WORLD
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/184439#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 17:44:33 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/184439</link>
        <guid>http://kiral.javaeye.com/blog/184439</guid>
      </item>
      <item>
        <title>工作流设计原则</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/177554" style="color:red;">http://kiral.javaeye.com/blog/177554</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.一种业务对象使用一个流程，<br />如：某个流程就是用来处理文档，而不是既处理文档又处理其他的对象。<br /><br />2.业务ID和流程ID最好是一对一的关系。这样可以通过流程ID查询到业务对象。<br /><br />3.在流程里，最好只通过业务ID就能查询到你需要的信息，降低耦合。
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/177554#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Mar 2008 11:07:19 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/177554</link>
        <guid>http://kiral.javaeye.com/blog/177554</guid>
      </item>
      <item>
        <title>总结JAVASCRIPT和HTML基础</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/164172" style="color:red;">http://kiral.javaeye.com/blog/164172</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.Confim</strong><br />在html标记添加确认，加上<br /><pre name="code" class="javascript">onclick="return confirm('您确定要删除这个数据吗？')"</pre><br />在js方法里添加确认，加上<br /><pre name="code" class="javascript">
if(confirm('确定要删除选中的数据吗？'))
{
     document.listForm.submit();
}
</pre><br /><br /><strong>2.可用与不可用</strong><br />在html标记里添加disabled表示当前控件不可用，readonly表示当前控件只读，enabled表示当前控件可用。<br />在js方法里通过disabled=true表示某空间不可用。<br /><br /><strong>3.浏览器回退</strong><br /><pre name="code" class="javascript">window.history.back();</pre><br /><br /><strong>4.限制输入框长度</strong><br />在html标记里添加maxlength="500"。<br />//限制textArea的长度<br /><pre name="code" class="javascript">
onkeyup="return limitMaxLength(this)"
function limitMaxLength(obj){
  var mlength = obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
  if (obj.getAttribute && obj.value.length > mlength){
    obj.value = obj.value.substring(0,mlength);
  }
}
</pre><br /><br /><strong>5.设置页面不被浏览器缓存</strong><br /><pre name="code" class="html">
&lt;meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
&lt;meta http-equiv="Cache-Control" content="no-store"/>
&lt;meta http-equiv="Pragma" content="no-cache"/>
&lt;meta http-equiv="Expires" content="0"/>
</pre><br /><br /><br /><strong>6.修改样式名称</strong><br /><pre name="code" class="javascript">object.className="";</pre><br /><br /><strong>7.显示和隐藏</strong><br /><pre name="code" class="javascript">object.style.display="none";//隐藏
object.style.display="";//显示</pre><br /><br /><strong>8.刷新页面</strong><br /><pre name="code" class="javascript">
1 history.go(0) 
2 location.reload() 
3 location=location 
4 location.assign(location) 
5 document.execCommand(‘Refresh‘) 
6 window.navigate(location) 
7 location.replace(location) 
8 document.URL=location.href.自动刷新页面的方法:
1.页面自动刷新：把如下代码加入&lt;head>区域中&lt;meta http-equiv="refresh" content="20">其中20指每隔20秒刷新一次页面.
2.&lt;body onload="opener.location.reload()"> 开窗时刷新
3.&lt;body onUnload="opener.location.reload()"> 关闭时刷新
</pre><br /><br /><strong>9.使用锚</strong><br />使用锚(mao)可以定位到页面的某个地方<br />格式：URL+#+元素的ID（最好是&lt;a>的ID），<br />例子：http://www.google.com#edit。<br />http://www.google.com页面里有一个&lt;a id="edit">&lt;/a>的元素 <br /><br /><strong>10.定时执行JS函数</strong><br />setInterval("pushIDSEvent()",5000);//间隔5秒
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/164172#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 13:08:10 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/164172</link>
        <guid>http://kiral.javaeye.com/blog/164172</guid>
      </item>
      <item>
        <title>如何实现自己的事件监听器</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/163965" style="color:red;">http://kiral.javaeye.com/blog/163965</a>&nbsp;
          发表时间: 2008年02月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.何时需要使用事件监听？</strong><br />但凡大的项目，各模块都是由不同的程序员开发，但是各模块之间需要进行通讯，用来保证项目的整体性，那么我们可以使用事件监听器来做通讯工具，用来告诉各模块自己模块的一些事件。如： 当用户被删除或者添加的时候，请通知我，我需要要做一些相关的处理事情（如删除用户和组的对应关系）。<br /><br /><strong>2.创建自己的事件监听器？</strong><br /><br />2.1 添加事件源<br />事件源就是你需要监听的对象（类似于swing里的button），本示例将资产类型作为事件源进行讲解。<br /><pre name="code" class="java">
public class AssetType {

    private String typeId;

    public String getTypeId() {
        return typeId;
    }

    public void setTypeId(String typeId) {
        this.typeId = typeId;
    }

    /**
     * 用于存储事件监听者
     */
    private EventListenerList assetListenners;

    /**
     * 通知注册删除资产的监听者
     */
    @Transient
    public void notifyDeleteAssetEvent() {
        Object[] listenners = assetListenners.getListenerList();
        for (Object listenner : listenners) {
            if (listenner instanceof AssetTypeListenner) {
                AssetTypeListenner assetListenner;
                assetListenner = (AssetTypeListenner) listenner;
                assetListenner.deleteAssetTypeEvent(new AssetTypeEvent(this));
            }
        }
    }

    /**
     * 通知注册添加资产的监听者
     */
    @Transient
    public void notifyAddAssetEvent() {
        Object[] listenners = assetListenners.getListenerList();
        for (Object listenner : listenners) {
            if (listenner instanceof AssetTypeListenner) {
                AssetTypeListenner assetListenner;
                assetListenner = (AssetTypeListenner) listenner;
                assetListenner.addAssetTypeEvent(new AssetTypeEvent(this));
            }
        }
    }

    public EventListenerList getAssetListenners() {
        return assetListenners;
    }

    public void setAssetListenners(EventListenerList assetListenners)  
    {
        this.assetListenners = assetListenners;
    }

}
</pre><br /><br /><br />2.2添加事件状态类<br /><br />事件状态类，用来描述这个事件源的状态。<br /><pre name="code" class="java">
public class AssetTypeEvent extends EventObject {

    private AssetType assetType;

    public AssetTypeEvent(Object source) {
        super(source);
        assetType = (AssetType) source;
    }

    private static final long serialVersionUID = 1L;

    public AssetType getAssetType() {
        return assetType;
    }

    public void setAssetType(AssetType assetType) {
        this.assetType = assetType;
    }

}
</pre><br /><br />2.3 添加事件监听器<br /><br />事件监听器就是向外界声明，事件源所有可能发生的事件。<br />本例中如果需要监听资产类型的事件，就必须实现这个接口。<br /><pre name="code" class="java">
public interface AssetTypeListenner extends EventListener {

    /**
     * 删除资产类型
     * @param assetEvent
     */
    public void deleteAssetTypeEvent(AssetTypeEvent assetEvent);
    
    /**
     * 添加资产类型
     * @param assetEvent
     */
    public void addAssetTypeEvent(AssetTypeEvent assetEvent);
    
}
</pre><br /><br />2.4通知监听者<br />当你执行操作的时候需要通知监听者。<br /><pre name="code" class="java">private List&lt;AssetTypeListenner> assetTypeListenners;
assetType.setAssetListenners(assetTypeListenners);//添加所有监听者
assetType.notifyDeleteAssetEvent();//通知监听者</pre><br /><br /><br /><strong>3.如何使用事件监听器？</strong><br />3.1.实现监听器接口<br />       需要监听的类实现资产类型监听器接口implements AssetTypeListenner<br />      实现这个接口以后，需要监听的类必须实现接口里两个方法，用来处理你的业务逻辑，<br />     <pre name="code" class="java">public void addAssetTypeEvent(AssetTypeEvent assetEvent) {
        System.out.println("我知道了，资产类型"+assetEvent.getAssetType().getTypeName()+"将要添加");
     }
 
    public void deleteAssetTypeEvent(AssetTypeEvent assetEvent) {
        System.out.println("我知道了，资产类型"+assetEvent.getAssetType().getTypeName()+"将要删除");
     }</pre><br />     在方法里你可以通过assetEvent.getAssetType()来得到资产类型对象。<br />    <br />3.2.注册您的监听器<br />    实现了监听器接口的类被称为监听者，监听者必须注册到assetTypeListenners里。
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/163965#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Feb 2008 17:01:44 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/163965</link>
        <guid>http://kiral.javaeye.com/blog/163965</guid>
      </item>
      <item>
        <title>List删除问题</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/115634" style="color:red;">http://kiral.javaeye.com/blog/115634</a>&nbsp;
          发表时间: 2007年08月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">错误：</div>
<div class="code_title">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>List&nbsp;list&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;1&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;2&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;3&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;4&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;5&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;6&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;list.size();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(i); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;list.size();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(list.get(i)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<div class="code_title"></div>
<div class="code_title">输出：</div>
<div class="code_title"><font face="Arial">2<br />
4<br />
6<br />
</font>
<div class="code_title"></div>
<div class="code_title"></div>
<div class="code_title">正确：</div>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>List&nbsp;list&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;1&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;2&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;3&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(</span><span class="string">&quot;4&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;list.size()&nbsp;-&nbsp;</span><span class="number">1</span><span>;&nbsp;i&nbsp;&gt;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i--)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(i); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;list.size();&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(list.get(i)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/115634#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 23 Aug 2007 13:40:51 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/115634</link>
        <guid>http://kiral.javaeye.com/blog/115634</guid>
      </item>
      <item>
        <title>java基础</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/104406" style="color:red;">http://kiral.javaeye.com/blog/104406</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp; 1。指令集分为精简指令集和复杂指令集，一个精简指令能完成多个复杂指令集完成的任务，但是编译器复杂</p>
<p>&nbsp;&nbsp; 2。java没有寄存器，数据是放在栈里面</p>
<p>&nbsp;&nbsp; 3。java是解释执行的，比编译执行差10倍。java首先会编译成字节码，然后解释执行。</p>
<p>&nbsp;&nbsp; 4。JVM不能调用平台相关的程序，如注册表，如需要调用需要使用C.</p>
<p>&nbsp;&nbsp; 5。JDK=java开发工具包 包括javac,jar,applicationviewer,</p>
<p>&nbsp;&nbsp; 6。UTF-8&nbsp; 变长的字符集，用三个或者四个字节表示一个中文字符，用一个字节表示一个英文字符.同ISO8859兼容.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UTF-16 定长的字符集，用两个字节表示一个字符。和ISO,ASC码不兼容。</p>
<p>&nbsp;&nbsp; 7。static变量有可能会造成内存泄漏。</p>
<p>&nbsp;&nbsp; 8。克隆&nbsp; 克隆分为深克隆和浅克隆</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 浅克隆：只是copy引用，引用还是指向同一个对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;深克隆：重新copy一份对象。</p>
<p>&nbsp;9。序列化： 使得对象变成字节在网络上传播</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static变量不能被序列化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不想序列化的用transition申明</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;序列化ID表示版本号</p>
<p>10。重写equals方法的时候，也需要重写hashcode方法。</p>
<p>11。static变量在多个类加载器加载的时候值会发生变化，&nbsp;所以在做负载均衡的时候，不要使用static变量缓存数据。</p>
<p>12。异常分为check异常和uncheck异常，check异常就是EXCEPTION,强制需要用户处理，uncheck异常就是RuntimeException，不强制用户处理。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/104406#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jul 2007 13:00:37 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/104406</link>
        <guid>http://kiral.javaeye.com/blog/104406</guid>
      </item>
      <item>
        <title>我订阅的RSS</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/100784" style="color:red;">http://kiral.javaeye.com/blog/100784</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial">JavaEye热点话题&nbsp; </font>&nbsp;地址：<font face="Arial"><a href="http://www.javaeye.com/index/rss_index_topics">http://www.javaeye.com/index/rss_index_topics</a></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 江南白衣的博客&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址：<font face="Arial"><a href="http://www.blogjava.net/calvin/rss">http://www.blogjava.net/calvin/rss</a></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Robbin的博客&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;地址：<font face="Arial"><a href="http://robbin.javaeye.com/blog/rss_blog/robbin">http://robbin.javaeye.com/blog/rss_blog/robbin</a></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 透明思考&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址<font face="Arial"><a href="http://gigix.thoughtworkers.org/xml/rss20/feed.xml">http://gigix.thoughtworkers.org/xml/rss20/feed.xml</a></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InfoQ网站&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址：<font face="Arial"><a href="http://www.infoq.com/cn/rss/rss.action?token=FIkmazI2l11JNUc5Rr4zoFKs5PE7WlEh">http://www.infoq.com/cn/rss/rss.action?token=FIkmazI2l11JNUc5Rr4zoFKs5PE7WlEh</a></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBM&nbsp; <font face="Arial">Java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;地址：<font face="Arial"><a href="http://www.ibm.com/developerworks/cn/views/rss/customrssatom.jsp?zone_by=Java+technology&amp;type_by=Articles&amp;type_by=Tutorials&amp;search_by=&amp;max_entries=50&amp;feed_by=rss">http://www.ibm.com/developerworks/cn/views/rss/customrssatom.jsp?zone_by=Java+technology&amp;type_by=Articles&amp;type_by=Tutorials&amp;search_by=&amp;max_entries=50&amp;feed_by=rss</a></font></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/100784#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 16:29:25 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/100784</link>
        <guid>http://kiral.javaeye.com/blog/100784</guid>
      </item>
      <item>
        <title>我的计算机藏书</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/100056" style="color:red;">http://kiral.javaeye.com/blog/100056</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天去图书城买了300多块钱的书。大多都是计算机方面的书。不明白为啥计算机方面的书比其他的书要贵？难道是学计算机的人都是有钱人，剥削我们？<br />
&nbsp; 整理了下自己所有的计算机图书。大概列个清单吧。 </p>
<p><br />
&nbsp; JAVA方面：<br />
&nbsp; 1.《java编程思想》第三版，感谢飞兄送我这本经典巨作。&nbsp;&nbsp; </p>
<p>这本经典的书讲的都是java基础，但是不适合一开始学java的人阅读，有的内容过于深入。推荐度5</p>
<p><br />
&nbsp; 2.《深入java虚拟机》第二版&nbsp;&nbsp; </p>
<p>一本帮你理解java虚拟机的书，本书内容很不错，但是读起来有点乏味.推荐度4.</p>
<p><br />
&nbsp; 3.《Spring框架高级编程》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>这本书虽然是名家之作，但是看起来更像一个技术手册，而不是技术图书，不适合入门。看了很多的spring的书，个人觉得spring in action这本书很不错。推荐度2.</p>
<p><br />
&nbsp; 4.《JFC Swing标准教材》第二版&nbsp;&nbsp;&nbsp;</p>
<p>一本介绍swing的工具书，当手册随手翻翻，推荐度2.</p>
<p><br />
&nbsp; 5.《JAVA与模式》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>这本书是我买过最厚的一本书，1000多页吧，书中介绍了很多常见的设计模式，配有UML图，很清晰的向你展现模式的魅力。推荐度5.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; 6.《重构与模式》</p>
<p>这本书是诞生于模式和重构热浪之后的，书中传达的含义是将现有代码重构为模式。推荐度3.</p>
<p><br />
&nbsp; 7.《java游戏编程》</p>
<p>没怎么看过，当初准备做游戏时候买的。</p>
<p><br />
&nbsp; 8.《servlet和jsp核心编程》第二版</p>
<p>学习servlet和jsp的一本很不错的教材。推荐度4.</p>
<p><br />
&nbsp; 9.《实用java程序设计教程》</p>
<p>我的大学教材，内容一般，也不适合初学者，推荐度2.</p>
<p><br />
&nbsp; 10.《无线设备编程指南》，感谢高微小朋友送我这本书。</p>
<p>还没看过。看过后再写评语。</p>
<p><br />
&nbsp; 11.《java设计》,感谢宋老师送我这本书。</p>
<p>没看过</p>
<p><br />
&nbsp; 12.《java游戏程序设计》</p>
<p>一本很普通的书，书中介绍了很多实用的例子，配有代码，大学里应付毕业的宝典。</p>
<p>推荐度3.</p>
<p><br />
&nbsp; 13.《java开发利器 eclipse从入门到精通》&nbsp;&nbsp;</p>
<p>eclipse的工具书，除非做插件开发，可以买这本书学习下。其他的感觉没什么大用，自己多用用eclipse就会了。</p>
<p>推荐度3.</p>
<p>&nbsp;</p>
<p>&nbsp; 14.《测试驱动开发》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>敏捷开发必备，还没看。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;推荐度5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;<br />
&nbsp; </p>
<p>&nbsp;软件工程方面：<br />
&nbsp; 1.《软件构架编档》</p>
<p>白衣推荐的架构师图书，还没看。</p>
<p><br />
&nbsp; 2.《质量-软件-管理》</p>
<p>作者已经从事软件开发40年了，书中主要是和读者传播一些思想，让读者明白质量，软件，管理</p>
<p>推荐度4.</p>
<p><br />
&nbsp; 3.《UML精粹》第三版</p>
<p>学习UML必备。martin fowler的经典之作。推荐度5&nbsp;.</p>
<p><br />
&nbsp; 4.《数据结构和算法》</p>
<p>这本书个人觉得翻译的很烂，反正我是看不懂，以后买书一定要仔细看看翻译的质量，不然买回来和废纸没区别！</p>
<p>推荐度1.</p>
<p><br />
&nbsp; 5.《软件架构实践》</p>
<p>白衣推荐的架构师图书，还没看。</p>
<p><br />
&nbsp; 6.《人月神话》</p>
<p>号称经典，但是还没和经典第一次亲密接触过。</p>
<p><br />
<br />
&nbsp; 数据库方面<br />
&nbsp;1。《DB2入门和提高》<br />
<br />
&nbsp; 其他<br />
&nbsp;1。《xml基础到应用》 <br />
<br />
&nbsp; 不列举我还真不知道，我以前几乎没有买过和看过软件工程的书。看来在思想上已经开始觉悟了。<br />
现在坚持每天看书，然后赋之于笔墨。还有选书真是一个痛苦的过程，在茫茫的书海中，找到自己的书还真是不容易（我指计算机方面）。其他的书，看两眼就可以决定是否抱回家了。所以以后去购这方面的书的时候最好列个清单。<br />
&nbsp; 未完待续。。&nbsp;&nbsp; </p>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/100056#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jul 2007 09:48:49 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/100056</link>
        <guid>http://kiral.javaeye.com/blog/100056</guid>
      </item>
      <item>
        <title>理解JNDI</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/98190" style="color:red;">http://kiral.javaeye.com/blog/98190</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>&nbsp;什么是JNDI:</strong></p>
<p>说白了，JNDI就是一棵树，上面挂着很多对象。你可以往这颗树上，添加（绑定）对象，摘掉（解绑定）对象，查找对象。</p>
<p><strong>为什么要使用JNDI:</strong></p>
<p>这棵树是活在内存里的，所以你能很快速的得到你需要的对象，并把你的对象添加到这个树里面，进行统一的管理。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/98190#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jul 2007 17:23:38 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/98190</link>
        <guid>http://kiral.javaeye.com/blog/98190</guid>
      </item>
      <item>
        <title>关于oracle使用delete删除的问题</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/98133" style="color:red;">http://kiral.javaeye.com/blog/98133</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2" face="Times New Roman"><strong>问题：</strong></font></p>
<p><font size="2" face="Times New Roman">在oracle里,使用delete删除数据以后，数据库的存储容量不会减少，而且使用delete删除某个表的数据以后，查询这张表的速度和删除之前一样，不会发生变化。</font></p>
<p><font size="2" face="Times New Roman"></font></p>
<p><font size="2" face="Times New Roman"></font></p>
<p><font size="2" face="Times New Roman"></font></p>
<p><font size="2" face="Times New Roman"><strong>原因：</strong></font></p>
<p><font size="2" face="Times New Roman">因为oralce有一个HWM高水位，它是oracle的一个表使用空间最高水位线。当插入了数据以后，高水位线就会上涨，但是如果你采用delete语句删除数据的话，数据虽然被删除了，但是高水位线却没有降低，还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么，这条高水位线在日常的增删操作中只会上涨，不会下跌，所以数据库容量也只会上升，不会下降。而使用select语句查询数据时，数据库会扫描高水位线以下的数据块，因为高水位线没有变化，所以扫描的时间不会减少，所以才会出现使用delete删除数据以后，查询的速度还是和delete以前一样。</font></p>
<p><font size="2" face="Times New Roman">&nbsp;</font></p>
<p><font size="2" face="Times New Roman"><strong>解决方案：</strong></font></p>
<p><font size="2" face="Times New Roman">1.首先导出表，然后truncate这张表，最后导入这张表。</font></p>
<p><font size="2" face="Times New Roman">2.在存储空间当中移动表，但是由于rowid会被打乱，所以需要重建索引.</font></p>
<p><font size="2" face="Times New Roman">3.如果是oracle 10g.可是直接更新表的高水位线。</font></p>
<p><font size="2" face="Times New Roman">对应的SQL：</font></p>
<font size="2" face="Times New Roman">
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><font face="Arial">9i中：<br />
create table aa_bak as select * from aa where record_time &gt; sysdate - 10;<br />
truncate table aa;<br />
insert into aa select * from aa_bak;<br />
drop table aa_bak;</font></div>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><font face="Arial"></font></div>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"></div>
</font>
<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto">10g 版本<br />
alter tablename enable row movement;<br />
alter tablename shrink space;</div>
          <br/>
          <span style="color:red;">
            <a href="http://kiral.javaeye.com/blog/98133#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jul 2007 14:46:02 +0800</pubDate>
        <link>http://kiral.javaeye.com/blog/98133</link>
        <guid>http://kiral.javaeye.com/blog/98133</guid>
      </item>
      <item>
        <title>在Spring中使用JMS</title>
        <author>fantasy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiral.javaeye.com">fantasy</a>&nbsp;
          链接：<a href="http://kiral.javaeye.com/blog/98040" style="color:red;">http://kiral.javaeye.com/blog/98040</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>准备工作：</strong>
</p>
<p>熟悉下JMS的基础知识，这里不再罗嗦，主要是实战。</p>
<p>配置JMS需要两个对象connectionFactory和&nbsp;destination。</p>
<p>connectionFactory使用jboss自带的<span>TopicConnectionFactory。</span>
</p>
<p><span>destination可以使用自定义的。</span>
</p>
<p><span><span style="font-family: Arial;">kiral-jms-service.xml&nbsp;&nbsp; 注意：文件名称一定要是-service.xml结尾。这个文件放在部署目录下。</span>
</span>
</p>
<p>
<span>
<div class="code_title">xml 代码</div>
</span>
</p>
<div class="dp-highlighter">
<ol class="dp-xml">
<li class="alt"><span><span class="tag"><!-- sp--><span class="tag-name"><span class="tag">&lt;</span>
xml</span>
<span>&nbsp;</span>
<span class="attribute">version</span>
<span>=</span>
<span class="attribute-value">&quot;1.0&quot;</span>
<span>&nbsp;</span>
<span class="attribute">encoding</span>
<span>=</span>
<span class="attribute-value">&quot;UTF-8&quot;</span>
<span class="tag">?&gt;</span>
<span>&nbsp;&nbsp;</span>
</span>
 </span>
</li>
<li><span class="tag">&lt;</span>
<span class="tag-name">server</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">mbean</span>
<span>&nbsp;</span>
<span class="attribute">code</span>
<span>=</span>
<span class="attribute-value">&quot;org.jboss.mq.server.jmx.Topic&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;jboss.mq.destination:service=Topic,name=kiralJms&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">depends</span>
<span>&nbsp;</span>
<span class="attribute">optional-attribute-name</span>
<span>=</span>
<span class="attribute-value">&quot;DestinationManager&quot;</span>
<span class="tag">&gt;</span>
<span class="attribute">jboss.mq:service</span>
<span>=</span>
<span class="attribute-value">DestinationManager</span>
<span class="tag"><span class="tag-name">depends</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">depends</span>
<span>&nbsp;</span>
<span class="attribute">optional-attribute-name</span>
<span>=</span>
<span class="attribute-value">&quot;SecurityManager&quot;</span>
<span class="tag">&gt;</span>
<span class="attribute">jboss.mq:service</span>
<span>=</span>
<span class="attribute-value">SecurityManager</span>
<span class="tag"><span class="tag-name">depends</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">attribute</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;SecurityConf&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">security</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">role</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;guest&quot;</span>
<span>&nbsp;</span>
<span class="attribute">read</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span>&nbsp;</span>
<span class="attribute">write</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">role</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;publisher&quot;</span>
<span>&nbsp;</span>
<span class="attribute">read</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span>&nbsp;</span>
<span class="attribute">write</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span>&nbsp;</span>
<span class="attribute">create</span>
<span>=</span>
<span class="attribute-value">&quot;false&quot;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">role</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;durpublisher&quot;</span>
<span>&nbsp;</span>
<span class="attribute">read</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span>&nbsp;</span>
<span class="attribute">write</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span>&nbsp;</span>
<span class="attribute">create</span>
<span>=</span>
<span class="attribute-value">&quot;true&quot;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">security</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">attribute</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">mbean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;</span>
<span class="tag"><span class="tag-name">server</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;&nbsp;</span>
 </span>
</li>
</ol>
</div>
<p><strong></strong>
</p>
<p><strong>发送消息端</strong>
</p>
<p><strong>bean-jms.xml</strong>
</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<ol class="dp-xml">
<li class="alt"><span><span class="tag"><!-- sp--><span class="tag-name">xml</span>
<span>&nbsp;</span>
<span class="attribute">version</span>
<span>=</span>
<span class="attribute-value">&quot;1.0&quot;</span>
<span>&nbsp;</span>
<span class="attribute">encoding</span>
<span>=</span>
<span class="attribute-value">&quot;GB2312&quot;</span>
<span class="tag">?&gt;</span>
</span>
</span>
<span><span>&nbsp;</span>
 </span>
</li>
<li class="alt"><span class="tag">&lt;</span>
<span class="tag-name">beans</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;jmsConnectionFactory&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;jndiName&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>TopicConnectionFactory</span>
<span class="tag"><span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">property</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;destination&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;jndiName&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>topic/kiralJms</span>
<span class="tag"><span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">property</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="comments"><!--   Spring JmsTemplate config --></span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;jmsTemplate&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jms.core.JmsTemplate&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;connectionFactory&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jms.connection.SingleConnectionFactory&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;targetConnectionFactory&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;jmsConnectionFactory&quot;</span>
<span>&nbsp;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">property</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="comments"><!--  POJO which send Message uses  Spring JmsTemplate --></span>
<span>&nbsp;<!-- 配置消息发送者-->&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;messageProducer&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;jms.MessageProducer&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;template&quot;</span>
<span>&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;jmsTemplate&quot;</span>
<span>&nbsp;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;destination&quot;</span>
<span>&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;destination&quot;</span>
<span>&nbsp;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span class="tag"><span class="tag-name">beans</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
</ol>
</div>
<p>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
<li class="alt"><span><span class="keyword">import</span>
<span>&nbsp;javax.jms.Destination; &nbsp;&nbsp;</span>
</span>
 </li>
<li><span class="keyword">import</span>
<span>&nbsp;javax.jms.JMSException; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span class="keyword">import</span>
<span>&nbsp;javax.jms.Message; &nbsp;&nbsp;</span>
 </li>
<li><span class="keyword">import</span>
<span>&nbsp;javax.jms.Session; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span class="keyword">import</span>
<span>&nbsp;org.springframework.jms.core.JmsTemplate; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span class="keyword">import</span>
<span>&nbsp;org.springframework.jms.core.MessageCreator; &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span class="comment">/*********************************************************** </span>
&nbsp; </li>
<li><span><span class="comment">&nbsp;*&nbsp;消息发送者 </span>
&nbsp;</span>
 </li>
<li class="alt"><span><span class="comment">&nbsp;*&nbsp; </span>
&nbsp;</span>
 </li>
<li><span><span class="comment">&nbsp;*&nbsp;@作者：kiral</span>
&nbsp;</span>
 </li>
<li class="alt"><span><span class="comment">&nbsp;*&nbsp;@日期：2007-7-3 </span>
&nbsp;</span>
 </li>
<li class="alt"><span><span class="comment">&nbsp;**********************************************************/</span>
<span>&nbsp;&nbsp;</span>
</span>
 </li>
<li><span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">class</span>
<span>&nbsp;MessageProducer&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">void</span>
<span>&nbsp;send(</span>
<span class="keyword">final</span>
<span>&nbsp;String&nbsp;message)&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.send(destination,&nbsp;</span>
<span class="keyword">new</span>
<span>&nbsp;MessageCreator()&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;Message&nbsp;createMessage(Session&nbsp;session)&nbsp;</span>
<span class="keyword">throws</span>
<span>&nbsp;JMSException&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;m&nbsp;=&nbsp;session.createTextMessage(message); &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">return</span>
<span>&nbsp;m; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">private</span>
<span>&nbsp;JmsTemplate&nbsp;template; &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">private</span>
<span>&nbsp;Destination&nbsp;destination; &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">void</span>
<span>&nbsp;setDestination(Destination&nbsp;destination)&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">this</span>
<span>.destination&nbsp;=&nbsp;destination; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">void</span>
<span>&nbsp;setTemplate(JmsTemplate&nbsp;template)&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">this</span>
<span>.template&nbsp;=&nbsp;template; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>}&nbsp;&nbsp;</span>
 </li>
</ol>
</div>
<p>发送方调用send方法发送消息。</p>
<p>&nbsp;</p>
<p><strong>消息接收者</strong>
</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<ol class="dp-xml">
<li class="alt"><span><span class="tag"><!-- sp--></span>
<span class="tag-name"><span class="tag">&lt;</span>
xml</span>
<span>&nbsp;</span>
<span class="attribute">version</span>
<span>=</span>
<span class="attribute-value">&quot;1.0&quot;</span>
<span>&nbsp;</span>
<span class="attribute">encoding</span>
<span>=</span>
<span class="attribute-value">&quot;UTF-8&quot;</span>
<span class="tag">?&gt;</span>
<span>&nbsp;&nbsp;</span>
</span>
 </li>
<li class="alt"><span class="comments"><!--   </span> </li>
<li class=""><span><span class="comments">    jms的接收方，使用spring的listenerContainer，消息不持久化保存，服务器重启会丢失 </span> </span></li>
<li class="alt"><span><span class="comments">--></span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span class="tag">&lt;</span>
<span class="tag-name">beans</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;jmsConnectionFactory&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;jndiName&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>TopicConnectionFactory</span>
<span class="tag"><span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">property</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span>
</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;destination&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;jndiName&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>topic/kiralJms</span>
<span class="tag"><span class="tag-name">value</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag"><span class="tag-name">property</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span>
</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="comments"><!--   Message Driven POJO (MDP) --></span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;messageListener&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;jms.MessageConsumer&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;worksheetService&quot;</span>
<span>&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;worksheetService&quot;</span>
<span class="tag">&gt;</span>
<span class="tag"><span class="tag-name">property</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span>
</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="comments"><!--   listener container，MDP无需实现接口 --></span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">bean</span>
<span>&nbsp;</span>
<span class="attribute">id</span>
<span>=</span>
<span class="attribute-value">&quot;listenerContainer&quot;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="attribute">class</span>
<span>=</span>
<span class="attribute-value">&quot;org.springframework.jms.listener.DefaultMessageListenerContainer&quot;</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;connectionFactory&quot;</span>
<span>&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;jmsConnectionFactory&quot;</span>
<span>&nbsp;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;destination&quot;</span>
<span>&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;destination&quot;</span>
<span>&nbsp;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="tag">&lt;</span>
<span class="tag-name">property</span>
<span>&nbsp;</span>
<span class="attribute">name</span>
<span>=</span>
<span class="attribute-value">&quot;messageListener&quot;</span>
<span>&nbsp;</span>
<span class="attribute">ref</span>
<span>=</span>
<span class="attribute-value">&quot;messageListener&quot;</span>
<span>&nbsp;</span>
<span class="tag">/&gt;</span>
<span>&nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span>
</span>
<span class="tag"><span class="tag-name">bean</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
<li class="alt"><span class="tag"><span class="tag-name"><span class="tag">&lt;</span>
beans</span>
<span class="tag">&gt;</span>
<span>&nbsp;&nbsp;</span>
 </span>
</li>
</ol>
</div>
<p>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
<li class="alt"><span><span class="keyword">import</span>
<span>&nbsp;javax.jms.Message; &nbsp;&nbsp;</span>
</span>
 </li>
<li><span class="keyword">import</span>
<span>&nbsp;javax.jms.MessageListener; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span class="keyword">import</span>
<span> org.kiral.flow.service.WorksheetService; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;</span>
 </li>
<li><span class="comment">/******************************************************************************* </span>
&nbsp; </li>
<li class="alt"><span><span class="comment">&nbsp;*&nbsp;消息接收者 </span>
&nbsp;</span>
 </li>
<li><span><span class="comment">&nbsp;*&nbsp; </span>
&nbsp;</span>
 </li>
<li class="alt"><span><span class="comment">&nbsp;*&nbsp;@作者：kiral </span>
&nbsp;</span>
 </li>
<li><span><span class="comment">&nbsp;*&nbsp;@日期：2007-7-3 </span>
&nbsp;</span>
 <span></span>
</li>
<li><span><span class="comment">&nbsp;******************************************************************************/</span>
<span>&nbsp;&nbsp;</span>
</span>
 </li>
<li class="alt"><span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">class</span>
<span>&nbsp;MessageConsumer&nbsp;</span>
<span class="keyword">implements</span>
<span>&nbsp;MessageListener&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">private</span>
<span>&nbsp;WorksheetService&nbsp;worksheetService; &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;WorksheetService&nbsp;getWorksheetService()&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">return</span>
<span>&nbsp;worksheetService; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">void</span>
<span>&nbsp;setWorksheetService(WorksheetService&nbsp;worksheetService)&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">this</span>
<span>.worksheetService&nbsp;=&nbsp;worksheetService; &nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;</span>
 </li>
<li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="keyword">public</span>
<span>&nbsp;</span>
<span class="keyword">void</span>
<span>&nbsp;onMessage(Message&nbsp;message)&nbsp;{ &nbsp;&nbsp;</span>
 </li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb