Raible's Wiki

Raible Designs
Wiki Home
News
Recent Changes

AppFuse

Homepage
  - Korean
  - Chinese
  - Italian
  - Japanese

QuickStart Guide
  - Chinese
  - French
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish
  - Japanese

User Guide
  - Korean
  - Chinese

Tutorials
  - Chinese
  - German
  - Italian
  - Korean
  - Portuguese
  - Spanish

FAQ
  - Korean

Latest Downloads

Other Applications

Struts Resume
Security Example
Struts Menu

Set your name in
UserPreferences


Referenced by
Articles_zh
WebWorkActions_zh




JSPWiki v2.2.33

[RSS]


Hide Menu

ValidationAndListWebWork_zh


Difference between version 3 and version 2:

At line 1 changed 1 line.
__第四部分:__ [增加校验和列表页面 |ValidationAndListWebWork] - 增加Person对象的校验逻辑保证firstName和lastName是必填字段并且加入列表页面显示数据库中所有的person纪录。
__第四部分:__ [增加校验和列表页面 |ValidationAndListWebWork] - 增加Person对象的校验逻辑保证firstName和lastName是必填字段并且加入列表页面显示数据库中所有的person纪录。
At line 4 changed 1 line.
;:''阅读这部分指南请先阅读 __第三部分:__ [创建Webwork Action和JSP|WebWorkActions].''
;:''阅读这部分指南请先阅读 __第三部分:__ [创建Webwork Action和JSP|WebWorkActions_zh].''
At line 6 changed 2 lines.
!!内容提要
这部分指南将向你展示如何使用Webwork的校验框架加入校验逻辑。并且将使用[Display Tag Library|http://displaytag.sf.net]标签库(Tag Library)创建列表页面显示数据库中的所有Person。
!!内容提要
这部分指南将向你展示如何使用Webwork的校验框架加入校验逻辑。并且将使用[Display Tag Library|http://displaytag.sf.net]标签库(Tag Library)创建列表页面显示数据库中的所有Person。
At line 9 changed 1 line.
;:%%(color: blue)''我会用这种格式说明我在 __实际过程__ 中的操作。''%%
;:%%(color: blue)''我会用这种格式说明我在 __实际过程__ 中的操作。''%%
At line 11 changed 9 lines.
!目录
* [1] 创建包含了校验规则了Person-validation.xml文件
* [2] 查看加入了校验的JSP页面并且进行测试
* [3] 在DAO、ManagerTest类中加入''testGetPeople''方法
* [4] 在PersonDao和Manager类中增加 ''getPeople'' 方法
* [5] 在Action Test中加入''testSearch''方法
* [6] 在Action中加入''search ''方法
* [7] 创建personList.jsp和Canoo test
* [8] 在菜单中加入链接
!目录
* [1] 创建包含了校验规则了Person-validation.xml文件
* [2] 查看加入了校验的JSP页面并且进行测试
* [3] 在DAO、ManagerTest类中加入''testGetPeople''方法
* [4] 在PersonDao和Manager类中增加 ''getPeople'' 方法
* [5] 在Action Test中加入''testSearch''方法
* [6] 在Action中加入''search ''方法
* [7] 创建personList.jsp和Canoo test
* [8] 在菜单中加入链接
At line 21 changed 2 lines.
!!创建包含了校验规则了Person-validation.xml文件 [#1]
为了利用WebWork校验框架实现数据校验有两件事情要做,第一是创建一个validation.xml文件,第二是在需要进行校验的action中加入一个校验interceptor引用。
!!创建包含了校验规则了Person-validation.xml文件 [#1]
为了利用WebWork校验框架实现数据校验有两件事情要做,第一是创建一个validation.xml文件,第二是在需要进行校验的action中加入一个校验interceptor引用。
At line 24 changed 1 line.
WebWork允许两种类型的校验 —— per-action和model-based。因为所有的Action对Person引用都要使用相同的校验规则,所以本文将使用model-based类型的校验。
WebWork允许两种类型的校验 —— per-action和model-based。因为所有的Action对Person引用都要使用相同的校验规则,所以本文将使用model-based类型的校验。
At line 26 changed 1 line.
在src/dao/**/model目录下创建Person-validation.xml文件并加入下列内容:
在src/dao/**/model目录下创建Person-validation.xml文件并加入下列内容:
At line 46 changed 1 line.
在ApplicationResources_*.properties文件中的"errors.message" 键值使用字段的"name"属性以实现国际化。如果不需要提供对i18n的支持可以直接对<message>元素中指定显示内容。
在ApplicationResources_*.properties文件中的"errors.message" 键值使用字段的"name"属性以实现国际化。如果不需要提供对i18n的支持可以直接对<message>元素中指定显示内容。
At line 53 changed 1 line.
现在可以配置PersonAction使用[visitor validation|http://wiki.opensymphony.com/display/WW/Visitor+validation]。为了实现这个目标,在PersonAction目录下创建一个PersonAction-validation.xml文件。加入下面的内容:
现在可以配置PersonAction使用[visitor validation|http://wiki.opensymphony.com/display/WW/Visitor+validation]。为了实现这个目标,在PersonAction目录下创建一个PersonAction-validation.xml文件。加入下面的内容:
At line 69 changed 1 line.
糟糕的是,WebWork没有提供一个透明机制读取Person-validation.xml文件并且标记在UI上标记哪个字段时必须的。AppFuse的Struts和Spring版本使用LabelTag实现了这个目标,不过他们也只是实现了一个普通的校验。我希望有人能够为WebWork提供相同的功能实现。同时JSP tags "required" 属性实际上没有对你所指定的校验规则作任何事情,仅仅是在加入对应的字段后面加入了一个星号而已。
糟糕的是,WebWork没有提供一个透明机制读取Person-validation.xml文件并且标记在UI上标记哪个字段时必须的。AppFuse的Struts和Spring版本使用LabelTag实现了这个目标,不过他们也只是实现了一个普通的校验。我希望有人能够为WebWork提供相同的功能实现。同时JSP tags "required" 属性实际上没有对你所指定的校验规则作任何事情,仅仅是在加入对应的字段后面加入了一个星号而已。
At line 72 changed 1 line.
__&#27880;&#24847;&#65306;__ &#22312;AppFuse&#37324;&#38754;&#25552;&#20379;&#30340;SpringObjectFactory&#30340;&#23458;&#25143;&#31471;model-based&#26657;&#39564;&#35268;&#21017;[&#26080;&#27861;&#24037;&#20316;|http://jira.opensymphony.com/browse/XW-227]&#12290;&#24182;&#19988;&#25105;&#35748;&#20026;Webwork&#25552;&#20379;&#30340;&#23458;&#25143;&#31471;&#26657;&#39564;&#38656;&#35201;&#22686;&#21152;&#19968;&#20123;&#29305;&#24615;&#65292;&#20363;&#22914;&#65306;[&#20801;&#35768;&#21462;&#28040;|http://jira.opensymphony.com/browse/WW-648] &#21644; [&#22312;&#19968;&#20010;&#23545;&#35805;&#26694;&#20013;&#26174;&#31034;&#25152;&#26377;&#30340;&#38169;&#35823;&#20449;&#24687;|http://jira.opensymphony.com/browse/WW-647]&#12290;&#22240;&#20026;&#36825;&#20123;&#21407;&#22240;&#22312;AppFuse+webwork&#29615;&#22659;&#20013;&#21482;&#20351;&#29992;&#20102;&#26381;&#21153;&#22120;&#31471;&#26657;&#39564;&#12290;&#22914;&#26524;&#20320;&#24076;&#26395;&#20351;&#29992;&#65292;&#20320;&#21487;&#20197;[&#20102;&#35299;&#22312;&#36825;&#37324;&#20102;&#35299;&#26356;&#22810;|http://raibledesigns.com/page/rd?anchor=webwork_s_validation_and_springobjectfactory] &#25105;&#20351;&#29992;&#23458;&#25143;&#31471;&#26657;&#39564;&#36935;&#21040;&#30340;&#38382;&#39064;<br /><br />&#24403;&#28982;&#65292;&#20063;&#21487;&#20197;&#20351;&#29992;per-action&#26657;&#39564;&#12290;&#21482;&#38656;&#35201;&#25335;&#36125;Person-validation.xml&#25991;&#20214;&#21040;"webapp.action"&#21253;&#20013;&#24182;&#19988;&#25226;&#23427;&#37325;&#21629;&#21517;&#20026;PersonAction-validation.xml&#12290;
__注意:__ 在AppFuse里面提供的SpringObjectFactory的客户端model-based校验规则[无法工作|http://jira.opensymphony.com/browse/XW-227]。并且我认为Webwork提供的客户端校验需要增加一些特性,例如:[允许取消|http://jira.opensymphony.com/browse/WW-648] 和 [在一个对话框中显示所有的错误信息|http://jira.opensymphony.com/browse/WW-647]。因为这些原因在AppFuse+webwork环境中只使用了服务器端校验。如果你希望使用,你可以[了解在这里了解更多|http://raibledesigns.com/page/rd?anchor=webwork_s_validation_and_springobjectfactory] 我使用客户端校验遇到的问题<br /><br />当然,也可以使用per-action校验。只需要拷贝Person-validation.xml文件到"webapp.action"包中并且把它重命名为PersonAction-validation.xml。
At line 75 changed 1 line.
&#20026;&#20102;&#20351;&#22312;"savePerson" &#25805;&#20316;&#20013;&#25105;&#20204;&#26032;&#21152;&#20837;&#30340;&#26657;&#39564;&#35268;&#21017;&#21457;&#25381;&#20316;&#29992;&#65292;&#25105;&#20204;&#35201;&#25226;&#21407;&#26469;&#22312;"validator"&#23646;&#24615;&#19978;&#30340;&#27880;&#37322;&#21435;&#25481;&#12290;&#30830;&#23450;&#26368;&#21518;&#22312;web/WEB-INF/classes/xwork.xml&#25991;&#20214;&#30340;"savePerson" <action> &#37096;&#20998;&#21253;&#21547;&#20197;&#19979;&#20869;&#23481;&#65306;
为了使在"savePerson" 操作中我们新加入的校验规则发挥作用,我们要把原来在"validator"属性上的注释去掉。确定最后在web/WEB-INF/classes/xwork.xml文件的"savePerson" <action> 部分包含以下内容:
At line 82 changed 1 line.
&#35828;&#26126;&#65306;&#22312;Appfuse&#20013;&#20351;&#29992;&#30340;validationStack&#21644;WebWork&#33258;&#24102;&#30340;&#26377;&#20123;&#19981;&#21516;&#65292;&#26356;&#22810;&#30340;&#20449;&#24687;&#21487;&#20197;&#22312;[WebWork's JIRA|http://jira.opensymphony.com/browse/XW-228]&#20013;&#26597;&#25214;&#12290;
说明:在Appfuse中使用的validationStack和WebWork自带的有些不同,更多的信息可以在[WebWork's JIRA|http://jira.opensymphony.com/browse/XW-228]中查找。
At line 84 changed 1 line.
!!&#26597;&#30475;&#21152;&#20837;&#20102;&#26657;&#39564;&#30340;JSP&#39029;&#38754;&#24182;&#19988;&#36827;&#34892;&#27979;&#35797; [#2]
!!查看加入了校验的JSP页面并且进行测试 [#2]
At line 86 changed 1 line.
&#29616;&#22312;&#20445;&#23384;&#25152;&#26377;&#30340;&#25991;&#20214;&#12290;&#20026;&#20102;&#27979;&#35797;&#21152;&#20837;&#20102;&#26657;&#39564;&#21518;&#30340;JSP&#65292;&#36816;&#34892;__ant db-load deploy__&#65292;&#21551;&#21160;Tomcat&#24182;&#19988;&#22312;&#27983;&#35272;&#22120;&#20013;&#36755;&#20837; [http://localhost:8080/appfuse/editPerson.html?id=1]&#12290;
现在保存所有的文件。为了测试加入了校验后的JSP,运行__ant db-load deploy__,启动Tomcat并且在浏览器中输入 [http://localhost:8080/appfuse/editPerson.html?id=1]。
At line 88 changed 1 line.
&#22914;&#26524;&#21024;&#25481;&#20102;firstName&#25110;&#32773;lastName&#23383;&#27573;&#30340;&#20540;&#24182;&#28857;&#20987;save&#25353;&#38062;&#65292;&#20320;&#23558;&#30475;&#21040;&#38169;&#35823;&#25552;&#31034;&#20449;&#24687;&#65306;
如果删掉了firstName或者lastName字段的值并点击save按钮,你将看到错误提示信息:
At line 94 changed 2 lines.
!!&#22312;DAO&#12289;ManagerTest&#31867;&#20013;&#21152;&#20837;''testGetPeople''&#26041;&#27861; [#3]
&#20026;&#20102;&#21019;&#24314;&#19968;&#20010;List&#39029;&#38754;(&#25110;&#32773;&#35828;&#26159;master&#39029;&#38754;)&#65292;&#25105;&#20204;&#38656;&#35201;&#31359;&#20214;&#19968;&#20010;&#26041;&#27861;&#36820;&#22238;''person''&#34920;&#20013;&#30340;&#25152;&#26377;&#34892;&#12290;&#25105;&#20204;&#39318;&#20808;&#22312;PersonDaoTest&#21644; PersonManagerTest&#31867;&#20013;&#21019;&#24314;&#27979;&#35797;&#26041;&#27861;&#12290;&#36890;&#24120;&#25226;&#36825;&#20010;&#26041;&#27861;&#21629;&#21517;&#20026;''getEntities'' (&#20363;&#22914;getUsers)&#65292;&#20320;&#20063;&#21487;&#20197;&#20351;&#29992; ''getAll'' &#25110;&#32773; ''search'' —— &#36825;&#20854;&#23454;&#26159;&#21516;&#19968;&#31867;&#38382;&#39064;&#12290;
!!在DAO、ManagerTest类中加入''testGetPeople''方法 [#3]
为了创建一个List页面(或者说是master页面),我们需要穿件一个方法返回''person''表中的所有行。我们首先在PersonDaoTest和 PersonManagerTest类中创建测试方法。通常把这个方法命名为''getEntities'' (例如getUsers),你也可以使用 ''getAll'' 或者 ''search'' —— 这其实是同一类问题。
At line 97 changed 1 line.
&#25171;&#24320;test/dao/**/dao/PersonDaoTest.java&#25991;&#20214;&#21152;&#20837;testGetPeople&#26041;&#27861;&#65306;
打开test/dao/**/dao/PersonDaoTest.java文件加入testGetPeople方法:
At line 108 changed 1 line.
&#25105;&#22312;''getPeople''&#26041;&#27861;&#20013;&#20256;&#20837;&#19968;&#20010;person&#23545;&#35937;&#26159;&#24819;&#22312;&#20197;&#21518;&#26041;&#20415;&#21152;&#20837;&#36807;&#28388;(filtering)&#22788;&#29702; (&#22522;&#20110;person&#23545;&#35937;&#20013;&#30340;&#23646;&#24615;&#20540;)&#12290;&#22312;getPeople()&#26041;&#27861;&#20013;&#24212;&#35813;&#35828;&#26126;&#36825;&#20010;&#21442;&#25968;&#26159;&#21487;&#36873;&#30340;&#12290;
我在''getPeople''方法中传入一个person对象是想在以后方便加入过滤(filtering)处理 (基于person对象中的属性值)。在getPeople()方法中应该说明这个参数是可选的。
At line 110 changed 1 line.
&#29616;&#22312;&#25171;&#26469;test/service/**/service/PersonManagerTest.java&#25991;&#20214;&#21152;&#20837; ''testGetPeople'' &#26041;&#27861;&#12290;
现在打来test/service/**/service/PersonManagerTest.java文件加入 ''testGetPeople'' 方法。
At line 129 changed 1 line.
&#20026;&#20102;&#36825;&#20004;&#20010;&#31867;&#33021;&#22815;&#36890;&#36807;&#32534;&#35793;&#65292;&#38656;&#35201;&#22312;PersonDao&#21644;PersonManager&#25509;&#21475;&#20013;&#21152;&#20837;''getPeople()''&#26041;&#27861;&#24182;&#19988;&#21152;&#20837;&#23454;&#29616;&#12290;
为了这两个类能够通过编译,需要在PersonDao和PersonManager接口中加入''getPeople()''方法并且加入实现。
At line 131 changed 2 lines.
!!&#22312;PersonDao&#21644;Manager&#31867;&#20013;&#22686;&#21152; ''getPeople'' &#26041;&#27861; [#4]
&#25171;&#24320;src/dao/**/dao/PersonDao.java&#25991;&#20214;&#24182;&#19988;&#21152;&#20837;getPeople()&#26041;&#27861;&#35828;&#26126;&#65306;
!!在PersonDao和Manager类中增加 ''getPeople'' 方法 [#4]
打开src/dao/**/dao/PersonDao.java文件并且加入getPeople()方法说明:
At line 139 changed 1 line.
&#29616;&#22312;&#22312;src/service/**/service/PersonManager.java&#25991;&#20214;&#20013;&#21152;&#20837;&#21516;&#26679;&#30340;&#26041;&#27861;&#12290;&#20445;&#23384;&#25152;&#26377;&#30340;&#25991;&#20214;&#24182;&#19988;&#22312;tests&#31867;&#20013;&#35843;&#25972;imports&#31867;&#12290;&#25509;&#19979;&#26469;&#22312;&#23454;&#29616;&#31867;&#20013;&#23454;&#29616;getPeople()&#26041;&#27861;&#12290;&#25171;&#24320;src/dao/**/dao/hibernate/__PersonManager.java__&#25991;&#20214;&#21152;&#20837;&#19979;&#38754;&#30340;&#20195;&#30721;&#65306;
现在在src/service/**/service/PersonManager.java文件中加入同样的方法。保存所有的文件并且在tests类中调整imports类。接下来在实现类中实现getPeople()方法。打开src/dao/**/dao/hibernate/__PersonManager.java__文件加入下面的代码:
At line 148 changed 2 lines.
&#20320;&#21487;&#20197;&#27880;&#24847;&#21040;&#29616;&#22312;&#27809;&#26377;&#23545;''person''&#21442;&#25968;&#20316;&#20219;&#20309;&#22788;&#29702;&#12290;&#20165;&#20165;&#26159;&#21344;&#20102;&#20010;&#20301;&#32622; —— &#22312;&#20197;&#21518;&#20320;&#21487;&#20197;&#20381;&#38752;&#23427;&#30340;&#23646;&#24615;&#20540;&#20351;&#29992;[Hibernate's&#26597;&#35810;&#35821;&#35328;|http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html] (HQL) &#25110;&#32773;&#20351;&#29992; [Criteria Queries|http://www.hibernate.org/hib_docs/reference/en/html/querycriteria.html]&#21152;&#20837;filter&#12290;
''&#19968;&#20010;&#20351;&#29992;Criteria Query&#30340;&#31034;&#20363;&#65306;''
你可以注意到现在没有对''person''参数作任何处理。仅仅是占了个位置 —— 在以后你可以依靠它的属性值使用[Hibernate's查询语言|http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html] (HQL) 或者使用 [Criteria Queries|http://www.hibernate.org/hib_docs/reference/en/html/querycriteria.html]加入filter。
''一个使用Criteria Query的示例:''
At line 168 changed 1 line.
&#22312;src/service/**/impl/PersonManagerImpl.java&#20013;&#23454;&#29616;''getPeople()''&#26041;&#27861;&#65306;
在src/service/**/impl/PersonManagerImpl.java中实现''getPeople()''方法:
At line 177 changed 1 line.
&#20445;&#23384;&#25152;&#26377;&#30340;&#21464;&#26356;&#65292;&#36816;&#34892;&#19979;&#38754;&#30340;&#27979;&#35797;&#26041;&#27861;&#65306;
保存所有的变更,运行下面的测试方法:
At line 182 changed 1 line.
&#22914;&#26524;&#19968;&#20999;&#27491;&#24120;&#21487;&#20197;&#22312;web&#23618;&#21152;&#20837;&#35835;&#21462;&#25152;&#26377;&#20154;&#21592;&#20449;&#24687;&#30340;&#21151;&#33021;&#23454;&#29616;&#20102;&#12290;
如果一切正常可以在web层加入读取所有人员信息的功能实现了。
At line 184 changed 2 lines.
!!&#22312;Action Test&#20013;&#21152;&#20837;''testSearch''&#26041;&#27861; [#5]
&#25171;&#24320;test/web/**/action/PersonActionTest.java&#25991;&#20214;&#21152;&#20837;&#19979;&#38754;&#30340;&#26041;&#27861;&#65306;
!!在Action Test中加入''testSearch''方法 [#5]
打开test/web/**/action/PersonActionTest.java文件加入下面的方法:
At line 197 changed 1 line.
&#21482;&#26377;&#22312;PersonAction&#20013;&#21152;&#20837; {{getPeople()}} &#21644; {{list()}} &#26041;&#27861;&#36825;&#20010;&#31867;&#25165;&#33021;&#36890;&#36807;&#32534;&#35793;&#12290;
只有在PersonAction中加入 {{getPeople()}} 和 {{list()}} 方法这个类才能通过编译。
At line 199 changed 2 lines.
!!&#22312;Action&#20013;&#21152;&#20837;list()&#21644;getPeople()&#26041;&#27861; [#6]
&#25171;&#24320;src/web/**/action/PersonAction.java &#21152;&#20837;list() &#26041;&#27861;&#12290;&#22312;&#27492;&#20043;&#21069;&#21152;&#20837;"people"&#21464;&#37327;&#21644; {{getPeople()}} &#26041;&#27861;&#12290;
!!在Action中加入list()和getPeople()方法 [#6]
打开src/web/**/action/PersonAction.java 加入list() 方法。在此之前加入"people"变量和 {{getPeople()}} 方法。
At line 202 changed 1 line.
;:%%(color: blue)''&#25105;&#20351;&#29992; UserAction.search() &#20316;&#20026;&#27169;&#26495;&#32534;&#20889;&#36825;&#20010;&#26041;&#27861;&#30340;&#20195;&#30721;&#12290;''
;:%%(color: blue)''我使用 UserAction.search() 作为模板编写这个方法的代码。''
At line 220 changed 1 line.
&#36816;&#34892; __ant test-web -Dtestcase=PersonAction__ &#36827;&#34892;&#27979;&#35797;&#12290;
运行 __ant test-web -Dtestcase=PersonAction__ 进行测试。
At line 222 changed 1 line.
__&#22909;&#65281;__
__好!__
At line 226 changed 2 lines.
!!&#21019;&#24314;personList.jsp&#21644;Canoo test [#7]
&#25171;&#24320;''web/pages''&#30446;&#24405;&#19979;&#30340;personList.jsp&#25991;&#20214;&#36827;&#34892;&#32534;&#36753;&#12290;&#22312;&#25991;&#20214;&#39030;&#37096;&#26377;&#19968;&#20010;&lt;ww:set&gt;&#26631;&#31614;&#29992;&#26469;&#23637;&#31034; "people" &#20449;&#24687;&#12290;&#20320;&#38656;&#35201;&#25226;&#36825;&#20010;&#24341;&#29992;&#30340;&#20540;&#20174;"persons" &#25913;&#25104; "people"&#12290;
!!创建personList.jsp和Canoo test [#7]
打开''web/pages''目录下的personList.jsp文件进行编辑。在文件顶部有一个&lt;ww:set&gt;标签用来展示 "people" 信息。你需要把这个引用的值从"persons" 改成 "people"。
At line 234 changed 1 line.
&#21478;&#19968;&#20010;&#20320;&#38656;&#35201;&#25913;&#21464;&#30340;&#22320;&#26041;&#26159;&#34920;&#21333;&#19978;&#30340;&#20154;&#30340;&#22797;&#25968;&#24418;&#24335;&#21333;&#35789;&#12290;&#31034;&#20363;&#31243;&#24207;&#20135;&#29983;&#30340;&#21517;&#23383;&#26159; "persons" &#36825;&#20010;&#27491;&#30830;&#30340;&#34920;&#31034;&#26041;&#27861;&#26159; "people"&#12290;&#22312;&#22823;&#32422;30&#34892;&#30340;&#20301;&#32622;&#65292;&#20320;&#21487;&#20197;&#25214;&#21040;&#19979;&#38754;&#36825;&#19968;&#34892;
另一个你需要改变的地方是表单上的人的复数形式单词。示例程序产生的名字是 "persons" 这个正确的表示方法是 "people"。在大约30行的位置,你可以找到下面这一行
At line 238 changed 1 line.
&#25913;&#21464;&#25104;&#65306;
改变成:
At line 242 changed 1 line.
&#26368;&#21518;&#22312;to web/WEB-INF/classes/ApplicationResources_en.properties&#25991;&#20214;&#20013;&#21152;&#20837;title&#21644;heading &#38190;&#20540; (personList.title&#21644; personList.heading) &#65306;
最后在to web/WEB-INF/classes/ApplicationResources_en.properties文件中加入title和heading 键值 (personList.title和 personList.heading) :
At line 248 changed 1 line.
&#38656;&#35201;&#27880;&#24847;&#30340;&#26159;&#65292;{{personList.title}}&#23558;&#20250;&#20986;&#29616;&#22312;&#27983;&#35272;&#22120;&#30340;&#26631;&#39064;&#26639;&#20013;&#65292;&#32780;{{personList.heading}}&#23558;&#20250;&#26174;&#31034;&#22312;&#39029;&#38754;&#20013;&#20316;&#20026;&#26631;&#39064;&#65306;
需要注意的是,{{personList.title}}将会出现在浏览器的标题栏中,而{{personList.heading}}将会显示在页面中作为标题:
At line 250 changed 1 line.
&#36824;&#35201;&#22312;&#22312;web/WEB-INF/classes/xwork.xml&#25991;&#20214;&#20013;&#21152;&#20837;&#19968;&#20010;&#26032;&#30340;"people" action &#19968;&#36793;&#33021;&#22815;&#22312;URL&#20013;&#35843;&#29992;{{list()}}&#26041;&#27861;&#65306;
还要在在web/WEB-INF/classes/xwork.xml文件中加入一个新的"people" action 一边能够在URL中调用{{list()}}方法:
At line 259 changed 1 line.
&#36825;&#26102;&#21487;&#20197;&#36816;&#34892;__ant clean deploy__, &#21551;&#21160;Tomcat&#25226;&#27983;&#35272;&#22120;&#36716;&#21040;[http://localhost:8080/appfuse/people.html]&#26597;&#30475;&#36825;&#20010;&#26174;&#31034;&#21015;&#34920;&#30340;&#39029;&#38754;&#20102;
这时可以运行__ant clean deploy__, 启动Tomcat把浏览器转到[http://localhost:8080/appfuse/people.html]查看这个显示列表的页面了
At line 262 changed 2 lines.
&#29616;&#22312;&#26377;&#20102;&#19968;&#20010;&#21015;&#34920;&#26174;&#31034;&#39029;&#38754;&#65292;&#35753;&#25105;&#20204;&#25913;&#21464;&#22312;&#26032;&#22686;&#21644;&#21024;&#38500;&#20102;&#19968;&#20010;Person&#21518;&#26174;&#31034;&#36825;&#20010;&#39029;&#38754;&#12290;&#22312;web/WEB-INF/classes/xwork.xml&#25991;&#20214;&#20013;&#65292;&#25913;&#21464; savePersons&#30340; "input" &#21644; "success" &#32467;&#26524;&#25351;&#21521;"people.html"&#12290;
&#20320;&#36824;&#38656;&#35201;&#25913;&#21464;Canoo tests "AddPerson" &#21644; "DeletePerson" &#20219;&#21153;&#33050;&#26412; &#12290;&#25171;&#24320; test/web/web-tests.xml &#25991;&#20214;&#23450;&#20301;&#21040; "AddPerson" &#20219;&#21153;&#20013;&#19979;&#38754;&#36825;&#19968;&#34892;&#65306;
现在有了一个列表显示页面,让我们改变在新增和删除了一个Person后显示这个页面。在web/WEB-INF/classes/xwork.xml文件中,改变 savePersons的 "input" 和 "success" 结果指向"people.html"。
你还需要改变Canoo tests "AddPerson" 和 "DeletePerson" 任务脚本 。打开 test/web/web-tests.xml 文件定位到 "AddPerson" 任务中下面这一行:
At line 268 changed 1 line.
&#20462;&#25913;&#25104;&#65306;
修改成:
At line 273 changed 1 line.
&#28982;&#21518;&#23450;&#20301;&#21040; "DeletePerson" &#20219;&#21153;&#30340;&#19979;&#38754;&#36825;&#19968;&#34892;&#65306;
然后定位到 "DeletePerson" 任务的下面这一行:
At line 279 changed 1 line.
&#20462;&#25913;&#25104;&#65306;
修改成:
At line 283 changed 1 line.
&#20026;&#20102;&#27979;&#35797;&#21015;&#34920;&#39029;&#38754;&#30340;&#24037;&#20316;&#65292;&#22312;test/web/web-tests.xml&#20013;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;JSP&#27979;&#35797;&#65306;
为了测试列表页面的工作,在test/web/web-tests.xml中创建一个新的JSP测试:
At line 303 changed 1 line.
&#20320;&#20063;&#35768;&#24076;&#26395;&#21152;&#20837; "SearchPeople" &#27979;&#35797;&#20219;&#21153;&#21040; "PersonTests" &#27979;&#35797;&#20219;&#21153;&#20013;&#21435;&#65292;&#20197;&#20415;&#33021;&#22815;&#21644;&#20854;&#20182;&#30456;&#20851;&#27979;&#35797;&#23545;&#35937;&#19968;&#36215;&#34987;&#27979;&#35797;&#12290;
你也许希望加入 "SearchPeople" 测试任务到 "PersonTests" 测试任务中去,以便能够和其他相关测试对象一起被测试。
At line 315 changed 1 line.
&#29616;&#22312;&#21487;&#20197;&#36816;&#34892; __ant test-canoo -Dtestcase=SearchPeople__ (&#25110;&#32773;&#36816;&#34892; ''ant test-jsp'' &#22914;&#26524;Tomcat&#27809;&#26377;&#36816;&#34892;)&#12290;&#22914;&#26524;&#32467;&#26524;&#26159;"BUILD SUCCESSFUL"&#23601;&#22823;&#21151;&#21578;&#25104;&#20102;!
现在可以运行 __ant test-canoo -Dtestcase=SearchPeople__ (或者运行 ''ant test-jsp'' 如果Tomcat没有运行)。如果结果是"BUILD SUCCESSFUL"就大功告成了!
At line 317 changed 2 lines.
!!&#22312;&#33756;&#21333;&#20013;&#21152;&#20837;&#38142;&#25509; [#8]
&#26368;&#21518;&#19968;&#27493;&#25226;list, add, edit&#21644;delete&#21151;&#33021;&#26174;&#31034;&#32473;&#29992;&#25143;&#35775;&#38382;&#26368;&#31616;&#21333;&#30340;&#21150;&#27861;&#26159;&#22312;web/pages/mainMenu.jsp&#25991;&#20214;&#20013;&#21152;&#20837;&#26032;&#30340;&#38142;&#25509;&#65306;
!!在菜单中加入链接 [#8]
最后一步把list, add, edit和delete功能显示给用户访问最简单的办法是在web/pages/mainMenu.jsp文件中加入新的链接:
At line 327 changed 1 line.
''menu.viewPeople''&#26159;&#23450;&#20041;&#22312;web/WEB-INF/classes/ApplicationResources_en.properties&#20013;&#30340;&#19968;&#20010;&#38190;&#12290;
''menu.viewPeople''是定义在web/WEB-INF/classes/ApplicationResources_en.properties中的一个键。
At line 332 changed 1 line.
&#21478;&#19968;&#20010;&#21150;&#27861;&#26159;&#25913;&#21464;web/WEB-INF/menu-config.xml&#21152;&#20837;&#19979;&#38754;&#30340;&#20869;&#23481;&#65306;
另一个办法是改变web/WEB-INF/menu-config.xml加入下面的内容:
At line 339 changed 1 line.
&#30830;&#23450;&#19978;&#38754;&#30340;XML&#22312; &lt;Menus&gt; &#26631;&#31614;&#20869;&#65292;&#20294;&#26159;&#27809;&#26377;&#22312;&#21478;&#22806;&#19968;&#20010;&lt;Menu&gt;&#37324;&#38754;&#12290;&#28982;&#21518;&#22312;web/common/menu.jsp&#20013;&#21152;&#20837;&#26032;&#33756;&#21333; —— &#29616;&#22312;&#30475;&#36215;&#26469;&#26159;&#19979;&#38754;&#30340;&#26679;&#23376;&#65306;
确定上面的XML在 &lt;Menus&gt; 标签内,但是没有在另外一个&lt;Menu&gt;里面。然后在web/common/menu.jsp中加入新菜单 —— 现在看起来是下面的样子:
At line 357 changed 1 line.
&#29616;&#22312;&#36816;&#34892;ant clean deploy &#21551;&#21160;Tomcat&#22312;&#27983;&#35272;&#22120;&#20013;&#36755;&#20837;[http://localhost:8080/appfuse/mainMenu.html] &#65292;&#20320;&#21487;&#20197;&#30475;&#21040;&#19979;&#38754;&#30340;&#30028;&#38754;
现在运行ant clean deploy 启动Tomcat在浏览器中输入[http://localhost:8080/appfuse/mainMenu.html] ,你可以看到下面的界面
At line 363 changed 1 line.
&#27880;&#24847;&#22312;&#39029;&#38754;&#24038;&#36793;&#26377;&#19968;&#20010;&#26032;&#30340;&#38142;&#25509;(&#30001; mainMenu.jsp&#20135;&#29983;) &#65292;&#21516;&#26102;&#22312;&#21491;&#36793;&#30340;&#33756;&#21333;&#19978;&#20063;&#26377;&#19968;&#20010;&#26032;&#38142;&#25509;(&#30001; menu.jsp&#20135;&#29983;)&#12290;
注意在页面左边有一个新的链接(由 mainMenu.jsp产生) ,同时在右边的菜单上也有一个新链接(由 menu.jsp产生)。
At line 365 changed 2 lines.
!!&#23601;&#26159;&#36825;&#26679;
&#29616;&#22312;&#24050;&#32463;&#23436;&#25104;&#20102;&#19968;&#20010;&#23436;&#25972;&#30340;master-detail&#30340;&#39029;&#38754;&#24320;&#21457;&#36807;&#31243;&#65281;&#29616;&#22312;&#21487;&#20197;&#36816;&#34892;&#25152;&#26377;&#30340;&#27979;&#35797;&#32780;&#30475;&#19981;&#21040;&#20219;&#20309;&#38169;&#35823;&#20102;&#65281;&#21487;&#20197;&#36827;&#34892;&#20840;&#38754;&#30340;&#27979;&#35797;&#65292; &#20572;&#27490;tomcat&#24182;&#19988;&#36816;&#34892; __ant clean test-all__&#12290; &#36825;&#20010;&#21629;&#20196;&#20250;&#36816;&#34892;&#24037;&#31243;&#37324;&#38754;&#25152;&#26377;&#30340;&#21333;&#20803;&#27979;&#35797;&#12290;&#38656;&#35201;&#25552;&#37266;&#27880;&#24847;&#30340;&#26159;&#65292;&#24212;&#35813;&#21487;&#20197;&#27491;&#24120;&#30340;&#21033;&#29992;__ant setup-db setup-tomcat test-all__ &#26469;&#23436;&#25104;AppFuse&#31243;&#24207;&#30340;&#29615;&#22659;&#35774;&#32622;&#21644;&#20840;&#38754;&#27979;&#35797;&#12290;&#27492;&#26102;&#20320;&#21487;&#20197;&#21442;&#32771;&#19968;&#20123;&#26356;&#22797;&#26434;&#30340;&#31034;&#20363;&#31243;&#24207; - [Struts Resume|StrutsResume].
!!就是这样
现在已经完成了一个完整的master-detail的页面开发过程!现在可以运行所有的测试而看不到任何错误了!可以进行全面的测试, 停止tomcat并且运行 __ant clean test-all__。 这个命令会运行工程里面所有的单元测试。需要提醒注意的是,应该可以正常的利用__ant setup-db setup-tomcat test-all__ 来完成AppFuse程序的环境设置和全面测试。此时你可以参考一些更复杂的示例程序 - [Struts Resume|StrutsResume].
At line 368 changed 1 line.
''__&#22810;&#20040;&#32654;&#22909;&#30340;&#19968;&#22825;!__''
''__多么美好的一天!__''

Back to ValidationAndListWebWork_zh, or to the Page History.