<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>kakaluyi java之家</title>
    <description></description>
    <link>http://kakaluyi.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>DWR如何获得返回对象</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/241245" style="color:red;">http://kakaluyi.javaeye.com/blog/241245</a>&nbsp;
          发表时间: 2008年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3><a href="http://kakaluyi.javaeye.com/blog/79294"><span style="color: #108ac6;"><span class="hilite2"></span></span></a></h3>
<div class="blog_content">
<div><span style="color: #0000ff;"><strong>1、调用没有返回值和参数的JAVA方法</strong></span></div>
<strong></strong>
<div><br /><span style="color: #ff00ff;">1.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置</span><br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod1"/&gt;<br />&lt;/create&gt;<br />&lt;/allow&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;标签中包括可以暴露给javascript访问的东西。<br />&lt;create&gt;标签中指定javascript中可以访问的java类，并定义<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式，new意味着<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>应当调用类的默认构造函数来获得实例，其他的还有spring方式，通过与IOC容器Spring进行集成来获得实例等等。javascript="&nbsp;testClass&nbsp;"属性指定javascript代码访问对象时使用的名称。<br />&lt;param&gt;标签指定要公开给javascript的java类名。<br />&lt;include&gt;标签指定要公开给javascript的方法。不指定的话就公开所有方法。<br />&lt;exclude&gt;标签指定要防止被访问的方法。<br /><span style="color: #ff00ff;">1.2、javascript中调用</span><br />首先，引入javascript脚本<br />&lt;script&nbsp;src='<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>/interface/&nbsp;testClass.js'&gt;&lt;/script&gt;<br />&lt;script&nbsp;src="/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>/engine.js"&gt;&lt;/script&gt;<br />&lt;script&nbsp;src="/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>/util.js"&gt;&lt;/script&gt;<br />其中TestClass.js是<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>根据配置文件自动生成的，engine.js和util.js是<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>自带的脚本文件。<br />其次，编写调用java方法的javascript函数<br />Function&nbsp;callTestMethod1(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod1();<br />}<br /><strong><span style="color: #0000ff;">2、调用有简单返回值的java方法</span></strong></div>
<div><br /><strong><span style="color: #ff00ff;">2.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置</span><br />配置同1.1<br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod2"/&gt;<br />&lt;/create&gt;<br />&lt;/allow&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />2.2、javascript中调用<br />首先，引入javascript脚本<br />其次，编写调用java方法的javascript函数和接收返回值的回调函数<br />Function&nbsp;callTestMethod2(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod2(callBackFortestMethod2);<br />}<br />Function&nbsp;callBackFortestMethod2(data){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//其中date接收方法的返回值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//可以在这里对返回值进行处理和显示等等<br />alert("the&nbsp;return&nbsp;value&nbsp;is&nbsp;"&nbsp;+&nbsp;data);<br />}<br />其中callBackFortestMethod2是接收返回值的回调函数</strong></div>
<div><br /><span style="color: #0000ff;"><strong>3、调用有简单参数的java方法</strong></span></div>
<div><br /><strong><span style="color: #ff00ff;">3.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置</span><br />配置同1.1<br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod3"/&gt;<br />&lt;/create&gt;<br />&lt;/allow&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br /><span style="color: #ff00ff;">3.2、javascript中调用</span><br />首先，引入javascript脚本<br />其次，编写调用java方法的javascript函数<br />Function&nbsp;callTestMethod3(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义要传到java方法中的参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;&ldquo;test&nbsp;String&rdquo;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod3(data);<br />}</strong></div>
<div><br /><strong><span style="color: #0000ff;">4、调用返回JavaBean的java方法</span><br /><span style="color: #ff00ff;">4.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置</span><br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod4"/&gt;<br />&lt;/create&gt;<br />&lt;convert&nbsp;converter="bean"&nbsp;match=""com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name="include"&nbsp;value="username,password"&nbsp;/&gt;<br />&lt;/convert&gt;<br />&lt;/allow&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;creator&gt;标签负责公开用于Web远程的类和类的方法，&lt;convertor&gt;标签则负责这些方法的参数和返回类型。convert元素的作用是告诉<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>在服务器端Java&nbsp;对象表示和序列化的JavaScript之间如何转换数据类型。<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括Java原生类型和它们各自的封装类表示，还有String、Date、数组和集合类型。<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>也能把JavaBean转换成JavaScript&nbsp;表示，但是出于安全性的原因，要求显式的配置，&lt;convertor&gt;标签就是完成此功能的。converter="bean"属性指定转换的方式采用JavaBean命名规范，match=""com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean"属性指定要转换的javabean名称，&lt;param&gt;标签指定要转换的JavaBean属性。<br /><span style="color: #ff00ff;">4.2、javascript中调用</span><br />首先，引入javascript脚本<br />其次，编写调用java方法的javascript函数和接收返回值的回调函数<br />Function&nbsp;callTestMethod4(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod4(callBackFortestMethod4);<br />}<br />Function&nbsp;callBackFortestMethod4(data){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//其中date接收方法的返回值<br />//对于JavaBean返回值，有两种方式处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不知道属性名称时，使用如下方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;property&nbsp;in&nbsp;data){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("property:"+property);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(property+":"+data[property]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />//知道属性名称时，使用如下方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(data.username);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(data.password);<br />}<br />其中callBackFortestMethod4是接收返回值的回调函数</strong></div>
<div><br /><strong><span style="color: #0000ff;">5、调用有JavaBean参数的java方法</span><br /></strong><strong><span style="color: #ff00ff;">5.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置<br /></span>配置同4.1<br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod5"/&gt;<br />&lt;/create&gt;<br />&lt;convert&nbsp;converter="bean"&nbsp;match="com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name="include"&nbsp;value="username,password"&nbsp;/&gt;<br />&lt;/convert&gt;<br />&lt;/allow&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br /><span style="color: #ff00ff;">5.2、javascript中调用</span><br />首先，引入javascript脚本<br />其次，编写调用java方法的javascript函数<br />Function&nbsp;callTestMethod5(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义要传到java方法中的参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造参数，date实际上是一个object<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;{&nbsp;username:"user",&nbsp;password:"password"&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod5(data);<br />}</strong></div>
<div><br /><strong><span style="font-size: large; color: #0000ff;"><em><span style="text-decoration: underline;">6、调用返回List、Set或者Map的java方法</span></em></span><br /><span style="color: #ff00ff;">6.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置</span><br />配置同4.1<br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod6"/&gt;<br />&lt;/create&gt;<br />&lt;convert&nbsp;converter="bean"&nbsp;match="com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean"&gt;<br />&lt;param&nbsp;name="include"&nbsp;value="username,password"&nbsp;/&gt;<br />&lt;/convert&gt;<br />&lt;/allow&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />注意：如果List、Set或者Map中的元素均为简单类型（包括其封装类）或String、Date、数组和集合类型，则不需要&lt;convert&gt;标签。<br /></strong><strong><span style="color: #ff00ff;">6.2、javascript中调用(以返回List为例，List的元素为TestBean)<br /></span>首先，引入javascript脚本<br />其次，编写调用java方法的javascript函数和接收返回值的回调函数<br />Function&nbsp;callTestMethod6(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod6(callBackFortestMethod6);<br />}<br />Function&nbsp;callBackFortestMethod6(data){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//其中date接收方法的返回值<br />//对于JavaBean返回值，有两种方式处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不知道属性名称时，使用如下方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i=0;i&lt;data.length;i++){<br />for(var&nbsp;property&nbsp;in&nbsp;data){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("property:"+property);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(property+":"+data[property]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />//知道属性名称时，使用如下方法<br />for(var&nbsp;i=0;i&lt;data.length;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(data.username);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(data.password);<br />}<br />}</strong></div>
<div><br /><span style="font-size: large; color: #0000ff;"><em><strong>7、调用有List、Set或者Map参数的java方法</strong></em></span></div>
<div><br /><strong><span style="color: #ff00ff;">7.1、<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml的配置</span><br />&lt;<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;allow&gt;<br />&lt;create&nbsp;creator="new"&nbsp;javascript="testClass"&nbsp;&gt;<br />&lt;param&nbsp;name="class"&nbsp;value="/com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass"&nbsp;/&gt;<br />&lt;include&nbsp;method="testMethod7"/&gt;<br />&lt;/create&gt;<br />&lt;convert&nbsp;converter="bean"&nbsp;match="com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean"&gt;<br />&lt;param&nbsp;name="include"&nbsp;value="username,password"&nbsp;/&gt;<br />&lt;/convert&gt;<br />&lt;/allow&gt;<br />&lt;signatures&gt;<br />&lt;![CDATA[&nbsp;<br />import&nbsp;java.util.List;&nbsp;<br />import&nbsp;com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass;&nbsp;<br />import&nbsp;com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean;&nbsp;<br />TestClass.testMethod7(List&lt;TestBean&gt;);&nbsp;<br />]]&gt;<br />&lt;/signatures&gt;<br />&lt;/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>&gt;<br />&lt;signatures&gt;标签是用来声明java方法中List、Set或者Map参数所包含的确切类，以便java代码作出判断。<br /></strong><strong><span style="color: #ff00ff;">7.2、javascript中调用(以返回List为例，List的元素为TestBean)<br /></span>首先，引入javascript脚本<br />其次，编写调用java方法的javascript函数<br />Function&nbsp;callTestMethod7(){<br />//定义要传到java方法中的参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造参数，date实际上是一个object数组，即数组的每个元素均为object<br />data&nbsp;=&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username:"user1",&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password:"password2"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username:"user2",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password:"&nbsp;password2"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod7(data);<br />}<br />注意：<br /></strong><strong><span style="color: #006600;">1、对于第6种情况，如果java方法的返回值为Map，则在接收该返回值的javascript回调函数中如下处理：<br /></span>function&nbsp;callBackFortestMethod(data){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//其中date接收方法的返回值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;property&nbsp;in&nbsp;data){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bean&nbsp;=&nbsp;data[property];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(bean.username);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(bean.password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></strong><strong><span style="color: #006600;">2、对于第7种情况，如果java的方法的参数为Map（假设其key为String，value为TestBean），则在调用该方法的javascript函数中用如下方法构造要传递的参数：<br /></span>function&nbsp;callTestMethod&nbsp;(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义要传到java方法中的参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造参数，date实际上是一个object，其属性名为Map的key，属性值为Map的value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"key1":{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username:"user1",&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password:"password2"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"key2":{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username:"user2",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password:"&nbsp;password2"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testClass.testMethod(data);<br />}<br />并且在<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml中增加如下的配置段<br />&lt;signatures&gt;<br />&lt;![CDATA[&nbsp;<br />import&nbsp;java.util.List;&nbsp;<br />import&nbsp;com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestClass;&nbsp;<br />import&nbsp;com.<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.TestBean;&nbsp;<br />TestClass.testMethod7(Map&lt;String,TestBean&gt;);&nbsp;<br />]]&gt;<br />&lt;/signatures&gt;<br /></strong><strong><span style="color: #003300;"><span style="color: #009900;">3、由以上可以发现，对于java方法的返回值为List(Set)的情况，<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>将其转化为Object数组，传递个javascript；对于java方法的返回值为Map的情况，<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>将其转化为一个Object，其中Object的属性为原Map的key值，属性值为原Map相应的value值。</span><br /></span><span style="color: #993300;">4、如果java方法的参数为List(Set)和Map的情况，javascript中也要根据3种所说，构造相应的javascript数据来传递到java中。&nbsp; </span></strong></div>
<div><strong>&nbsp;</strong></div>
<div><strong>======================================================================================</strong></div>
<div>
<h1><a name="ScriptingIntroduction-ScriptingIntroduction"></a>Scripting Introduction</h1>
<p><strong><span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>根据<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>.xml生成和Java代码类似的Javascript代码。</strong></p>
<p><strong>相对而言Java同步调用，创建与Java代码匹配的Ajax远程调用接口的最大挑战来至与实现Ajax的异步调用特性。</strong></p>
<p><strong><span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>通过引入回调函数来解决这个问题，当结果被返回时，<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>会调用这个函数。</strong></p>
<p><strong>有两种推荐的方式来使用<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>实现远程方法调用。可以通过把回调函数放在参数列表里，也可以把回调函数放到元数据对象里。</strong></p>
<p><strong>当然也可以把回调函数做为第一个参数，但是不建议使用这种方法。因为这种方法在处理</strong><a href="http://wiki.javascud.org/display/dwrcn/Accessing+Servlet+Objects" title="Accessing Servlet Objects"><span style="color: #108ac6;">自动处理http对象</span></a><strong>时(查看"Alternative Method")上会有问题。这个方法主要是为向下兼容而存在的。</strong></p>
<h2><a name="ScriptingIntroduction-%E7%AE%80%E5%8D%95%E7%9A%84%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0"></a>简单的回调函数</h2>
<p><strong>假设你有一个这样的Java方法：</strong></p>
<div>
<div>
<pre><strong><span>public</span> class Remote {    <span>public</span> <span>String</span> getData(<span>int</span> index) { ... }}</strong></pre>
</div>
</div>
<p><strong>我们可以在Javascript中这样使用：</strong></p>
<div>
<div>
<pre><strong>&lt;script type=<span>"text/javascript"</span>    src=<span>"[WEBAPP]/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>/interface/Remote.js"</span>&gt; <span>&lt;/script&gt;</span>&lt;script type=<span>"text/javascript"</span>    src=<span>"[WEBAPP]/<span class="hilite1"><span style="background-color: #ffff00;">dwr</span></span>/engine.js"</span>&gt; <span>&lt;/script&gt;</span>...function handleGetData(str) {  alert(str);}Remote.getData(42, handleGetData);</strong></pre>
</div>
</div>
<p><strong>42是Java方法getData()的一个参数。</strong></p>
<p><strong>此外你也可以使用这种减缩格式：</strong></p>
<div>
<div>
<pre><strong>Remote.getData(42, function(str) { alert(str); });</strong></pre>
</div>
</div>
<h2><a name="ScriptingIntroduction-%E8%B0%83%E7%94%A8%E5%85%83%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1%28MetaData%29"></a>调用元数据对象(Meta-Data)</h2>
<p><strong>另外一种语法时使用"调用元数据对象"来指定回调函数和其他的选项。上面的例子可以写成这样：</strong></p>
<div>
<div>
<pre><strong>Remote.getData(42, {  callback:function(str) { alert(str); }});</strong></pre>
</div>
</div>
<p><strong>这种方法有很多优点：易于阅读，更重要的指定额外的调用选项。</strong></p>
<h3><a name="ScriptingIntroduction-%E8%B6%85%E6%97%B6%E5%92%8C%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86"></a>超时和错误处理</h3>
<p><strong>在回调函数的元数据中你可以指定超时和错误的处理方式。例如：</strong></p>
<div>
<div>
<pre><strong>Remote.getData(42, {  callback:function(str) { alert(str); },  timeout:5000,  errorHandler:function(message) { alert(<span>"Oops: "</span> + message); }});</strong></pre>
</div>
</div>
<h2><a name="ScriptingIntroduction-%E6%9F%A5%E6%89%BE%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0"></a>查找回调函数</h2>
<p><strong>有些情况下我们很难区分各种回调选项(记住，Javascript是不支持函数重载的)。例如：</strong></p>
<div>
<div>
<pre><strong>Remote.method({ timeout:3 }, { errorHandler:somefunc });</strong></pre>
</div>
</div>
<p><strong>这两个参数之一是bean的参数，另一个是元数据对象，但是我们不能清楚的告诉<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>哪个是哪个。为了可以跨浏览器，我们假定null == undefined。 所以当前的情况，规则是：</strong></p>
<ul>
<li><strong>如果第一个或最后一个是一个函数，那么它就是回调函数，没有元数据对象，并且其他参数都是Java的方法参数。 </strong></li>
<li><strong>另外，如果最后一个参数是一个对象，这个对象中有一个callback成员，并且它是个函数，那么这个对象就是元数据对象，其他的都是Java方法参数。 </strong></li>
<li><strong>另外，如果第一个参数是 <em>null</em> ，我们就假设没有回调函数，并且其他的都是Java方法参数。尽管如此，我们会检查最后一个参数是不是null，如果是就发出警告。 </strong></li>
<li><strong>最后如果最后一个参数是null，那么就没有callback函数。 </strong></li>
<li><strong>另外，发出错误信号是个糟糕的请求格式。 </strong></li>
</ul>
<h2><a name="ScriptingIntroduction-%E5%88%9B%E9%80%A0%E4%B8%80%E4%B8%AA%E4%B8%8EJava%E5%AF%B9%E8%B1%A1%E5%8C%B9%E9%85%8D%E7%9A%84Javascript%E5%AF%B9%E8%B1%A1"></a>创造一个与Java对象匹配的Javascript对象</h2>
<p><strong>假设你有这样的Java方法：</strong></p>
<div>
<div>
<pre><strong><span>public</span> class Remote {  <span>public</span> void setPerson(Person p) {    <span>this</span>.person = p;  }}</strong></pre>
</div>
</div>
<p><strong>Person对象的结构是这样的：</strong></p>
<div>
<div>
<pre><strong><span>public</span> Person {  <span>private</span> <span>String</span> name;  <span>private</span> <span>int</span> age;  <span>private</span> Date[] appointments;  </strong><strong><span>// getters and setters ...</span>}</strong></pre>
</div>
</div>
<p><strong>那么你可以在Javascript中这样写：</strong></p>
<div>
<div>
<pre><strong><span>var</span> p = {  name:"Fred Bloggs",  age:42,  appointments:[ <span>new</span> Date(), <span>new</span> Date("1 Jan 2008") ]};Remote.setPerson(p);</strong></pre>
</div>
</div>
<p><strong>在Javascript没有出现的字段，在Java中就不会被设置。</strong></p>
<p><strong>因为setter都是返回'void'，我们就不需要使用callback函数了。如果你想要一个返回void的服务端方法的完整版，你也可以加上callback函数。很明显<span class="hilite1"><span style="background-color: #ffff00;">DWR</span></span>不会向它传递任何参数。</strong></p>
<!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-      rdf-      syntax-      ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://wiki.javascud.org/display/dwrcn/Scripting+Introduction"dc:identifier="http://wiki.javascud.org/display/dwrcn/Scripting+Introduction"dc:title="Scripting Introduction"trackback:ping="http://wiki.javascud.org/rpc/trackback/5012" /></rdf:RDF>--><!--Root decorator: all decisions about how a page is to be decorated via theinline decoration begins here.--><!--Switch based upon the context. However, for now, just delegate to a decoratoridentified directly by the context.-->&nbsp;</div>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/241245#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Sep 2008 15:52:40 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/241245</link>
        <guid>http://kakaluyi.javaeye.com/blog/241245</guid>
      </item>
          <item>
        <title>密码强度检测</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/228727" style="color:red;">http://kakaluyi.javaeye.com/blog/228727</a>&nbsp;
          发表时间: 2008年08月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;script type="text/javascript"&gt;<br />var $ = function(v){return document.getElementById(v);}<br />function isSecurity(v){<br />&nbsp;if (v.length &lt; 3) { iss.reset();return;}<br />&nbsp;var lv = -1;<br />&nbsp;if (v.match(/[a-z]/ig)){lv++;}<br />&nbsp;if (v.match(/[0-9]/ig)){lv++;}<br />&nbsp;if (v.match(/(.[^a-z0-9])/ig)){lv++;}<br />&nbsp;if (v.length &lt; 6 &amp;&amp; lv &gt; 0){lv--;}<br />&nbsp;iss.reset();<br />&nbsp;switch(lv) { <br />&nbsp;case 0:<br />&nbsp;iss.level0();<br />&nbsp;break;<br />&nbsp;case 1:<br />&nbsp;iss.level1();<br />&nbsp;break;<br />&nbsp;case 2:<br />&nbsp;iss.level2();<br />&nbsp;break;<br />&nbsp;default:<br />&nbsp;iss.reset();<br />&nbsp;}<br />}<br />var iss = {<br />&nbsp;color:["CC0000","FFCC33","66CC00","CCCCCC"],<br />&nbsp;text:["弱","中","强"],<br />&nbsp;width:["50","100","150","10"],<br />&nbsp;reset:function(){<br />&nbsp;$("B").style.backgroundColor = iss.color[3];<br />&nbsp;$("B").style.width = iss.width[3];<br />&nbsp;$("A").innerHTML = "验证试中";<br />&nbsp;},<br />&nbsp;level0:function(){<br />&nbsp;$("B").style.backgroundColor = iss.color[0];<br />&nbsp;$("B").style.width = iss.width[0];<br />&nbsp;$("A").innerHTML = "较弱"; <br />&nbsp;},<br />&nbsp;level1:function(){<br />&nbsp;$("B").style.backgroundColor = iss.color[1];<br />&nbsp;$("B").style.width = iss.width[1];<br />&nbsp;$("A").innerHTML = "中"; <br />&nbsp;},<br />&nbsp;level2:function(){<br />&nbsp;$("B").style.backgroundColor = iss.color[2];<br />&nbsp;$("B").style.width = iss.width[2];<br />&nbsp;$("A").innerHTML = "高强";<br />&nbsp;}<br />}<br />&lt;/script&gt;<br />&lt;input type="password" name="password" size="25" maxlength="20" onkeyup="isSecurity(this.value);"&gt;<br />&lt;font class="red" id="A"&gt;密码强度&lt;/font&gt;<br />&lt;table height="8" border="1" align="left" cellpadding="0" cellspacing="0" bordercolor="#EEEEEE" style="border-collapse:collapse;"&gt;<br />&lt;tr&gt;<br />&nbsp;&lt;td bgcolor="#EEEEEE" width="1" align="center" valign="middle" id="B"&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/table&gt;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/228727#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Aug 2008 16:45:37 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/228727</link>
        <guid>http://kakaluyi.javaeye.com/blog/228727</guid>
      </item>
          <item>
        <title>公司要求实时监控服务器，写个Web的监控系统</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/228636" style="color:red;">http://kakaluyi.javaeye.com/blog/228636</a>&nbsp;
          发表时间: 2008年08月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>&nbsp;</p>
<p>公司的服务器需要实时监控，而且当用户空间已经满了，操作失败，或者出现程序Exception的时候就需要实时提醒，便于网管和程序员调式，这样就把这个实时监控系统分为了两部分，</p>
<p>&nbsp;</p>
<p>第一部分：实时系统监控（cpu利用率，cpu温度，总内存大小，已使用内存大小）</p>
<p>第二部分：实时告警</p>
<p>由于无刷新实时性，所以只能使用Ajax，这里没有用到任何ajax框架，因为调用比较简单</p>
<p>大家知道，由于java的先天不足，对底层系统的调用和操作一般用jni来完成，特别是cpu温度，你在window下是打死用命令行是得不到的，但由于我们的服务器系统是linux，所以可以不调用jni完全用java的方式来得到系统信息，这里用到了runtime的exec()函数，通过解析本地命令调用的结果来查询本地信息，</p>
<p>这里要感谢公司同事qinkun推荐ecsun兄的这篇文章<a href="http://papa.javaeye.com/blog/220532">http://papa.javaeye.com/blog/220532</a>，</p>
<p>&nbsp;</p>
<pre name="code" class="java">* 取得linux系统下的cpu、内存信息 
* 
* */ 
public final class LinuxSystemTool 
{ 
/** 
* get memory by used info 
* 
* @return int[] result 
* result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree; 
* @throws IOException 
* @throws InterruptedException 
*/ 
public static int[] getMemInfo() throws IOException, InterruptedException 
{ 
File file = new File("/proc/meminfo"); 
BufferedReader br = new BufferedReader(new InputStreamReader( 
new FileInputStream(file))); 
int[] result = new int[4]; 
String str = null; 
StringTokenizer token = null; 
while((str = br.readLine()) != null) 
{ 
token = new StringTokenizer(str); 
if(!token.hasMoreTokens()) 
continue; 

str = token.nextToken(); 
if(!token.hasMoreTokens()) 
continue; 

if(str.equalsIgnoreCase("MemTotal:")) 
result[0] = Integer.parseInt(token.nextToken()); 
else if(str.equalsIgnoreCase("MemFree:")) 
result[1] = Integer.parseInt(token.nextToken()); 
else if(str.equalsIgnoreCase("SwapTotal:")) 
result[2] = Integer.parseInt(token.nextToken()); 
else if(str.equalsIgnoreCase("SwapFree:")) 
result[3] = Integer.parseInt(token.nextToken()); 
} 

return result; 
} 

/** 
* get memory by used info 
* 
* @return float efficiency 
* @throws IOException 
* @throws InterruptedException 
*/ 
public static float getCpuInfo() throws IOException, InterruptedException 
{ 
File file = new File("/proc/stat"); 
BufferedReader br = new BufferedReader(new InputStreamReader( 
new FileInputStream(file))); 
StringTokenizer token = new StringTokenizer(br.readLine()); 
token.nextToken(); 
int user1 = Integer.parseInt(token.nextToken()); 
int nice1 = Integer.parseInt(token.nextToken()); 
int sys1 = Integer.parseInt(token.nextToken()); 
int idle1 = Integer.parseInt(token.nextToken()); 

Thread.sleep(1000); 

br = new BufferedReader( 
new InputStreamReader(new FileInputStream(file))); 
token = new StringTokenizer(br.readLine()); 
token.nextToken(); 
int user2 = Integer.parseInt(token.nextToken()); 
int nice2 = Integer.parseInt(token.nextToken()); 
int sys2 = Integer.parseInt(token.nextToken()); 
int idle2 = Integer.parseInt(token.nextToken()); 

return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1)); 
} 
} 

</pre>
<p>&nbsp;</p>
<p>这里的两个方法，解释一下，</p>
<p>方法1文件"/proc/meminfo"里面包含的就是内存的信息，还包括了swap的信息。例如： <br /><br />$ cat /proc/meminfo <br /><br />total: used: free: shared: buffers: cached: <br />Mem: 1057009664 851668992 205340672 0 67616768 367820800 <br />Swap: 2146787328 164429824 1982357504 <br />MemTotal: 1032236 kB <br />MemFree: 200528 kB <br />MemShared: 0 kB <br />这样可以用截取字符串的方法，来得到linux内存信息.</p>
<p>方法2在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是： user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在，CPU的每tick用在了哪里。例如： <br /><br />cpu0 256279030 0 11832528 1637168262 <br /><br />就是cpu0从开机到现在有 256279030 tick用在了user消耗，11832528用在了sys消耗。所以如果想计算单位时间（例如1s）里面CPU的负载，那只需要计算1秒前后数值的差除以每一秒的tick数量就可以了。</p>
<p>ok这样还剩下cpu温度，怎么做呢</p>
<p>发现了一个文件"cat /proc/acpi/thermal_zone/THM/temperature";可以返回本机的linux温度，</p>
<p>大概是这样的：temperature：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;68C</p>
<p>但不是每台linux机器都有这个THM你要确定你的linux加载了这个THM才能使用这个文件，这样就用<span style="color: #ff0000;">InputStreamReader(new FileInputStream（new File("/proc/acpi/thermal_zone/THM/temperature")）,</span>去读取这个文件，后面的相信大家一定会做了吧，就是把内容读出来,然后分割字符串去得到这个68。ok,系统基本信息全部完成，然后ok现在就只有一件事就是用Ajax去调用这个类来得到&nbsp;基本信息，然后返回到页面上，Ajax的用法就不赘言了。</p>
<p>&nbsp;</p>
<p>下面是系统监控的效果，大概是Ajax每几秒去linux下去取一次系统信息，然后显示在jsp页面上，以下是效果。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="../../../../upload/picture/pic/19967/7c685f82-cfc3-365a-8d3b-1487f495530b.bmp?1218858196" height="204" alt="" width="450" /></p>
<p>&nbsp;</p>
<p>到这里第一部分系统监控部分已经完成，现在开始完成实时告警部分，分析需求</p>
<p>1温度和cpu超过额定值需要告警</p>
<p>2用户操作系统失败，用户存储空间不足也需要告警，还有我们公司的业务操作失败告警，如果发生Exception也只能告警，当然要把异常的堆栈的信息保存在数据库里，我就这样设计如果用户在操作中触发了这些错误，则保存在数据库的告警表里，然后实时监控的再取出来这些信息。</p>
<p>3告警是要实时的那么要怎么从告警表里查到当前以后的数据呢，一开始想到用当前时间，在当前时间加上Ajax发送时间间隔，select * from warnlist where date&gt;new Date()+AjaxTime这种形式,后来发现时间是很不正确的，网络延迟，程序处理时间，（cpu信息用了sleep函数），等等你常常会发现有些告警信息被无情的放过，而有的时候有重复数据，这样我想到了用id，每次进入告警系统先查询到最大的告警id,然后保存在session中，然后ajax从数据库里取告警信息的时候都查这个id之后的数据（就是进入监控系统后的最新数据），然后session再保存新的最大id,下次ajax取还是从这个session中取最大id,这样信息就可以当ajax取的时候都保证是最新的，而且没有重复，very good!就这样做了</p>
<p>这样设计了一张告警处理表</p>
<pre name="code" class="sql">CREATE TABLE `warnlist` (
  `Id` bigint(20) NOT NULL auto_increment,
  `warnleave` tinyint(2) NOT NULL default '0',//告警级别：告警的严重程度
  `fromguy` varchar(20) NOT NULL,//属于哪个用户哪个组织的告警
  `warncontent` varchar(100) NOT NULL,//告警内容，比如cpu使用率超过80%
  `aviliablevalue` varchar(12) default NULL,//允许值 比如85%
  `warnvalue` varchar(12) default NULL,//告警值 80
  `warntime` datetime NOT NULL,//告警时间
  `stackinfo` varchar(255) default NULL,//异常的堆栈信息
  `dealwith` tinyint(2) NOT NULL default '0',//处理结果
  `version` int(11) default NULL,//version
  `organizerID` varchar(20) default NULL,//组织id
  `des` varchar(255) default NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
<p>&nbsp;</p>
<p>假设我ajax从系统取信息后，那么要写个逻辑，if(cpuTempature&gt;75C)or if(cpuUserd&gt;80%)则写入数据库，然后再查询大于上一次发送Ajax数据库的最大id的告警信息（这期间如果发生的以下错误一并查出：用户存储空间不足，还有我们公司的业务操作失败告警，Exception等），循环插入一个xml解析类中，大概形式是这样的Ajax返回这个xml,供页面提取信息</p>
<pre name="code" class="xml">&lt;response&gt;
&lt;cpuUsed&gt;67&lt;/cpuUsed&gt;
&lt;cpuTemp&gt;76&lt;cpuTemp&gt;
&lt;Memory&gt;1023422&lt;/Memory&gt;
&lt;freeMemory&gt;43244&lt;/freeMemory&gt;
&lt;wannlist&gt;
&lt;warnid&gt;2&lt;/warnid&gt;
&lt;warncontent&gt;系统存储空间不足&lt;/warncontent&gt;
&lt;fromguy&gt;kakaluyi&lt;/fromguy&gt;
..............
&lt;/wanrlist&gt;
&lt;warnlist&gt;
&lt;warnid&gt;3&lt;/warnid&gt;
&lt;warncontent&gt;cpu温度过高&lt;/warncontent&gt;
&lt;fromguy&gt;系统&lt;/fromguy&gt;
&lt;orgid&gt;系统&lt;/orgid&gt;
&lt;warnvalue&gt;78&lt;/warnvalue&gt;
.............
&lt;/warnlist&gt;
........

&lt;/response&gt;</pre>
<p>&nbsp;</p>
<p>系统信息的显示代码，就是关联上面那个图片的：</p>
<pre name="code" class="html">var cpuUsed=req.responseXML.getElementsByTagName('cpuUsed')[0].firstChild.nodeValue;
var totalMemory=req.responseXML.getElementsByTagName('totalMemory')[0].firstChild.nodeValue;
var freeMemory=req.responseXML.getElementsByTagName('freeMemory')[0].firstChild.nodeValue;
var cpuTemp=req.responseXML.getElementsByTagName('cpuTemp')[0].firstChild.nodeValue;
$('cpuUsed').innerHTML=cpuUsed;
$('totalMemory').innerHTML=totalMemory;
$('freeMemory').innerHTML=freeMemory;
$('cpuTemp').innerHTML=cpuTemp;

//jsp
&lt;tr&gt;
&lt;td class="label" width="20%"&gt;
服务器CPU使用率：&lt;/td&gt;
&lt;td class="text"&gt;
&lt;font color="#FF0000" size="+2"&gt;&lt;label id="cpuUsed"&gt;&lt;/label&gt;
&lt;/font&gt; &lt; 告警预定阀值: 80% &gt;
&lt;/td&gt;
&lt;/tr&gt;
 .........</pre>
<p>然后就是页面展现的问题了这里我用了dom节点的增删，一个页面保持50条记录，如果超过50条则删除以前的节点，代码为：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="js">var length=req.responseXML.getElementsByTagName('warnlist').length;
if(length&gt;0)
{
var trlength=document.getElementsByTagName('table')[4].childNodes[0].childNodes.length;

if(trlength+length-1&gt;50)//如果大于50条，则查找告警列表的table，得到
告警信息的子节点，然后删除多余的最早的告警信息
{
var tbody=document.getElementsByTagName('table')[4].childNodes[0];
for(var i=1;i&lt;trlength+length-50;i++)
{
var tr=tbody.childNodes[i];
tr.parentNode.removeChild(tr);

}</pre>
<p>&nbsp;</p>
<p>然后插入新的告警信息，</p>
<pre name="code" class="js">for(var i=0;i&lt;length;i++)
{
var onewarnlist=req.responseXML.getElementsByTagName('warnlist')[i].childNodes;
if(onewarnlist[0].firstChild.nodeValue==0)
{
var leave="企业级告警";
}
else {
var leave="运营商级告警";
}
var from=onewarnlist[1].firstChild.nodeValue;
var warncontent=onewarnlist[2].firstChild.nodeValue;
var aviliablevalue=onewarnlist[3].firstChild.nodeValue;
var warnvalue=onewarnlist[4].firstChild.nodeValue;
var warntime=onewarnlist[5].firstChild.nodeValue;
var id=onewarnlist[8].firstChild.nodeValue;
if(onewarnlist[6].firstChild.nodeValue==0)
{
var dealwith="未处理" ;
}
else {
var dealwith="&lt;font color='red'&gt;已处理&lt;/font&gt;";
}
var table=document.getElementById('warntable');
var tr=document.createElement('tr');
 if(x%2==1)
{
tr.style.backgroundColor="#BFD3F9"
}
else{
tr.style.backgroundColor="#FBFCEB"
}
x++;
table.appendChild(tr);
var td=document.createElement('td');
td.className ='listText';
td.innerHTML =x;
tr.appendChild(td);
var td1=document.createElement('td');
td1.className ='listText';
td1.innerHTML = leave;
tr.appendChild(td1);
var td2=document.createElement('td');
td2.className ='listText';
td2.innerHTML = from;
tr.appendChild(td2);
var td3=document.createElement('td');
td3.className ='listText';
td3.innerHTML = warncontent;
tr.appendChild(td3);6
var td4=document.createElement('td');
td4.className ='listText';
td4.innerHTML = aviliablevalue;
tr.appendChild(td4);
var td5=document.createElement('td');
td5.className ='listText';
td5.innerHTML = '&lt;font color="#FF0000"&gt;'+warnvalue+'&lt;/font&gt;';
tr.appendChild(td5);
var td6=document.createElement('td');
td6.className ='listText';
td6.innerHTML = warntime;
tr.appendChild(td6);
var td7=document.createElement('td');
td7.className ='listText';
td7.innerHTML = dealwith;
tr.appendChild(td7);
var td8=document.createElement('td');
td8.className ='listText';
td8.innerHTML = id;
tr.appendChild(td8);
   }</pre>
<p>&nbsp;</p>
<p>ok，一切大功告成，以下是最终效果</p>
<p><img src="../../../../upload/picture/pic/19963/89cd061e-0d44-31d6-8769-c69a06de7ae2.bmp?1218855651" height="343" alt="" width="762" /></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/228636#comments" style="color:red;">已有 <strong>37</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Aug 2008 12:38:02 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/228636</link>
        <guid>http://kakaluyi.javaeye.com/blog/228636</guid>
      </item>
          <item>
        <title>JAVA读取WORD,EXCEL,POWERPOINT,PDF文件的方法</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/227875" style="color:red;">http://kakaluyi.javaeye.com/blog/227875</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>OFFICE文档使用POI控件，PDF可以使用PDFBOX0.7.3控件，完全支持中文，用XPDF也行，不过感觉PDFBOX比较好，而且作者也在更新。水平有限，万望各位指正<br /><br />WORD:<br />import&nbsp;org.apache.lucene.document.Document;<br />import&nbsp;org.apache.lucene.document.Field;<br />import&nbsp;org.apache.poi.hwpf.extractor.WordExtractor;<br /><br />import&nbsp;java.io.File;<br />import&nbsp;java.io.InputStream;<br />import&nbsp;java.io.FileInputStream;<br /><br />import&nbsp;com.search.code.Index;<br /><br />public&nbsp;Document&nbsp;getDocument(Index&nbsp;index,&nbsp;String&nbsp;url,&nbsp;String&nbsp;title,&nbsp;InputStream&nbsp;is)&nbsp;throws&nbsp;DocCenterException&nbsp;{<br /><br />&nbsp;&nbsp;String&nbsp;bodyText&nbsp;=&nbsp;null;<br />&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;WordExtractor&nbsp;ex&nbsp;=&nbsp;new&nbsp;WordExtractor(is);//is是WORD文件的InputStream&nbsp;<br />&nbsp;&nbsp;&nbsp;bodyText&nbsp;=&nbsp;ex.getText();<br />&nbsp;&nbsp;&nbsp;if(!bodyText.equals("")){<br />&nbsp;&nbsp;&nbsp;&nbsp;index.AddIndex(url,&nbsp;title,&nbsp;bodyText);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch&nbsp;(DocCenterException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DocCenterException("无法从该Mocriosoft&nbsp;Word文档中提取内容",&nbsp;e);<br />&nbsp;&nbsp;}catch(Exception&nbsp;e){<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />}<br />&nbsp;&nbsp;return&nbsp;null;<br />}<br /><br /><br /><br />Excel:<br /><br />import&nbsp;org.apache.lucene.document.Document;<br />import&nbsp;org.apache.lucene.document.Field;<br /><br />import&nbsp;org.apache.poi.hwpf.extractor.WordExtractor;<br />import&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFWorkbook;&nbsp;<br />import&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFSheet;&nbsp;<br />import&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFRow;&nbsp;<br />import&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFCell;&nbsp;<br /><br />import&nbsp;java.io.File;<br />import&nbsp;java.io.InputStream;<br />import&nbsp;java.io.FileInputStream;<br /><br />import&nbsp;com.search.code.Index;<br /><br /><br /><br />public&nbsp;Document&nbsp;getDocument(Index&nbsp;index,&nbsp;String&nbsp;url,&nbsp;String&nbsp;title,&nbsp;InputStream&nbsp;is)&nbsp;throws&nbsp;DocCenterException&nbsp;{<br />&nbsp;&nbsp;StringBuffer&nbsp;content&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;HSSFWorkbook&nbsp;&nbsp;workbook&nbsp;&nbsp;=&nbsp;&nbsp;new&nbsp;&nbsp;HSSFWorkbook(is);//创建对Excel工作簿文件的引用&nbsp;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;numSheets&nbsp;=&nbsp;0;&nbsp;numSheets&nbsp;&lt;&nbsp;workbook.getNumberOfSheets();&nbsp;numSheets++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;workbook.getSheetAt(numSheets))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFSheet&nbsp;aSheet&nbsp;=&nbsp;workbook.getSheetAt(numSheets);//获得一个sheet<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;rowNumOfSheet&nbsp;=&nbsp;0;&nbsp;rowNumOfSheet&nbsp;&lt;=&nbsp;aSheet.getLastRowNum();&nbsp;rowNumOfSheet++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;aSheet.getRow(rowNumOfSheet))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFRow&nbsp;aRow&nbsp;=&nbsp;aSheet.getRow(rowNumOfSheet);&nbsp;//获得一个行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(short&nbsp;cellNumOfRow&nbsp;=&nbsp;0;&nbsp;cellNumOfRow&nbsp;&lt;=&nbsp;aRow.getLastCellNum();&nbsp;cellNumOfRow++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;aRow.getCell(cellNumOfRow))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCell&nbsp;aCell&nbsp;=&nbsp;aRow.getCell(cellNumOfRow);//获得列值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content.append(aCell.getStringCellValue());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if(!content.equals("")){<br />&nbsp;&nbsp;&nbsp;&nbsp;index.AddIndex(url,&nbsp;title,&nbsp;content.toString());<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch&nbsp;(DocCenterException&nbsp;e)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DocCenterException("无法从该Mocriosoft&nbsp;Word文档中提取内容",&nbsp;e);<br />&nbsp;&nbsp;}catch(Exception&nbsp;&nbsp;e)&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;System.out.println("已运行xlRead()&nbsp;&nbsp;:&nbsp;&nbsp;"&nbsp;&nbsp;+&nbsp;&nbsp;e&nbsp;&nbsp;);&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return&nbsp;null;<br />}<br /><br /><br /><br />PowerPoint:<br /><br />import&nbsp;java.io.InputStream;<br /><br />import&nbsp;org.apache.lucene.document.Document;<br />import&nbsp;org.apache.poi.hslf.HSLFSlideShow;<br />import&nbsp;org.apache.poi.hslf.model.TextRun;<br />import&nbsp;org.apache.poi.hslf.model.Slide;<br />import&nbsp;org.apache.poi.hslf.usermodel.SlideShow;<br /><br />public&nbsp;Document&nbsp;getDocument(Index&nbsp;index,&nbsp;String&nbsp;url,&nbsp;String&nbsp;title,&nbsp;InputStream&nbsp;is)<br />throws&nbsp;DocCenterException&nbsp;{<br />&nbsp;&nbsp;StringBuffer&nbsp;content&nbsp;=&nbsp;new&nbsp;StringBuffer("");<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;SlideShow&nbsp;ss&nbsp;=&nbsp;new&nbsp;SlideShow(new&nbsp;HSLFSlideShow(is));//is&nbsp;为文件的InputStream，建立SlideShow<br />&nbsp;&nbsp;&nbsp;Slide[]&nbsp;slides&nbsp;=&nbsp;ss.getSlides();//获得每一张幻灯片<br />&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;slides.length;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;TextRun[]&nbsp;t&nbsp;=&nbsp;slides[i].getTextRuns();//为了取得幻灯片的文字内容，建立TextRun<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j=0;j&lt;t.length;j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content.append(t[j].getText());//这里会将文字内容加到content中去<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;content.append(slides[i].getTitle());<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;index.AddIndex(url,&nbsp;title,&nbsp;content.toString());<br />&nbsp;&nbsp;}catch(Exception&nbsp;ex){<br />&nbsp;&nbsp;&nbsp;System.out.println(ex.toString());<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return&nbsp;null;<br />}<br /><br /><br /><br />PDF:<br /><br />import&nbsp;java.io.InputStream;<br />import&nbsp;java.io.IOException;<br />import&nbsp;org.apache.lucene.document.Document;<br /><br />import&nbsp;org.pdfbox.cos.COSDocument;<br />import&nbsp;org.pdfbox.pdfparser.PDFParser;<br />import&nbsp;org.pdfbox.pdmodel.PDDocument;<br />import&nbsp;org.pdfbox.pdmodel.PDDocumentInformation;<br />import&nbsp;org.pdfbox.util.PDFTextStripper;<br /><br />import&nbsp;com.search.code.Index;<br /><br /><br /><br />public&nbsp;Document&nbsp;getDocument(Index&nbsp;index,&nbsp;String&nbsp;url,&nbsp;String&nbsp;title,&nbsp;InputStream&nbsp;is)throws&nbsp;DocCenterException&nbsp;{<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;COSDocument&nbsp;cosDoc&nbsp;=&nbsp;null;<br />&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;cosDoc&nbsp;=&nbsp;parseDocument(is);<br />&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;closeCOSDocument(cosDoc);<br />&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DocCenterException("无法处理该PDF文档",&nbsp;e);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(cosDoc.isEncrypted())&nbsp;{<br />&nbsp;&nbsp;&nbsp;if&nbsp;(cosDoc&nbsp;!=&nbsp;null)<br />&nbsp;&nbsp;&nbsp;&nbsp;closeCOSDocument(cosDoc);<br />&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DocCenterException("该PDF文档是加密文档，无法处理");<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;String&nbsp;docText&nbsp;=&nbsp;null;<br />&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;PDFTextStripper&nbsp;stripper&nbsp;=&nbsp;new&nbsp;PDFTextStripper();<br />&nbsp;&nbsp;&nbsp;docText&nbsp;=&nbsp;stripper.getText(new&nbsp;PDDocument(cosDoc));<br />&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;closeCOSDocument(cosDoc);<br />&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DocCenterException("无法处理该PDF文档",&nbsp;e);<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;PDDocument&nbsp;pdDoc&nbsp;=&nbsp;null;<br />&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;pdDoc&nbsp;=&nbsp;new&nbsp;PDDocument(cosDoc);<br />&nbsp;&nbsp;&nbsp;PDDocumentInformation&nbsp;docInfo&nbsp;=&nbsp;pdDoc.getDocumentInformation();<br />&nbsp;&nbsp;&nbsp;if(docInfo.getTitle()!=null&nbsp;&amp;&amp;&nbsp;!docInfo.getTitle().equals("")){<br />&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;=&nbsp;docInfo.getTitle();<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;closeCOSDocument(cosDoc);<br />&nbsp;&nbsp;&nbsp;closePDDocument(pdDoc);<br />&nbsp;&nbsp;&nbsp;System.err.println("无法取得该PDF文档的元数据"&nbsp;+&nbsp;e.getMessage());<br />&nbsp;&nbsp;}&nbsp;finally&nbsp;{<br />&nbsp;&nbsp;&nbsp;closeCOSDocument(cosDoc);<br />&nbsp;&nbsp;&nbsp;closePDDocument(pdDoc);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;return&nbsp;null;<br />}<br /><br />private&nbsp;static&nbsp;COSDocument&nbsp;parseDocument(InputStream&nbsp;is)&nbsp;throws&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;PDFParser&nbsp;parser&nbsp;=&nbsp;new&nbsp;PDFParser(is);<br />&nbsp;&nbsp;parser.parse();<br />&nbsp;&nbsp;return&nbsp;parser.getDocument();<br />}<br /><br />private&nbsp;void&nbsp;closeCOSDocument(COSDocument&nbsp;cosDoc)&nbsp;{<br />&nbsp;&nbsp;if&nbsp;(cosDoc&nbsp;!=&nbsp;null)&nbsp;{<br />&nbsp;&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cosDoc.close();<br />&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br /><br />private&nbsp;void&nbsp;closePDDocument(PDDocument&nbsp;pdDoc)&nbsp;{<br />&nbsp;&nbsp;if&nbsp;(pdDoc&nbsp;!=&nbsp;null)&nbsp;{<br />&nbsp;&nbsp;&nbsp;try&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;pdDoc.close();<br />&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/227875#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 09:02:15 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/227875</link>
        <guid>http://kakaluyi.javaeye.com/blog/227875</guid>
      </item>
          <item>
        <title>mysql查询优化</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/227569" style="color:red;">http://kakaluyi.javaeye.com/blog/227569</a>&nbsp;
          发表时间: 2008年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="blog_content">对查询 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://nihongye.javaeye.com/blog/193442#" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"><img src="http://nihongye.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j">
<li><span><span>select&nbsp;distinct&nbsp;product0_.id&nbsp;as&nbsp;id62_........................................................&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>from&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;t_product&nbsp;product0_,&nbsp;t_product_catagory&nbsp;productcat1_&nbsp; &nbsp;&nbsp;</span></li>
<li><span>where&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;product0_.catagory_id=productcat1_.id&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;product0_.site_id=</span><span class="string"><span style="color: #0000ff;">'54586546898098098'</span></span><span>&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;product0_.state=</span><span class="number"><span style="color: #c00000;">1</span></span><span>&nbsp;and&nbsp;productcat1_.publish=</span><span class="number"><span style="color: #c00000;">1</span></span><span>&nbsp; &nbsp;&nbsp;</span></li>
<li><span>order&nbsp;by&nbsp;product0_.modifyTime&nbsp;desc&nbsp;limit&nbsp;</span><span class="number"><span style="color: #c00000;">0</span></span><span>,&nbsp;</span><span class="number"><span style="color: #c00000;">30</span></span><span>;&nbsp;&nbsp;</span></li>
</ol></div>
<pre name="code" class="java">select distinct product0_.id as id62_........................................................ 
from 
	t_product product0_, t_product_catagory productcat1_ 
where 
	product0_.catagory_id=productcat1_.id 
	and product0_.site_id='54586546898098098' 
	and product0_.state=1 and productcat1_.publish=1 
order by product0_.modifyTime desc limit 0, 30;</pre>
<br />的优化 <br /><br />1.优化order by,order by 使用index的几种情况，其中key_part1,key_part2表示联合索引中的某索引字段 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a href="http://nihongye.javaeye.com/blog/193442#" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"><img src="http://nihongye.javaeye.com/images/icon_copy.gif" alt="复制代码" /></a></div>
</div>
<ol class="dp-j">
<li><span><span>SELECT&nbsp;*&nbsp;FROM&nbsp;t1&nbsp; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;key_part1,key_part2,...&nbsp;; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;t1&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;key_part1=constant&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;key_part2; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;t1&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;key_part1&nbsp;DESC,&nbsp;key_part2&nbsp;DESC; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;t1 &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;key_part1=</span><span class="number"><span style="color: #c00000;">1</span></span><span>&nbsp; &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY&nbsp;key_part1&nbsp;DESC,&nbsp;key_part2&nbsp;DESC;&nbsp;&nbsp;</span></li>
</ol></div>
<pre name="code" class="java">SELECT * FROM t1 
  	ORDER BY key_part1,key_part2,... ;
    
	SELECT * FROM t1 
	  WHERE key_part1=constant 
	  ORDER BY key_part2;
    
	SELECT * FROM t1 
	  ORDER BY key_part1 DESC, key_part2 DESC;
    
	SELECT * FROM t1
	  WHERE key_part1=1 
	  ORDER BY key_part1 DESC, key_part2 DESC;</pre>
<br />具体见：<a href="http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html" target="_blank"><span style="color: #108ac6;">http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html</span></a> <br />所以优化产品查询的排序只要做这样的改变就可以了alter table t_product add index t_product_site_modifytime_idx (site_id,modifytime), <br />如果order by 没有利用到索引，那么将会出现fileSort，如果sort_buffer不够大，fileSort过程则需要使用临时文件,fileSort优化，主要通过调整环境来达到，如下 <br /><br />2.设置参数，优化order by 时可能出现的file sort： <br />将sort_buffer_size = 1M read_rnd_buffer_size = 1M <br />修改为sort_buffer_size = 16M read_rnd_buffer_size = 16M <br />避免order by 过程 进行fileSort排序过程临时文件的产生。从3秒-&gt;0.7秒左右 <br /><br />3.去掉distinct,因为distinct加order by,mysql将自动使用临时表 <br />distinct的优化方式详见：<a href="http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html" target="_blank"><span style="color: #108ac6;">http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html </span></a><br /><br />4.修改jdbc的url，增加参数useServerPrepStmts=false，使得query cache生效， <br />这个参数就是让参数与sql连接成整一个字符串，调试对参数中的单引号做了转义，应该 <br />不用担心sql注入攻击了。另外，是否会导致服务端对查询重复的编译而导致的性能下降就不 清楚了. <br /><br />整个测试去掉了querycache,保证innodb_buffer的命中率的情况下进行. <br />结果，在limit很小的时候，原来需要7秒，现在需要0.0秒。但在limit 1000或者更大的时候，查询速度下降， <br />因为需要得到开始索引那么多条记录，这只能通过限制limit的开始值和期望query cache命中率高些. <br />最重要工具是下面链接的explain教程 <br /><a href="http://dev.mysql.com/doc/refman/5.1/en/using-explain.html" target="_blank"><span style="color: #108ac6;">http://dev.mysql.com/doc/refman/5.1/en/using-explain.html</span></a> </div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/227569#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Aug 2008 15:59:32 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/227569</link>
        <guid>http://kakaluyi.javaeye.com/blog/227569</guid>
      </item>
          <item>
        <title>J2EE开发之常用开源项目介绍</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/225176" style="color:red;">http://kakaluyi.javaeye.com/blog/225176</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small; font-family: Arial;"><span style="background-color: #ffcc00;">&nbsp;J2EE开发之常用开源项目介绍</span> <br />&nbsp;<br />主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发.主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库<br />&nbsp;<br /><span style="color: #ff9900; background-color: #99cc00;"><strong>1持久层:</strong></span><br /><strong>1)Hibernate</strong><br />这个不用介绍了,用的很频繁,用的比较多的是映射,包括继承映射和父子表映射<br />对于DAO在这里介绍个在它基础上开发的包bba96,目前最新版本是bba96 2.0它对Hibernate进行了封装, 查询功能包括执行hsql或者sql查询/更新的方法，如果你要多层次逻辑的条件查询可以自己组装QueryObject.可以参考它做HibernateDAO.也可以直接利用它<br /><strong>2) iBATIS</strong><br />另一个ORM工具,Apache的,没有Hibernate那么集成,自由度比较大</span></p>
<p><span style="font-size: small; font-family: Arial;">
<p><br /><strong><span style="color: #ff9900; background-color: #99cc00;">2:SpringMVC</span></strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原理说明和快速入门:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置文件为:<br />Spring的配置文件默认为WEB-INF/xxxx-servelet.xm其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Action分发:<br />Spring将按照配置文件定义的URL，Mapping到具体Controller类，再根据URL里的action= xxx或其他参数，利用反射调用Controller里对应的Action方法。<br />输入数据绑定:<br />Spring提供Binder 通过名字的一一对应反射绑定Pojo，也可以直接从request.getParameter()取数据。<br />输入数据验证<br />Sping 提供了Validator接口当然还可以使用开源的Commons-Validaor支持最好<br />Interceptor(拦截器)<br />Spring的拦截器提供接口需要自己编写,在这点不如WebWork做的好.全面 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (这里提一下WebWork和Struts的区别最主要的区别在于WebWork在建立一个Action时是新New一个对象而Struts是SingleMoule所有的都继承它的一个Action,所以根据项目需要合适的选择.)</p>
<p><br /><strong><span style="color: #ff9900; background-color: #99cc00;">3:View层</span></strong><br /><strong>1) 标签库:JSP2.0/JSTL</strong><br />由于Webwork或Spring的标签确实很有限,一般view层用JSTL标签,而且据说JSTL设计很好速度是所有标签中最快的使用起来也很简单<br />&nbsp;<br /><strong>2) 富客户端:DOJO Widgets, YUI(YahooUI),FCKEditor, Coolest日历控件</strong><br />Dojo主要提供Tree, Tab等富客户端控件,可以用其进行辅助客户端开发<br />YahooUI和DOJO一样它有自己的一套javascript调试控制台,主要支持ajax开发也有很多Tree,Table,Menu等富客户端控件<br />FCKEditor 最流行的文本编辑器<br />Coolest日历控件 目前很多日历控件可用,集成在项目中也比较简单,这个只是其中的一个,界面不错的说..<br />&nbsp;<br /><strong>3) JavaScript:Prototype.js</strong><br />Prototype.js作为javascript的成功的开源框架，封装了很多好用的功能,通过它很容易编写AJAX应用,现在AJAX技术逐渐成熟,框架资源比较丰富,比如YUI,DWR等等,也是因为JavaScript没有合适的调试工具,所以没有必要从零开始编写AJAX应用,个人认为多用一些成熟的Ajax框架实现无刷新更新页面是不错的选择.<br />&nbsp;<br /><strong>4)表格控件:Display Tag ,Extreme Table</strong><br />这两个的功能差不多,都是View层表格的生成,界面也比较相向,可以导出Excel,Pdf,对Spring支持很容易.<br />相比较而言比较推荐ExtremeTable,它的设计很好功能上比DisplayTag多一些,支持Ajax,封装了一些拦截器,而且最方面的是在主页wiki中有详细的中文使用文档.<br />&nbsp;<br /><strong>5):OSCache</strong><br />OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件,Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统的稳定性和运行性能。<br />它主要用在处理短时间或一定时间内一些数据或页面不会发生变化,或将一些不变的统计报表,缓冲在内存,可以充分的减轻服务器的压力,防治负载平衡,快速重启服务器(通过硬盘缓存).<br />&nbsp;<br /><strong>6)SiteMesh</strong><br />sitemesh应用Decorator模式主要用于提高页面的可维护性和复用性，其原理是用Filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer，现在，在sitemesh的帮助下，我们删掉他们轻松达到复合视图模式.<br />Sitemesh也是 OpenSymphony的一个项目现在最近的版本是2.2,目前OpenSymphony自从04年就没有更新的版本了..感觉它还是比较有创新的一种页面组装方式, OpenSymphony开源组织的代码一般写的比较漂亮,可以改其源代码对自己的项目进行适配.<br />测试发现Sitemesh还存在一些问题,比如中文问题,它的默认编码是iso-8859-1在使用时候需要做一些改动.<br />&nbsp;<br /><strong>7)CSS,XHTML</strong><br />这个不用说了,遵循W3C标准的web页面开发.<br /><strong>&nbsp;<br />8)分页标签: pager-taglib组件</strong><br />Pager-taglib 是一套分页标签库，可以灵活地实现多种不同风格的分页导航页面，并且可以很好的与服务器分页逻辑分离.使用起来也比较简单.<br /><strong>&nbsp;<br />9)Form: Jodd Form taglib</strong><br />Jodd Form taglib使用比较简单,只要把form的头尾以包住<br />就会自动绑定mybean, 自动绑定mybean的所有同名属性到普通html标记input, selectbox, checkbox,radiobox.....在这些input框里不用再写任何代码&hellip;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><strong>10)Ajax:DWR</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J2EE应用最常用的ajax框架<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><strong>11)报表 图表</strong><br />Eclipse BIRT功能比较强大,也很庞大..好几十M,一般没有特别需求或别的图表设计软件可以解决的不用它<br />JasperReports+ iReport是一个基于Java的开源报表工具，它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。<br />JFreeChart主要是用来制作各种各样的图表，这些图表包括：饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 琴棋报表,国产的..重点推荐,适合中国的情况,开放源代码，使用完全免费。纯JAVA开发，适用多种系统平台。特别适合B/S结构的系统。官方网站有其优点介绍,看来用它还是不错的选择,最重要的是支持国产呵呵<br />&nbsp;<br /><strong><span style="color: #ff9900; background-color: #99cc00;">4:权限控制: Acegi</span></strong><br />Acegi是Spring Framework 下最成熟的安全系统，它提供了强大灵活的企业级安全服务，如完善的认证和授权机制，Http资源访问控制，Method 调用访问控制等等,支持CAS<br />(耶鲁大学的单点登陆技术,这个单点登陆方案比较出名.我也进行过配置使用,可以根据项目需要,如果用户分布在不同的地方不同的系统通用一套登陆口令可以用它进行解决,一般注册机登陆机就是这样解决的)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Acegi只是于Spring结合最好的安全框架,功能比较强大,当然还有一些其他的安全框架,这里列举一些比较流行的是我从网上找到的,使用方法看其官方文档把&hellip;<br />JAAS, Seraph, jSai - Servlet Security, Gabriel, JOSSO, Kasai, jPAM, OpenSAML都是些安全控制的框架..真够多的呵呵<br />&nbsp;<br /><span style="color: #ff9900; background-color: #99cc00;"><strong>5:全文检索</strong></span><br /><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1) Lucene</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lucene是一套全文索引接口,可以通过它将数据进行倒排文件处理加入索引文件,它的索引速度和查询速度是相当快的,查询百万级数据毫秒级出结果,现在最火的Apache开源项目,版本更新速度很快现在已经到了2.0,每个版本更新的都比较大,目前用的最多的版本应该是1.4.3,但它有个不太方面的地方单个索引文件有2G文件限制,现在2.0版本没有这个限制,我研究的比较多,它的扩展性比较好,可以很方面的扩充其分词接口和查询接口.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于它的开发的系统很多,比如最常用的Eclipse的搜索功能,还有一些开源的软件比如Compass,Nutch,Lius,还有我最近做的InSearch(企业级FTP文件网页搜索) <form enctype="application/x-www-form-urlencoded" method="get" accept-charset="UNKNOWN"></form></p>
<p><br /><span style="color: #ff9900; background-color: #99cc00;"><strong>6:公共Util类</strong></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要是Jakarta-Commons类库,其中最常用得是以下几个类库<br /><strong>1) Jakarta-Commons-Language</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最常用得类是StringUtils类,提供了使用的字符串处理的常用方法效率比较高<br /><strong>2) Jakarta-Commons-Beantuils</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要用Beantuils能够获得反射函数封装及对嵌套属性，map,array型属性的读取。<br /><strong>3) Jakarta-Commons-Collections</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 里面有很多Utils方法<br />&nbsp;<br /><span style="color: #ff9900; background-color: #99cc00;"><strong>7 日志管理</strong></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务是日志记录,分为Info,Warn,error几个层次可以更好的调试程序<br />&nbsp;<br /><span style="color: #ff9900; background-color: #99cc00;"><strong>8 开源的J2EE框架</strong></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>1) Appfuse</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架, 它对如何集成流行的Spring、Hibernate、iBatis、Struts、Xdcolet、JUnit等基础框架给出了示范. 在持久层，AppFuse采用了Hibernate O/R映射工具；在容器方面，它采用了Spring,用户可以自由选择Struts、Spring/MVC，Webwork，JSF这几个Web框架。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>2) SpringSide<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .SpringSide较完整的演示了企业应用的各个方面,是一个电子商务网站的应用 SpringSide也大量参考了Appfuse中的优秀经验。最重要的是它是国内的一个开源项目,可以了解到国内现在的一些实际技术动态和方向很有指导意义&hellip;<br />&nbsp;<br /><span style="color: #ff9900; background-color: #99cc00;"><strong>9:模版 Template</strong></span> <br />主要有Veloctiy和Freemarker<br />模板用Servlet提供的数据动态地生成 HTML。编译器速度快，输出接近静态HTML&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 页面的速度。<br /><span style="color: #ff9900;">&nbsp;<br /></span><span style="color: #003366; background-color: #99cc00;"><strong><span style="color: #ff9900;">10:工作流</span><br /></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我所知道比较出名的主要有JBpm Shark Osworkflow,由于对它没有过多的研究所以还不是很清楚之间有什么区别.<br />&nbsp;<br />项目管理软件<br />dotProject:是一个基于LAMP的开源项目管理软件。最出名的项目管理软件<br />JIRA: 项目计划，任务安排，错误管理<br />Bugzilla:提交和管理bug,和eclipse集成,可以通过安装MyEclipse配置一下即可使用<br />BugFree借鉴微软公司软件研发理念、免费开放源代码、基于Web的精简版Bug管理<br />CVS:这个就不介绍了都在用.<br />SVN: SubVersion已逐渐超越CVS，更适应于JavaEE的项目。Apache用了它很久后，Sourceforge刚刚推出SVN的支持。<br />测试用例:主要JUnit单元测试,编写TestCase,Spring也对Junit做了很好的支持<br />&nbsp;<br /><strong><span style="color: #99cc00;"><span style="background-color: #ffcc00;">后记:</span><br /></span></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以Spring为主的应用开发可选用的组件中间件真是眼花缭乱,所以针对不同的项目需求可以利用不同的开源产品解决,比如用Spring+Hibernate/ iBATIS或Spring+WebWork+Hibernate/ iBATIS或Spring+Struts+Hibernate/ iBATIS,合理的框架设计和代码复用设计对项目开发效率和程序性能有很大的提高,也有利于后期的维护.</p>
</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/225176#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 06 Aug 2008 19:49:03 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/225176</link>
        <guid>http://kakaluyi.javaeye.com/blog/225176</guid>
      </item>
          <item>
        <title>MySQL实施热备份</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/223931" style="color:red;">http://kakaluyi.javaeye.com/blog/223931</a>&nbsp;
          发表时间: 2008年08月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>MySQL<span style="font-family: 宋体;">内部复制功能是建立在两个或两个以上服务器之间，通过设定它们之间的<br />主</span>-<span style="font-family: 宋体;">从关系来实现的。其中一个作为主服务器，其它的作为副服务器。以下将<br />详细讨论如何配置两台服务器，将一个设为主服务器，另一个设为副服务器。<br />并且描述一下在它们之间进行切换的处理过程。<br /><br /></span></p>
