<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>困难户</title>
    <description></description>
    <link>http://callan.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>C# 加密 java解密 (DES)</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/227784" style="color:red;">http://callan.javaeye.com/blog/227784</a>&nbsp;
          发表时间: 2008年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>C#中对数据进行加密,java对加密后的数据解密。</p>
<p>&nbsp;</p>
<p>c# 加密</p>
<pre name="code" class="c#">        const string KEY_64 = "flxmtdes";
        const string IV_64 = "flxmtIvS";

        public Security()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        public static string Encode(string data)
        {
            byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
            byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);

            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            int i = cryptoProvider.KeySize;
            MemoryStream ms = new MemoryStream();
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);

            StreamWriter sw = new StreamWriter(cst);
            sw.Write(data);
            sw.Flush();
            cst.FlushFinalBlock();
            sw.Flush();
            return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        }</pre>
<p>&nbsp;</p>
<p>&nbsp; java 解密</p>
<p>&nbsp;</p>
<pre name="code" class="java">/**
	 * 解密
	 * 
	 * @param src 数据源
	 * @param key 密钥，长度必须是8的倍数
	 * @return 返回解密后的原始数据
	 * @throws Exception
	 */
	public String decrypt(String message) throws Exception {
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] bytesrc = decoder.decodeBuffer(message);
		Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
		DESKeySpec desKeySpec = new DESKeySpec(PASSWORD_CRYPT_KEY.getBytes("UTF-8"));
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
		IvParameterSpec iv = new IvParameterSpec(IV.getBytes("UTF-8"));
		 
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);   
   
        byte[] retByte = cipher.doFinal(bytesrc);  
        return new String(retByte);
		
	}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/227784#comments" style="color:red;">已有 <strong>1</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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Aug 2008 21:26:29 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/227784</link>
        <guid>http://callan.javaeye.com/blog/227784</guid>
      </item>
      <item>
        <title>功能执行前调用</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/206936" style="color:red;">http://callan.javaeye.com/blog/206936</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在<a href="http://www.71search.com/company/t100017.html" title="http://www.71search.com/company/t100017.html" target="_blank">http://www.71search.com/company/t100017.html</a>上看到实现的点击投票时，就会出现一个层，上面显示正在加载中，这种效果给用户一种很好的效果。用dwr也可以实现这种ajax效果</p>
<p>&nbsp;</p>
<pre name="code" class="html">//后台dwr方法执行前调用
  DWREngine.setPreHook(function() {
    //弹出层
    alertDiv("数据操作中,请稍候......");
     //这个是显示数据加载中的层,如果不要的话,可以注释掉
    disabledZone.style.visibility = 'visible';
});
 //后台dwr方法执行完毕后调用
  DWREngine.setPostHook(function() {
  //关闭弹出层
  closeDiv();
   //这个是隐藏数据加载中的层,如果不要的话,可以注释掉
  disabledZone.style.visibility = 'hidden';
 });</pre>
<p>&nbsp;</p>
<p>使用了dwr的setPreHook 和 setPostHook</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/206936#comments" style="color:red;">已有 <strong>2</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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jun 2008 23:07:33 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/206936</link>
        <guid>http://callan.javaeye.com/blog/206936</guid>
      </item>
      <item>
        <title>BigDecimal对象的用法(加减乘除)</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/200526" style="color:red;">http://callan.javaeye.com/blog/200526</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>java.math.BigDecimal。BigDecimal一共有4个够造方法，让我先来看看其中的两种用法：</p>
<p>第一种：BigDecimal(double val)<br />Translates a double into a BigDecimal. </p>
<p>第二种：BigDecimal(String val)<br />Translates the String repre sentation of a BigDecimal into a BigDecimal. </p>
<p>使用BigDecimal要用String来够造，要做一个加法运算，需要先将两个浮点数转为String，然后够造成BigDecimal，在其中一个上调用add方法，传入另一个作为参数，然后把运算的结果（BigDecimal）再转换为浮点数。</p>
<p><br />public static double add(double v1,double v2)<br />public static double sub(double v1,double v2)<br />public static double mul(double v1,double v2)<br />public static double div(double v1,double v2)<br />public static double div(double v1,double v2,int scale)<br />public static double round(double v,int scale)</p>
<p>&nbsp;</p>
<pre name="code" class="java">import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算，这个工具类提供精
* 确的浮点数运算，包括加减乘除和四舍五入。
*/
public class Arith{ //默认除法运算精度
private static final int DEF_DIV_SCALE = 10; //这个类不能实例化
private Arith(){
}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到
* 小数点以后10位，以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
* 定精度，以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale){
if(scale&lt;0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale){
if(scale&lt;0){
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
};

</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/200526#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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 15:03:46 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/200526</link>
        <guid>http://callan.javaeye.com/blog/200526</guid>
      </item>
      <item>
        <title>ibatis 学习</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/196676" style="color:red;">http://callan.javaeye.com/blog/196676</a>&nbsp;
          发表时间: 2008年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530401"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">insert,update,delete </span></span></a><span style="mso-bookmark: _Toc160530401;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">返回值</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">insert </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">返回的为插入的主键值，但必须在配置文件中加入</span></span><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">&lt;selectKey/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">如果主键值为</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">String</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span><span style="background: white; color: #008080; mso-highlight: white;">&lt;</span><span style="background: white; color: #3f7f7f; mso-highlight: white;">selectKey </span><span style="background: white; color: #7f007f; mso-highlight: white;">resultClass</span><span style="background: white; color: #000000; mso-highlight: white;">=</span><span style="background: white; color: #2a00ff; mso-highlight: white;">"String" </span><span style="background: white; color: #7f007f; mso-highlight: white;">keyProperty</span><span style="background: white; color: #000000; mso-highlight: white;">=</span><span style="background: white; color: #2a00ff; mso-highlight: white;">"resourceId" </span><span style="background: white; color: #008080; mso-highlight: white;">&gt;</span><span style="background: white; color: #000000; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp; </span></span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;![CDATA[</span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp; </span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 25pt; text-indent: -25pt; text-align: left; mso-layout-grid-align: none; mso-char-indent-count: -2.5;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>select resource_id as resourceId<span style="mso-spacerun: yes;">&nbsp; </span>from rentout where resource_id=#resourceId# </span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">]]&gt;</span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp; </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;/</span><span style="font-size: 10pt; background: white; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">selectKey</span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp; </span></span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;</span></span><span style="font-size: 10pt; font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">如果主键值为</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">Int</span><span style="font-size: 10pt; font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New';">型</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="background: white; color: #008080; mso-highlight: white;">&lt;</span><span style="background: white; color: #3f7f7f; mso-highlight: white;">selectKey </span><span style="background: white; color: #7f007f; mso-highlight: white;">resultClass</span><span style="background: white; color: #000000; mso-highlight: white;">=</span><span style="background: white; color: #2a00ff; mso-highlight: white;">"Integer" </span><span style="background: white; color: #7f007f; mso-highlight: white;">keyProperty</span><span style="background: white; color: #000000; mso-highlight: white;">=</span><span style="background: white; color: #2a00ff; mso-highlight: white;">"id" </span><span style="background: white; color: #008080; mso-highlight: white;">&gt;</span><span style="background: white; color: #000000; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp; </span></span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;![CDATA[</span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp; </span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 25pt; text-indent: -25pt; text-align: left; mso-layout-grid-align: none; mso-char-indent-count: -2.5;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt;">Select last_insert_id();</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">]]&gt;</span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp; </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;/</span><span style="font-size: 10pt; background: white; color: #3f7f7f; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">selectKey</span><span style="font-size: 10pt; background: white; color: #008080; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">Update,</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">Delete</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">返回为修改数据影响的条数；</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530402"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">SQL</span></span></a><span style="mso-bookmark: _Toc160530402;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注入</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>a.</span></span><span style="color: #000000; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在关键字传入前加&lsquo;％&rsquo;；</span><span style="color: #000000; mso-bidi-font-size: 10.5pt;"><span style="font-family: Times New Roman;"> </span></span><span style="color: #000000; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">例：</span><span style="color: #000000; mso-bidi-font-size: 10.5pt;"><span style="font-family: Times New Roman;">String<span style="mso-spacerun: yes;">&nbsp; </span>keyword=&rdquo;%&rdquo;+keyword+&rdquo;%&rdquo;;</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt; mso-char-indent-count: 1.0;"><span style="font-size: small;"><span style="color: #000000; mso-bidi-font-size: 10.5pt;"><span style="font-family: Times New Roman;">b</span></span><span style="color: #000000; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">、过滤关键字中的非法字符</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530403"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">公共</span></a><span style="mso-bookmark: _Toc160530403;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">SQL</span></span></span><span style="mso-bookmark: _Toc160530403;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提取的运用</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">&lt;sql&gt;&lt;/sql&gt; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中包含需要复用的</span><span lang="EN-US"><span style="font-family: Times New Roman;">SQL</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">语句，在需要的地方</span><span lang="EN-US"><span style="font-family: Times New Roman;">&lt;include<span style="mso-spacerun: yes;">&nbsp; </span>refid=&rdquo;&rdquo;/&gt; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">引入即可</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530404"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">ResultClass</span></span></a><span style="mso-bookmark: _Toc160530404;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span></span><span style="mso-bookmark: _Toc160530404;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">ResultMap</span></span></span><span style="mso-bookmark: _Toc160530404;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的区别</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>resultClass:</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以把结果自动映射到相应的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JAVA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类中，但无法指定输出字段的类型，会对性能产生轻微的影响。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>resultMap:</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以预先定义</span><span lang="EN-US"><span style="font-family: Times New Roman;">resultMap</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">元素，可以控制数据如何从结果集中取出，以及哪个属性匹配哪个字段，</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530405"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">parameterClass</span></span></a><span style="mso-bookmark: _Toc160530405;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和</span></span><span style="mso-bookmark: _Toc160530405;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">parameterMap</span></span></span><span style="mso-bookmark: _Toc160530405;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的区别</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">parameterClass</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">属性值是</span><span lang="EN-US"><span style="font-family: Times New Roman;">JAVA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类的全限定名，目的是限制输入参数的类型为指定的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JAVA</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类，如果不指定，任何带有合适属性（</span><span lang="EN-US"><span style="font-family: Times New Roman;">get/set</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法）的</span><span lang="EN-US"><span style="font-family: Times New Roman;">JAVA BEAN</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">都可以作为输入参数</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">parameterMap:</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">预先定义</span><span lang="EN-US"><span style="font-family: Times New Roman;">parameterMap</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的属性值，用于有次序的参数匹配</span><span lang="EN-US"><span style="font-family: Times New Roman;">JDBC</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">符号</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530406"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&ldquo;</span></a><span style="mso-bookmark: _Toc160530406;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">#</span></span></span><span style="mso-bookmark: _Toc160530406;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;和&ldquo;</span></span><span style="mso-bookmark: _Toc160530406;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">$</span></span></span><span style="mso-bookmark: _Toc160530406;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;的区别</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&ldquo;</span><span lang="EN-US"><span style="font-family: Times New Roman;">#</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;</span><span style="font-family: Times New Roman;"> </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">为占为符</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&ldquo;</span><span lang="EN-US"><span style="font-family: Times New Roman;">$</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;为直接替换，但为出现</span><span lang="EN-US"><span style="font-family: Times New Roman;">SQL</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">引入问题和性能上的影响，</span><span lang="EN-US"><span style="font-family: Times New Roman;">like,limit</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和表名的引入必须使用&ldquo;</span><span lang="EN-US"><span style="font-family: Times New Roman;">$</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530407"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">分页功能的实现</span></a></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;</span>a. </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用</span><span lang="EN-US"><span style="font-family: Times New Roman;">ibatis</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">自带的分页功能，但是自带分页是把所有数据读入内存再分页的，所以必须自己覆写</span><span lang="EN-US"><span style="font-family: Times New Roman;">LimitSqlExecutor</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法，</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;</span>b. </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">直接使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">limit</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp;</span></span><a name="_Toc160530408"><span style="font-family: Times New Roman;">where </span></a></span><span style="mso-bookmark: _Toc160530408;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">条件的组装</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isEqual&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比较属性值和静态值或另一个属性值是否相等</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;idNotEqual&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比较属性值和静态值或另一个属性值是否不相等</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isGreaterThan&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比较属性值是否大于静态值或另一个属性值</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isGreaterEqual&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比较属性值是否大于等于静态值或另一个属性值</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isLessThan&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比较属性值是否小于静态值或另一个属性值</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isLessEqual&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">比较属性值是否小于等于静态值或另一个属性值</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isNull&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查属性是否为</span><span lang="EN-US"><span style="font-family: Times New Roman;">NULL</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isNotNull&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查属性是否不为</span><span lang="EN-US"><span style="font-family: Times New Roman;">NULL</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isEmpty&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查属性是否为</span><span lang="EN-US"><span style="font-family: Times New Roman;">NULL</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或空</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isNotEmpty&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查属性是否不为</span><span lang="EN-US"><span style="font-family: Times New Roman;">NULL</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或不为空</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isPropertyAvailable&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查是否存在该属性</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp; </span>&lt;isNotPropertyAvailable&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">检查是否不存在该属性</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530409"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">&lt;![CDATA[<span style="mso-spacerun: yes;">&nbsp; </span>]]&gt;</span></span></a><span style="mso-bookmark: _Toc160530409;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的含义</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">用了特殊字符的</span><span lang="EN-US"><span style="font-family: Times New Roman;">SQL</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">语句不能直接使用。必须用</span><span lang="EN-US"><span style="font-family: Times New Roman;">&lt;![CDATA[ ]]&gt;</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530410"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">ibatis</span></span></a><span style="mso-bookmark: _Toc160530410;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">自带缓存的运用</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;cacheModel<span style="mso-spacerun: yes;">&nbsp; </span>id=&rdquo;person-cache&rdquo; implementation=&rdquo;LRU&rdquo;&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>&lt;flushInterval<span style="mso-spacerun: yes;">&nbsp; </span>hours=&rdquo;24&rdquo;/&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以用</span><span lang="EN-US"><span style="font-family: Times New Roman;">hours/minutes/second</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>&lt;flushOnExecute<span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>statement=&rdquo;selectperson&rdquo;/&gt;<span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span>//</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">需要缓存的方法，可以为多个</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>&lt;property<span style="mso-spacerun: yes;">&nbsp; </span>name=&rdquo;size&rdquo;<span style="mso-spacerun: yes;">&nbsp; </span>value=&rdquo;1000&rdquo;/&gt;</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;/cacheModel&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">缓存策略：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;</span><span style="mso-spacerun: yes;">&nbsp; </span>LRU</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：最近最少使用</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>MEMORY</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：适用于没有统一的对象重用模式，</span><span lang="EN-US"><span style="font-family: Times New Roman;">property</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的属性值必须是</span><span lang="EN-US"><span style="font-family: Times New Roman;">STRONG</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes;">&nbsp;&nbsp;</span>SOFT</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，</span><span lang="EN-US"><span style="font-family: Times New Roman;">WEAK</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，这三个值分别对应于</span><span lang="EN-US"><span style="font-family: Times New Roman;">JVM</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">不同内存</span><span lang="EN-US"><span style="font-family: Times New Roman;">reference</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类型。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 31.5pt; text-indent: -31.5pt; mso-char-indent-count: -3.0;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>WEAK,</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">大多数情况下，</span><span lang="EN-US"><span style="font-family: Times New Roman;">WEAK</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">是最佳选择，缺省值就是</span><span lang="EN-US"><span style="font-family: Times New Roman;">WEAK</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，它能大大提高常用查询的性能，对于当前不被使用的查询数据，将被清除</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SOFT</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，在查询结果对象不被使用，可以减少内存不足的可能性</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 36.75pt; text-indent: -36.75pt; mso-char-indent-count: -3.5;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>STRONG</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，对查询的结果一直保留在内存中，可以使用在数据量很少或者静态数据的时</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>FIFO</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：先进先出</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>OSCACHE</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：配置</span><span lang="EN-US"><span style="font-family: Times New Roman;">oscache.properties</span></span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530411"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">value</span></span></a><span style="mso-bookmark: _Toc160530411;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的使用</span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">假如没有必要写</span><span lang="EN-US"><span style="font-family: Times New Roman;">JAVA BEAN</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">作为参数，可以直接使用基本类型，也可以直接传入参数值。如果是直接传入参数值就配置文件中必须写</span><span lang="EN-US"><span style="font-family: Times New Roman;"> #value#</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">做为参数传入</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530412"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">iterate</span></span></a><span style="mso-bookmark: _Toc160530412;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span></span><span style="mso-bookmark: _Toc160530412;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">ibatis</span></span></span><span style="mso-bookmark: _Toc160530412;"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">里的运用</span></span><span style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;"> </span></span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;iterate<span style="mso-spacerun: yes;">&nbsp; </span>perpend=&rdquo;AND&rdquo; property=&rdquo;stringList&rdquo;<span style="mso-spacerun: yes;">&nbsp; </span>open=&rdquo;(&rdquo;<span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>close=&rdquo;)&rdquo;<span style="mso-spacerun: yes;">&nbsp; </span>conjunction=&rdquo;OR&rdquo;&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>&lt;![CDATA[</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Username=#stringList[]#</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; mso-char-indent-count: 2.0;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">]]&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;/iterate&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">List</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">参数名后面一定要加&ldquo;</span><span lang="EN-US"><span style="font-family: Times New Roman;">[]</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&rdquo;，防止解析器简单的把</span><span lang="EN-US"><span style="font-family: Times New Roman;">List</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">解析成</span><span lang="EN-US"><span style="font-family: Times New Roman;">String</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">结果：</span><span lang="EN-US"><span style="font-family: Times New Roman;">username=(1 or 2 or 3)</span></span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530413"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">事务的处理</span></a></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">startTransacton();</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">commitTransaction();</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">rollbackTransaction();</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><a name="_Toc160530414"><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">批处理</span></a></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">如果有很多非查询的（</span><span lang="EN-US"><span style="font-family: Times New Roman;">insert/update/delete</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）语句要处理，为了减少网络通讯的流量，可以进行批处理</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">sqlMap.startBatch();</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">sqlMap.endBatch();</span></span></p>
<h1 style="margin: 17pt 0cm 16.5pt;"><span lang="EN-US" style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;">xmlResultName</span></span><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的运用</span><span style="font-size: 15pt; line-height: 240%;"><span style="font-family: Times New Roman;"> </span></span><span style="font-size: 15pt; line-height: 240%; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">详细输出结果</span></h1>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="mso-spacerun: yes;"><span style="font-family: Times New Roman;">&nbsp;</span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">直接把查存出来的结果映射成</span><span lang="EN-US"><span style="font-family: Times New Roman;">XML document </span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;</span>&lt;select<span style="mso-spacerun: yes;">&nbsp; </span>id=&rdquo;getPerson&rdquo; parameterClass=&rdquo;int&rdquo;<span style="mso-spacerun: yes;">&nbsp; </span>resultClass=&rdquo;xml&rdquo; xmlResultName=&rdquo;person&rdquo;&gt;</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;"><span style="mso-spacerun: yes;">&nbsp;&nbsp; </span>Select id as id,name as name from<span style="mso-spacerun: yes;">&nbsp; </span>person<span style="mso-spacerun: yes;">&nbsp; </span>where id=#value#;</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 5.25pt; mso-char-indent-count: .5;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&lt;/select&gt;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 5.25pt; mso-char-indent-count: .5;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">结果：返回的为</span><span lang="EN-US"><span style="font-family: Times New Roman;">XML</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">格式的字符串（</span><span lang="EN-US"><span style="font-family: Times New Roman;">String</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">）</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="mso-spacerun: yes;"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;xmlversion="1.0"encoding="UTF-8"/&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;</span><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;"> person</span></span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;id&gt;2&lt;/id&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;name&gt;2222&lt;/name&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&lt;/</span><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">person</span></span><span style="font-size: 10pt; background: white; color: #000000; font-family: &quot;Courier New&quot;; mso-font-kerning: 0pt; mso-highlight: white;">&gt;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">xmlResultName</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">属性值为根目录名</span></span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/196676#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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 25 May 2008 11:37:48 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/196676</link>
        <guid>http://callan.javaeye.com/blog/196676</guid>
      </item>
      <item>
        <title>struts2 的国际化支持</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/186014" style="color:red;">http://callan.javaeye.com/blog/186014</a>&nbsp;
          发表时间: 2008年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>每种框价都会有国际化的支持,struts2的国际化大致上分为页面的国际化,Action的国际化以及xml的国际化</p>
<p>&nbsp;</p>
<p>首先在struts.properties文件中加入以下内容:<br />struts.custom.i18n.resources=messageResource<br />或在struts.xml中加入<br />&lt;constant name="struts.custom.i18n.resources" value="messageResource"&gt;&lt;/constant&gt;</p>
<p>&nbsp;</p>
<p>资源文件的命名格式: 名称_语言代码_国家代码. Properties<br />如果创建中文和英语国际化,那么资源文件名称为<br />messageResource_zh_CN.properties和messageResource_en_US.properties</p>
<p>&nbsp;</p>
<p>1.&nbsp;jsp页面的国际化 <br />通过使用标签&lt;s:text name="label.helloWorld"/&gt;输出国际化<br />label.helloWorld为资源文件中定义的key</p>
<p>&nbsp;</p>
<p><br />&nbsp; 在messageResource_en_US.properties加入以下内容<br />&nbsp; label.hello=hello {0}<br />&nbsp; label.helloWorld=hello,world</p>
<p>&nbsp; 在messageResource_zh_CN.properties加入以下内容<br />&nbsp; label.hello=你好 {0}<br />&nbsp; label.helloWorld=你好,世界</p>
<p>&nbsp;</p>
<p>(1). &lt;s:text name="label.helloWorld"/&gt;<br />&lt;s:property value="%{getText('label.helloWorld')}"/&gt;<br />上面两个都为输出一个hello word的两种表示</p>
<p>&nbsp;</p>
<p>&lt;s:textfield name="name" key="label.helloWorld"/&gt;<br />&lt;s:textfield name="name" label="%{getText('label.helloWorld')}"/&gt;<br />显示一个文本框,文本框的标题进行国际化</p>
<p>&nbsp;</p>
<p>(2). 使用&lt;s:i18n&gt;标签指定从某个特定的资源文件中取数据<br />&lt;s:i18n name="messageResource"&gt;<br />&nbsp;&nbsp; &nbsp;&lt;s:text name="label.helloWorld"&gt;&lt;/s:text&gt;<br />&lt;/s:i18n&gt;<br />指定在从messageResource取资源</p>
<p>&nbsp;</p>
<p>(3).<br />&lt;s:text name="label.hello"&gt;<br />&nbsp;&nbsp; &nbsp;&lt;s:param&gt;callan&lt;/s:param&gt;<br />&lt;/s:text&gt;<br />使用带参数的资源.&lt;s:param&gt;可以替换label.hello=hello {0}中的{0}</p>
<p>&nbsp;</p>
<p>2.&nbsp;Action的国际化<br />Action的国际化主要是通过getText(String key)方法实现的</p>
<pre name="code" class="java">public String execute() throws Exception {

		

		// getText(String) string为key

		String str1 = getText("label.helloWorld");

		System.out.println(str1);

		

		// 带参数的

		String str2 = getText("label.hello",new String[]{"fjf"});

		System.out.println(str2);

	

		// 与上一种实现一样

		List l = new ArrayList();

		l.add("callan");

		String str3 = getText("label.hello",l);

		System.out.println(str3);

		

		return SUCCESS;

	}</pre>
<p>&nbsp;</p>
<p>&nbsp;3.&nbsp; 参数化国际化<br />在messageResource_en_US.properties加入以下内容<br />userName=userName<br />userName.required=${getText('userName')} is required</p>
<p>&nbsp;</p>
<p>在messageResource_zh_CN.properties加入以下内容<br />userName=用户名<br />userName.required=${getText('userName')} 不能为空</p>
<p>&nbsp;</p>
<p>在Action中<br />String str4 = getText("userName.required");<br />System.out.println(str4);</p>
<p>&nbsp;</p>
<p>userName.required=${getText('userName')}会取国际化的用户名</p>
<p>&nbsp;</p>
<p>4.&nbsp;使用校验框价时,提示信息可以国际化<br />&nbsp;&nbsp; &lt;field name="userName"&gt;<br />&nbsp;&nbsp;&lt;field-validator type="requiredstring"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;message key=&rdquo;userName.required&rdquo;&gt; &lt;/message&gt;<br />&nbsp;&nbsp;&lt;/field-validator&gt;<br />&nbsp;&lt;/field&gt;</p>
<p>&nbsp;</p>
<p><br />国际化资源文件分为三种级别<br />(1)&nbsp;全局资源文件,可以被整个应该程序引用,也就是struts.custom.i18n.resources=messageResource指定的文件<br />(2)&nbsp;包级资源文件,每个包的根目录下可以新建资源文件,仅被当前包中的类访问.文件名格式为:package_语言代码_国家代码.<br />(3)&nbsp;Action级资源文件,仅被当前Action引用,名称为action名_语言代码_国家代码<br />查找顺序为从小范围到大范围, Action级优先级最大&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/186014#comments" style="color:red;">已有 <strong>2</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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Apr 2008 17:21:14 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/186014</link>
        <guid>http://callan.javaeye.com/blog/186014</guid>
      </item>
      <item>
        <title>struts2 校验框架</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/185577" style="color:red;">http://callan.javaeye.com/blog/185577</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>通过继承ActionSupport重写validate()方法,实现数据校验,会存在大量的重复代码,<br />类似于struts1,Struts2也提供通过配置文件来进行数据校验,使用校验框架不必重复的编写校验代码.</p>
<p>Action及jsp可以不用改变</p>
<pre name="code" class="java">package com;



import java.util.Date;



import com.opensymphony.xwork2.ActionSupport;



public class RegistAction extends ActionSupport {



	private String userName;

	

	private String password;

	

	private Integer age;

	

	private Date birthday;



	public Integer getAge() {

		return age;

	}



	public void setAge(Integer age) {

		this.age = age;

	}



	public Date getBirthday() {

		return birthday;

	}



	public void setBirthday(Date birthday) {

		this.birthday = birthday;

	}



	public String getPassword() {

		return password;

	}



	public void setPassword(String password) {

		this.password = password;

	}



	public String getUserName() {

		return userName;

	}



	public void setUserName(String userName) {

		this.userName = userName;

	}



	@Override

	public String execute() throws Exception {

		return SUCCESS;

	}

}</pre>
<p>&nbsp;Struts.xml</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;

&lt;!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;



&lt;struts&gt;	

    &lt;constant name="struts.custom.i18n.resources" value="messageResource"&gt;&lt;/constant&gt;

    

    &lt;package name="user" extends="struts-default"&gt;

    	&lt;action name="regist" class="com.RegistAction"&gt;

    		&lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;

    		&lt;result name="input"&gt;/regist.jsp&lt;/result&gt;

    	&lt;/action&gt;

    &lt;/package&gt;

&lt;/struts&gt;

</pre>
<p>&nbsp;jsp</p>
<pre name="code" class="html">&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;

&lt;%@taglib prefix="s" uri ="/struts-tags"%&gt; 

&lt;html&gt;

  &lt;body&gt;

  	&lt;form action="regist.action" method="post"&gt;

  		&lt;s:fielderror&gt;&lt;/s:fielderror&gt;

  		&lt;table&gt;

  			&lt;tr&gt;

  				&lt;td&gt;userName:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="userName"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			&lt;tr&gt;

  				&lt;td&gt;password:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="password"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			

  			&lt;tr&gt;

  				&lt;td&gt;age:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="age"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			&lt;tr&gt;

  				&lt;td&gt;birthday:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="birthday"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			&lt;tr&gt;

  				&lt;td colspan="2"&gt;

  					&lt;s:submit value="注册"&gt;&lt;/s:submit&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

   	&lt;/form&gt;

  &lt;/body&gt;

&lt;/html&gt;</pre>
<p>&nbsp;</p>
<p><br />添加验证文件<br />在RegistAction.java同目录下添加文件名为RegistAction-validation.xml(action名-validation.xml)</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;!DOCTYPE validators PUBLIC 

          "-//OpenSymphony Group//XWork Validator 1.0//EN" 

          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;

&lt;validators&gt;

	&lt;field name="userName"&gt;

		&lt;!-- 验证字符串不能为空 --&gt;

		&lt;field-validator type="requiredstring"&gt;

			&lt;!-- 去空格 --&gt;

			&lt;param name="trim"&gt;true&lt;/param&gt;

			&lt;!-- 错误提示信息 --&gt;

			&lt;message&gt;userName is required&lt;/message&gt;

		&lt;/field-validator&gt;

		

		&lt;!-- 验证字符串长度 --&gt;

		&lt;field-validator type="stringlength"&gt;

			&lt;param name="minLength"&gt;5&lt;/param&gt;

			&lt;param name="maxLength"&gt;16&lt;/param&gt;

			&lt;message&gt;userName should be between ${minLength} and ${maxLength}&lt;/message&gt;

		&lt;/field-validator&gt;

	&lt;/field&gt;

	

	&lt;field name="password"&gt;

		&lt;field-validator type="requiredstring"&gt;

			&lt;param name="trim"&gt;true&lt;/param&gt;

			&lt;message&gt;password is required&lt;/message&gt;

		&lt;/field-validator&gt;

		

		&lt;field-validator type="stringlength"&gt;

			&lt;param name="minLength"&gt;5&lt;/param&gt;

			&lt;param name="maxLength"&gt;16&lt;/param&gt;

			&lt;message&gt;password should be between ${minLength} and ${maxLength}&lt;/message&gt;

		&lt;/field-validator&gt;

	&lt;/field&gt;

	

	&lt;!-- 验证字符串为数字 --&gt;

	&lt;field name="age"&gt;

		&lt;field-validator type="int"&gt;

			&lt;param name="min"&gt;1&lt;/param&gt;

			&lt;param name="max"&gt;150&lt;/param&gt;

			&lt;message&gt;age should be between ${min} and ${max}&lt;/message&gt;

		&lt;/field-validator&gt;

	&lt;/field&gt;

	

	&lt;!-- 验证字符串为日期类型 --&gt;

	&lt;field name="birthday"&gt;

		&lt;field-validator type="date"&gt;

			&lt;param name="min"&gt;1888-01-01&lt;/param&gt;

			&lt;param name="max"&gt;2008-01-01&lt;/param&gt;

			&lt;message&gt;birthday should be between ${min} and ${max}&lt;/message&gt;

		&lt;/field-validator&gt;

	&lt;/field&gt;

&lt;/validators&gt;</pre>
<p>&nbsp;</p>
<p>Struts 2.0已经实现很多常用的校验了,在jar的default.xml中的注册的</p>
<pre name="code" class="xml">&lt;validators&gt; 

    &lt;validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" /&gt; 

    &lt;validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /&gt; 

    &lt;validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" /&gt; 

    &lt;validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" /&gt; 

    &lt;validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" /&gt; 

    &lt;validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" /&gt; 

    &lt;validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" /&gt; 

    &lt;validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" /&gt; 

    &lt;validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" /&gt; 

    &lt;validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" /&gt; 

    &lt;validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" /&gt; 

    &lt;validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" /&gt; 

    &lt;validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" /&gt; 

&lt;/validators&gt;</pre>
<p>&nbsp;</p>
<p>&lt;message&gt;提示信息也可以国际化,&lt;message key=&rdquo;&rdquo;&gt;就可以显示资源文件里的key对应的value了</p>
<p><br />当一个Action中有多个业务方法时,每个业务方法都会使用这种验证,显然是不好的.例如Action中有方法public String regist(),我们可以为regist()专门定义一个配置文件,文件名称为RegistAction-regist-validation.xml(Action名称-方法名- validation.xml)</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/185577#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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Tue, 22 Apr 2008 18:06:53 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/185577</link>
        <guid>http://callan.javaeye.com/blog/185577</guid>
      </item>
      <item>
        <title>struts2 数据校验</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/185418" style="color:red;">http://callan.javaeye.com/blog/185418</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一. ActionSupport是个工具类，他实现了Action, Validatable等接口, Validatable提供validate()方法进行数据验证．Ａction只要继承ActionSupport类，重写validate()方法就可以进行数据验证</p>
<p>二. 校验的流程<br />&nbsp;&nbsp;&nbsp;&nbsp; 首先,Struts框价对输入数据进行类型转换,然后再进行数据校验,如果类型转换与数据校验都没有错误发生, 就进入execute(),否则请求将被转发到input视图</p>
<p>三. 注册实例<br />&nbsp;&nbsp;&nbsp; 首先新建RegistAcion.java</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<pre name="code" class="java">package com;



import java.util.Date;



import com.opensymphony.xwork2.ActionSupport;



public class RegistAction extends ActionSupport {



	private String userName;

		

	private Integer age;

	

	private Date birthday;

	

	public String getUserName() {

		return userName;

	}



	public void setUserName(String userName) {

		this.userName = userName;

	}



	public Integer getAge() {

		return age;

	}



	public void setAge(Integer age) {

		this.age = age;

	}



	public Date getBirthday() {

		return birthday;

	}



	public void setBirthday(Date birthday) {

		this.birthday = birthday;

	}



	@Override

	public String execute() throws Exception {

		System.out.println("注册成功");

		return SUCCESS;

	}



	@Override

	public void validate() {

		if("".equals(userName)){

			addFieldError("userName", "username is empty");

		}

		if(null != age){

			if(1 &gt; age || 150 &lt; age){

				addFieldError("age", "age invalid");

			}

		}

	}

}</pre>
<p>&nbsp;配置Action</p>
<pre name="code" class="xml">&lt;action name="regist" class="com.RegistAction" method="regist"&gt;

      &lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;

      &lt;result name="input"&gt;/regist.jsp&lt;/result&gt;

 &lt;/action&gt;

</pre>
<p>&nbsp;接着是注册页面和注册成功页面</p>
<p>regist.jsp</p>
<pre name="code" class="html">&lt;body&gt;

  	&lt;form action="regist.action" method="post"&gt;

  		&lt;s:fielderror&gt;&lt;/s:fielderror&gt;

  		&lt;table&gt;

  			&lt;tr&gt;

  				&lt;td&gt;userName:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="userName"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			&lt;tr&gt;

  				&lt;td&gt;age:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="age"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			&lt;tr&gt;

  				&lt;td&gt;birthday:&lt;/td&gt;

  				&lt;td&gt;

  					&lt;input type="text" name="birthday"&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

  			&lt;tr&gt;

  				&lt;td colspan="2"&gt;

  					&lt;s:submit value="注册"&gt;&lt;/s:submit&gt;

  				&lt;/td&gt;

  			&lt;/tr&gt;

   	&lt;/form&gt;

  &lt;/body&gt;</pre>
<p>&nbsp;如果不输入userName, age输入为abc,会提示<br />&bull;&nbsp;Invalid field value for field "age". <br />&bull;&nbsp;username is empty </p>
<p>1. 其中Invalid field value for field "age" 信息是struts2通过内置的类型转换器进行类型转换时,如果不能成功转换, struts2框架自动生成一条错误信息，并将该错误信息放到addFieldError里面,这种默认的输出信息格式是在&nbsp; xwork-2.0.4.jar中定义的.&nbsp; com/opensymphony/xwork2/xwork-messages.properties文件中有一条xwork.default.invalid.fieldvalue=Invalid field value for field "{0}".</p>
<p>2. 这是一种全局的错误提示方式,整个系统中只要是字段类型转换错误都会这样提示,我们也可以改变这种输出格式,只要在全局的国际资源文件中重写xwork.default.invalid.fieldvalue就可以了.</p>
<p>实现方式:<br />在struts.xml中加入&lt;constant name="struts.custom.i18n.resources" value="messageResource"&gt;&lt;/constant&gt;<br />或者也可以在struts.properties中加入struts.custom.i18n.resources=messageResource<br />指定国际化资源文件名为messageResource. Properties</p>
<p>新建messageResource. Properties资源文件并添加数据xwork.default.invalid.fieldvalue={0} failure<br />修改之后字段类型转换错误提示为 : {0} failure</p>
<p>3 所有的类型转换失败后,struts2会将基本类型设置为0,对象类型设置为null,这里的age的类型为Integer,当类型转换失败age值为null,如果age的类型为int,那么转换失败后值为0</p>
<p><br />4.这种提示信息不够友好,也可以定义局布的提示信息,为每一个Action新建一个properties文件,文件名为XXX.properties(Action名.properties)</p>
<p>实现方式:新建RegistAction.properties并添加<br />invalid.fieldvalue.age=age error<br />invalid.fieldvalue.birthday=birthday error<br />其中age和birthday分别为字段的名称<br /><br />四.<br />Struts2也提供类似BaseDispatchAction的功能</p>
<pre name="code" class="java">package com;



import com.opensymphony.xwork2.ActionSupport;



public class Regist2Action extends ActionSupport {



	private String userName;

		

	public String getUserName() {

		return userName;

	}



	public void setUserName(String userName) {

		this.userName = userName;

	}



	public String regist() throws Exception {

		System.out.println("注册成功-regist");

		return SUCCESS;

	}

	

	public void validateRegist() {

		if(userName.equals("")){

			addFieldError("userName", "请输入用户名-registValidate");

		}

	}

}</pre>
<p>&nbsp;&nbsp; </p>
<pre name="code" class="xml">&lt;action name="regist2" class="com.Regist2Action" method="regist"&gt;



    		&lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;



    		&lt;result name="input"&gt;/regist2.jsp&lt;/result&gt;



 &lt;/action&gt;</pre>
<p>&nbsp;</p>
<p>指定了method为regist,当请求时会执行regist(),不会再去执行默认的execute()方法了,<br />validateRegist()方法是专门针对regist校验的.(格式为validate+方法名)</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/185418#comments" style="color:red;">已有 <strong>3</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;">北京: 千橡集团暨校内网诚聘软件研发工程师</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>Tue, 22 Apr 2008 13:16:32 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/185418</link>
        <guid>http://callan.javaeye.com/blog/185418</guid>
      </item>
      <item>
        <title>struts2 转换器</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/185211" style="color:red;">http://callan.javaeye.com/blog/185211</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我们通过表单输入的数据其实都是一个String,有时需要把这些String转成int date等等<br />Struts1中也提供了类型转换器，比如form中有一个字段age,当我们输入表单时, Struts1的转换器会将这个age字符串转换成Form表单中对应的age数值,Struts2提供了更加强大的类型转换.</p>
<p><br />实例:<br />提供一个文本框,输入用户名和密码,以&rdquo;,&rdquo;号分隔开</p>
<p>首先新建输入页面(input.jsp)</p>
<p>&lt;%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%&gt;<br />&lt;<a href="mailto:%@taglib">%@taglib</a> prefix="s" uri="/struts-tags"%&gt;<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&nbsp; &lt;head&gt;<br />&nbsp;&lt;meta http-equiv="pragma" content="no-cache"&gt;<br />&nbsp;&lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />&nbsp;&lt;meta http-equiv="expires" content="0"&gt;&nbsp;&nbsp;&nbsp; <br />&nbsp;&lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />&nbsp;&lt;meta http-equiv="description" content="This is my page"&gt;<br />&nbsp; &lt;/head&gt;<br />&nbsp; <br />&nbsp; &lt;body&gt;<br />&nbsp;&nbsp; &nbsp;&lt;s:form action="userAction.action"&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&lt;s:textfield name="user" label="username and password"&gt;&lt;/s:textfield&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/s:form&gt;<br />&nbsp; &lt;/body&gt;<br />&lt;/html&gt;</p>
<p>创建一个用户pojo(User.java)</p>
<pre name="code" class="java">package com.bean;

public class User {

	private String username;
	private String password;
	public String getPassword() {
		
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
}</pre>
<p>&nbsp;<br />然后增加自定义转换器 (UserConverter.java)</p>
<pre name="code" class="java">package com.converter;

import java.util.Map;
import com.bean.User;


import ognl.DefaultTypeConverter;

public class UserConverter extends DefaultTypeConverter {

	@Override
	public Object convertValue(Map content, Object value, Class typeClass) {
		
		if(String.class == typeClass){
			
			User user = (User)value;
			
			String username = user.getUsername();
			
			String password = user.getPassword();
			
			return username + "-" + password;
			
		} 

		if(User.class == typeClass){
			
			User user = new User();
			
			String[] str = (String[])value;
			
			String[] paramValues = str[0].split(",");
			
			user.setUsername(paramValues[0]);
			
			user.setPassword(paramValues[1]);
			
			return user;
		}
		
		return null;
	}
}
</pre>
<p>&nbsp;</p>
<p>&nbsp;创建Action&nbsp; (UserAction.java)</p>
<pre name="code" class="java">package com.action;

import com.bean.User;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
	
	private static final long serialVersionUID = 8469145731747703330L;
	
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		
		if("callan".equals(user.getUsername()) &amp;&amp; "fjf".equals(user.getPassword())){
			return SUCCESS;
		} else {
			return INPUT;
		}		
	}
}
</pre>
<p>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">添加</span><span lang="EN-US"><span style="font-family: Times New Roman;">struts.xml</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中添加以下配置</span></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="font-size: small;"></span>&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
<p><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">
<pre name="code" class="xml">&lt;action name="userAction" class="com.action.UserAction"&gt;
			&lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;
			&lt;result name="input"&gt;/input.jsp&lt;/result&gt;
		&lt;/action&gt;
</pre>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">接着在Action同目录下加入XXX-conversion.properties<br />这里是在UserAction目录下加入UserAction-conversion.properties,并在其中加入<br />user=com.converter.UserConverter<br />user表示的是UaerAction中的一个字段,user使用com.converter.UserConverter转换器</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><br />也可以配置全局转换器,在class根目录下添加xwork-conversion.properties,这个名字是固定的,加入com.bean.User=com.converter.UserConverter2表示所有的com.bean.User都使用的是UserConverter2转换器</p>
<span style="font-size: small;"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</span></span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</span><font size="3">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
</font></span>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
&nbsp;</p>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/185211#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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 23:18:24 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/185211</link>
        <guid>http://callan.javaeye.com/blog/185211</guid>
      </item>
      <item>
        <title>Hibernate Annotation(三)</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/185208" style="color:red;">http://callan.javaeye.com/blog/185208</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Hibernate是ORM的解决方案，其底层对数据库的操作依赖于JDBC，所以您必须先取得JDBC驱动程序，在这边所使用的是MySQL，所以您必须至 MySQL&reg; Connector/J 取得MySQL的JDBC驱动程序。 </p>
<p>接下来至 Hibernate 官方网站 取得Hibernate 3.2、Hibernate Annotations 3.2。 </p>
<p>您必须安装JDK 5.0才可以使用Hibernate Annotations的功能。 </p>
<p>解开Hibernate 3.2的zip档案后，当中的hibernate3.jar是必要的，而在lib目录中还包括了许多jar档案，您可以在 Hibernate 3.0官方的参考手册 上找到这些jar的相关说明，其中必要的是 antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache，Hibernate底层还需要Java Transaction API，所以您还需要jta.jar。 </p>
<p>解开Hibernate Annotations 3.2的zip档案后，您需要hibernate-annotations.jar、ejb3-persistence.jar这两个档案。 </p>
<p>到这边为止，总共需要以下的jar档案：</p>
<p>Hibernate可以运行于单机之上，也可以运行于Web应用程序之中，如果是运行于单机，则将所有用到的jar档案（包括JDBC驱动程序）设定至CLASSPATH中，如果是运行于Web应用程序中，则将jar档案置放于WEB-INF/lib中。</p>
<p>如果您还需要额外的Library，再依需求加入，例如JUnit、Proxool等等，接下来可以将etc目录下的 log4j.properties复制至Hibernate项目的Classpath下，并修改一下当中的 log4j.logger.org.hibernate为error，也就是只在在错误发生时显示必要的讯息。</p>
<p>接着设置基本的Hibernate配置文件，可以使用XML或Properties档案，这边先使用XML，档名预设为hibernate.cfg.xml：</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt; 
&lt;!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;
  
&lt;hibernate-configuration&gt; 
    &lt;session-factory&gt; 
        &lt;!-- 显示实际操作数据库时的SQL --&gt; 
        &lt;property name="show_sql"&gt;true&lt;/property&gt; 
        &lt;!-- SQL方言，这边设定的是MySQL --&gt; 
        &lt;property name="dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt; 
        &lt;!-- JDBC驱动程序 --&gt; 
        &lt;property name="connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; 
        &lt;!-- JDBC URL --&gt; 
        &lt;property name="connection.url"&gt;jdbc:mysql://localhost/demo&lt;/property&gt; 
        &lt;!-- 数据库使用者 --&gt; 
        &lt;property name="connection.username"&gt;root&lt;/property&gt; 
        &lt;!-- 数据库密码 --&gt; 
        &lt;property name="connection.password"&gt;123456&lt;/property&gt; 
 
        &lt;!-- 以下设置对象与数据库表格映像类别 --&gt;
        &lt;mapping class="onlyfun.caterpillar.User"/&gt; 
    &lt;/session-factory&gt; 
&lt;/hibernate-configuration&gt;</pre>
<p>&nbsp;</p>
<p>这边以一个简单的单机程序来示范Hibernate的配置与功能，首先作数据库的准备工作，在MySQL中新增一个demo数据库，并建立user表格：<br />CREATE TABLE user (&nbsp;&nbsp;&nbsp; id INT(11) NOT NULL auto_increment PRIMARY KEY,&nbsp;&nbsp;&nbsp; name VARCHAR(100) NOT NULL default '',&nbsp;&nbsp;&nbsp; age INT);<br />对于这个表格，您有一个User类别与之对应，表格中的每一个字段将对应至User实例上的Field成员。</p>
<pre name="code" class="java">package onlyfun.caterpillar;
 
import javax.persistence.*;
 
@Entity
@Table(name="user") // 非必要，在表格名称与类别名称不同时使用
public class User {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
  
  @Column(name="name") // 非必要，在字段名称与属性名称不同时使用
    private String name;
  
  @Column(name="age") 
    private Integer age; // 非必要，在字段名称与属性名称不同时使用
    
    // 必须要有一个预设的建构方法
    // 以使得Hibernate可以使用Constructor.newInstance()建立对象
    public User() {
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
}</pre>
<p>&nbsp;</p>
<p>其中id是个特殊的属性，Hibernate会使用它来作为主键识别，您可以定义主键产生的方式，这边设定为自动产生主键，可以看到，实体标识，主键生成，以及相关映像，都可以使用Annotation来完成。 </p>
<p>接下来撰写一个测试的程序，这个程序直接以Java程序设计人员熟悉的语法方式来操作对象，而实际上也直接完成对数据库的操作，程序将会将一笔数据存入表格之中：</p>
<pre name="code" class="java">package onlyfun.caterpillar;
 
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction; 
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration; 
 
public class HibernateAnnotationDemo {
 
    public static void main(String[] args) {
        // 需要AnnotationConfiguration读取Annotation讯息
        Configuration config = new AnnotationConfiguration().configure();
        // 根据 config 建立 SessionFactory
        // SessionFactory 将用于建立 Session
        SessionFactory sessionFactory = config.buildSessionFactory(); 
 
        // 将持久化的物件
        User user = new User(); 
        user.setName("caterpillar"); 
        user.setAge(new Integer(30));     
 
        // 开启Session，相当于开启JDBC的Connection
        Session session = sessionFactory.openSession(); 
        // Transaction表示一组会话操作
        Transaction tx= session.beginTransaction(); 
        // 将对象映像至数据库表格中储存
        session.save(user); 
        tx.commit(); 
        session.close(); 
        sessionFactory.close(); 
       
        System.out.println("新增资料OK!请先用MySQL观看结果！"); 
    }
}</pre>
<p>&nbsp;注意，使用Annotation时，需要的是AnnotationConfiguration类别。 </p>
<p>如您所看到的，程序中只需要直接操作User对象，并进行Session与Transaction的相关操作，Hibernate就会自动完成对数据库的操作，您看不到任何一行JDBC或SQL的陈述，撰写好以上的各个档案之后，各档案的放置位置如下：</p>
<p><br />接着可以开始运行程序，结果如下：</p>
<p>Hibernate: insert into user (name, age) values (?, ?)<br />新增资料OK!请先用MySQL观看结果！</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/185208#comments" style="color:red;">已有 <strong>2</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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 23:09:00 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/185208</link>
        <guid>http://callan.javaeye.com/blog/185208</guid>
      </item>
      <item>
        <title>Hibernate Annotation(二)</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/185074" style="color:red;">http://callan.javaeye.com/blog/185074</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>用EJB3注释进行映射<br />　　现在EJB3实体Bean是纯粹的POJO。实际上表达了和Hibernate持久化实体对象同样的概念。他们的映射都通过JDK5.0注释来定义(EJB3规范中的XML描述语法至今还没有定下来)。注释分为两个部分，分别是逻辑映射注释和物理映射注释，通过逻辑映射注释可用描述对象模型，类之间的关系等等，而物理映射注释则描述了物理的schema，表，列，索引等等。下面外面在代码中将混合使用这两种类型的注释</p>
<p>(一)声明实体<br />@Entity<br />&nbsp;&nbsp;&nbsp;&nbsp; POJO用@Entity进行实体注释</p>
<p>@Table <br />&nbsp;&nbsp;&nbsp; @Table是类的一级注释，通过它可用为实体指定表(Table)，目录(Catalog)，和schema的名字，如果没有@Table，那么系统自动使用默认值：实体的短类名（不带包名）</p>
<p>@Version<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;可用在实体Bean中使用@Version添加乐观锁支持。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据EJB3规范，Version列可以使用numeric类型（推荐方式）也可以使用timestamp类型。Hibernate支持任何自定义类型，只要该类型实现了UserVersionType.</p>
<p><br />(二)映射简单属性</p>
<p>实体Bean中的所有非static、非transient的属性都可以被持久化。同时使用@Transient对属性进行注解同样不不会被持久化.<br /><br />@Column<br />&nbsp;&nbsp;&nbsp; 使用@Column可将属性映射到列。</p>
<p>@Column(name = &ldquo;列名&rdquo; length = 长度)<br /><br />例如：</p>
<p>&nbsp;&nbsp; @Column(name = &ldquo;NAME&rdquo; length = 20)</p>
<p>&nbsp;&nbsp; public String getName() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; return this.name;</p>
<p>}<br /><br />注意：<br />&nbsp;&nbsp;&nbsp;&nbsp; 当POJO用有属性不需要映射的时候一定要用@Transient修饰　　</p>
<p>&nbsp;&nbsp;&nbsp; @&nbsp;Lob注解表示将属性持久化为Blob或者Clob类型，具体取决于属性的类型，java.sql.Clob,Character[ ]和 char[] 和 java.lang.String这些属性都被持久化为Clob类型，而java.sql.Blob,Byte[],byte[] 和 serializable类型在被持久化为Blob类型</p>
<p>&nbsp;</p>
<p>(三)映射主键属性</p>
<p>@Id</p>
<p>使用@Id注解可以将实体Bean中的某个属性定为为标识符(identifier)。该属性值可以通过应用自身创建，也可以通过Hibernate生成（推荐）。使用@GeneratedValue注释利用定义标识符的生产策略：</p>
<p>&nbsp;*AUTO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以是一下三种任意一种类型，取决于地层数据库的不同</p>
<p>*TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用表保存id值</p>
<p>*IDENTITY&nbsp;&nbsp;&nbsp; identity column</p>
<p>*SEQUENCE&nbsp;&nbsp; sequence</p>
<p>&nbsp;@Id</p>
<p>@GeneratedValue(strategy = GenerationType.IDENTITy)</p>
<p>Public Integer getId() {&hellip; &hellip;}</p>
<p>&nbsp;</p>
<p>在Hibernate的应用中提供了更加丰富的主键生产策略。</p>
<p>@org.hibernate.annotations.GenericGeneracor允许定义一个Hibernate特定的id生成器。</p>
<p>例:</p>
<pre name="code" class="java">@Id 
@GeneratedValue(generator = "system-uuid")[该属性名自定义]
@GenericGenerator(name = " system-uuid ", strategy = "uuid")
[name可自定义，但是strategy属性必须是Hibernate中有效的主键策略]
@Column (name = "user_id")
 private Integer userId;

 

@Id 
@GeneratedValue(generator = "hilo")
@GenericGenerator(name = "hilo", strategy = "hilo")
@Column (name = "user_id")
private Integer userId;</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/185074#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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 17:03:32 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/185074</link>
        <guid>http://callan.javaeye.com/blog/185074</guid>
      </item>
      <item>
        <title>Hibernate  Annotation(一)</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/185072" style="color:red;">http://callan.javaeye.com/blog/185072</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>1.概述</strong> <br />&nbsp;&nbsp;&nbsp;&nbsp; 值得期待的Hibernate Annotation 式配置终于随着Hibernate 3.2GA 版本的发布而宣布正式被支持了！<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;只要数据库以及字段名称设计合适，我们甚至只需要在原来程序上加上3行代码，就可以配置完成一个Bean。这依&nbsp;&nbsp;&nbsp;&nbsp; 稀看到了Rails 的影子......</p>
<p><strong>1.1 参考资料</strong><br />&nbsp; 最为重要的参考资料莫过于由RedSega 团队翻译的，并入Hibernate 官方文档库的参考手册中文版。</p>
<p><strong>2.系统配置</strong><br />&nbsp;&nbsp;&nbsp;1. 首先，需要将hibernate-annotations 的相关jar 包(hibernate-annotations.jar,hibernate-commons-&nbsp;&nbsp; annotations.jar,ejb3-persistence.jar)引入项目。<br />&nbsp;&nbsp; 2. 可以使用hibernate.cfg.xml ，也可以使用Spring的封装来配置annotation pojo</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; a. 直接在spring中配置&nbsp;&nbsp;sessionFactory的类型改为&nbsp; org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean</p>
<p>&nbsp;&nbsp;&nbsp; 增加如下节点配置<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="annotatedClasses"&gt;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;&lt;value&gt;org.springside.helloworld.model.User&lt;/value&gt;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><br />&nbsp;&nbsp;&nbsp; b. 在hibernate.cfg.xml 中配置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建hibernate.cfg.xml 文件，以SpringSide 项目的HelloWorld 为例，写入以下内容</p>
<p>&lt;!DOCTYPE hibernate-configuration PUBLIC&nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"&nbsp; "<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</a> "&gt;<br />&nbsp;&nbsp; &lt;hibernate-configuration&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;session-factory&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mapping class="org.springside.helloworld.model.User"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/session-factory&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/hibernate-configuration&gt;<br /><br />&nbsp;&nbsp; 同时，在Spring 配置文件中，将原来的SessionFactory 配置改为：</p>
<p>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dataSource" ref="dataSource"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="configLocations"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;&lt;value&gt;classpath*:/config/hibernate.cfg.xml&lt;/value&gt;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/&gt;<br />&lt;/bean&gt;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/185072#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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 17:00:29 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/185072</link>
        <guid>http://callan.javaeye.com/blog/185072</guid>
      </item>
      <item>
        <title>struts2中的拦截器</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/182520" style="color:red;">http://callan.javaeye.com/blog/182520</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一.理解拦截器</p>
<p>&nbsp;&nbsp; 1. 拦截器是在防问某个方法，字段之前或之后实施拦截，并且拦截器是可插拔的，拦截器是ＡＯＰ的一种实现．<br /><br />&nbsp;&nbsp; 2. 拦截器栈（Interceptor Stack）。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拦截器链中的拦截器就会按其之前定义的顺序被调用。</p>
<p>二.实现原理<br />&nbsp;&nbsp;&nbsp; Struts2拦截器的实现原理相对简单，当请求struts2的action时，Struts 2会查找配置文件，并根据其配置实例化相对的&nbsp;&nbsp;&nbsp; 拦截器对象，然后串成一个列表，最后一个一个地调用列表中的拦截器</p>
<p>三.拦截器的配置<br />&nbsp; 1. 普通的拦截器</p>
<pre name="code" class="xml">&lt;package name="default" extends="struts-default"&gt;<br />


   &lt;interceptors&gt;<br />


       &lt;interceptor name="拦截器名1" class="拦截器实现类"/&gt;<br />


       &lt;interceptor name="拦截器名2" class="拦截器实现类"/&gt;<br />


   &lt;/interceptors&gt;<br />


&lt;action name="login"　class="com.Logon"&gt;<br />


　　&lt;interceptor-ref name="defaultStack"/&gt;<br />


        &lt;interceptor-ref name="拦截器名1"/&gt;<br />


        &lt;interceptor-ref name="拦截器名2"/&gt;<br />


         &lt;result name="input"&gt;logon.jsp&lt;/result&gt;<br />


         &lt;result name="success"&gt;/index.jsp&lt;/result&gt;<br />


   &lt;/action&gt;<br />


&lt;/package&gt;</pre>
<p>&nbsp;2. 拦截器栈</p>
<pre name="code" class="xml">&lt;package name="default" extends="struts-default"&gt;<br />


   &lt;interceptors&gt;<br />


        &lt;interceptor name="拦截器名1" class="拦截器实现类"/&gt;<br />


        &lt;interceptor name="拦截器名2" class="拦截器实现类"/&gt;<br />


        &lt;interceptor-stack name="myStack"&gt;<br />


           &lt;interceptor-ref name="拦截器名1"/&gt;<br />


           &lt;interceptor-ref name="拦截器名2"/&gt;<br />


        &lt;/interceptor-stack&gt;<br />


    &lt;/interceptors&gt;<br />


    &lt;action name="login" class="com.Logon"&gt;<br />


　　　　　&lt;interceptor-ref name="defaultStack"/&gt;<br />


         &lt;interceptor-ref name="myStack"/&gt;<br />


         &lt;result name="input"&gt;login.jsp&lt;/result&gt;<br />


         &lt;resultname="success" &gt;/index.jsp&lt;/result&gt;<br />


&lt;/action&gt;<br />


&lt;/package&gt;<br />


</pre>
<p>&nbsp;需要注意的是，如果为Action指定了一个拦截器，则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器，所以上面配置文件中手动引入了默认拦截器</p>
<p>&nbsp;</p>
<p>四.自定义拦截器<br />&nbsp;&nbsp; 1.直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。<br />&nbsp;&nbsp; 2.或者继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor<br />&nbsp;&nbsp; 3.通过&lt;interceptor&gt;元素来定义拦截器<br />&nbsp;&nbsp; 4.通过&lt;interceptor-ref&gt;元素来使用拦截器</p>
<p>五.使用拦截器实现权限控制<br />&nbsp; 1.功能 <br />&nbsp;&nbsp;&nbsp; 使用自定义拦截器来完成用户权限的控制，当执行操作时，判断用户是否己经登陆，如果没有登陆跳转到登陆页面<br /><br />&nbsp; 2.拦截器类</p>
<pre name="code" class="java">package com.interceptor;
<br />
<br />import com.opensymphony.xwork2.Action;
<br />import com.opensymphony.xwork2.ActionContext;
<br />import com.opensymphony.xwork2.ActionInvocation;
<br />import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
<br />
<br />public class AuthorizationInterceptor extends AbstractInterceptor {
<br />
<br />	private static final long serialVersionUID = 1L;
<br />
<br />	@Override
<br />	public String intercept(ActionInvocation actionInvocation) throws Exception {
<br />		
<br />		ActionContext actionContext = actionInvocation.getInvocationContext();
<br />		
<br />		Object user = actionContext.get("user");
<br />		
<br />		if(user != null){
<br />			return actionInvocation.invoke();
<br />		} else{
<br />			actionInvocation.getInvocationContext().put("nav_title", "你还没有登陆,请先登陆");
<br />			return Action.LOGIN;
<br />		}
<br />	}
<br />
<br />}
<br /></pre>
<p>&nbsp;</p>
<p>&nbsp;2.配置</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />


&lt;!DOCTYPE struts PUBLIC<br />


    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />


    "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br />

&lt;struts&gt;	<br />
   &lt;package name="user" extends="struts-default"&gt;

    	&lt;interceptors&gt;
    		&lt;!-- 定义拦截器  --&gt;
    		&lt;interceptor name="authority" class="com.interceptor.AuthorizationInterceptor"&gt;&lt;/interceptor&gt;
    	&lt;/interceptors&gt;<br />

        &lt;action name="user" class="com.UserAction"&gt;<br />
        	&lt;!-- 使用拦截器 --&gt;
        	&lt;interceptor-ref name="authority"/&gt;
        	&lt;interceptor-ref name="defaultStack"/&gt;
            &lt;result name="succee"&gt;/logon/welcome.jsp&lt;/result&gt;<br />
            &lt;result name="login"&gt;/logon/logon.jsp&lt;/result&gt;
        &lt;/action&gt;
    &lt;/package&gt;
&lt;/struts&gt;<br />


</pre>
<p>&nbsp;访问http://localhost:8080/struts2-interceptor/user.action时，会判断用户是否登陆</p>
<p><br />六.方法拦截器<br />&nbsp; 1.Struts2提供MethodFilterInterceptor类，该类是AbstractInerceptor的子类，可以实现对Action方法的拦截.<br />&nbsp; 2. MethodFilterInterceptor中有两个方法<br />　&nbsp; setExcludeMethods:排除需要过滤的方法<br />&nbsp;&nbsp;&nbsp;&nbsp; setIncludeMethods:设置需要过滤的方法<br />&nbsp;&nbsp;&nbsp;&nbsp; 如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截</p>
<p>&nbsp; 3.实现</p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">拦截器</span> </p>
<pre name="code" class="java">package com.interceptor;
<br />
<br />import com.opensymphony.xwork2.ActionInvocation;
<br />import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
<br />
<br />public class LogInterceptor extends MethodFilterInterceptor {
<br />
<br />	private static final long serialVersionUID = 1L;
<br />
<br />	private String name;
<br />	
<br />	@Override
<br />	protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
<br />	
<br />		System.out.println("拦截器名称:" + name);
<br />		System.out.println("action:" + actionInvocation.getAction());
<br />		
<br />		return actionInvocation.invoke();
<br />	}
<br />
<br />	public String getName() {
<br />		return name;
<br />	}
<br />
<br />	public void setName(String name) {
<br />		this.name = name;
<br />	}
<br />}
<br /></pre>
<p class="MsoNormal" style="margin-left: 18pt;">&nbsp;</p>
<p>&nbsp;action</p>
<pre name="code" class="java">package com;<br /><br />
public class ManageAction {<br /><br />
	public String execute(){
		System.out.println("execute....");<br />
		return "succee";
	}<br />

	public String search(){<br />
		System.out.println("search....");
		return "succee";
	}
	public String add(){
		System.out.println("add....");
		return "succee";
	}
}<br />


</pre>
<p>&nbsp;struts.xml配置</p>
<pre name="code" class="xml">&lt;action name="manage" class="com.ManageAction"&gt;<br />
         	&lt;interceptor-ref name="log"&gt;<br />
         		&lt;param name="name"&gt;日志拦截&lt;/param&gt;<br />
         		&lt;!-- 设置需要拦截的方法,指定多个方法以逗号隔开 --&gt;

         		&lt;param name="includeMethods"&gt;execute,add&lt;/param&gt;<br />
         		&lt;!-- 设置不需要拦截的方法,execute在includeMethods中同时存在，execute会被拦截 --&gt;<br />
         		&lt;param name="excludeMethods"&gt;search,execute&lt;/param&gt;
         	&lt;/interceptor-ref&gt;<br />
         	&lt;result name="succee"&gt;/welcome.jsp&lt;/result&gt;
         &lt;/action&gt;

</pre>
<p>&nbsp;</p>
<p>打开浏览器访问　http://localhost:8080/struts2-interceptor/manage.action</p>
<p><br />会报执行execute方法，会执行拦截器<br />拦截器名称:日志拦截<br />action:com.ManageAction@1a0ae6d<br />execute....<br /><br />当访问 http://localhost:8080/struts2-interceptor/manage!search.action<br />执行search方法，不会执行拦截器</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://callan.javaeye.com/blog/182520#comments" style="color:red;">已有 <strong>2</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;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 11:37:48 +0800</pubDate>
        <link>http://callan.javaeye.com/blog/182520</link>
        <guid>http://callan.javaeye.com/blog/182520</guid>
      </item>
      <item>
        <title>struts2 文件上传</title>
        <author>Callan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://callan.javaeye.com">Callan</a>&nbsp;
          链接：<a href="http://callan.javaeye.com/blog/179351" style="color:red;">http://callan.javaeye.com/blog/179351</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一.简介</p><p>Struts2并未提供自己的请求解析器，也就是就Struts2不会自己去处理multipart/form-data的请求，它需要调用其他请求解析器，将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装，更进一步简化了文件上传。<br />Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件，因此，要在web应用中增加两个Jar文件：commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上传框架上做了进一步封装，简化了文件上传的代码实现，取消了不同上传框架上的编程差异。<br />如果要改成其它的文件上传框架，可以修改struts.multipart.parser常量的值为cos/pell，默认值是jakata。并在classpath中增加相应上传组件的类库</p><p>例如配置成cos上传</p><p>struts.multipart.parser=cos</p><p>struts.multipart.maxSize=1024&nbsp; 指定文件的最大字结数</p><p>&nbsp;</p><p>二.原理</p><p>不管用common-fileUPload框架，还是用cos，都是通过将HTTP的数据保存到临时文件夹，然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。</p><p>&nbsp;</p><p>&nbsp;</p><p>三.需要的jar包(默认使用commons-fileupload,如果使用cos，要将jar引进来)</p><p><span style="font-family: Arial">commons-logging-1.1.jar<br />freemarker-2.3.8.jar<br />ognl-2.6.11.jar<br /><span class="hilite1">struts2</span>-core-2.0.6.jar<br />xwork-2.0.1.jar<br />commons-io-1.3.1.jar<br />commons-fileupload-1.2.jar</span></p><p>&nbsp;</p><p>四.实例</p><p>1.首先，创建上传页面</p><pre name="code" class="html">&lt;%@page language=&quot;java&quot; contentType = &quot;text/html; charset=utf-8&quot; pageEncoding = &quot;utf-8&quot;%&gt; 
&lt;%@taglib prefix=&quot;s&quot; uri =&quot;/struts-tags&quot;%&gt; 


&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&lt;html&gt;
  &lt;head&gt;

    &lt;title&gt;My JSP 'FileUpload.jsp' starting page&lt;/title&gt;
    
	&lt;meta http-equiv=&quot;pragma&quot; content=&quot;no-cache&quot;&gt;
	&lt;meta http-equiv=&quot;cache-control&quot; content=&quot;no-cache&quot;&gt;
	&lt;meta http-equiv=&quot;expires&quot; content=&quot;0&quot;&gt;    
	&lt;meta http-equiv=&quot;keywords&quot; content=&quot;keyword1,keyword2,keyword3&quot;&gt;
	&lt;meta http-equiv=&quot;description&quot; content=&quot;This is my page&quot;&gt;
	&lt;!--
	&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;styles.css&quot;&gt;
	--&gt;

  &lt;/head&gt;
  
  &lt;body&gt;
   &lt;s:form action =&quot;fileUpload&quot; method =&quot;POST&quot; enctype =&quot;multipart/form-data&quot;&gt; 
		&lt;s:fielderror /&gt;
        &lt;s:file name =&quot;upload&quot;/&gt;   
        &lt;s:submit /&gt; 
    &lt;/s:form &gt; 

  &lt;/body&gt;
&lt;/html&gt;
</pre><p>&nbsp;</p><p>&nbsp;</p><p>2.action</p><pre name="code" class="java">package com;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {
	
	private static final long serialVersionUID = 572146812454l;

	private File upload;

	private String uploadContentType;

	private String uploadFileName;

	private String imageFileName;

	public String getUploadContentType() {
		return uploadContentType;
	}

	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public File getUpload() {
		return upload;
	}

	public void setUpload(File upload) {
		this.upload = upload;
	}

	public String getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public void setImageFileName(String imageFileName) {
		this.imageFileName = imageFileName;
	}

	public String getImageFileName() {
		return imageFileName;
	}

	private static void copy(File src, File dst) {
		try {
			InputStream in = null;
			OutputStream out = null;
			try {
				in = new BufferedInputStream(new FileInputStream(src));
				out = new BufferedOutputStream(new FileOutputStream(dst));
				byte[] buffer = new byte[1024*10];
				while (in.read(buffer) &gt; 0) {
					out.write(buffer);
				}
			} finally {
				if (null != in) {
					in.close();
				}
				if (null != out) {
					out.close();
				}
			}
		} catch (Exception e) {
			e.pri