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
Articles_cn
Articles_pt
Articles_zh
CreateManager_zh
ValidationAndList_zh




JSPWiki v2.2.33

[RSS]


Hide Menu

CreateActions_zh


Difference between version 7 and version 2:

At line 1 changed 1 line.
__Part III:__ [创建Actions和JSPs|CreateActions] - 在[AppFuse]架构下创建[Struts|http://jakarta.apache.org/struts] 的Actions和JSPs。
__Part III:__ [创建 Struts Actions和JSPs|CreateActions] - 在[AppFuse]架构下创建[Struts|http://jakarta.apache.org/struts] 的Actions和JSPs。
At line 3 changed 1 line.
;:''本教程依赖于__Part II:__ [创建管理器Manager|CreateManager_zh]。''
;:''本教程依赖于__Part II:__ [创建新的Manager|CreateManager_zh]。''
At line 6 changed 1 line.
本教程将向你展示如何创建一个Struts Action,一个JUnit Test(使用 [StrutsTestCase|http://strutstestcase.sourceforge.net/]),和一个form的JSP,我们创建的这个Action将与教程[创建管理器Manager|CreateManager_zh]创建的PersonManager交互。
本教程将向你展示如何创建一个Struts Action,一个JUnit Test(使用 [StrutsTestCase|http://strutstestcase.sourceforge.net/]),和一个form的JSP,我们创建的这个Action将与教程[创建Managers|CreateManager_zh]创建的PersonManager交互。
At line 49 changed 3 lines.
** web/personForm.jsp (察看单个文件的JSP文件)
** web/personList.jsp (察看People列表的JSP文件)
* 把Person.properties的内容拷贝到web/WEB-INF/classes/ApplicationResources_en.properties,这是所有form中需要的标题关键字,以下是你将要添加到ApplicationResources_en.properties的内容的例子:
** web/pages/personForm.jsp (察看单个文件的JSP文件)
** web/pages/personList.jsp (察看People列表的JSP文件)
* 把Person.properties的内容拷贝到web/WEB-INF/classes/ApplicationResources.properties,这是所有form中需要的标题关键字,以下是你将要添加到ApplicationResources.properties的内容的例子:
At line 60 changed 3 lines.
person.added=Information for <strong>{0}</strong> has been added successfully.
person.updated=Information for <strong>{0}</strong> has been updated successfully.
person.deleted=Information for <strong>{0}</strong> has been deleted successfully.
person.added=Person has been added successfully.
person.updated=Person has been updated successfully.
person.deleted=Person has been deleted successfully.
At line 83 changed 1 line.
* &#22312;ApplicationResources_en.properties&#20013;&#28155;&#21152;JSP&#25991;&#20214;&#20986;&#29616;&#30340;&#26631;&#39064;&#21644;&#39064;&#22836;&#65292;&#22312;&#29983;&#25104;&#30340;JSPs&#37324;&#26377;&#20004;&#22788;&#26631;&#39064;(&#27983;&#35272;&#22120;&#39030;&#31471;&#26174;&#31034;)&#30340;&#20851;&#38190;&#23383;&#65292;&#36825;&#20123;&#23383;&#27573;&#25552;&#20379;&#20102;personDetail.title&#21644;personDetail.heading&#20851;&#38190;&#23383;&#21517;&#12290;
* &#22312;ApplicationResources.properties&#20013;&#28155;&#21152;JSP&#25991;&#20214;&#20986;&#29616;&#30340;&#26631;&#39064;&#21644;&#39064;&#22836;&#65292;&#22312;&#29983;&#25104;&#30340;JSPs&#37324;&#26377;&#20004;&#22788;&#26631;&#39064;(&#27983;&#35272;&#22120;&#39030;&#31471;&#26174;&#31034;)&#30340;&#20851;&#38190;&#23383;&#65292;&#36825;&#20123;&#23383;&#27573;&#25552;&#20379;&#20102;personDetail.title&#21644;personDetail.heading&#20851;&#38190;&#23383;&#21517;&#12290;
At line 152 added 314 lines.
&#20320;&#38656;&#35201;&#20026;src/dao/**/Constants.java&#28155;&#21152;__PERSON_KEY__&#21464;&#37327;&#65292;&#36825;&#20010;"personForm"&#19982;struts-config.xml&#20013;&#30340;&#21517;&#31216;&#30456;&#23545;&#24212;&#12290;
[{Java2HtmlPlugin
/**
* The request scope attribute that holds the person form.
*/
public static final String PERSON_KEY = "personForm";
}]
&#22914;&#26524;&#20320;&#23581;&#35797;&#36816;&#34892;&#27979;&#35797;&#65292;&#20320;&#20250;&#24471;&#21040;&#20960;&#20010;NoSuchMethodErrors&#65292;&#25152;&#20197;&#65292;&#35753;&#25105;&#20204;&#23450;&#20041;PersonAction&#30340;edit&#12289;save&#21644;delete&#26041;&#27861;&#12290;
!!&#21019;&#24314;PersonAction [#4]
&#22312;src/web/**/action&#65292;&#21019;&#24314;PersonAction.java&#65292;&#26377;&#19979;&#38754;&#30340;&#20869;&#23481;&#65306;
[{Java2HtmlPlugin
package org.appfuse.webapp.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.appfuse.model.Person;
import org.appfuse.service.PersonManager;
import org.appfuse.webapp.form.PersonForm;
/**
* @struts.action name="personForm" path="/editPerson" scope="request"
* validate="false" parameter="method" input="mainMenu"
*/
public final class PersonAction extends BaseAction {
public ActionForward cancel(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
return mapping.findForward("mainMenu");
}
public ActionForward delete(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("Entering 'delete' method");
}
ActionMessages messages = new ActionMessages();
PersonForm personForm = (PersonForm) form;
// Exceptions are caught by ActionExceptionHandler
PersonManager mgr = (PersonManager) getBean("personManager");
mgr.removePerson(personForm.getId());
messages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("person.deleted"));
// save messages in session, so they'll survive the redirect
saveMessages(request.getSession(), messages);
return mapping.findForward("mainMenu");
}
public ActionForward edit(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("Entering 'edit' method");
}
PersonForm personForm = (PersonForm) form;
// if an id is passed in, look up the user - otherwise
// don't do anything - user is doing an add
if (personForm.getId() != null) {
PersonManager mgr = (PersonManager) getBean("personManager");
Person person = mgr.getPerson(personForm.getId());
personForm = (PersonForm) convert(person);
updateFormBean(mapping, request, personForm);
}
return mapping.findForward("edit");
}
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (log.isDebugEnabled()) {
log.debug("Entering 'save' method");
}
// Extract attributes and parameters we will need
ActionMessages messages = new ActionMessages();
PersonForm personForm = (PersonForm) form;
boolean isNew = ("".equals(personForm.getId()));
if (log.isDebugEnabled()) {
log.debug("saving person: " + personForm);
}
PersonManager mgr = (PersonManager) getBean("personManager");
Person person = (Person) convert(personForm);
mgr.savePerson(person);
// add success messages
if (isNew) {
messages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("person.added"));
// save messages in session to survive a redirect
saveMessages(request.getSession(), messages);
return mapping.findForward("mainMenu");
} else {
messages.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("person.updated"));
saveMessages(request, messages);
return mapping.findForward("edit");
}
}
}
}]
&#20320;&#20250;&#27880;&#24847;&#21040;&#20197;&#19978;&#30340;&#20195;&#30721;&#26377;&#35768;&#22810;&#23545;''convert''&#30340;&#35843;&#29992;&#26469;&#36716;&#21270;PersonForm&#21040;Person&#65292;&#36825;&#20010;&#36716;&#21270;''convert''&#26041;&#27861;&#22312;BaseAction.java&#65288;&#35843;&#29992;ConvertUtil.convert()&#65289;&#20013;&#65292;&#24182;&#19988;&#20351;&#29992;[BeanUtils.copyProperties|http://jakarta.apache.org/commons/beanutils/api/org/apache/commons/beanutils/BeanUtils.html#copyProperties(java.lang.Object,%20java.lang.Object)] &#26469;&#23454;&#29616;POJOs &rarr; ActionForms&#21644;ActionForms &rarr; POJOs&#30340;&#36716;&#21270;&#12290;
;:''&#22914;&#26524;&#20320;&#36816;&#34892;Eclipse&#65292;&#20320;&#38656;&#35201;&#23545;project&#36816;&#34892;"refresh"&#26469;&#26174;&#31034;PersonForm&#65292;&#23427;&#22312;build/web/gen&#30446;&#24405;&#20013;&#65292;&#36825;&#20010;&#30446;&#24405;&#24517;&#39035;&#26159;project&#30340;&#28304;&#30446;&#24405;&#20043;&#19968;&#65292;&#36825;&#26159;Eclipse&#30475;&#21040;&#21644;&#23548;&#20837;PersonForm&#30340;&#21807;&#19968;&#26041;&#24335;&#65292;&#22240;&#20026;&#23427;&#26159;&#36890;&#36807;XDoclet&#20135;&#29983;&#24182;&#19988;&#19981;&#22312;&#36890;&#24120;&#30340;&#28304;&#30446;&#24405;&#20013;&#65292;&#20320;&#21487;&#20197;&#22312;build/web/gen/org/appfuse/webapp/form/PersonForm.java&#25214;&#21040;&#23427;&#12290;''
;:''&#22312;[BaseAction|http://raibledesigns.com/downloads/apptracker/api/org/appfuse/webapp/action/BaseAction.java.html]&#37324;&#20320;&#21487;&#20197;&#23450;&#20041;&#33258;&#24049;&#30340;&#36716;&#25442;&#22120;(&#20363;&#22914; [DateConverter|http://raibledesigns.com/downloads/apptracker/api/org/apptracker/util/DateConverter.java.html])&#65292;&#22240;&#27492;BeanUtils.copyProperties&#33021;&#22815;&#30693;&#36947;Strings &rarr; Objects&#30340;&#36716;&#21270;&#12290;&#22914;&#26524;&#20320;&#30340;POJOs&#23384;&#22312;Lists(&#20363;&#22914; &#29238;&#23376;&#20851;&#31995;)&#65292;&#20320;&#38656;&#35201;&#20351;&#29992;{{convertLists(java.lang.Object)}}&#26041;&#27861;&#25163;&#24037;&#23436;&#25104;&#36825;&#20010;&#36716;&#21270;&#12290;''
&#29616;&#22312;&#20320;&#38656;&#35201;&#28155;&#21152;''edit'' forward&#21644;''savePerson'' action-mapping&#65292;&#36825;&#20004;&#20010;&#26089;&#23601;&#22312;PersonActionTest&#20013;&#25552;&#21040;&#65292;&#20026;&#27492;&#65292;&#21487;&#20197;&#22312;PersonAction.java&#28155;&#21152;&#19968;&#20123;&#39069;&#22806;&#30340;XDoclet&#26631;&#31614;&#65292;&#22312;&#31867;&#30340;&#22768;&#26126;&#21069;&#38754;&#21152;&#20837;&#36825;&#20123;&#27880;&#37322;&#65292;&#20320;&#19968;&#23450;&#24050;&#32463;&#26377;&#20102;''editPerson'' action-mapping&#30340;XDoclet&#26631;&#31614;&#65292;&#25105;&#22312;&#36825;&#37324;&#23637;&#31034;&#20320;&#20250;&#22312;&#31867;&#20013;&#30475;&#21040;&#30340;&#25152;&#26377;&#30340;XDoclet&#26631;&#31614;&#12290;
[{Java2HtmlPlugin
/**
* @struts.action name="personForm" path="/editPerson" scope="request"
* validate="false" parameter="method" input="mainMenu"
*
* @struts.action name="personForm" path="/savePerson" scope="request"
* validate="true" parameter="method" input="edit"
*
* @struts.action-forward name="edit" path="/WEB-INF/pages/personForm.jsp"
*/
public final class PersonAction extends BaseAction {
}]
action-mappings&#20013;''editPerson''&#21644;''savePerson''&#20027;&#35201;&#21306;&#21035;&#26159;''savePerson''&#30340;XDoclet&#26631;&#31614;&#30340;validation&#26631;&#35760;&#26159;true(&#35265;validation="true")&#65292;&#27880;&#24847;"input"&#23646;&#24615;&#24517;&#39035;&#25351;&#21521;&#21040;&#19968;&#20010;forward&#65292;&#32780;&#19981;&#26159;&#20010;&#36335;&#24452;(&#20363;&#22914;/editPerson.html)&#65292;&#22914;&#26524;&#20320;&#24076;&#26395;edit&#21516;save&#19968;&#26679;&#26159;&#26159;&#29992;&#29992;save&#30340;&#36335;&#24452;&#20063;&#26159;&#21487;&#20197;&#30340;&#65292;&#21482;&#35201;&#30830;&#20445;validate="false"&#65292;&#28982;&#21518;&#22312;&#20320;&#30340;"save"&#26041;&#27861;&#20013;&#65292;&#20320;&#21487;&#20197;&#25191;&#34892;form.validate()&#26469;&#22788;&#29702;&#38169;&#35823;&#12290;
&#20320;&#19968;&#23450;&#27880;&#24847;&#21040;&#20102;&#36825;&#37324;&#26159;&#29992;PersonManager&#30340;&#26041;&#24335;&#19982;PersonManagerTest&#20013;&#30340;&#19968;&#26679;&#65292;PersonAction&#21644;PersonManagerTest&#37117;&#26159;PersonManagerImpl&#30340;''&#23458;&#25143;''&#65292;&#36825;&#24456;&#26377;&#24847;&#20041;&#12290;
&#26412;&#25945;&#31243;&#20960;&#20046;&#25152;&#26377;&#30340;&#20107;&#24773;&#37117;&#25630;&#23450;&#20102;&#65292;&#35753;&#25105;&#20204;&#26469;&#36816;&#34892;&#36825;&#20123;&#27979;&#35797;&#65281;
!!&#36816;&#34892;PersonActionTest [#5]
&#22914;&#26524;&#20320;&#26597;&#30475;PersonActionTest&#65292;&#20320;&#20250;&#21457;&#29616;&#25152;&#26377;&#30340;&#27979;&#35797;&#20381;&#36182;&#20110;&#25968;&#25454;&#24211;&#20013;&#19968;&#26465;id=1&#30340;&#35760;&#24405;(testRemove&#20381;&#36182;&#20110;id=2)&#65292;&#25152;&#20197;&#35201;&#28155;&#21152;&#37027;&#20123;&#26679;&#26412;&#25968;&#25454;(metadata/sql/sample-data.xml)&#65292;&#25105;&#20250;&#28155;&#21152;&#21040;&#24213;&#37096;&#65292;&#39034;&#24207;&#24182;&#19981;&#37325;&#35201;&#65288;&#30446;&#21069;&#65289;&#65292;&#22240;&#20026;&#23427;&#20204;&#20114;&#30456;&#24182;&#19981;&#23384;&#22312;&#20381;&#36182;&#20851;&#31995;&#12290;
{{{
<table name='person'>
<column>id</column>
<column>first_name</column>
<column>last_name</column>
<row>
<value>1</value>
<value>Matt</value>
<value>Raible</value>
</row>
<row>
<value>2</value>
<value>James</value>
<value>Davidson</value>
</row>
</table>
}}}
DBUnit&#20250;&#22312;&#25191;&#34892;&#27979;&#35797;&#21069;&#21152;&#36733;&#36825;&#20123;&#25968;&#25454;&#65292;&#25152;&#20197;&#36825;&#20123;&#35760;&#24405;PersonActionTest&#21487;&#20197;&#24471;&#21040;&#12290;
&#22914;&#26524;&#29616;&#22312;&#20320;&#25191;&#34892;__ant test-web -Dtestcase=PersonAction__ - &#25152;&#26377;&#20107;&#24773;&#20250;&#25353;&#35745;&#21010;&#25191;&#34892;&#65292;&#22312;&#20316;&#23581;&#35797;&#21069;&#35831;&#30830;&#23450;Tomcat&#24050;&#32463;&#36816;&#34892;&#12290;
%%(color:green)BUILD SUCCESSFUL\\
Total time: 1 minute 21 seconds%%
!!&#28165;&#29702;JSP&#26469;&#20351;&#23427;&#26356;&#22909;&#30475; [#6]
&#35753;&#25105;&#20204;&#24320;&#22987;&#28165;&#29702;personForm.jsp&#65292;&#20462;&#25913;&lt;html:form&gt;&#30340;''action''&#20026;"savePerson"&#65292;&#36825;&#20445;&#35777;&#39564;&#35777;&#36215;&#20316;&#29992;&#65292;&#21516;&#26102;&#20462;&#25913;''focus''&#23646;&#24615;&#65292;&#20174;focus=""&#25913;&#20026;focus="firstName"&#65292;&#36825;&#26679;&#22312;&#39029;&#38754;&#25171;&#24320;&#21518;&#20809;&#26631;&#20250;&#33853;&#21040;firstName&#23383;&#27573;(&#20351;&#29992;JavaScript)&#12290;
&#29616;&#22312;&#20320;&#22914;&#26524;&#25191;&#34892;__ant db-load deploy__&#65292;&#21551;&#21160;Tomcat&#65292;&#28982;&#21518;&#22312;&#20320;&#30340;&#27983;&#35272;&#22120;&#36755;&#20837;[http://localhost:8080/appfuse/editPerson.html?id=1]&#65292;&#20320;&#20250;&#30475;&#21040;&#22914;&#19979;&#20449;&#24687;&#65306;
%%(border: 1px solid black; margin: 0 auto; height: 166px; width: 337px)
[personForm-final.png]
%%
%%note __&#27880;&#24847;__:&#22914;&#26524;&#20320;&#20462;&#25913;&#20102;''web''&#20013;&#30340;&#20219;&#20309;&#25991;&#20214;&#65292;&#35831;&#20351;&#29992;__deploy-web__&#65292;&#21542;&#21017;&#65292;&#20351;&#29992;__deploy__&#26469;&#32534;&#35793;&#21644;&#37096;&#32626;&#12290;%%
&#26368;&#21518;&#65292;&#20026;&#20102;&#20351;&#39029;&#38754;&#26356;&#21152;&#30340;&#29992;&#25143;&#21451;&#22909;&#65292;&#20320;&#20063;&#35768;&#24076;&#26395;&#20026;&#29992;&#25143;&#22312;form&#19978;&#38754;&#28155;&#21152;&#19968;&#27573;&#20449;&#24687;&#65292;&#21482;&#38656;&#22312;personForm.jsp&#39029;&#30340;&#39030;&#31471;&#28155;&#21152;(&#20351;&#29992; &lt;fmt:message&gt;)&#12290;
!![[&#21487;&#36873;&#30340;] &#21019;&#24314;Canoo WebTests&#26469;&#27979;&#35797;&#27169;&#25311;&#27983;&#35272;&#22120;&#30340;actions [#7]
&#26412;&#25945;&#31243;&#26368;&#21518;&#30340;&#27493;&#39588;(&#21487;&#36873;&#30340;)&#26159;&#21019;&#24314;[Canoo WebTest|http://webtest.canoo.com]&#26469;&#27979;&#35797;JSPs&#12290;
;:''&#25105;&#35828;&#26159;&#21487;&#36873;&#30340;&#65292;&#26159;&#22240;&#20026;&#20320;&#21487;&#20197;&#36890;&#36807;&#27983;&#35272;&#22120;&#36816;&#34892;&#21516;&#26679;&#30340;&#27979;&#35797;&#12290;''
&#20320;&#21487;&#20197;&#20351;&#29992;&#22914;&#19979;&#30340;URLs&#26469;&#27979;&#35797;&#19981;&#21516;actions&#30340;adding&#12289;editing&#21644;saving&#12290;
* Add - [http://localhost:8080/appfuse/editPerson.html].
* Edit - [http://localhost:8080/appfuse/editPerson.html?id=1] (make sure and run __ant db-load__ first).
* Delete - [http://localhost:8080/appfuse/editPerson.html?method=Delete&amp;id=1] (or edit and click on the Delete button).
* Save - Click [edit|http://localhost:8080/appfuse/editPerson.html?id=1] and then click the Save button.
Canoo&#27979;&#35797;&#38750;&#24120;&#30340;&#28789;&#27963;&#65292;&#21482;&#38656;&#35201;&#37197;&#32622;XML&#25991;&#20214;&#65292;&#20026;&#20102;&#27979;&#35797;add&#12289;edit&#12289;save&#21644;delete&#65292;&#25171;&#24320;test/web/web-tests.xml&#28155;&#21152;&#22914;&#19979;&#30340;XML&#65292;&#20320;&#19968;&#23450;&#27880;&#24847;&#21040;&#36825;&#20123;&#29255;&#26029;&#30340;target&#21517;&#31216;&#26159;''PersonTests''&#65292;&#20250;&#36816;&#34892;&#25152;&#26377;&#30456;&#20851;&#30340;&#27979;&#35797;&#12290;
;:''&#25105;&#20351;&#29992;CamelCase&#30340;target&#21629;&#21517;&#26041;&#24335;(vs. &#20256;&#32479;&#30340;&#23567;&#20889;&#65292;&#19979;&#21010;&#32447;&#20998;&#21106;&#30340;&#26041;&#24335;)&#26159;&#22240;&#20026;&#24403;&#25340;&#20889;''-Dtestcase=Name''&#26102;&#65292;&#25105;&#20250;&#32463;&#24120;&#20064;&#24815;&#20110;&#20351;&#29992;CamelCase&#26041;&#24335;&#26469;&#21629;&#21517;&#25105;&#30340;JUnit Tests&#12290;''
[{Java2HtmlPlugin
<!-- runs person-related tests -->
<target name="PersonTests"
depends="EditPerson,SavePerson,AddPerson,DeletePerson"
description="Call and executes all person test cases (targets)">
<echo>Successfully ran all Person JSP tests!</echo>
</target>
<!-- Verify the edit person screen displays without errors -->
<target name="EditPerson"
description="Tests editing an existing Person's information">
<webtest name="editPerson">
&config;
<steps>
&login;
<invoke description="click Edit Person link" url="/editPerson.html?id=1"/>
<verifytitle description="we should see the personDetail title"
text=".*${personDetail.title}.*" regex="true"/>
</steps>
</webtest>
</target>
<!-- Edit a person and then save -->
<target name="SavePerson"
description="Tests editing and saving a user">
<webtest name="savePerson">
&config;
<steps>
&login;
<invoke description="click Edit Person link" url="/editPerson.html?id=1"/>
<verifytitle description="we should see the personDetail title"
text=".*${personDetail.title}.*" regex="true"/>
<setinputfield description="set lastName" name="lastName" value="Canoo"/>
<clickbutton label="Save" description="Click Save"/>
<verifytitle description="Page re-appears if save successful"
text=".*${personDetail.title}.*" regex="true"/>
<verifytext description="verify success message" text="${person.updated}"/>
</steps>
</webtest>
</target>
<!-- Add a new Person -->
<target name="AddPerson"
description="Adds a new Person">
<webtest name="addPerson">
&config;
<steps>
&login;
<invoke description="click Add Button" url="/editPerson.html"/>
<verifytitle description="we should see the personDetail title"
text=".*${personDetail.title}.*" regex="true"/>
<setinputfield description="set firstName" name="firstName" value="Abbie"/>
<setinputfield description="set lastName" name="lastName" value="Raible"/>
<clickbutton label="${button.save}" description="Click button 'Save'"/>
<verifytitle description="Main Menu appears if save successful"
text=".*${mainMenu.title}.*" regex="true"/>
<verifytext description="verify success message" text="${person.added}"/>
</steps>
</webtest>
</target>
<!-- Delete existing person -->
<target name="DeletePerson"
description="Deletes existing Person">
<webtest name="deletePerson">
&config;
<steps>
&login;
<invoke description="click Edit Person link" url="/editPerson.html?id=1"/>
<clickbutton label="${button.delete}" description="Click button 'Delete'"/>
<verifytitle description="display Main Menu" text=".*${mainMenu.title}.*" regex="true"/>
<verifytext description="verify success message" text="${person.deleted}"/>
</steps>
</webtest>
</target>
}]
&#23436;&#25104;&#28155;&#21152;&#21518;&#65292;&#20320;&#19968;&#23450;&#21487;&#20197;&#22312;Tomcat&#36816;&#34892;&#26102;&#36816;&#34892;__ant test-canoo -Dtestcase=PersonTests__&#65292;&#25110;&#32773;&#20351;&#29992;__ant test-jsp -Dtestcase=PersonTests__&#35753;Ant&#20026;&#20320;&#21551;&#21160;/&#20851;&#38381;Tomcat&#65292;&#20026;&#20102;&#22312;&#25152;&#26377;&#30340;Canoo&#27979;&#35797;&#20013;&#21253;&#25324;PersonTests&#65292;&#25226;&#23427;&#20316;&#20026;"run-all-tests"&#30340;&#20381;&#36182;target&#12290;
&#20320;&#24517;&#39035;&#27880;&#24847;&#21040;Canoo&#27809;&#26377;&#23458;&#25143;&#31471;&#30340;&#26085;&#24535;&#65292;&#22914;&#26524;&#20320;&#26399;&#26395;&#30475;&#21040;&#19968;&#20123;&#20449;&#24687;&#65292;&#20320;&#21487;&#20197;&#22312;&#27599;&#19968;&#20010;target&#30340;&lt;/canoo&gt;&#21644;&lt;/target&gt;&#20043;&#38388;&#28155;&#21152;&#22914;&#19979;&#20195;&#30721;&#12290;
{{{<loadfile property="web-tests.result"
srcFile="${test.dir}/data/web-tests-result.xml"/>
<echo>${web-tests.result}</echo>}}}
%%(color:green)BUILD SUCCESSFUL\\
Total time: 11 seconds%%
----
''Next Up:'' __Part IV:__ [增加校验功能和列表页面|ValidationAndList_zh] - &#32473;personForm&#30340;firstName&#21644;lastName&#23383;&#27573;&#28155;&#21152;&#24517;&#28155;&#30340;&#39564;&#35777;&#36923;&#36753;&#21644;&#26174;&#31034;person&#25152;&#26377;&#35760;&#24405;&#30340;&#39029;&#38754;&#12290;

Back to CreateActions_zh, or to the Page History.