<h1><a name="_Toc93810184"><span style="font-size: large; font-family: 仿宋_GB2312;">1</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: large; font-family: 仿宋_GB2312;">操作步骤</span></a></h1>
<h2><a name="_授权"></a><span style="font-size: small; font-family: 仿宋_GB2312;">1.1</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">主服务器授权</span></h2>
<p>授权副服务器可以连接主服务器并可以进行更新。这是在主服务器上进行的，创建一个<br />username和password供副服务器访问时使用。在MySQL命令行下输入</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;GRANT&nbsp;REPLICATION&nbsp;SLAVE&nbsp;ON&nbsp;*.*&nbsp;TO&nbsp;&lsquo;username&rsquo;@&rsquo;slave-server-hostname&rsquo;&nbsp;IDENTIFIED&nbsp;BY&nbsp;&lsquo;password&rsquo;;</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br /><br />根据实际情况替换username，slave-server-hostname，password。</p>
<p>&nbsp;</p>
<h2><a name="_数据复制"></a><span style="font-size: small; font-family: 仿宋_GB2312;">1.2</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">数据复制</span></h2>
<p>一旦建立好访问许可后，接下来就是从主服务器向副服务器复制数据。可以从mysqldump<br />工具。</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">#锁住表，禁止update。</span></p>
<p><span style="font-size: x-small;">mysql&gt;&nbsp;FLUSH&nbsp;TABLES&nbsp;WITH&nbsp;READ&nbsp;LOCK;</span></p>
<p><span style="font-size: x-small;">#导出数据&nbsp;Windows中为命令提示符。</span></p>
<p><span style="font-size: x-small;">shell&gt;&nbsp;mysqldump&nbsp;&ndash;opt&nbsp;databasename&nbsp;&gt;&nbsp;backup.sql</span></p>
<p><span style="font-size: x-small;">#解除锁定</span></p>
<pre><span style="font-family: 宋体;">mysql&gt; UNLOCK TABLES</span></pre>
</td>
</tr>
</tbody>
</table>
</p>
<p><br /><br /><br /><br /><br /><br />将备份好的数据库脚本backup.sql拷贝到副服务器。</p>
<p>另外也可以使用LOAD&nbsp;DATA&nbsp;FROM&nbsp;MASTER语句将主服务器的数据传输到副服务器，但<br />使用上有些限制。<br />注意：在执行数据复制的过程中，要确保不能对主服务器执行更新操作。</p>
<h2><a name="_配置主服务器"></a><span style="font-size: small; font-family: 仿宋_GB2312;">1.3</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">配置主服务器</span></h2>
<p>在选项配置文件中赋予主服务器一个server-id，该id必须是1到2^23-1范围<br />内的唯一值。主服务器和副服务器的server-id不能相同。</p>
<p>另外，还需要配置主服务器，使之启用二进制日志，即在选项配置文件中添加log-bin<br />启动选项。</p>
<p>选项文件示例(其中#开头的为注释)：</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">[mysqld]</span></p>
<p><span style="font-size: x-small;">#唯一值，并不能与副服务器相同</span></p>
<p><span style="font-size: x-small;">server-id=3</span></p>
<p><span style="font-size: x-small;">#日志文件以binary_log为前缀，如果不给log-bin赋值，日志文件将以#master-server-hostname为前缀</span></p>
<p><span style="font-size: x-small;">log-bin&nbsp;=&nbsp;binary_log</span></p>
<p><span style="font-size: x-small;">#日志文件跳过的数据库(可选属性)</span></p>
<p><span style="font-size: x-small;">binlog-ignore-db=mysql</span></p>
<p><span style="font-size: x-small;">#日志文件操作的数据库(可选属性)</span></p>
<p><span style="font-size: x-small;">binlog-do-db=netbar</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p>&nbsp;</p>
<h2><a name="_重启主服务器"></a>&nbsp;</h2>
<h2>&nbsp;</h2>
<h2>&nbsp;</h2>
<h2><span style="font-size: small; font-family: 仿宋_GB2312;">1.4</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">重启主服务器</span></h2>
<p>配置好以上选项后，重启MySQL服务，新选项将生效。现在，所有对数据库中信息的<br />更新操作将被写进日志中。</p>
<p>&nbsp;</p>
<p>注意：如果主服务器的二进制日志已经启用，关闭并重新启动之前应该对以前的二<br />进制日志进行备份。重新启动后，应使用RESET&nbsp;MASTER语句清空以前的日志。</p>
<p>&nbsp;</p>
<h2><a name="_配置副服务器"></a><span style="font-size: small; font-family: 仿宋_GB2312;">1.5</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">配置副服务器</span></h2>
<p>在副服务器上的MySQL选项配置文件中添加以下参数。</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">[mysqld]</span></p>
<p><span style="font-size: x-small;">#唯一，并与主服务器上的server-id不同。</span></p>
<p><span style="font-size: x-small;">server-id=7</span></p>
<p><span style="font-size: x-small;">#主服务器的主机名或者ip地址</span></p>
<p><span style="font-size: x-small;">master-host=master-server-hostname</span></p>
<p><span style="font-size: x-small;">#如果主服务器没有在默认的端口上监听，则需确定master-port选项</span></p>
<p><span style="font-size: x-small;">master-port=3306</span></p>
<p><span style="font-size: x-small;">#步骤2.1中创建的用户名和密码</span></p>
<p><span style="font-size: x-small;">master-user=username</span></p>
<p><span style="font-size: x-small;">master-password=password</span></p>
<p><span style="font-size: x-small;">#复制操作要针对的数据库(可选，默认为全部)</span></p>
<p><span style="font-size: x-small;">replicate-do-db=netbar</span></p>
<p><span style="font-size: x-small;">#如果主副服务器间连接经常失败，需增加master-retry-count和master-connect-retry</span></p>
<p><span style="font-size: x-small;">#master-retry-count连接重试的次数</span></p>
<p><span style="font-size: x-small;">#master-connect-retry&nbsp;连接失败后等待的秒数</span></p>
<p><span style="font-size: x-small;">master-retry-count&nbsp;=&nbsp;999</span></p>
<p><span style="font-size: x-small;">master-connect-retry&nbsp;=&nbsp;60</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p>&nbsp;</p>
<h2><a name="_重启副服务器"></a>&nbsp;</h2>
<h2>&nbsp;</h2>
<h2>&nbsp;</h2>
<h2>&nbsp;</h2>
<h2>&nbsp;</h2>
<h2><span style="font-size: small; font-family: 仿宋_GB2312;">1.6</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">重启副服务器</span></h2>
<p>副服务器上MySQL服务重启后，还在数据目录中创建一个master.info文件，其中包含<br />所有有关复制过程的信息(连接主服务器的相关信息及与主服务器交换数据的相关信息)。<br />在初次启动以后，副服务器将检查这个master.info文件，以得到相关信息。如果想修<br />改复制选项，删除master.info并重启MySQL服务，在启动过程中使用选项配置文件中的<br />新选项进行重新创建了master.info文件。</p>
<p>&nbsp;</p>
<p>将主服务器上备份好的数据库脚本文件(backup.sql)导入到副服务器数据库中，以便保<br />证主-副服务器上进行复制操作的起点一样。</p>
<h1><a name="_管理复制过程"></a><span style="font-size: large; font-family: 仿宋_GB2312;">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: large; font-family: 仿宋_GB2312;">管理复制过程</span></h1>
<h2><a name="_管理主服务器"></a><span style="font-size: small; font-family: 仿宋_GB2312;">2.1</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">管理主服务器</span></h2>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;SHOW&nbsp;PROCESSLIST</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />显示数据库服务器上有关线程的信息</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;SHOW&nbsp;BINLOG&nbsp;EVENTS</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />显示二进制日志中的信息(MySQL&nbsp;4.0以后的版本中)</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;SHOW&nbsp;MASTER&nbsp;STATUS</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />显示主服务器中有关二进制日志的其他信息。</p>
<h2><span style="font-size: small; font-family: 仿宋_GB2312;">2.2</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">管理副服务器</span></h2>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;START&nbsp;SLAVE</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />用于开始或恢复复制，START&nbsp;SLAVE命令执行后，并不意味着一切都OK，需要用&nbsp;<br />SHOW&nbsp;SLAVE&nbsp;STATUS来监督副服务器的活动</p>
<p>在SHOW&nbsp;SLAVE&nbsp;STATUS的命令输出后，应该包含Slave_IO_Running对应的值为YES，<br />Slave_SQL_Running对应的值为YES</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;STOP&nbsp;SLAVE</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />停止或结束复制</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;SHOW&nbsp;SLAVE&nbsp;STATUS</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />查看服务器的状态信息</p>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;CHANGE&nbsp;MASTER&nbsp;TO&nbsp;master_def&nbsp;[,&nbsp;master_def]&nbsp;...</span></p>
<pre><span style="font-family: 宋体;">master_def:</span></pre>
<pre><span style="font-family: 宋体;">      MASTER_HOST = '<var>host_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_USER = '<var>user_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_PASSWORD = '<var>password</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_PORT = <var>port_num</var></span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_CONNECT_RETRY = <var>count</var></span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_LOG_FILE = '<var>master_log_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_LOG_POS = <var>master_log_pos</var></span></pre>
<pre><span style="font-family: 宋体;">    | RELAY_LOG_FILE = '<var>relay_log_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | RELAY_LOG_POS = <var>relay_log_pos</var></span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_SSL = {0|1}</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_SSL_CA = '<var>ca_file_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_SSL_CAPATH = '<var>ca_directory_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_SSL_CERT = '<var>cert_file_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_SSL_KEY = '<var>key_file_name</var>'</span></pre>
<pre><span style="font-family: 宋体;">    | MASTER_SSL_CIPHER = '<var>cipher_list</var>'</span></pre>
<p>&nbsp;</p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />CHANGE&nbsp;MASTER&nbsp;TO更新了副服务器与主服务器连接和通讯的参数，即更新了master.info<br />和relay-log.info两个文件中的内容。如果不需要改变已有参数则不需要指定相对于的<br />参数名。在更改参数值之前需调用STOP&nbsp;SLAVE停止副服务器上的IO_THREAD和SQL_THREAD进程。</p>
<h2><a name="_数据恢复"></a><span style="font-size: small; font-family: 仿宋_GB2312;">2.3</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">数据恢复</span></h2>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<p><span style="font-size: x-small;">mysql&gt;&nbsp;LOAD&nbsp;DATA&nbsp;FROM&nbsp;MASTER</span></p>
</td>
</tr>
</tbody>
</table>
</p>
<p><br />该语句在MySQL4.0以上版本使用，这是一种副服务器从主服务器获得数据的方法。但<br />使用这个命令有些限制，目前MySQL建议只能在主服务器数据库很小以及主服务器对长<br />时间不存在问题的情况设置了读锁的的情况下使用。此外只有MyISAM类型的表可以使<br />用这个命令复制数据。</p>
<p>&nbsp;</p>
<h1><strong><span style="font-size: large; font-family: 仿宋_GB2312;">4</span></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: large; font-family: 仿宋_GB2312;">附录</span></h1>
<h2><a name="_选项配置文件"></a><span style="font-size: small; font-family: 仿宋_GB2312;">5.1</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">选项配置文件</span></h2>
<p><span style="font-size: x-small;"><strong>Windows&nbsp;</strong>MySQL将在Windows安装目录(比如C:\WINNT或C:\WINDOWS)中的名为my.cnf的选项文件和<br />C:\my.cnf中查找启动选项。作为代替，my.cnf可以采用文件名为my.ini,位于Windows安装目录中。</span></p>
<p><span style="font-size: x-small;"><strong>Unix/Linux&nbsp;</strong>MySQL将检查/etc/my.cnf文件，如果没有MySQL使用默认启动选项。也可以手工创建该文件。</span></p>
<h2><a name="_数据目录"></a><span style="font-size: small; font-family: 仿宋_GB2312;">5.2</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">数据目录</span></h2>
<p><span style="font-size: x-small;"><strong>Windows&nbsp;</strong>MySQL的安装目录下的data目录，比如C:\mysql\data目录</span></p>
<p><span style="font-size: x-small;">Unix/Linux&nbsp;如果是源码方式安装(tar.gz)MySQL，数据目录在/usr/loca/mysql/data目录；<br />如果是用RPM包安装的，数据目录在/var/lib/mysql目录</span></p>
<h2><span style="font-size: small; font-family: 仿宋_GB2312;">5.3</span>&nbsp;&nbsp;&nbsp;<span style="font-size: small; font-family: 仿宋_GB2312;">从MySQL数据库和表中倒出结构和数据</span></h2>
<p>
<table cellspacing="0" border="1" align="left" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="552">
<pre><span style="font-family: 宋体;">shell&gt; mysqldump [OPTIONS] database [tables]</span></pre>
</td>
</tr>
</tbody>
</table>
</p>
<p><span style="font-size: x-small;"><br /><br />如果你不给定任何表，整个数据库将被倾倒。&nbsp;通过执行mysqldump&nbsp;--help，你能得到你mysqldump的<br />版本支持的选项表。&nbsp;</span></p>
<p><span style="font-size: x-small;">注意，如果你运行mysqldump没有--quick或--opt选项，mysqldump将在倾倒结果前装载整个结果集到<br />内存中，如果你正在倾倒一个大的数据库，这将可能是一个问题。&nbsp;</span></p>
<p><span style="font-size: x-small;">mysqldump支持下列选项(常用的)：&nbsp;</span></p>
<p><span style="font-size: x-small;">--add-locks&nbsp;</span></p>
<p><span style="font-size: x-small;">在每个表倾倒之前增加LOCK&nbsp;TABLES并且之后UNLOCK&nbsp;TABLE。(为了使得更快地插入到<strong>MySQL</strong>)。&nbsp;</span></p>
<p><span style="font-size: x-small;">-F,&nbsp;--flush-logs&nbsp;</span></p>
<p><span style="font-size: x-small;">在开始倾倒前，洗掉在<strong>MySQL</strong>服务器中的日志文件。&nbsp;</span></p>
<p><span style="font-size: x-small;">-f,&nbsp;--force,&nbsp;</span></p>
<p><span style="font-size: x-small;">即使我们在一个表倾倒期间得到一个SQL错误，继续。&nbsp;</span></p>
<p><span style="font-size: x-small;">-h,&nbsp;--host=..&nbsp;</span></p>
<p><span style="font-size: x-small;">从命名的主机上的<strong>MySQL</strong>服务器倾倒数据。缺省主机是localhost。&nbsp;</span></p>
<p><span style="font-size: x-small;">-l,&nbsp;--lock-tables.&nbsp;</span></p>
<p><span style="font-size: x-small;">为开始倾倒锁定所有表。&nbsp;</span></p>
<p><span style="font-size: x-small;">-t,&nbsp;--no-create-info&nbsp;</span></p>
<p><span style="font-size: x-small;">不写入表创建信息(CREATE&nbsp;TABLE语句）&nbsp;</span></p>
<p><span style="font-size: x-small;">-d,&nbsp;--no-data&nbsp;</span></p>
<p><span style="font-size: x-small;">不写入表的任何行信息。如果你只想得到一个表的结构的倾倒，这是很有用的！&nbsp;</span></p>
<p><span style="font-size: x-small;">--opt&nbsp;</span></p>
<p><span style="font-size: x-small;">同--quick&nbsp;--add-drop-table&nbsp;--add-locks&nbsp;--extended-insert&nbsp;--lock-tables。应该给你为<br />读入一个<strong>MySQL</strong>服务器的尽可能最快的倾倒。&nbsp;</span></p>
<p><span style="font-size: x-small;">-pyour_pass,&nbsp;--password[=your_pass]&nbsp;</span></p>
<p><span style="font-size: x-small;">与服务器连接时使用的口令。如果你不指定&ldquo;=your_pass&rdquo;部分，mysqldump需要来自终端的口令。&nbsp;</span></p>
<p><span style="font-size: x-small;">-P&nbsp;port_num,&nbsp;--port=port_num&nbsp;</span></p>
<p><span style="font-size: x-small;">与一台主机连接时使用的TCP/IP端口号。（这用于连接到localhost以外的主机，因为它使用&nbsp;Unix套接字。）&nbsp;</span></p>
<p><span style="font-size: x-small;">-u&nbsp;user_name,&nbsp;--user=user_name&nbsp;</span></p>
<p><span style="font-size: x-small;">与服务器连接时，<strong>MySQL</strong>使用的用户名。缺省值是root。&nbsp;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-small;">最常见的mysqldump使用可能制作整个数据库的一个备份：&nbsp;</span></p>
<p><span style="font-size: x-small;">mysqldump&nbsp;--opt&nbsp;database&nbsp;&gt;&nbsp;backup-file.sql&nbsp;</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/223931#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 04 Aug 2008 17:16:32 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/223931</link>
        <guid>http://kakaluyi.javaeye.com/blog/223931</guid>
      </item>
          <item>
        <title>获得来访IP</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/221588" style="color:red;">http://kakaluyi.javaeye.com/blog/221588</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="g_w_100 g_t_wrap g_t_center g_t_bold g_t_24 g_c_pdin c07" id="blogtitle_fks_084075093083086065081080094095081087082075081082087066">&nbsp;</p>
<div class="g_blog_list">
<pre name="code" class="java">     public static String getIp(HttpServletRequest req) {
         String ip_for = req.getHeader("x-forwarded-for");
         String ip_client = req.getHeader("http_client_ip");
         String un = "unknown";

         if (ip_for != null &amp;&amp; !ip_for.equalsIgnoreCase(un)
                 &amp;&amp; ip_for.trim().length() &gt; 0) {
             return ip_for;
         } else if (ip_client != null &amp;&amp; !ip_client.equalsIgnoreCase(un)
                 &amp;&amp; ip_client.trim().length() &gt; 0) {
             return ip_client;
         } else {
             return req.getRemoteAddr();
         }</pre>
</div>
<div class="g_blog_list"><ol>
<li><span><span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span>&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">static</span></strong></span><span>&nbsp;String&nbsp;getRemoteAddress(HttpServletRequest&nbsp;request){ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;=&nbsp;request.getHeader(</span><span class="string"><span style="color: #0000ff;">"x-forwarded-for"</span></span><span>); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(ip&nbsp;==&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>&nbsp;||&nbsp;ip.length()&nbsp;==&nbsp;</span><span class="number"><span style="color: #c00000;">0</span></span><span>&nbsp;||&nbsp;ip.equalsIgnoreCase(</span><span class="string"><span style="color: #0000ff;">"unknown"</span></span><span>))&nbsp;ip&nbsp;=&nbsp;request.getHeader(</span><span class="string"><span style="color: #0000ff;">"Proxy-Client-IP"</span></span><span>); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(ip&nbsp;==&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>&nbsp;||&nbsp;ip.length()&nbsp;==&nbsp;</span><span class="number"><span style="color: #c00000;">0</span></span><span>&nbsp;||&nbsp;ip.equalsIgnoreCase(</span><span class="string"><span style="color: #0000ff;">"unknown"</span></span><span>))&nbsp;ip&nbsp;=&nbsp;request.getHeader(</span><span class="string"><span style="color: #0000ff;">"WL-Proxy-Client-IP"</span></span><span>); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(ip&nbsp;==&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>&nbsp;||&nbsp;ip.length()&nbsp;==&nbsp;</span><span class="number"><span style="color: #c00000;">0</span></span><span>&nbsp;||&nbsp;ip.equalsIgnoreCase(</span><span class="string"><span style="color: #0000ff;">"unknown"</span></span><span>))&nbsp;ip&nbsp;=&nbsp;request.getRemoteAddr(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span>&nbsp;ip; &nbsp;&nbsp;</span></li>
<li><span>}&nbsp;&nbsp;</span></li>
</ol></div>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/221588#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jul 2008 15:54:38 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/221588</link>
        <guid>http://kakaluyi.javaeye.com/blog/221588</guid>
      </item>
          <item>
        <title>Xfire and JSR 181 Annotations</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/221519" style="color:red;">http://kakaluyi.javaeye.com/blog/221519</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table border="0" style="padding-right: 2mm; width: 100%;">
<tbody>
<tr>
<td align="left" valign="middle">JSR 181 Annotations</td>
<td align="right" valign="middle"><a href="http://xfire.codehaus.org/JSR+181+Annotations?print=1"></a></td>
</tr>
</tbody>
</table>
<div class="content" style="padding-top: 3mm;">
<p>We are working on adding JSR 181 2.0 support for annotations in XFire via Java 5 and <span class="nobr"><a href="http://jakarta.apache.org/commons/attributes/"><span style="color: #2266cc;">commons-attributes</span></a></span>. The Java 5 implementation will follow the JSR 181 spec and the commons-attributes implementation will mimic the spec in a pre-Java 5 way.</p>
<p><strong>Currently we have not passed the TCK and this is available only in early access form only. However, what we have is fairly stable and we are working on passing the TCK as soon as it is out. (Yes we know the JSR 181 1.0 TCK is out, be we are intent on passing the 2.0 version as we are implementing JAX-WS as well).</strong></p>
<p>As covered before, <span class="nobr"><span title="Create Page: The ServicFactory" class="createlink">ServiceFactories</span></span> are used to create services from classes. The default ServiceFactory is ObjectServiceFactory. To use annotations you must use the AnnotationsServiceFactory. You must pass it an annotation reader in the constructor which will read the particular type of annotation you are using.</p>
<div class="section_2">
<h2><a name="JSR181Annotations-UsingJava5Annotations"></a>Using Java 5 Annotations</h2>
<div class="code">
<div class="codeContent">
<pre class="code-java">XFire xfire = XFireFactory.getInstance().getXFire();
AnnotationServiceFactory factory = <span class="code-keyword"><span style="color: #000091;">new</span></span> AnnotationServiceFactory(xfire.getTransportManager());
Service service = factory.create(YourService.class)
xfire.getServiceRegistry().register(service);</pre>
</div>
</div>
<p>In your services.xml, it would look like this:</p>
<div class="code">
<div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span style="color: #000091;">&lt;service&gt;</span></span>

  <span class="code-tag"><span style="color: #000091;">&lt;name&gt;</span></span>ServiceName<span class="code-tag"><span style="color: #000091;">&lt;/name&gt;</span></span>
  <span class="code-tag"><span style="color: #000091;">&lt;namespace&gt;</span></span>urn:your:namespace<span class="code-tag"><span style="color: #000091;">&lt;/namespace&gt;</span></span>
  <span class="code-tag"><span style="color: #000091;">&lt;serviceClass&gt;</span></span>your.service.Class<span class="code-tag"><span style="color: #000091;">&lt;/serviceClass&gt;</span></span>
  <span class="code-tag"><span style="color: #000091;">&lt;serviceFactory&gt;</span></span>org.codehaus.xfire.jaxws.JAXWSServiceFactory<span class="code-tag"><span style="color: #000091;">&lt;/serviceFactory&gt;</span></span>

<span class="code-tag"><span style="color: #000091;">&lt;/service&gt;</span></span></pre>
</div>
</div>
<p>&nbsp;<br /><br />The jar with the Java 5 JSR 181 annotations can be found <span class="nobr"><a href="http://www.ibiblio.org/maven/xfire/jars/xfire-jsr181-api-1.0-M1.jar"><span style="color: #2266cc;">here</span></a></span></p>
</div>
<div class="section_2">
<h2><a name="JSR181Annotations-UsingCommonsAttributesAnnotations"></a>Using Commons-Attributes Annotations</h2>
<p>To use the commons-attributes annotations, you will need to follow <span class="nobr"><a href="http://jakarta.apache.org/commons/attributes/tutorial.html"><span style="color: #2266cc;">these instructions</span></a></span> on how to install the commons-attributes ant or maven plugin.</p>
<div class="code">
<div class="codeContent">
<pre class="code-java">XFire xfire = XFireFactory.getInstance().getXFire();
TypeMappingRegistry registry = <span class="code-keyword"><span style="color: #000091;">new</span></span> DefaultTypeMappingRegistry();

AnnotationServiceFactory factory = <span class="code-keyword"><span style="color: #000091;">new</span></span> AnnotationServiceFactory(xfire.getTransportManager());
Service service = factory.create(YourService.class)
xfire.getServiceRegistry().register(service);</pre>
</div>
</div>
<p>In your services.xml, it would look like this:</p>
<div class="code">
<div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span style="color: #000091;">&lt;service&gt;</span></span>

  <span class="code-tag"><span style="color: #000091;">&lt;name&gt;</span></span>ServiceName<span class="code-tag"><span style="color: #000091;">&lt;/name&gt;</span></span>
  <span class="code-tag"><span style="color: #000091;">&lt;namespace&gt;</span></span>urn:your:namespace<span class="code-tag"><span style="color: #000091;">&lt;/namespace&gt;</span></span>
  <span class="code-tag"><span style="color: #000091;">&lt;serviceClass&gt;</span></span>your.service.Class<span class="code-tag"><span style="color: #000091;">&lt;/serviceClass&gt;</span></span>
  <span class="code-tag"><span style="color: #000091;">&lt;serviceFactory&gt;</span></span>org.codehaus.xfire.annotations.AnnotationServiceFactory<span class="code-tag"><span style="color: #000091;">&lt;/serviceFactory&gt;</span></span>

<span class="code-tag"><span style="color: #000091;">&lt;/service&gt;</span></span></pre>
</div>
</div>
</div>
<div class="section_2">
<h2><a name="JSR181Annotations-WritingServiceswithAnnotations"></a>Writing Services with Annotations</h2>
<p><span class="nobr"><a href="http://incubator.apache.org/beehive/apidocs/classref_wsm/index.html"><span style="color: #2266cc;">Javadocs</span></a></span> (See the javax.jws packages only).</p>
<p>Example:</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebMethod;
<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebParam;
<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebResult;
<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebService;

@WebService(name = <span class="code-quote"><span style="color: #009100;">"EchoService"</span></span>, targetNamespace = <span class="code-quote"><span style="color: #009100;">"http:</span><span class="code-comment"><span style="color: #808080;">//www.openuri.org/2004/04/HelloWorld"</span></span><span style="color: #009100;">)
</span></span>        <span class="code-keyword"><span style="color: #000091;">public</span></span> class Jsr181EchoService
{
    @WebMethod(operationName = <span class="code-quote"><span style="color: #009100;">"echoString"</span></span>, action = <span class="code-quote"><span style="color: #009100;">"urn:EchoString"</span></span>)
    @WebResult(name = <span class="code-quote"><span style="color: #009100;">"echoResult"</span></span>)
    <span class="code-keyword"><span style="color: #000091;">public</span></span> <span class="code-object"><span style="color: #910091;">String</span></span> echo(@WebParam(name = <span class="code-quote"><span style="color: #009100;">"echoParam"</span></span>, header = <span class="code-keyword"><span style="color: #000091;">true</span></span>) <span class="code-object"><span style="color: #910091;">String</span></span> input)
    {
        <span class="code-keyword"><span style="color: #000091;">return</span></span> input;
    }
}</pre>
</div>
</div>
<p>Alternatively you can place your annotations in your interface and have your implementation refer to it as shown below.</p>
<p>The interface:</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword"><span style="color: #000091;">package</span></span> com.example;

<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebMethod;
<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebParam;
<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebResult;
<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebService;

@WebService(name = <span class="code-quote"><span style="color: #009100;">"EchoService"</span></span>,  targetNamespace = <span class="code-quote"><span style="color: #009100;">"http:</span><span class="code-comment"><span style="color: #808080;">//www.openuri.org/2004/04/HelloWorld"</span></span><span style="color: #009100;">)
</span></span><span class="code-keyword"><span style="color: #000091;">public</span></span> <span class="code-keyword"><span style="color: #000091;">interface</span></span> Jsr181EchoService
{
    @WebMethod(operationName = <span class="code-quote"><span style="color: #009100;">"echoString"</span></span>, action = <span class="code-quote"><span style="color: #009100;">"urn:EchoString"</span></span>)
    @WebResult(name = <span class="code-quote"><span style="color: #009100;">"echoResult"</span></span>)
    <span class="code-keyword"><span style="color: #000091;">public</span></span> <span class="code-object"><span style="color: #910091;">String</span></span> echo(@WebParam(name = <span class="code-quote"><span style="color: #009100;">"echoParam"</span></span>, header = <span class="code-keyword"><span style="color: #000091;">true</span></span>) <span class="code-object"><span style="color: #910091;">String</span></span> input);
}</pre>
</div>
</div>
<p>and the implementation:</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword"><span style="color: #000091;">package</span></span> com.example;

<span class="code-keyword"><span style="color: #000091;">import</span></span> javax.jws.WebService;

@WebService(endpointInterface = <span class="code-quote"><span style="color: #009100;">"com.example.Jsr181EchoService"</span></span>)
<span class="code-keyword"><span style="color: #000091;">public</span></span> class Jsr181EchoServiceImpl
{
    <span class="code-keyword"><span style="color: #000091;">public</span></span> <span class="code-object"><span style="color: #910091;">String</span></span> echo(<span class="code-object"><span style="color: #910091;">String</span></span> input)
    {
        <span class="code-keyword"><span style="color: #000091;">return</span></span> input;
    }
}</pre>
</div>
</div>
<p>To do this with commons-attributes instead, you will need to import the attributes from a different location and use the commons-attributes syntax:</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword"><span style="color: #000091;">import</span></span> org.codehaus.xfire.annotations.commons.WebMethod;
<span class="code-keyword"><span style="color: #000091;">import</span></span> org.codehaus.xfire.annotations.commons.WebParam;
<span class="code-keyword"><span style="color: #000091;">import</span></span> org.codehaus.xfire.annotations.commons.WebResult;
<span class="code-keyword"><span style="color: #000091;">import</span></span> org.codehaus.xfire.annotations.commons.WebService;

/**
 * @@WebService(name = <span class="code-quote"><span style="color: #009100;">"EchoService"</span></span>, targetNamespace = <span class="code-quote"><span style="color: #009100;">"http:</span><span class="code-comment"><span style="color: #808080;">//www.openuri.org/2004/04/HelloWorld"</span></span><span style="color: #009100;">)
</span></span> * @@org.codehaus.xfire.annotations.commons.soap.SOAPBinding(style = 1)
 */
<span class="code-keyword"><span style="color: #000091;">public</span></span> class CommonsEchoService
{

    /**
     * Returns the input.
     *
     * @param input the input.
     * @<span class="code-keyword"><span style="color: #000091;">return</span></span> the input.
     * @@WebMethod(operationName = <span class="code-quote"><span style="color: #009100;">"echoString"</span></span>, action=<span class="code-quote"><span style="color: #009100;">"urn:EchoString"</span></span>)
     * @@.echoParam WebParam(<span class="code-quote"><span style="color: #009100;">"echoParam"</span></span>)
     * @@.<span class="code-keyword"><span style="color: #000091;">return</span></span> WebResult(<span class="code-quote"><span style="color: #009100;">"echoResult"</span></span>)
     */
    <span class="code-keyword"><span style="color: #000091;">public</span></span> <span class="code-object"><span style="color: #910091;">String</span></span> echo(<span class="code-object"><span style="color: #910091;">String</span></span> inputString)
    {
        <span class="code-keyword"><span style="color: #000091;">return</span></span> inputString;
    }
}</pre>
</div>
</div>
<div class="section_3">
<h3><a name="JSR181Annotations-Usingcustomannotations%26nbsp%3B"></a>Using custom annotations&nbsp;</h3>
<p>Additionaly XFire provides some annotations which are not part of JSR 181, but allows to use XFire specific functionality .</p>
<div class="code">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword"><span style="color: #000091;">package</span></span> org.codehaus.xfire.annotations;

@EnableMTOM
@ServiceProperty(key=<span class="code-quote"><span style="color: #009100;">"singlePropertyKey"</span></span>,list={<span class="code-quote"><span style="color: #009100;">"value3"</span></span>,<span class="code-quote"><span style="color: #009100;">"value2"</span></span>} )
@ServiceProperties*(properties={@ServiceProperty(key=<span class="code-quote"><span style="color: #009100;">"key12"</span></span>,value=<span class="code-quote"><span style="color: #009100;">"value12"</span></span>)})
@WebService(name=<span class="code-quote"><span style="color: #009100;">"EchoService"</span></span>, targetNamespace=<span class="code-quote"><span style="color: #009100;">"http:</span><span class="code-comment"><span style="color: #808080;">//www.open.uri.org/2004/04/HelloWorld"</span></span><span style="color: #009100;"> )
</span></span>
<span class="code-keyword"><span style="color: #000091;">public</span></span> class Jsr181EchoService {

}</pre>
</div>
</div>
<p>@EnableMTOM - enable MTOM on service<br /><br />@ServiceProperty - allows to specify property on given serwise ( instead of creating &lt;poperties&gt;&lt;property key="propertyKey"&gt;propertyValue&lt;/property&gt;&lt;/properties&gt; tags in service configuration file )<br /><br />@ServicesProperties - allows to specify as many properties as you want, at once</p>
</div>
</div>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://kakaluyi.javaeye.com/blog/221519#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 30 Jul 2008 14:21:14 +0800</pubDate>
        <link>http://kakaluyi.javaeye.com/blog/221519</link>
        <guid>http://kakaluyi.javaeye.com/blog/221519</guid>
      </item>
          <item>
        <title>MySQL搭建主从同步设置</title>
        <author>kakaluyi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kakaluyi.javaeye.com">kakaluyi</a>&nbsp;
                    链接：<a href="http://kakaluyi.javaeye.com/blog/219192" style="color:red;">http://kakaluyi.javaeye.com/blog/219192</a>&nbsp;
          发表时间: 2008年07月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="articleContent" id="articleBody">
<div>主库：192.168.1.1<br />从库：192.168.1.2<br />数据文件存放位置：/var/mysql/data<br />待同步数据库：syncdb</div>
<div>&nbsp;</div>
<div>一、设置MASTER<br />1、修改my.cnf<br />============================<br /># vi /etc/my.cnf<br />server-id = 1<br />log-bin<br />binlog-ignore-db=mysql<br />binlog-ignore-db=test<br />============================<br />2、赋予SLAVE权限帐号，允许用户在MASTER上LOAD TABLE和LOAD DATA<br />====================================================================<br />mysql&gt; GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO <a href="mailto:slave@192.168.1.2">slave@192.168.1.2</a> IDENTIFIED BY 'password';<br />====================================================================<br />3、锁主库表<br />===========================<br />mysql&gt; FLUSH TABLES WITH READ LOCK;<br />===========================<br />4、显示主库信息<br />记录File和Position，从库设置将会用到<br />=====================<br />mysql&gt; SHOW MASTER STATUS;<br />=====================<br />+---------------+----------+--------------+------------------+<br />| File&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Position | Binlog_do_db | Binlog_ignore_db |<br />+---------------+----------+--------------+------------------+<br />| mysql-bin.030 | 870279&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbs