<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>myoldman</title>
    <description>毕业三年以来一直从事web应用开发，熟悉j2ee，Asp.net，对Php，RoR有一定的实践经验。
熟悉web应用开发各方面知识，对web开发有极大的兴趣。
动手能力强，对新知识和架构能很快上手。
学习能力强，喜欢学习和探索新技术和知识。
善于与他人沟通，能够很快融入团队。
</description>
    <link>http://myoldman.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>歌曲中的英文单词</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/201206" style="color:red;">http://myoldman.javaeye.com/blog/201206</a>&nbsp;
          发表时间: 2008年06月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          glory         <br />n.<br />光荣, 荣誉<br /><br />(对上帝的)赞 美[颂]<br /><br />壮丽[观], 辉煌, 灿烂<br /><br />可赞美[夸耀]的事<br /><br />繁荣, 昌盛<br /><br />兴致勃勃, 得意扬扬<br /><br />【宗】天国的荣誉, 天福<br /><br />(神像后的)光轮<br /><br />日[月]华, 日冕<br /><br />the glory of the sunset <br />落日的壮观<br /><br /><br />distress         <br />n.<br />苦恼; 痛苦<br /><br />穷困; 贫苦<br /><br />危难, 不幸<br /><br />【律】(被)扣押财物<br /><br />respiratory distress <br />呼吸困难<br />in distress <br />遇难; 痛苦<br />be a great distress to sb. <br />使某人深感苦恼的事<br />relieve distress among the poor <br />救济穷人<br />a signal of distress <br />遇难信号<br />distress warrant <br />【律】扣押令<br /><br />Cinderella         <br />n.<br />灰姑娘(童话中一美丽姑娘, 被后母虐待, 终日与煤渣为伴)<br /><br />美丽的贫苦姑娘<br /><br />打杂女仆<br /><br />一举成名的人<br /><br />(=Cinderella dance)午夜结束的小舞会<br /><br />cellar         <br />n.<br />地下室, 地[酒]窖<br /><br />窖藏酒; 藏酒量<br /><br />【机】油盒; 油井口<br /><br />(运输工具的)用品箱<br /><br />后进先出存储器, 堆栈存储器<br /><br /><br />armour         <br />var.<br />→ armor<br /><br /> 简明英汉词典armour         <br />n.<br />盔甲, 装甲钢板, 装甲部队<br /><br />vt.<br />卷起, 叠起; 折短; 在衣服上打横褶(up)<br /><br />包起, 卷紧<br /><br />使盖好被子安睡(up, in)<br /><br />把...塞[挤]进; 藏起(in, into); 使隐藏(away); 使蜷曲<br /><br />用网兜把鱼从网中捞出<br /><br />[俚]绞死, 吊死(up)<br /><br />[英俚]大吃(in, away, into)<br /><br />tuck one's book under sth. <br />把书夹在[塞在]....底下<br />tuck the child up in bed <br />为孩子把被盖好(并把被边塞进垫褥底下)<br />be tucked away in a wardrobe <br />被藏在衣柜里<br />tuck away both steak and chicken <br />大嚼牛排和鸡肉<br />The bird tucked its head under its wing. <br />鸟把头缩进翅膀下。<br />T-him up! <br />勒死他!<br /><br />fairytale         <br />adj.<br />童话式的<br /><br />童话中才有的<br /><br />优美无比的
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/201206#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 07 Jun 2008 20:26:55 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/201206</link>
        <guid>http://myoldman.javaeye.com/blog/201206</guid>
      </item>
      <item>
        <title>Zend Framework编码规则</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/199118" style="color:red;">http://myoldman.javaeye.com/blog/199118</a>&nbsp;
          发表时间: 2008年06月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          B.2. PHP File 文件格式 <br />B.2.1.  常规 <br />对于只包含有 PHP 代码的文件，结束标志（"?>"）是不允许存在的，PHP自身不需要（"?>"）, 这样做, 可以防止它的末尾的被意外地注入空白并显示输出。 <br /><br />重要： 由 __HALT_COMPILER() 允许的任意的二进制代码的内容被 Zend Framework PHP 文件或由它们产生的文件禁止。这个功能的使用只对特殊的安装脚本开放。 <br /><br />B.2.2.  缩进 <br />使用四个空格的缩进，而不使用制表符 TAB 。<br /><br />B.2.3.  行的最大长度 <br />一行 80 字符以内是比较合适, 长点也可以, 但最多为 120 个字符。 <br /><br />B.2.4.  行结束标志 <br />行结束标志只能是标准的 unix 文本文件的换行，换行符在文件中表示为 10，或16进制的 0x0A。 <br /><br />不要使用 Macintosh 电脑的回车如（0x0D）。<br /><br />不要使用 Windows 电脑的回车换行组合如（0x0D,0x0A）。<br /><br />B.3.  命名约定 <br />B.3.1.  类 <br />Zend Framework 的类命名总是对应于其所属文件的目录结构的，Zend Framework 的根目录是 “Zend/”，所有的类在其下按等级存放。 <br /><br />类名只允许有字母数字字符，但不鼓励使用数字。下划线只允许做路径分隔符，例如 Zend/Db/Table.php 文件里对应的类名称是 Zend_Db_Table。 <br /><br />如果类名包含多个单词，每个单词的第一个字母必须大写，连续的大写是不允许的，例如 “Zend_PDF” 是不允许的，而 "Zend_Pdf" 是可接受的。 <br /><br />由 Zend 或其参与 Zend Framework 项目的伙伴公司发行的类必须以 "Zend_" 开头并且必须按等级放在 "Zend/"目录下。 <br /><br />可接受的类名的例子： <br /><br /><br />Zend_DbZend_ViewZend_View_Helper<br />重要： 最终用户写的代码，不要以 "Zend_" 开头。 <br /><br />B.3.2.  接口 <br />接口类也必须遵循同样的约定（如上所述），但必须以 "Interface" 结尾，比如这些例子： <br /><br /><br />Zend_Log_Adapter_InterfaceZend_Controller_Dispatcher_Interface<br /><br />B.3.3.  文件名 <br />对于其它文件，只有字母数字字符、下划线和短横线（"-"）可用，空格是不允许的。 <br /><br />包含任何 PHP 代码的任何文件必须以 ".php" 扩展名结尾。这些例子给出可接受的文件名，它们包含的类名都在上述章节的例子中： <br /><br /><br />Zend/Db.phpZend/Controller/Front.phpZend/View/Helper/FormRadio.php<br />文件名必须遵循上述的对应类名的规则。 <br /><br />B.3.4.  函数和方法 <br />函数名只包含字母数字字符，但不鼓励使用数字，下划线是不允许的。 <br /><br />函数名总是以小写开头，当函数名包含多个单词，每个子的首字母必须大写，这就是所谓的 “驼峰” 格式。 <br /><br />我们鼓励使用冗长的名字，这样容易理解代码。 <br /><br />这些是可接受的函数名的例子： <br /><br /><br />filterInput()getElementById()widgetFactory()<br /><br />对于面向对象编程，对象的访问器总是以 "get" 或 "set" 为前缀。当使用设计模式如 单态模式（singleton）或工厂模式（factory），方法的名字应当包含模式的名字，这样容易从名字识别设计模式。 <br /><br />在对象中的方法，声明为 "private" 或 "protected" 的， 名称的首字符必须是一个单个的下划线，这是唯一的下划线在方法名字中的用法。声明为 "public" 的从不以下划线开头。 <br /><br />全局函数 ("floating functions") 允许但不鼓励，建议把这类函数封装到静态类里。 <br /><br />B.3.5.  变量 <br />变量只包含数字字母字符，不鼓励使用数字，下划线不接受。 <br /><br />声明为 "private" 或 "protected" 的类成员变量名必须以一个单个下划线开头，这是唯一的下划线在变量名中的用法，声明为 "public" 的从不以下划线开头。 <br /><br />象函数名（见上面 3.3 节）一样，变量名总以小写字母开头并遵循“驼峰式”命名约定。 <br /><br />我们鼓励使用冗长的名字，这样容易理解代码。除非在小循环里，不鼓励使用简洁的名字如 "$i" 和 "$n" 。如果一个循环超过 20 行代码，索引的变量名必须有个具有描述意义的名字。 <br /><br />B.3.6.  常量 <br />常量包含数字字母字符和下划线，数字允许作为常量名。 <br /><br />常量名的所有字母必须大写。 <br /><br />为加强可读性，常量中的单词必须以下划线分隔，例如可以这样 EMBED_SUPPRESS_EMBED_EXCEPTION 但不许这样 EMBED_SUPPRESSEMBEDEXCEPTION。 <br /><br />常量必须通过 "const" 定义为类的成员，不鼓励使用 "define" 定义的全局常量。 <br /><br />B.4.  编码风格 <br />B.4.1. PHP 代码划分（Demarcation）<br />PHP 代码总是用完整的标准的 PHP 标签定界： <br /><br /><br />&lt;?php?><br /><br /><br />短标签（ ）是不允许的，只包含 PHP 代码的文件，不要结束标签 （参见 第 B.2.1 节 “ 常规 ”）。 <br /><br />B.4.2.  字符串 <br />B.4.2.1.  字符串文字 <br />当字符串是文字(不包含变量)，用单引号（ apostrophe ）来括起来： <br /><br /><br />$a = 'Example String';<br /><br />B.4.2.2.  包含单引号（'）的字符串文字 <br />当文字字符串包含单引号（apostrophe ）就用双引号括起来，特别在 SQL 语句中： <br /><br /><br />$sql = "SELECT `id`, `name` from `people` WHERE `name`='Fred' OR `name`='Susan'";<br />在转义单引号时，上述语法是首选的。 <br /><br />B.4.2.3.  变量替换 <br />变量替换有下面两种形式： <br /><br /><br />$greeting = "Hello $name, welcome back!";$greeting = "Hello {$name}, welcome back!";<br /><br />为保持一致，这个形式不允许： <br /><br /><br />$greeting = "Hello ${name}, welcome back!";<br /><br />B.4.2.4.  字符串连接 <br />字符串用 "." 操作符连接，在它的前后加上空格以提高可读性： <br /><br /><br />$company = 'Zend' . ' ' . 'Technologies';<br /><br />当用 "." 操作符连接字符串，代码可以分成多个行，也是为提高可读性。在这些例子中，每个连续的行应当由 whitespace 来填补，例如 "." 和 "=" 对齐： <br /><br /><br />$sql = "SELECT `id`, `name` FROM `people` "     . "WHERE `name` = 'Susan' "     . "ORDER BY `name` ASC ";<br /><br />B.4.3.  数组 <br />B.4.3.1.  数字索引数组 Numerically Indexed Arrays<br />索引不能为负数 <br /><br />建议数组索引从 0 开始。 <br /><br />当用 array 声明有索引的数组，在每个逗号的后面价格空格以提高可读性： <br /><br /><br />$sampleArray = array(1, 2, 3, 'Zend', 'Studio');<br /><br />也可以用 "array" 声明多行有索引的数组，在每个连续行的开头要用空格填补对齐： <br /><br /><br />$sampleArray = array(1, 2, 3, 'Zend', 'Studio',                     $a, $b, $c,                     56.44, $d, 500);<br /><br />B.4.3.2.  关联数组 <br />当用 声明关联数组，array 我们鼓励把代码分成多行，在每个连续行的开头用空格填补来对齐键和值： <br /><br /><br />$sampleArray = array('firstKey'  => 'firstValue',                     'secondKey' => 'secondValue');<br /><br />B.4.4.  类 <br />B.4.4.1.  类的声明 <br />用下面的约定来命名类。 <br /><br />花括号总是从类名下一行开始。 <br /><br />每个类必须有一个符合 PHPDocumentor 标准的文档块。 <br /><br />四个空格的缩进。 <br /><br />每个 PHP 文件中只有一个类。 <br /><br />放另外的代码到类里允许但不鼓励。在这些文件中，用两行空格来分隔类和其它代码。 <br /><br />这是个可接受的类的例子： <br /><br /><br />/** * Documentation Block Here */class SampleClass{    // entire content of class    // must be indented four spaces}<br /><br />B.4.4.2.  类成员变量 <br />必须用下面的变量名约定来命名类成员变量。 <br /><br />变量的声明必须在类的顶部，要先于方法的声明。 <br /><br />不允许使用 var （因为 ZF 是基于 PHP 5 的 ），要用 private、 protected 或 public。直接访问变量允许但不鼓励，最好使用访问器 （set/get）。 <br /><br />B.4.5.  函数和方法 <br />B.4.5.1.  函数和方方声明 <br />必须用下面的变量名约定来命名函数。 <br /><br />在类中的函数必须用 private、 protected 或 public 声明它们的可见性。 <br /><br />象类一样，花括号从函数名的下一行开始，函数名和括参数的圆括号中间没有空格。 <br /><br />强烈反对使用全局函数。 <br /><br />可接受的在类中的函数声明的例子： <br /><br /><br />/** * Documentation Block Here */class Foo{    /**     * Documentation Block Here     */    public function bar()    {        // entire content of function        // must be indented four spaces    }}<br /><br />注： 传址（Pass-by-reference）只在函数声明中允许： <br /><br /><br />/** * Documentation Block Here */class Foo{    /**     * Documentation Block Here     */    public function bar(&$baz)    {}}<br /><br />传址在调用时是禁止的。 <br /><br />返回值不能在圆括号中，这妨碍可读性而且如果将来方法被修改成传址方式，代码会有问题。 <br /><br /><br />/** * Documentation Block Here */class Foo{    /**     * WRONG     */    public function bar()    {        return($this->bar);    }    /**     * RIGHT     */    public function bar()    {        return $this->bar;    }}<br /><br />B.4.5.2.  函数和方法的用法 <br />函数的参数用逗号和紧接着的空格分开，下面的例子中的函数带有三个参数： <br /><br /><br />threeArguments(1, 2, 3);<br /><br />传址方式在调用的时候是禁止的，参见函数的声明一节如何正确使用函数的传址方式。 <br /><br />带有数组参数的函数，函数的调用可包括 "array" 并分成多行来提高可读性，同时，书写数组的标准仍然适用： <br /><br /><br />threeArguments(array(1, 2, 3), 2, 3);threeArguments(array(1, 2, 3, 'Zend', 'Studio',                     $a, $b, $c,                     56.44, $d, 500), 2, 3);<br /><br />B.4.6.  控制语句 <br />B.4.6.1. If / Else / Elseif<br />使用 if and elseif 的控制语句在条件语句的圆括号前后都必须有一个空格。 <br /><br />在圆括号里的条件语句，操作符必须用空格分开，鼓励使用多重圆括号以提高在复杂的条件中划分逻辑组合。 <br /><br />前花括号必须和条件语句在同一行，后花括号单独在最后一行，其中的内容用四个空格缩进。 <br /><br /><br />if ($a != 2) {    $a = 2;}<br /><br />下面的例子示例 "if" 语句， 包括 "elseif" 或 "else" 的格式约定： <br /><br /><br />if ($a != 2) {    $a = 2;} else {   $a = 7;}if ($a != 2) {    $a = 2;} elseif ($a == 3) {   $a = 4;} else {   $a = 7;}<br />在有些情况下， PHP 允许这些语句不用花括号，但在 ZF 代码标准里，它们（"if"、 "elseif" 或 "else" 语句）必须使用花括号。 <br /><br />"elseif" 是允许的但强烈不鼓励，我们支持 "else if" 组合。 <br /><br />B.4.6.2. Switch<br />在 "switch" 结构里的控制语句在条件语句的圆括号前后必须都有一个单个的空格。 <br /><br />"switch" 里的代码必须有四个空格缩进，在"case"里的代码再缩进四个空格。 <br /><br /><br />switch ($numPeople) {    case 1:        break;    case 2:        break;    default:        break;}<br />switch 语句中必须有 default。 <br /><br />注： 有时候，在 falls through 到下个 case 的 case 语句中不写 break or return 很有用。为了区别于 bug，任何 case 语句中，所有不写 break or return 的地方必须有 "// break intentionally omitted" 这样的注释。 <br /><br />B.4.7.  注释文档 <br />B.4.7.1.  格式 <br />所有文档块 ("docblocks") 必须和 phpDocumentor 格式兼容，phpDocumentor 格式的描述超出了本文档的范围，关于它的详情，参考：http://phpdoc.org/。 <br /><br />所有 Zend Framework 或和它一起工作的源代码必须在每个文件的顶部包含文件级 （"file-level"）的 docblock ，在每个类的顶部放置一个 "class-level" 的 docblock。下面是一些例子： <br /><br />B.4.7.2.  文件 <br />每个包含 PHP 代码的文件必须至少在文件顶部包含这些 phpDocumentor 标签： <br /><br /><br />/** * 文件的简短描述 * * 文件的详细描述（如果有的话）... ... * * LICENSE: 一些 license 信息 * * @copyright  2005 Zend Technologies * @license    http://www.zend.com/license/3_0.txt   PHP License 3.0 * @version    $Id:$ * @link       http://dev.zend.com/package/PackageName * @since      File available since Release 1.2.0*/<br /><br />B.4.7.3.  类 <br />每个类必须至少包含这些 phpDocumentor 标签： <br /><br /><br />/** * 类的简述 * * 类的详细描述 （如果有的话）... ... * * @copyright  2005 Zend Technologies * @license    http://www.zend.com/license/3_0.txt   PHP License 3.0 * @version    Release: @package_version@ * @link       http://dev.zend.com/package/PackageName * @since      Class available since Release 1.2.0 * @deprecated Class deprecated in Release 2.0.0 */<br /><br />B.4.7.4.  函数 <br />每个函数，包括对象方法，必须有最少包含下列内容的文档块（docblock）： <br /><br />函数的描述 <br /><br />所有参数 <br /><br />所有可能的返回值 <br /><br /><br />因为访问级已经通过 "public"、 "private" 或 "protected" 声明， 不需要使用 "@access"。 <br /><br />如果函数/方法抛出一个异常，使用 @throws： <br /><br /><br />@throws exceptionclass [description]
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/199118#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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, 01 Jun 2008 10:38:42 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/199118</link>
        <guid>http://myoldman.javaeye.com/blog/199118</guid>
      </item>
      <item>
        <title>php学习之从数据库生成Propel schema.xml</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/199081" style="color:red;">http://myoldman.javaeye.com/blog/199081</a>&nbsp;
          发表时间: 2008年05月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          教训1，不要把php装在带空格的目录中。<br />1.建立一个目录，名字叫dinner，然后创建一个build.properties文件内容如下<br />build.properties <br />propel.project = legacyapp<br />propel.database = mysql<br />propel.database.url = mysql://root@localhost/legacyapp<br />2.进入1中的目录运行creole target<br />propel-gen .\ creole<br />3.查看生成的schema.xml文件是否符合需要。<br />4.运行propel-gen ./生成class文件。<br />该过程中需要把生成的 schema.xml中的onDelete="RESTRICT"中的RESTRICT改成小写。<br />5.设置include_path<br />有两种方法<br />在php.ini中设置。<br />在初始化init.php中设置.
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/199081#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 31 May 2008 23:44:49 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/199081</link>
        <guid>http://myoldman.javaeye.com/blog/199081</guid>
      </item>
      <item>
        <title>php学习之安装Propel</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/199067" style="color:red;">http://myoldman.javaeye.com/blog/199067</a>&nbsp;
          发表时间: 2008年05月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.首先是安装PEAR<br />执行安装目录下的go-pear.bat<br />如果使用beta or RC 的版本可以利用如下命令<br />$> pear config-set preferred_state beta<br />修改preferred_state数据<br />2.安装Phing<br />$> pear channel-discover pear.phing.info<br />$> pear install phing/phing<br />3.安装Creole<br />$> pear channel-discover pear.phpdb.org<br />$> pear install phpdb/creole<br />$> pear install phpdb/jargon<br />4.安装Propel<br />$> pear install phpdb/propel_generator<br />$> pear install phpdb/propel_runtime<br />5.关闭下列php.ini选项<br />ze1_compatibility_mode Off  <br />magic_quotes_gpc Off  <br />magic_quotes_sybase Off<br />至此安装完毕<br />6.index.php中加入<br />require_once 'propel/Propel.php';<br />7.安装pear log framework<br />pear install Log
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/199067#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 31 May 2008 22:44:34 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/199067</link>
        <guid>http://myoldman.javaeye.com/blog/199067</guid>
      </item>
      <item>
        <title>了解ECShop的文件架构</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/198590" style="color:red;">http://myoldman.javaeye.com/blog/198590</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul><li>Javascript代码是区分大小写的(case-sensitive)</li><li>===全等于(值相等,数据类型也相等)</li>x===y<br />如果x等于整数2,y为字符串"2",<br />则x===y不成立<li></li></ul><br />zend 是php的创始公司.<br /> <br /><br />模板使用简易说明<br /><br /><br />以下为引用的内容：<br />一、        模板系统介绍<br />Ecshop模板系统使用我们自行研发的模板控制系统和著名的PHP开源模板程序Smarty组合而成。为了方便用户开发模板，还使用了Dreamweaver的模板和库的功能<br />Smarty中文手册：http://man.chinaunix.net/develop ... -docs-zh-CN/manual/<br /><br />二、模板设计原则<br />二、模板系统 文件结构<br />Ecshop根目录/<br />        |<br />        |->其它目录<br />        |->themes<br />                |->例:default (模板项目目录)<br />                                |->images                             (模板图片目录)<br />                                |->library                      (模板库目录)<br />                                |-screenshot.png                   (模板预览图)<br />                                |-style.css                                (模板所使用样式表)<br />                                |-article.dwt                        (阅读文章)<br />                                |-article_cat.dwt                (文章列表)<br />                                |-category.dwt                        (分类列表)<br />                                |-compare.dwt                        (商品比较)<br />                                |-gallery.dwt                        (商品图片)<br />                                |-goods.dwt                        (商品)<br />                                |-index.dwt                        (商城首页)<br />                                |-respond.dwt                        (支付)<br />                                |-secarch_result.dwt        (搜索结果)<br />                                |-shopping_flow.dwt        (购物流程)<br />                                |-snatch.dwt                        (夺宝奇兵)<br />                                |-user.dwt                                (用户中心) <br /><br /> <br /><br />library 说明<br /><br />以下为引用的内容：<br />articles.lbi - 文章列表 <br />article_info.lbi - 文章内容 <br />article_list.lbi - 文章列表 <br />best_goods.lbi - 精品推荐 <br />bought_goods.lbi - 购买过此商品的人购买过哪些商品 <br />brand_goods.lbi - 品牌的商品 <br />cart.lbi - 购物车 <br />cart_view.lbi - 查看购物车 <br />category_tree.lbi - 商品分类树 <br />cat_goods.lbi - 分类下的商品 <br />comments.lbi - 用户评论 <br />comment_form.lbi - 发表评论的表单 <br />consignee.lbi - 收货人信息 <br />fittings.lbi - 相关配件 <br />footer.lbi - 页脚 <br />gallery.lbi - 商品相册 <br />goods_detail.lbi - 商品详情 <br />goods_info.lbi - 商品基本信息 <br />goods_list.lbi - 商品列表 <br />help.lbi - 帮助内容 <br />history.lbi - 历史记录 <br />hot_goods.lbi - 热卖商品 <br />invoice_query.lbi - 发货单查询 <br />member.lbi - 会员登录区 <br />member_info.lbi - 会员信息 <br />nav_main.lbi - 主导航 <br />new_goods.lbi - 新品上架 <br />order_confirm.lbi - 订单确认 <br />order_detail.lbi - 订单详情 <br />order_view.lbi - 订单信息 <br />package_card.lbi - 包装和贺卡 <br />pages.lbi - 列表分页 <br />page_top.lbi - 页面顶部 <br />payment.lbi - 支付方式 <br />promotion.lbi - 促销商品 <br />properties.lbi - 商品属性 <br />register_login.lbi - 购物流程登录和注册 <br />related_goods.lbi - 相关商品 <br />search_advanced.lbi - 高级搜索表单 <br />search_form.lbi - 搜索表单 <br />search_result.lbi - 搜索结果 <br />shipping.lbi - 配送方式 <br />signin.lbi - 会员登录表单 <br />snatch_bid.lbi - 夺宝奇兵出价表单 <br />snatch_goods.lbi - 夺宝奇兵活动的商品 <br />snatch_list.lbi - 夺宝奇兵活动列表 <br />snatch_price.lbi - 夺宝奇兵价格列表 <br />snatch_result.lbi - 夺宝奇兵活动结果 <br />top10.lbi - 销售排行 <br />ur_here.lbi - 当前位置 <br />user_address.lbi - 会员中心收货人列表 <br />user_address_add.lbi - 会员中心添加收货人 <br />user_booking.lbi - 会员中心用户缺货登记 <br />user_booking_add.lbi - 会员中心用户添加缺货登记 <br />user_collect.lbi - 会员中心用户收藏夹 <br />user_forgetpassword.lbi - 会员中心找回密码 <br /><br /><br /> <br /><br />PHP处理页的说明<br /><br />以下为引用的内容：<br />\affiche.php:  广告处理文件<br />\ajax.php:  <br />\article.php:  文章内容<br />\article_cat.php:  文章分类<br />\category.php:  商品分类<br />\compare.php:  商品比较程序<br />\feed.php:  RSS Feed 生成程序<br />\flow.php:  购物流程 <br />\gallery.php:  商品相册<br />\goods.php:  商品详情<br />\index.php:  首页文件<br />\receive.php:  处理收回确认的页面 <br />\respond.php:  支付响应页面 <br />\search.php:  搜索程序<br />\snatch.php:  <br />\user.php:  会员中心<br />\admin\admin_logs.php:  记录管理日志文件<br />\admin\ads.php:  广告管理程序<br />\admin\ad_position.php:  广告位置管理程序<br />\admin\area_manage.php:  地区列表管理文件<br />\admin\article.php:  <br />\admin\articlecat.php:  <br />\admin\attribute.php:  属性规格管理<br />\admin\bonus.php:  红包的处理文件<br />\admin\bonus_type.php:  红包类型的处理<br />\admin\brand.php:  品牌管理<br />\admin\card.php:  贺卡管理程序<br />\admin\category.php:  商品分类管理程序<br />\admin\comment_manage.php:  用户评论管理文件<br />\admin\convert.php:  转换程序<br />\admin\database.php:  <br />\admin\flow_stats.php:  流量统计<br />\admin\friend_link.php:  友情链接管理<br />\admin\get_password.php:  管理员新密码<br />\admin\gift.php:  管理中心赠品管理<br />\admin\goods.php:  商品管理程序<br />\admin\goods_booking.php:  缺货处理管理程序<br />\admin\goods_type.php:  商品类型管理程序<br />\admin\guest_stats.php:  客户统计<br />\admin\help.php:  管理中心帮助信息<br />\admin\index.php:  控制台首页<br />\admin\integrate.php:  第三方程序会员数据整合插件管理程序<br />\admin\mail_template.php:  管理中心模版管理程序<br />\admin\message.php:  <br />\admin\order.php:  订单管理<br />\admin\order_stats.php:  订单统计<br />\admin\pack.php:  包装管理程序<br />\admin\payment.php:  支付方式管理程序<br />\admin\picture_batch.php:  图片批量处理程序<br />\admin\privilege.php:  管理员信息以及权限管理<br />\admin\repay.php:  <br />\admin\sale_general.php:  销售概况<br />\admin\sale_list.php:  销售明细列表文件<br />\admin\sale_order.php:  商品销售排行<br />\admin\shipping.php:  配送方式管理程序<br />\admin\shipping_area.php:  配送区域管理程序<br />\admin\shophelp.php:  <br />\admin\shopinfo.php:  <br />\admin\shop_config.php:  管理中心商店设置 <br />\admin\sitemap.php:  站点地图生成程序<br />\admin\snatch.php:  <br />\admin\sql.php:  会员管理程序<br />\admin\template.php:  管理中心模版管理程序<br />\admin\users.php:  会员管理程序<br />\admin\users_order.php:  会员排行统计文件<br />\admin\user_msg.php:  客户留言<br />\admin\user_rank.php:  会员等级管理程序<br />\admin\visit_sold.php:  访问购买比例<br />\admin\vote.php:   调查管理程序<br />\admin\includes\cls_exchange.php:  <br />\admin\includes\cls_google_sitemap.php:  Google sitemap 类<br />\admin\includes\cls_phpzip.php:  ZIP 处理类<br />\admin\includes\init.php:  管理中心公用文件<br />\admin\includes\lib_ajax.php:  管理中心用于Ajax的类库<br />\admin\includes\lib_image.php:  管理中心图片处理函数库<br />\admin\includes\lib_main.php:  管理中心公用函数库<br />\admin\includes\lib_report.php:  报表统计函数文件<br />\admin\includes\lib_template.php:  管理中心模版相关公用函数库<br />\admin\js\editzone.js(2):  编辑区脚本类<br />\admin\js\listzone.js(2):  列表脚本类<br />\admin\js\region.js(2):  公用脚本函数库<br />\admin\js\selectzone.js(2):  select脚本类<br />\admin\js\utils.js(2):  公用脚本函数库<br />\admin\js\validator.js(2):  表单验证类<br />\includes\cls_captcha.php:  验证码图片类<br />\includes\cls_ecshop.php:  基础类<br />\includes\cls_ecshop.php(56):      密码编译方法;<br />\includes\cls_rss.php:  RSS 类<br />\includes\cls_smtp.php:  SMTP 邮件类<br />\includes\inc_constant.php:  常量<br />\includes\init.php:  前台公用文件<br />\includes\lib_common.php:  公用函数库<br />\includes\lib_goodscat.php:  前台公用函数库<br />\includes\lib_insert.php:  动态内容函数库<br />\includes\lib_main.php:  前台公用函数库<br />\includes\lib_payment.php:  支付接口函数库<br />\includes\iconv\cls_iconv.php:  字符集转换类<br />\includes\ip\cls_ip.php:  IP 归属地查询类<br />\includes\modules\integrates\discuz.php:  会员数据处理类<br />\includes\modules\integrates\ecshop.php:  会员数据处理类<br />\includes\modules\integrates\molyx.php:  会员数据处理类(MolyX)<br />\includes\modules\integrates\phpwind.php:  会员数据处理类<br />\includes\modules\integrates\vbb.php:  会员数据处理类(VBB)<br />\includes\modules\payment\alipay.php:  支付宝插件<br />\includes\modules\payment\bank.php:  银行汇款（转帐）插件<br />\includes\modules\payment\chinabank.php:  快钱插件<br />\includes\modules\payment\cod.php:  货到付款插件<br />\includes\modules\payment\kuaiqian.php:  快钱插件<br />\includes\modules\payment\paypalcn.php:  贝宝插件<br />\includes\modules\payment\post.php:  邮局汇款插件<br />\includes\modules\shipping\cac.php:  上门取货插件<br />\includes\modules\shipping\ems.php:  EMS插件<br />\includes\modules\shipping\express.php:  城际快递插件<br />\includes\modules\shipping\flat.php:  邮政包裹插件<br />\includes\modules\shipping\post_express.php:  邮政包裹插件<br />\includes\modules\shipping\post_mail.php:  邮局平邮插件<br />\includes\modules\shipping\sf_express.php:  顺丰速运 配送方式插件<br />\includes\modules\shipping\sto_express.php:  申通快递 配送方式插件  <br /><br /><br />本篇文章来源于 站长中国 转载请以链接形式注明出处 网址：http://www.zzchn.com/discuz/ecshop/20070928/49425.shtml
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/198590#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 11:21:59 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/198590</link>
        <guid>http://myoldman.javaeye.com/blog/198590</guid>
      </item>
      <item>
        <title>在windows上用apahce2.2和php5.2安装ecshop</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/197205" style="color:red;">http://myoldman.javaeye.com/blog/197205</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>软件准备<br />apache 2.2.x for windows<br />php 5.2.x for windows<br />ZendOptimizer-3.3.0a for windows<br />ucenter<br />ecshop <br />开始安装<br />1.安装apache2.2<br />2.安装php5.2 for windows 在安装过程中选择需要集成的web server为apache2.2.x并且选择正确的apache安装路径.<br />3.配置apahce2.2.x</p>
<ul>
<li>配置虚拟目录</li>
修改httpd.conf<br />去掉如下的注释<br /># User home directories<br />Include conf/extra/httpd-userdir.conf<br />修改 conf/extra/httpd-userdir.conf<br />添加如下的虚拟目录配置<br />Alias /ucenter/ "I:/UCenter_1.0.0_SC_GBK/upload/" <br />&lt;Directory "I:/UCenter_1.0.0_SC_GBK/upload/"&gt;<br />AllowOverride None<br />Options None<br />Order allow,deny<br />Allow from all<br />&lt;/Directory&gt;<br />Alias /ecshop/ "I:/ecshop.v2.6.0_GBK_build0504/upload/" <br />&lt;Directory "I:/ecshop.v2.6.0_GBK_build0504/upload/"&gt;<br />AllowOverride None<br />Options None<br />Order allow,deny<br />Allow from all<br />&lt;/Directory&gt;
<li>添加index.php默认页面支持</li>
&lt;IfModule dir_module&gt;<br />DirectoryIndex index.html index.php<br />&lt;/IfModule&gt;<br />
</ul>
<p><br />4.安装zend optimizer<br />安装过程中需要注意选择apache和php的安装路径。<br />5.配置php.ini</p>
<ul>
<li>添加必要extension</li>
extension=php_gd2.dll<br />extension=php_mbstring.dll<br />extension=php_mysql.dll
<li>修改short_open_tag = On</li>
该选项必须修改，否则运行ucenter会报错。
<li>拷贝php安装路径/libmysql.dll 到c:\windows\system32目录</li>
这步应该可以不用做，但是实际上如果不错这一步的话会出现加载mysql驱动异常的错误。<br />所以还是做一下<br />
</ul>
<p><br />6.安装ucenter<br />打开http://localhost/ucenter/install/index.php<br />按照提示开始安装ucenter<br />详细的安装过程请参考<br />http://www.discuz.net/thread-897809-1-1.html<br />7.安装ecshop<br />从ucenter后台的应用管理中安装ecshop<br />截图如下<img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot.jpg" alt="" /> </p>
<p><img src="http://www.javaeye.com/upload/attachment/25556/689f74e5-7ab2-3b35-91f6-1c85a0e3ef00-thumb.jpg?1211809392" height="99" alt="" width="200" /> </p>
<p>然后按照页面提示安装ecshop</p>
<p>详细过程请参考</p>
<p><a href="http://www.discuz.net/thread-898071-1-1.html" target="_blank">http://www.discuz.net/thread-898071-1-1.html</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/197205#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 21:02:28 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/197205</link>
        <guid>http://myoldman.javaeye.com/blog/197205</guid>
      </item>
      <item>
        <title>struts2与jpa(hibernate实现)整合使用过程中碰到的一个匪夷所思的问题.</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/191343" style="color:red;">http://myoldman.javaeye.com/blog/191343</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.首先简要介绍一下出现的问题的环境<br />jdk1.6+strut2.0.11.1+Spring2.5+hibernate3.2.6.ga<br />使用了SpringOpenEntityManagerInViewFilter作为lazyloading.<br />2.问题出现的步骤和相关代码<br />主要问题:在action的某个方法中执行完添加数据的操作(insert)后返回success后跳转到添加页面后莫名其妙的又执行了一个update操作,把我插入数据库的数据给修改了.<br />代码如下<br />进入添加页面前的action方法<br /><pre name="code" class="java">
	public String contractorsaSignup() throws Exception
	{
		if (apparelhrContractor == null) {
			apparelhrContractor = new ApparelhrContractor();
			apparelhrContractor.setContractorTitle("test");
			apparelhrContractor.setContractorDescription("test");
			apparelhrContractor.setRegistrationDate(Globals.getCurrentSqlDate());
			apparelhrContractor.setPostDate(apparelhrContractor.getRegistrationDate());
		}
		return SUCCESS;		
	}
</pre><br />插入数据库数据的action方法<br /><pre name="code" class="java">
	public String contractorsaCreate() throws Exception {
		if (apparelhrContractor != null) {
			apparelhrContractor.setContractorTitle("");
			apparelhrContractor.setContractorDescription("");
			apparelhrContractorService.addApparelhrContractor(apparelhrContractor);
			String resultMessage = getText("contractorsa.success");
			addActionMessage(resultMessage);
		}
		return SUCCESS;
	}
</pre><br />struts.xml配置<br /><pre name="code" class="java">
		&lt;action name="*Front" class="contractorAction" method="{1}" >
			&lt;result>/contractorsaSignup.jsp&lt;/result>
		&lt;/action>
</pre><br />以上两个action方法都跳转到同一个页面contractorsaSignup.jsp<br />我的本意是想把页面提交上来数据中的ContractorTitle和ContractorDescription字段人为清空.<br />结果执行完insert操作跳转到contractorsaSignup.jsp页面后又把已经清空额ContractorTitle,ContractorDescription数据给update回去了.<br />后台的log输出如下<br /><pre name="code" class="java">
Hibernate: insert into apparelhr_contractor (city, company_brief, company_name, contact_persion, contractor_description, contractor_title, country, email, mobile, post_date, registration_date, service_offered, street, suburb, telephone) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2008-5-9 11:12:49 com.opensymphony.xwork2.interceptor.TimerInterceptor doLog
信息: Executed action [/include/contractorSubMenu!execute] took 16 ms.
2008-5-9 11:12:49 com.opensymphony.xwork2.interceptor.TimerInterceptor doLog
信息: Executed action [//contractorsaCreateFront!contractorsaCreate] took 828 ms.
Hibernate: select apparelhrl0_.link_id as link1_6_, apparelhrl0_.content as content6_, apparelhrl0_.create_date as create3_6_, apparelhrl0_.sequence as sequence6_, apparelhrl0_.title as title6_, apparelhrl0_.url as url6_ from apparelhr_link apparelhrl0_ order by apparelhrl0_.sequence
Hibernate: update apparelhr_contractor set city=?, company_brief=?, company_name=?, contact_persion=?, contractor_description=?, contractor_title=?, country=?, email=?, mobile=?, post_date=?, registration_date=?, service_offered=?, street=?, suburb=?, telephone=? where contractor_id=?
</pre><br />大家可以看到执行完insert回到contractorsaSignup.jsp后又执行了个update语句.<br />但是如果我把<br /><pre name="code" class="java">apparelhrContractor.setContractorTitle("");
apparelhrContractor.setContractorDescription("");</pre>给去掉就不会又update语句出现了.<br />实在是不知道为什么会出现这种奇怪现象,还请兄弟们给指点指点.
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/191343#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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>Fri, 09 May 2008 11:12:35 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/191343</link>
        <guid>http://myoldman.javaeye.com/blog/191343</guid>
      </item>
      <item>
        <title>英语学习20080430</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/191129" style="color:red;">http://myoldman.javaeye.com/blog/191129</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          consequence<br />结果， 后果；【数】后承；【逻】结论<br /><br />重要（性）； 重大意义<br />consider the consequences<br />考虑后果<br />a person of consequence<br />举足轻重的人<br /><br />philosophy      <br />n.<br /><br />哲学<br /><br />哲理<br /><br />人生观<br />tolerant        <br />adj.<br /><br />忍受的; 宽大的, 宽容的<br /><br />apparently<br />显然；似乎<br /><br />sole 3 <br /><br />仅有的；独一无二的；唯一的<br /><br />proof         加入生词本<br />n.<br /><br />证明; 证据;【律】(口头或书面)证词; 物证<br /><br />考验; 验证<br /><br />试管<br /><br />【刷】校样, 印样<br /><br />(酒的)标准酒精度<br /><br />(火器或爆炸物的)试验(场所)<br /><br />(测定原料品质等的)耐力, 坚牢程度, 不贯穿性<br /><br />【摄】样片, 样张<br /><br />【数】证明, 证法<br /><br />[苏]审问<br />be above[below] proof<br />合乎[不合乎]标准<br />be capable of proof<br />可经验证, 能被证明<br />be full proof th...<br />充分证明, 是... 的充分证明<br />give proof of<br />证明, 提供...的证据<br />require proof(s) of a statement<br />要求对陈述提供证据<br />The new product has stood a severe proof .<br />新产品经受了严格的考验。<br /><br />习惯用语<br />    artist's proof 雕版的初印待校稿<br />    foundry proof 最后校样, 清样<br />    galley proof 长条校样<br />    give proof on 举例证明<br />    in proof of 作...的证据<br />    press proof 清样, 机样<br />    put to the proof 考验, 验证<br />    stand the proof 经住考验<br />    The proof of the pudding is in the eating. 布丁好坏一吃即知; 空谈不如实验。<br />    proof against 能防....; 能耐...; 能抗...<br />    proof before letters (标题未上版之前印出的)校样<br />    proof positive 铁证<br />经的起..的<br /><br />subtle<br /><br />精细[巧]的; 敏锐[感]的, 有辨别力的<br /><br />微妙的, 难于捉摸[形容]的, 难解的<br /><br />狡猾的, 阴险的<br /><br />simultaneously<br /><br />arbitrary<br /><br />sibling<br /><br />with regard to<br /><br />inordinate<br />discrete<br />portion<br />encompasses<br /><br />potential<br />pristine<br />contend<br />wary<br />casual<br />tame<br />constitutes<br />sake<br />clarity<br />Underneath <br />Terminology<br />refactor<br />unsolicated
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/191129#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 08 May 2008 16:34:38 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/191129</link>
        <guid>http://myoldman.javaeye.com/blog/191129</guid>
      </item>
      <item>
        <title>每日英语词汇-20080326</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/182914" style="color:red;">http://myoldman.javaeye.com/blog/182914</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          concise         <br />adj.<br />简洁的；简明的<br /><br />focussed<br />Adjective<br />being in focus or brought into focus(被关注的)<br /><br />concern       <br />vt.<br />涉及, 关系到<br />n.<br />(利害)关系, 关心, 关注, 关注, 所关心的事<br /><br />Inventory <br />库存<br /><br />arbitrary <br />任意的类型<br /><br />arises 出现<br /><br />funnel <br /><br />insidious <br />(形) 隐伏的, 狡猾的, 阴险的<br />sufficient <br />充足的。<br />explicitly<br />(副) 明白地; 明确地
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/182914#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 14:46:14 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/182914</link>
        <guid>http://myoldman.javaeye.com/blog/182914</guid>
      </item>
      <item>
        <title>struts2实践- 结合jquery的纯客户端js表单校验</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/182911" style="color:red;">http://myoldman.javaeye.com/blog/182911</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          折腾了几天struts2框架,发现其对校验的支持不是很好,主要体现在如下几点<br />1.灵活性差<br />只有theme为xhtml和css_xhtml的时才能够启用纯客户端的js验证.<br />一般用户对页面UI表示都有一定的要求,当theme为xhtml或css_xhtml的时候会导致页面的排版和用户的UI要求不一致,而且几乎无法解决该问题.并且struts2纯js客户端的错误信息是利用动态添加一个tr来显示的.这就导致如果我想把错误和表单显示在同一行,利用struts2的客户端验证就很难做到.<br />2.默认支持的校验类型比较少.<br />struts2默认只支持比较少的几种验证类型例如<br />* required validator<br />* requiredstring validator<br />* stringlength validator<br />* regex validator<br />* email validator<br />* url validator<br />* int validator<br />* double validator<br />date和表达式验证都不支持.这给使用造成了一定的麻烦.<br />3.不支持客户端定制的js验证.<br />针对如上几点郁闷的地方,我在网上寻找了很久终于发现了一个比较好js客户端验证的框架<br />jquery-validate<br />该验证框架基于jquery这个js框架,利用jquery特性实现客户端的js校验,主要特点如下<br />1.支持基于表单类似声明式的js验证详细例子如下<br />	<pre name="code" class="java">$("#signupForm").validate({
		rules: {
			firstname: "required",
			lastname: "required",
			username: {
				required: true,
				minlength: 2
			},
			password: {
				required: true,
				minLength: 5
			},
			confirm_password: {
				required: true,
				minlength: 5,
				equalTo: "#password"
			},
			email: {
				required: true,
				email: true
			},
			topic: {
				required: "#newsletter:checked",
				minLength: 2
			},
			agree: "required"
		},
		messages: {
			firstname: "Please enter your firstname",
			lastname: "Please enter your lastname",
			username: {
				required: "Please enter a username",
				minLength: "Your username must consist of at least 2 characters"
			},
			password: {
				required: "Please provide a password",
				minLength: "Your password must be at least 5 characters long"
			},
			confirm_password: {
				required: "Please provide a password",
				minLength: "Your password must be at least 5 characters long",
				equalTo: "Please enter the same password as above"
			},
			email: "Please enter a valid email address",
			agree: "Please accept our policy"
		}
	});
</pre><br />2.内置多种基本校验的类型(包括与ajax结合的服务器断校验)<br />required,remote(ajax服务器端校验器),minlength,maxlength,rangelength,min,<br />max,range,email,url,date,,dateISO,dateDE,number,numberDE,digits,creditcard<br />,accept,equalTo<br />3.支持自定义校验类型.<br />可以通过<br />	$.validator.addMethod("phone", function(value) {<br />		return validatePhone(value);<br />	}, 'Please enter correct format for referee phone!');<br />	添加自己的校验器<br />4.支持多种校验器的声明方式.<br />1).利用函数声明<br />请参考1点<br />2).结合控件属性声明<br />&lt;input  type="radio" id="gender_male" value="m" name="gender" validate="required:true" /><br />3).结合控件的class属性声明<br />&lt;textarea id="ccomment" name="comment" class="required"><br />这几种声明方式可以按照实际需要结合使用大大提高了灵活性.<br /><br />附件是我利用struts2框架自己的form标签扩展的一个form标记的ftl模板,主要用于生成基于jquery的客户端校验标记,做的比较粗糙,重在抛砖引玉.
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/182911#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 14:45:28 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/182911</link>
        <guid>http://myoldman.javaeye.com/blog/182911</guid>
      </item>
      <item>
        <title>测试驱动开发与前瞻性思维</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/181686" style="color:red;">http://myoldman.javaeye.com/blog/181686</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于以前做的项目都是采用后发制人式的思维,碰到需要什么了再写什么代码.<br />比如说一个CRUD,一般都是先写出一个简单的框框,碰到需要分页了就加入分页组件,碰到需要校验了就加入校验的支持.<br />这样的写法虽然说看起来比较敏捷,但是如果几个项目下来还是采用这样的方法,就感觉写程序的效率上有一个瓶颈,速度上去不,速度快了bug又很多.<br />于是这次struts2实践为了避免或者说减少以上问题.<br />1.采用project做项目计划以及wbs,把系统分解成不同的模块.<br />2.利用测试驱动的方式编写代码,定号一个service的接口后,直接先开始写service的测试用例,确定service所实现的功能.至少保证这些功能的正确性,并且在接口定义的过程中,适当的根据以往开发的经验预测一些系统前瞻性的功能需求,而不是一味想到什么做什么.<br /><br /><br />这里列出目前为止系统开发需要考虑的一些方面的内容<br />1.对于JPA,确定数据库映射的工具,至少可以从数据库生成实体类.<br />2.对于spring,确定事务配置的方法,已经依赖注入的模式(手动指定,或者autowired)<br />3.确定url和对应的action如何映射.<br />4.标记库的开发,已经系统需要使用到的一些常用功能的自定义标记(例如性别,yesno列表等等可以考虑封装成一个自定义的标记,这样不用每个页面都写一堆struts的tag)<br />5.加密解密模块(包括密码和某些querystring的加密解密,以及支持的加密解密的算法md,sha1,des等)<br />6.用户在线状态管理.<br />7.系统权限管理.<br />8.页面分页组件的开发.<br />9.表单校验.<br />10.测试驱动功能的实现.<br />11.ajax集成.<br />还有那些需要考虑的还请大家补充.<br />以上只是偶在实践开始阶段的一些感想,随时实践的不断进行,还有其他补充的想法,都需要记录下来.以供以后项目的需要.
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/181686#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 10:52:24 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/181686</link>
        <guid>http://myoldman.javaeye.com/blog/181686</guid>
      </item>
      <item>
        <title>struts2实践-页面分页的设计构思</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/179930" style="color:red;">http://myoldman.javaeye.com/blog/179930</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          主要的思路是后端数据查询api+action+tag的方式实现分页功能.<br />1.后端数据查询api<br />提供封装分页信息的类PageInfo(保存pageIndex,pageSize,totalRecord,querycondition等等的信息)<br />提供接收分页信息类的数据查询接口，该接口能根据分页信息类返回正确的分页结果)<br />xxxDaoTemplate.find(PageInfo pageInfo,.........)<br />2.action层<br />设计一个action接口(PagerAwareAction?)提供操作有getPager,setPager<br />提供一个默认实现了PagerAwareAction的Action，所有Action都集成自该action。<br />提供一个拦截器获取页面上调用getPager获取action对应的pagrInfo对象，根据页面提交的请求设置该对象中相应的pageIndex,pageSize等值.<br />在渲染分页tag内容前action调用setPager接口根据数据库世界返回的结果更新pageInfo以便页面上tag显示。<br />3.tag<br />根据用户的要求的分页风格显示分页结果，以及上一页下一页等等的链接。<br />可能还需要利用javascript配合实现翻页的操作。<br /><br />以上只是一些简单的想法，打算动手实现，欢迎大家拍砖。
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/179930#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Sun, 06 Apr 2008 23:22:13 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/179930</link>
        <guid>http://myoldman.javaeye.com/blog/179930</guid>
      </item>
      <item>
        <title>struts2实践-我被#号撞了一下腰</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/179926" style="color:red;">http://myoldman.javaeye.com/blog/179926</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前一段时间一直都在看struts2的文档，上周终于看完并且总结完毕了。准备开始实践了。<br />初步计划如下<br />1.利用以前用.net做过的一个项目作为原始需求，这样能更关注于struts2各种功能的实践。<br />2.框架为spring2+struts2+Jpa(Hibernate)+sitemesh<br />选择以上框架的理由如下<br />spring框架提供了良好的配置式的事务和其他java周边(例如hibernate,mail,quartz等等的集成).<br />Jpa是sun持久化方案的一个接口到时候便于替换持久层的实现。<br />用习惯了.net中的masterpage的强大功能，打算试试看sitemesh是不是很好用。<br />3.整个实践计划3周实践。<br /><br />struts2和sitemesh整合使用的过程中出现了一个小小的插曲(花费了大概3个小时的时间)<br />具体的问题如下<br />在配置完sitemesh的decoretor以后，运行首页想看看sitemesh的装饰效果，从页面上效果是相当的好，和masterpage比起来虽然没有那么灵活，但是代码量可以说是做到了最少(.net需要页面指定masterpage，sitemesh只需要在decorator.xml中配置装饰映射就ok了，还支持通配符).<br />看了一下后台运行的sql语句，发现本来应该只执行一次的sql查询居然执行了5次。<br />于是我先怀疑是不是我的decorator.xml文件中的配置有问题导致重复装饰(前后折腾了将近1.5小时发现不是)。<br />然后又是打trace又是跟踪页面请求的url，发现都是来自同一个请求，但是还是不知道原因所在。<br />最后使用了排除法，把页面上的控件一个个的添加，删除，运行测试，又经过1.5小时终于找到了，原来页面设计人员设计页面的时候在把某些td写上了background="#"，导致在需要加载background的时候有提交请求到后端去加载页面本身，导致了以上问题的发生。<br /><br />哎，郁闷啊，大好的青春就这么浪费了。
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/179926#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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, 06 Apr 2008 23:10:36 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/179926</link>
        <guid>http://myoldman.javaeye.com/blog/179926</guid>
      </item>
      <item>
        <title>看起来很美--我也谈谈java5泛型</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/177358" style="color:red;">http://myoldman.javaeye.com/blog/177358</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.泛型的概念.<br />泛型英文名为(Generic Type),从字面上就是通用化,一般化了的类型.<br />类似于类是对象的一种抽象,泛型可以说就是对类进行抽象.<br />2.泛型的语法<br /><ul><li>类型参数的形式化</li>在java5中利用&lt;E>这样的语法来定义形式化类型参数.<br /><pre name="code" class="java">
public interface List&lt;E> {
           void add(E x);
           Iterator&lt;E> iterator();
}
</pre><br />以上代码中E就代表了一个形式化类型参数<li>类型参数的实际化</li><pre name="code" class="java">
List&lt;Integer> myIntList = new LinkedList&lt;Integer>();
Integer x = myIntList.iterator().next();
</pre><br />上述代码是java5以后经常看到的声明只能放某种对象的list,以用于加强编译器的类型安全检查.<br />并且在取出list中的元素时也不需要进行强制的类型转化.<br /></ul><br />3.泛型的种类<br /><ul><li>在类中声明的泛型</li><pre name="code" class="java">
public interface List&lt;E> {
           void add(E x);
           Iterator&lt;E> iterator();
}
</pre><br />上面代码中的E就可以到作一个类来用,可以用于声明函数的参数(E x),也可以继续当作形式化类型参数传给其他泛型的声明(Iterator&lt;E>)<li>泛型化的方法</li><pre name="code" class="java">
   static &lt;T> void fromArrayToCollection(T[] a, Collection&lt;T> c){
       for (T o : a) {
           c.add(o); // correct
       }
    }
</pre><br />以上定义中的&lt;T>定义了方法的形式化类型参数,该类型参数可以和类中定义的类型参数一起使用,但是该参数只能方法体的范围类有效.<br /><pre name="code" class="java">public class TestGeneric&lt;E>
{
	public &lt;T> void testOfMethodGeneric(T t,E e)
	{
		System.out.print(t);
		System.out.print(e);
	}
}
</pre><br /></ul><br />4.通配符和继承<br /><ul><li>除了形式化类型参数的声明,其他地方都可以使用通配符.</li><pre name="code" class="java">
        List&lt;?> testList = new ArrayList&lt;String>();
	public void testOfWildCard(List&lt;?> list)
	{
		
	}
</pre><br />?的语义是表示任意的类型.List&lt;?>就表示可以接受任何类型数据的集合,但是这样用一个限制就是不能往集合中插入任何元素(除了null,因为null是所有类型的成员),因为编译器也不知道集合中的元素类型是什么.<li>通配符可以加入上下限的限制.</li>&lt;? extends Father>表示匹配所有继承自father的类型(包括father,son,grand child等).<br />&lt;? super Father>表示匹配所有Father所继承的类型(包括father,grandpa,grandma等).<li>通配符的用意</li><pre name="code" class="java">
List&lt;String> ls = new ArrayList&lt;String>(); //1
//由于定义泛型的时候并没有使用通配符,会导致编译期的类型转化错误.具体原因请看后续代码
List&lt;Object> lo = ls; //2
lo.add(new Object()); // 3
String s = ls.get(0); // 4: 试图把Object赋值给String
</pre><br />有了通配符,在泛型使用的时候对子类类继承的功能就可以扩展.<br />但是给人感觉这个可能是因为编译器处理不了,结果我们就非得要手动声明.<br /></ul><br />5.使用要点<br /><ul><li>泛型类是共享(实际上的意思就是泛型类中的形式化类型参数是与泛型类的某个实际对象绑定的,不能在泛型类的static语义的代码断中调用形式化类型参数</li><pre name="code" class="java">       
       List&lt;String> l1 = new ArrayList&lt;String>();
       List&lt;Integer> l2 = new ArrayList&lt;Integer>();
       System.out.println(l1.getClass() == l2.getClass())//true
</pre><br /><pre name="code" class="java">public class TestClient&lt;E>{
	private static E e;//编译错误提示静态不能应用非静态内容.
	private E e1;//可以通过
}</pre><br />进一步推论可以得出一个结论如下代码也是没有意义的<br />       <pre name="code" class="java">
       Collection cs = new ArrayList&lt;String>();
       //下面这句话是没有意义的从编译器得到的错误信息感觉由于
       泛型化的信息只在编译器有效,运行期被擦除了,导致运行期间根本就没有Collection&lt;String>这样一个类.
       if (cs instanceof Collection&lt;String>) { ...} // 
</pre><li>除了数组其他对象都嵌套的使用形式化类型参数定义.</li><pre name="code" class="java">List&lt;String>[] lsa = new List&lt;String>[10]; // not really allowed</pre><br />以上定义是非法的<li>Class对象的泛型化</li>java5中Class类的声明带有一个类型参数T其用途如下<br />String.class类型代表 Class&lt;String><br /><pre name="code" class="java">
Collection&lt;EmpInfo> emps=sqlUtility.select(EmpInfo.class, ”select * from emps”); 
public static &lt;T> Collection&lt;T> select(Class&lt;T> c, String sqlStatement) {
Collection&lt;T> result = new ArrayList&lt;T>();
/* run sql query using jdbc */
for ( /* iterate over jdbc results */ ) {
T item = c.newInstance();
/* use reflection and set all of item’s fields from sql results */
result.add(item);
}
return result;
}</pre><br />以上的写法实际就是简化了select方法中关于实际类的创建的部分,至少保证了类必须存在,但是在方法和字段级别还是需要利用反射来解决.<li>另外泛型的代码还支持&符号</li><pre name="code" class="java">public static &lt;T extends Object & Comparable&lt;? super T>> T max(Collection&lt;? extends T> coll)</pre><br />相当于<br /><pre name="code" class="java">
public static Comparable max(Collection coll)
public static Object max(Collection coll)
的并集
</pre><br /></ul><br />之所以去研究了一下泛型是以为在看struts2中ioc框架的源码的过程中发现有很多泛型的内容看不懂所以特地研究了一下.<br />看完了以后对于泛型总体感觉并没有说为开发带来多少便利,只是加强了对编译器类型的检查.
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/177358#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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>Fri, 28 Mar 2008 17:03:36 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/177358</link>
        <guid>http://myoldman.javaeye.com/blog/177358</guid>
      </item>
      <item>
        <title>Struts2 Architects Guide-Big Picture</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/176934" style="color:red;">http://myoldman.javaeye.com/blog/176934</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          简要处理流程<br />HttpRequest-->ActionContextCleanUp(如果使用到sitemesh)->FilterDispatcher.doFilter(调用ActionMapper)->ActionMapper.getMapping(是否需要调用action处理页面请求)-->Dispatcher.serviceAction(调用ActionProxy包装的Action代理执行action)-->ActionInvocation.invoke(调用所有的before拦截器然后调用action本身的执行方法)-->如果有preresultlistener那么执行beforeResult方法-->ActionInvocation.invoke(执行完action方法本身后会根据action方法返回的resultcode去查找对应的result)-->Render Views(JSP,ftl,etc)-->执行after拦截器-->返回response给浏览器-->如果存在AutoActionContextCleanUp,那么ActionContext推迟到AutoActionContextCleanUp清除,否则有FilterDispatcher自己清除.<br />系统中的所有对象的创建都是利用ObjectFactory实现的,该接口可以针对不同IOC实现提供不同的实现.<br />文档中有提到说ActionInvocation中实现了command模式,这点有点看不太懂,难道是迭代那些interceptor的intercept方法就是所谓的命令模式的实现,这个无非就是面向接口编程,难道命令模式本身就没什么内容?<br />该内容后续将画一个流程图或者时序图,顺便研习一下struts2和xwork的源码.<br /><img src="/images/smiles/icon_question.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/176934#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Mar 2008 16:53:45 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/176934</link>
        <guid>http://myoldman.javaeye.com/blog/176934</guid>
      </item>
      <item>
        <title>Struts2 Core Developers Guide-Cookbook</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/176915" style="color:red;">http://myoldman.javaeye.com/blog/176915</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.Handling File Uploads<br /><ul><li>采用FileUploadInterceptor实现文件上传操作.</li><li>定义struts.properties文件中的如下属性来实现一下参数的配置</li>struts.multipart.parser定义解析用户上传文件的库.<br />struts.multipart.saveDir定义用户上传文件保存的路径.<br />struts.multipart.maxSize指定上传文件的最大值设置.<br /></ul><br />2.HibernateAndSpringEnabledExecuteAndWaitInterceptor<br /><ul><li>该例子是对ExecuteAndWaitInterceptor的一个扩展</li><li>目的是为了让后台线程运行的时候可以获取到hibernate的session中的对象,感觉上和opensessioninview类似.</li><li>具体的实现类是OpenSessionExecuteAndWaitInterceptor </li><li>重新新的OpenSessionBackgroundProcess类以确保在后台线程执行的过程中,session始终不被关闭,以保证事务.</li></ul><br />3.How to validate field formats, such as a phone number<br />可以利用正则表达式实现<br /><pre name="code" class="java">
&lt;validators>
    &lt;field name="phone">
        &lt;field-validator type="regex">
            &lt;param name="expression">\([\d][\d][\d]\) [\d][\d][\d]-[\d][\d][\d][\d]&lt;/param>
            &lt;message>Phone number must be in the format (XXX) XXX-XXXX&lt;/message>
        &lt;/field-validator>
    &lt;/field>
</pre><br />4.如何在jsp页面上访问session,request等对象中的属性<br />如下<br /><pre name="code" class="java">&lt;s:property value="#application\['foo'\]"/>
&lt;s:property value="#session\['baz'\]"/></pre><br />struts2中所有的ognl的对象都默认暴露给jsp或者jstl标记库.<br />5.Value Stack Internals(值堆栈的内部实现机制)<br />Value本质上就是一个list<br />在value stack上调用[1]返回是的是从index 1开始的一个子列表,只有调用stack上的peek或者pop等方法才能返回实际stack中的实际对象.<br />举例如下,假设有一个列表包含了[model,action]<br />[0]返回CompoundRoot对象包含[model,action]<br />[1]返回CompoundRoot对象包含[action]<br />[0].toString()调用value stack上第一个存在toString()方法的对象.<br />[1].foo从调用从action stack上的第一个对象的getFoo()方法,<br />&lt;ww:property value="[0].peek()"/>不会正常工作因为sturts2会把该方法翻译为从堆栈头部开始查找有peek()方法的第一个对象.<br />在struts2中栈中的对象有<br />    *  req - the current HttpServletRequest<br />    * res - the current HttpServletResponse<br />    * stack - the current OgnlValueStack<br />    * ognl - an instance of OgnlTool<br />    * ui - a (now deprecated) instance of a ui tag renderer<br />6.OGNL<br />OGNL规则<br />假设堆栈中有两个对象foo,bar,foo是堆栈root元素,要获取堆栈中的值可以用如下语法<br />#foo.blash<br />#bar.blash<br />blash-->foo.bash(由于foo是root元素所以foo和#前缀可以省略.<br />OGNL栈在struts的实现中处于是的栈的root元素<br />value stack上存储了很多对象,但是对与ognl来说它们看起来就像只有一个对象.<br />在root元素之外struts2还存储了其他的对象例如session,request等等的对象.<br />他们之中数值的访问必须加上#session,#request等等前缀.<br />实际的树状图如下<br />        |<br />                     |--application<br />                     |<br />                     |--session<br />       context map---|<br />                     |--value stack(root)<br />                     |<br />                     |--request<br />                     |<br />                     |--parameters<br />                     |<br />                     |--attr (searches page, request, session, then application scopes)<br />                     |<br />value stack中的对象有<br />action对象.<br />7.Collections (Maps, Lists, Sets)的创建和处理<br />list: {e1,e2,e3}<br />map: #{key1:value1,key2:value2}<br />判断集合中是否有某个元素<br /><pre name="code" class="java">
&lt;s:if test="'foo' in {'foo','bar'}">
   muhahaha
&lt;/s:if>
&lt;s:else>
   boo
&lt;/s:else>

&lt;s:if test="'foo' not in {'foo','bar'}">
   muhahaha
&lt;/s:if>
&lt;s:else>
   boo
&lt;/s:else>
</pre><br />获取集合的子集<br />    *  ? - All elements matching the selection logic<br />    * ^ - Only the first element matching the selection logic<br />    * $ - Only the last element matching the selection logic<br />person.relatives.{? #this.gender == 'male'}<br />Lambda Expressions<br /><pre name="code" class="java">
&lt;s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
</pre><br />上列语句中[]以内的部分为lambda表达式,#this表示函数的参数<br />8.在页面上显示action中的bean的值<br />如果需要显示多个bean的值<br /><pre name="code" class="java">
&lt;webwork:property value="myBean"> 
&lt;!- This will call getName() on your TestBean and print it to the page -->
The name is: &lt;webwork:property value="name"/>
&lt;/webwork:property>
</pre><br />如果只需要显示单个的值<br />&lt;webwork:property value="myBean.name" /><br />9.Tabular inputs(批量输入)<br /><pre name="code" class="java">&lt;s:iterator value="cart.items" status="rowstatus">
  &lt;s:hidden name="cart.items[%{#rowstatus.index}].productId" value="%{productId}">
  &lt;s:textfield name="cart.items[%{#rowstatus.index}].qty" value="%{qty}" />
  &lt;s:textfield name="cart.items[%{#rowstatus.index}].note" value="%{note}" />
&lt;/s:iterator></pre><br />如果后台list中item的个数不确定的话可以使用XworkList来代替ArrayList.Xwork中get方法的源码如下<br /><pre name="code" class="java">        while (index >= this.size()) {
            try {
                //todo
                this.add(objectFactory.buildBean(clazz, null)); //ActionContext.getContext().getContextMap()));
            } catch (Exception e) {
                throw new XWorkException(e);
            }
        }

        return super.get(index);</pre><br />10.HTML form buttons HOWTO<br /><ul><li>Determine Which Button Was Pressed(一个form多个button多个方法)</li>cookbook中列举的例子是利用每个button的name对应一个boolean的属性来解决.<br />但是在spring+struts的例子中看好像也可以通过如下方式实现<br /><pre name="code" class="java">&lt;s:submit value="%{getText('button.label.cancel')}" name="redirect-action:index"/></pre><li>Dynamic Set of Buttons(列表中存在多个submit按钮每个按钮提交到对应的需要修改的对象)</li>前端<br /><pre name="code" class="java">&lt;form action="UpdateCart.action">
  &lt;s:iterate value="items">
    &lt;s:property value="name"> 
    &lt;input type="submit" name="delete[&lt;s:property value='id'>]" value="delete" /> &lt;br/>
  &lt;/s:iterate>
&lt;/form></pre><br />后台<br /><pre name="code" class="java"> private Map delete = new HashMap();</pre><br />提交到id将被提交到后台页面上作为key保留.<br />该技术可以用于提供批量保存的功能.<br /><br /><br /><br /><li></li></ul>
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/176915#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Mar 2008 16:12:51 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/176915</link>
        <guid>http://myoldman.javaeye.com/blog/176915</guid>
      </item>
      <item>
        <title>Struts2 Core Developers Guide-FAQ</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/176670" style="color:red;">http://myoldman.javaeye.com/blog/176670</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.What are the fundamental differences between Struts and JSF<br />Specifically, JSF is a "component" framework whereas Struts is an "action" framework.<br />总的来说,JSF,asp.net这种框架采用的是一种,类似于cs架构中的组件式,基于组建事件的编程风格.<br />而struts事基于action的框架,这里的action对于http来说应该可以理解为url,或者说是REST中的资源路径.<br />2.如何在页面上直接从流中显示图片.<br />faq中居然自己写了一个MyActionResult类实现,一看日期居然是2006-7-22,好像在struts2中可以直接通过streamresult指定contenttype为image/jpeg,image/gif来实现了.<br />3.How can we return a text string as the response<br />faq中描述可以利用streamresult在stream中加入text信息来解决.但是这个给人感觉比较奇怪.\<br />4.How can we test applications?<br />原则,尽量把一些业务逻辑代码移到facade层中,保持action类中的代码量尽量少这样就可以通过测试,facade来覆盖大部分的系统功能.<br />另外faq中推荐了一种Selenium工具来进行UI测试.<br />5.How can we test Actions<br />直接创建并且调用action对象的方法.<br />通过ActionProxyFactory包装后调用,这样可以调用测试拦截器和result的运行结果是否正确.<br />6.如何处理文件上传的请求.<br />建议的方式是采用fileuploadinterceptor,可以实现多文件上传功能<br />代码如下<br /><pre name="code" class="java">
&lt;form name="myForm" enctype="multipart/form-data">
      &lt;input type="file" name="myDoc" value="Browse File A ..." />
      &lt;input type="file" name="myDoc" value="Browse File B ..." />
      &lt;input type="file" name="myDoc" value="Browse File C ..." />
      &lt;input type="submit" />
   &lt;/form>
public void setMyDoc(File[] myDocs)
public void setMyDocContentType(String[] contentTypes)
public void setMyDocFileName(String[] fileNames)
</pre><br />7.How can we force the Action Mappings (struts.xml) to reload<br />devMode=true或者struts.configuration.xml.reload=true<br />8.如何分割struts配置文件<br /><pre name="code" class="java">
&lt;struts>
    &lt;include file="struts-default.xml"/>
    &lt;include file="config-browser.xml"/>
    &lt;package name="default" extends="struts-default">
....
    &lt;/package>
    &lt;include file="other.xml"/>
&lt;/struts>
</pre><br />可以加载单个jar文件中的struts.xml配置文件.<br />9.Parameters in configuration results<br />result中的location属性支持ognl表达式,所以可以通过其实现结果的参数化.<br /><pre name="code" class="java">
&lt;struts>
....
   &lt;package name="somePackage" namespace="/myNamespace" extends="struts-default">
      &lt;action name="myAction" class="com.project.MyAction">
         &lt;result name="success" type="redirectAction">otherAction?id=${id}&lt;/result>
         &lt;result name="back" type="redirect">${redirectURL}&lt;/result>
      &lt;/action>

      &lt;action name="otherAction" class="com.project.MyOtherAction">
         ...
      &lt;/action>      
   &lt;/package>
....
&lt;/struts>
</pre><br />不过需要对应的action方法中有getId和getRedirectURL方法.<br />10.运行时获取session<br />Map attibutes = ActionContext.getContext().getSession();<br />或者实现SessionAware并且加入servlet-config拦截器.<br />11.运行时获取request<br />HttpServletRequest request = ServletActionContext.getRequest();<br />或者实现ServletRequestAware并且加入servlet-config拦截器.<br />12.运行时获取response<br />HttpServletResponse response = ServletActionContext.getResponse()<br />或者实现ServletResponseAware并且加入servlet-config拦截器.<br />13.获取提交的request parameters<br />Map parameters = ActionContext.getContext().getParameters();<br />实现ParameterAware并且加入servlet-config拦截器.<br />14.访问action配置中定义的参数<br />直接在action中定义对应action中参数名的settermethod,或者定义setParams(Map)来实现.<br />15.Can we access an Action's Result<br />Map resultsMap = invocation.getProxy().getConfig().getResults();<br />16.How do I obtain security details (JAAS)<br />从request中获取<br /><pre name="code" class="java">
HttpServletRequest request = ServletActionContext.getRequest();
String authType = request.getAuthType();         // http or https
String user = request.getRemoteUser();           // the user principal (in string)
Principalprincipal = request.getUserPrincipal(); // get a Principal object
bool isAuth = request.isUserInRole("patrick");
</pre><br />实现PrincipalAware并且加入servlet-config拦截器<br />通过调用PrincipalProxy的同名方法实现.<br />17.如何改变页面的主题(theme)<br />&lt;saf:set name="theme" value="simple" scope="page" /><br />由于value支持ognl所以也可以写成<br />&lt;saf:set name="theme" value="%{myTheme}" scope="page" /><br />18.Why isn't our Prepare interceptor being executed<br />Prepare 拦截器最好在validation拦截器之前,否则可能被打断.<br />19.Why doesn't my setter get called ?<br />getter和setter操作的数据类型必须一直,否则ognl会忽略.<br />20.How do we repopulate controls when validation fails<br />faq中提示采用preparable接口和action标记实现,但是感觉ConversionErrorInterceptor也可以实现相同的功能<br />21.如何测试校验信息<br /><pre name="code" class="java">
public class WebLoginActionTest extends TestCase {
    
    private WebLoginAction wla;
    
    protected void setUp() throws Exception {
        wla = new WebLoginAction();
        wla.setJ_username("");
        wla.setJ_password(null);
        super.setUp();
    }
 
    public void testWebLoginActionValidation() throws ValidationException {
        ActionValidatorManager avm = ActionValidatorManagerFactory.getInstance();        
        
        avm.validate(wla,"");
        Map fieldErrors = wla.getFieldErrors();
        
        assertTrue(wla.hasErrors());
        assertEquals(2, fieldErrors.size());
        assertTrue(fieldErrors.containsKey("j_username"));
        assertTrue(fieldErrors.containsKey("j_password"));
                
        System.out.println("[errors] : " +  fieldErrors.toString());              
    }
}
</pre><br />22.为什么使用CDATA时有些消息会被忽略.<br />确保&lt;![CDATA[ 后没有空格.<br />23.如何改变页面的locale<br /><ul><li>可以通过requst_locale参数传递</li><li>可以通过action的setLocale方法实现</li></ul><br />24.如何定义全局properties文件<br />struts.custom.i18n.resources=global-messages, image-messages<br />25.How do I add I18N to a UI tag, like the textfield tag<br />如何为普通的标记添加i18n的getText支持.<br />修改controlheader模板<br /><pre name="code" class="java">
${parameters.label?html}:&lt;#t/>

&lt;#assign mm="getText('"+parameters.label?html+"')" />&lt;#t/>
${stack.findValue(mm)}:&lt;#t/>

or

${stack.findValue("getText('"+parameters.label?html+"')")}

After making the change, tags with a label attribute will use the value you set as a key.

&lt;saf:textfield label="label.firstName" name="firstName" />
</pre><br />26.Can I add I18N outside the Action's context<br />可以通过如下的标签来实现对应的properties文件的加载以便在为调用action的情况下使用resource bundle.<br /><pre name="code" class="java">
&lt;p>&lt;saf:i18n name="alternate">
    &lt;img src="&lt;saf:text name="action.logo.path"/>"
         alt="&lt;saf:text name="action.logo.alt"/>"/>
&lt;/saf:i18n>&lt;/p>
</pre><br />27.How to escape special chars in resource bundles<br />如何在resource文件中转义特殊字符<br /><pre name="code" class="java">
The special chars \', { and }:
escape ' with another '

''
	(double-single quote)
escape \ with another \
\\

	(double backslash)
enclose } with '
'}'

enclose { with '
'{'
</pre><br />28.How do I change the invalid input error message for a particular field<br />如何修改某个字段的错误信息<br />invalid.fieldvalue.user.dob=Please enter Date of Birth in the correct format.<br />29.为jsp页面添加jsp标签的支持<br />在web.xml中添加如下定义<br /><pre name="code" class="java">
&lt;servlet>
    &lt;servlet-name>jspSupportServlet&lt;/servlet-name>
    &lt;servlet-class>org.apache.struts2.views.JspSupportServlet&lt;/servlet-class>
    &lt;load-on-startup>10&lt;/load-on-startup>
&lt;/servlet>
</pre><br />30.Can an action tag run another method apart from the default execute method<br />可以采用action别名来实现该需求.
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/176670#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Mar 2008 11:13:39 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/176670</link>
        <guid>http://myoldman.javaeye.com/blog/176670</guid>
      </item>
      <item>
        <title>Struts2 Core Developers Guide-Type Conversion</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/175897" style="color:red;">http://myoldman.javaeye.com/blog/175897</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.Overview<br />类型转化在struts2中的主要作用是把页面上符合ognl定义的控件的名字的输入值映射到action的相应字段中.以删除在servlet时代需要经常做的request.getParameter操作,并且利用ognl表达式甚至可以直接把页面上字段的值直接注入到action声明的对象中,是这个过程能够自动化,使得代码更加的简洁,更OO,可以说hibernate是处理对象到数据库的双向转化,struts2就是处理对象到html页面的双向转化.<br />2.Working Sample<br /><ul><li>Action以及字段级别的类型转化</li>在action对应的目录下定义ActionClassName-conversion.properties<br />point = com.acme.PointConverter<li>全局以及类级别的类型转化</li>xwork-conversion.properties在classpath<br />com.acme.Point = com.acme.PointConverter<li>PointConverter必须实现TypeConverter或者直接继承StrutsTypeConverter类.</li>并且实现如下的双向转化<br /><pre name="code" class="java">
    public abstract Object convertFromString(Map context, String[] values, Class toClass);
    public abstract String convertToString(Map context, Object o);
</pre> <br />该接口中还有个performFallbackConversion 方法,用来实现转化失败后的一些必要的操作.<br />当转化出现错误的时候需要抛出 XWorkException或者TypeConversionException以便struts2可以捕获该异常.<br /></ul><br />3.Built in Type Conversion Support(内建的转化)<br />String <br />boolean / Boolean <br />char / Character <br />int / Integer, float / Float, long / Long, double / Double <br />dates <br />arrays  数组数据可以单个转化数据<br />collections 如果不能确定collection中的元素的类型,默认传见一个String的ArrayList.<br />4.Relationship to Parameter Names<br />类型转化的最佳利用方式是直接在页面上定义user.name这样就能把input的数据直接注入到action.getUser().setName()方法中.<br /><ul><li>Use complex OGNL expressions--struts2能够自动处理对象的创建,而不用手工的创建嵌套对象.</li><li>Ognl语法支持创建带有不带参数构造函数的对象.</li><li>user.name会调用getUser().setName()但是如果user为空,那么action还必须具有setUser方法.</li><li>For lists and maps, use index notation, such as people[0].name or friends['patrick'].name. </li><li>对于多选框,如果定义问people.name 则系统会自动传见多个person对象并且注入name属性.</li></ul><br />5.Creating a Type Converter<br />继承StrutsTypeConverter类,实现to,from双向转化操作并且通过ActionClassName-conversion.properties或者全局xwork-conversion.properties中加载改converter即可.<br />6.Advanced Type Conversion(高级类型转化)<br /><ul><li>Null Property Handling(空指针处理)--自动对象嵌套关系创建.</li>实现规则<br />当ognl抛出空指针异常后,struts2能捕获该异常,并且自动创建相应的对象.<br />如果属性被声明为Collection or List,创建ArrayList并注入.<br />如果声明为Map,创建HashMap并且注入.<br />如果是javabean并且具有无参数构造函数,系统会利用ObjectFactory.buildBean方法创建该对象.<br />流程如下<br />person.name-->setUsers()-->getUsers().setName()<br /></ul><br />7.Collection and Map Support<br /><ul><li>系统支持在定义list或者collection中的对象类型.通过在Class-conversion.properties</li>定义Element_xxx=Class(xxx表示action中对应的字段名),美来定义action中的对象类型.<li>可以通过annotation来支持上面的Element_xxx定义.</li><li>定义集合索引方式.</li>在配置文件中定义KeyProperty_xxx=yyy xxx是集合字段的名字,yyy集合中类的某个需要当作索引的属性.下列举例<br />MyAction.java<br /><pre name="code" class="java">
/**
 * @return a Collection of Foo objects
 */
public Collection getFooCollection()
{
    return foo;
}
</pre><br />foo.java<br /><pre name="code" class="java">
/**
 * @return a unique identifier
 */
public Long getId()
{
    return id;
}
</pre><br />在文件MyAction-conversion.properties中定义<br />KeyProperty_fooCollection=id<br />fooCollection(22)将代表fooCollection中id为22,foo对象.<br />通过fooCollection(22).name可以直接设置该对象的其他属性的值.<br />fooCollection(22)如果返回空值,不会自动创建该对象,可以通过fooCollection.makeNew[0]=Phil直接创建该对象,如果该写法用于Set那么必须定义foo对象的equal和hashCode并且包含id之外的字段,以防止Set删除id字段为null的元素.<li>类型转化着部分处理的代码感觉和ognl结合的比较紧密,需要结合ognl来研习.</li></ul><br />8.Type Conversion Error Handling<br /><ul><li>类型转化错误提供了一种方式以区分用户输入错误和,输入类型转化错误.</li><li>所有的类型转化错误的提示信息的格式可以通过重写xwork.default.invalid.fieldvalue来修改.</li><li>也可以修改通过在Action.properties定义invalid.fieldvalue.xxx(xxx是字段名)来修改所需要显示的类型转化错误的信息.</li><li>显示该错误信息的途径有</li>Globally, using the Conversion Error Interceptor<br />在validator文件中定义conversion validator来显示.<br /></ul>
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/175897#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 16:50:49 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/175897</link>
        <guid>http://myoldman.javaeye.com/blog/175897</guid>
      </item>
      <item>
        <title>Struts2 Core Developers Guide-Localization</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/175895" style="color:red;">http://myoldman.javaeye.com/blog/175895</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.Overview<br />支持国际化的模块:<br />   <ul><li>1. the UI Tags</li><li>   2. Messages and Errors from the ValidationAware interface (implemented by ActionSupport and ValidationAwareSupport)</li><li>   3. Within action classes that extend ActionSupport through the getText() method</li><li>2.Resource Bundle Search Order(Resouce文件搜索规则)</li><li>   1. ActionClass.properties</li><li>   2. BaseClass.properties (all the way to Object.properties)</li><li>   3. Interface.properties (every interface and sub-interface)</li><li>   4. ModelDriven's model (if implements ModelDriven), for the model object repeat from 1</li><li>   5. package.properties (of the directory where class is located and every parent directory all the way to the root directory)</li><li>   6. search up the i18n message key hierarchy itself</li><li>   7. global resource properties</li></ul><br />   规则如下图<br />   <pre name="code" class="java">
Package hierarchy

To clarify #5, while traversing the package hierarchy, Struts 2 will look for a file package.properties:

com/
  acme/
    package.properties
    actions/
      package.properties
      FooAction.java
      FooAction.properties

If FooAction.properties does not exist, com/acme/action/package.properties will be searched for, if not found com/acme/package.properties, if not found com/package.properties, etc. 
</pre><br />3.Examples<br /><ul><li><pre name="code" class="java">&lt;s:property value="getText('some.key')" /></pre></li>可以嵌套在ui tags中<li><pre name="code" class="java">&lt;s:text name="some.key" /></pre></li><li><pre name="code" class="java">
&lt;s:i18n name="some.package.bundle" >
     &lt;s:text name="some.key" />
&lt;/s:i18n>
</pre></li>指定显示需要查找的resource bundle的文件.<br /></ul>  <br />4.I18n Interceptor<br />该拦截器可以在运行过程中改变某个session对应的locale信息,和localization配合以实现internationlization.<br />5.Global Resources (struts.custom.i18n.resources) in struts.properties<br />6.由于struts2支持与action相关的resource的定义,导致可以造成会有多个重复的key的存在.<br />解决该问题的方法是,通过定义ActionSupport.properties in com/opensymphony/xwork2 and put it on your classpath.来实现所有action的key的统一定义.不过这样一来所有的action都必须继承自ActionSupport.<br />由以上启发,其实也可以自己写一个接口,当作标记接口,所有的action都实现该接口,并且在该接口的文件夹中加入interfacename.properties文件也可以解决该问题.<br />7.Formatting Dates and Numbers(日期和数字的格式化)<br /><ul><li>struts2其实通过i10n来实现数字和日期的格式化的.</li><li>定义日期或者数字显示的格式需要利用ognl表达式的特性.</li><li>例子</li><pre name="code" class="java">format.time = {0,time}
format.number = {0,number,#0.0##}
format.percent = {0,number,##0.00'%'}
format.money = {0,number,\u00A4##0.00}
</pre><li>通过s:text标签嵌套需要转化的数字或者日期的值来实现以上数据的格式化.</li><li>Localizing form data with getText代码示例如下</li><pre name="code" class="java">&lt;s:textfield key="orderItem.price" value="%{getText('format.number',{'orderItem.price'})}" /></pre><br />详细的说明请参考getText in ActionSupport代码中实际调用的方法为<br />textProvider.getText(String key, String[] args)<br /></ul>
          <br/>
          <span style="color:red;">
            <a href="http://myoldman.javaeye.com/blog/175895#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 16:48:49 +0800</pubDate>
        <link>http://myoldman.javaeye.com/blog/175895</link>
        <guid>http://myoldman.javaeye.com/blog/175895</guid>
      </item>
      <item>
        <title>Struts2 Core Developers Guide-Validation</title>
        <author>myoldman</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://myoldman.javaeye.com">myoldman</a>&nbsp;
          链接：<a href="http://myoldman.javaeye.com/blog/175884" style="color:red;">http://myoldman.javaeye.com/blog/175884</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.Using Annotations(利用java5的标记实现验证)<br /><ul><li>该方式的验证必须在class级别上声明@Validation()属性代码如下</li><pre name="code" class="java">@Validation()
public class SimpleAnnotationAction extends ActionSupport {
}
</pre><li>在字段的setter方法上定义验证的规则</li>field validation的声明方式<br /><pre name="code" class="java"> @RequiredFieldValidator(type = ValidatorType.FIELD, message = "You must enter a value for bar.")
    @IntRangeFieldValidator(type = ValidatorType.FIELD, min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")
    public void setBar(int bar) {
        this.bar = bar;
    }
</pre><br />plain validation的声明方式<br /><pre name="code" class="java">
    @Validations(
            requiredFields =
                    {@RequiredFieldValidator(type = ValidatorType.SIMPLE, fieldName = "customfield", message = "You must enter a value for field.")},
            requiredStrings =
                    {@RequiredStringValidator(type = ValidatorType.SIMPLE, fieldName = "stringisrequired", message = "You must enter a value for string.")},
            emails =
                    { @EmailValidator(type = ValidatorType.SIMPLE, fieldName = "emailaddress", message = "You must enter a value for email.")},
            urls =
                    { @UrlValidator(type = ValidatorType.SIMPLE, fieldName = "hreflocation", message = "You must enter a value for email.")},
            stringLengthFields =
                    {@StringLengthFieldValidator(type = ValidatorType.SIMPLE, trim = true, minLength="10" , maxLength = "12", fieldName = "needstringlength", message = "You must enter a stringlength.")},
            intRangeFields =
                    { @IntRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "intfield", min = "6", max = "10", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
            dateRangeFields =
                    {@DateRangeFieldValidator(type = ValidatorType.SIMPLE, fieldName = "datefield", min = "-1", max = "99", message = "bar must be between ${min} and ${max}, current value is ${bar}.")},
            expressions = {
                @ExpressionValidator(expression = "foo > 1", message = "Foo must be greater than Bar 1. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 2", message = "Foo must be greater than Bar 2. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 3", message = "Foo must be greater than Bar 3. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 4", message = "Foo must be greater than Bar 4. Foo = ${foo}, Bar = ${bar}."),
                @ExpressionValidator(expression = "foo > 5", message = "Foo must be greater than Bar 5. Foo = ${foo}, Bar = ${bar}.")
    }
</pre><li>采用该方式验证可以减少配置文件的数量但是关于验证错误信息中对localization的支持有待调查。</li></ul><br />2.Examples(使用用例)<br /><ul><li>Basic Validation</li>主要一点就是声明validation.xml 文件放在action类的包下，命名规则为 &lt;ActionClassName>-validation.xml or &lt;ActionClassName>-&lt;ActionAliasName>-validation.xml<li>Client Validation</li>服务器端的配置代码和Basic Validation的代码一直不同的地方在于在jsp页面上声明s:form标记的时候必须指定 validate="true"属性，并且不支持把namespace写在action上而要直接写在页面的namespace属性上。实际应用如下<br /><pre name="code" class="java">&lt;s:form method="post" validate="true" action="quizClient" namespace="/validation">
</pre><br />not work<br /><pre name="code" class="java">&lt;s:form method="post" validate="true" action="/validation/quizClient.action">
</pre><li>AJAX Validation</li>2.0.x版本的ajax验证是和DWR结合的，文档中介绍的是和Dojo结合的版本。<br />服务器端配置除了Basic Validation,需要在struts.xml文件中加入如下拦截器<br /><pre name="code" class="java">&lt;interceptor-ref name="jsonValidationWorkflowStack"/>
</pre><br />在页面上的form标签中加入theme="xhtml"属性并且没有validate="true"属性<br />在head中加入&lt;sx:head /><br />在s:submit按钮(可以使其他控件例如bind)中加入validate="true"属性<br />如果需要进一步使用ajax提交,需要在s:submit,ajaxAfterValidation="true"<br />Setting validate to true in the form tag还是可以打开JavaScript验证，不过该验证会在ajax验证前执行。<br />工作原理<br />jsonValidation必须在正常的validation拦截器之后执行。<br />该拦截器先检查struts.enableJSONValidation属性为true则执行ajax验证。<br />检查 struts.validateOnly为true并且存在validation错误的时候，把错误信息序列化为JSON<br />在客户端使用utils.js中StrutsUtils.<br />Include prototype.js,utils.js and validation.js(the one for the theme being used), if you are not using the Dojo plugin.<br />详细的验证流程参考文档中的处理流程图.<li>Field Validators</li>这种校验器需要嵌套在&lt;field name="stringLengthValidatorField">标签中使用。<br />并且可以在field标签中定义多个&lt;field-validator type="stringlength">validator。<br />该校验器有两种形式还可以使用plain validator中加入fieldname属性来实现这种校验器。<li>Non Field Validators</li>该校验器的工作方式如下<br /><pre name="code" class="java">
&lt;validator type="expression">
		&lt;param name="expression">&lt;![CDATA[ ( (someText == someTextRetype) && (someTextRetype == someTextRetypeAgain) ) ]]&gt;&lt;/param>
		&lt;message>&lt;![CDATA[ all three text must be exactly the same ]]&gt;&lt;/message>
	&lt;/validator>
</pre><li>Visitor Field Validator</li>这种vistor用于定义使用某个对象自己的校验器进行数据的校验。<br />该校验器可以校验对象，数组，结合等等的元素。<br />context属性用于指定用于验证对象所对应的xml文件名字规则。如果需要验证的对象的名字为User那么寻找的校验文件的路径为User-Context-validation.xml<br />appendPrefix指定是否需要在属性前面添加前缀，前缀为fieldname如果filename为user那么指定appendPrefix后验证的实际字段名就为user.name<br /></ul><br />3.Bundled Validators(系统预定义的校验器)<br /><ul><li>conversion validator--ConversionErrorFieldValidator</li>用于检查所校验的字段是否存在类型转化错误。<br />可以定义repopulateField用于保留转化错误前的用户输入值。<br />实现的原理主要是把捕获页面的conversion错误并且获取该字段的错误信息，添加到对应的context中。<br />repopulateField的实现是定义从context的errors中获取到该字段的用户输入值，并且利用preresultlistener在用户执行完action后，result执行前，改变statck中该value的值为用户错误输入的值。<li>date validator--DateRangeFieldValidator</li>用于判断date类型的数据的大小<br />通过继承AbstractRangeValidator并且date类型的数据实现了Comparable接口来实现多种数据类型的比较。<br />详细比较代码如下<br /><pre name="code" class="java">
        if ((getMinComparatorValue() != null) && (value.compareTo(getMinComparatorValue()) &lt; 0)) {
            addFieldError(getFieldName(), object);
        }

        // only check for a maximum value if the max parameter is set
        if ((getMaxComparatorValue() != null) && (value.compareTo(getMaxComparatorValue()) > 0)) {
            addFieldError(getFieldName(), object);
        }
</pre><li>double validator--DoubleRangeFieldValidator</li>实现了double类型数值的比较<br />Inclusive为min&lt;a&lt;max<br />Exclusive为&lt;=min >=max<li>email validator--EmailValidator</li>校验email格式是否正确<br />该校验器其实是继承正则表达式实现的。表达式如下<br />"\\b(^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+(\\.[A-Za-z0-9-]+)*((\\.[A-Za-z0-9]{2,})|(\\.[A-Za-z0-9]{2,}\\.[A-Za-z0-9]{2,}))$)\\b"<li>expression validator--ExpressionValidator</li>利用ongl表达式校验field的值。<br />表达式必须能返回Boolean的值。<li>fieldexpression validator--FieldExpressionValidator</li>校验ognl表达式的值，必须指定filedname，并且错误信息是field级别的。<li>int validator--IntRangeFieldValidator</li>实现和date一致.<li>regex validator--RegexFieldValidator</li>利用正则表达式校验某个字段的值。<li>required validator</li>验证某个字段非空<li>requiredstring validator</li>判断值是否是字符串，而且判断字符串长度是否大于0<li>stringlength validato</li>判断字符串的长度范围.<li>url validator--URLValidator</li>判断字符串格式是否符合url的格式<br />实际调用TextUtils.verifyUrl方法实现.<li>visitor validator--VisitorFieldValidator</li>实现上一章节已经讲到这里不在鏊述。<br /></ul><br />4.Registering Validators<br /><ul><li>通过ValidatorFactory.parseValidators()方法解析加载所有配置文件中有定义的validator,系统只记住validator的名字和对应的实现类的包全路径。</li><li>加载过程会寻找的文件如下classpath中的validators.xml,com/opensymphony/xwork2/validator/validators/default.xml,com/opensymphony/xwork2/validator/validators中-validators.xml结尾的所有文件.</li></ul><br />5.Turning on Validation(添加验证拦截器)<br />加入如下拦截器到栈中<br /><pre name="code" class="java">&lt;interceptor name="validator" class="com.opensymphony.xwork2.validator.ValidationInterceptor"/></pre><br />6.Defining Validation Rules<br /><ul><li>校验文件的路径的查找规则</li>(1)Per Action class: in a file named ActionName-validation.xml<br />(2)Per Action alias: in a file named ActionName-alias-validation.xml<br />(3)以上都找不到则会递归的往对象的继承类或者接口类上一直找到Object.class<br />代码如下<br /><pre name="code" class="java">
        if 