4、添加验证和列表页面
主要任务:
[1]添加验证标记到Person类中
[2]查看添加验证后的JSP页面,并且测试
[3]添加testGetPeople方法到DAO、Manager测试中
[4]添加testSerach方法到Action测试中
[5]在Action中添加Serach方法
[6]创建personFormList.jsp页面
[7]在菜单中添加链接
在Struts当中使用验证通常是将验证写到vaildtion.xml文件中,但是这样配置比较麻烦。我们现在使用XDoclet来自动生成这个验证配置文件。
在Person对象当中需要验证的字段的GET方法前加入验证标签,如下:
/** * @struts.validator type="required" * @hibernate.property column="first_name" length="50" */ public String getFirstName() { return this.firstName; }
/** * @struts.validator type="required" * @hibernate.property column="last_name" length="50" */ public String getLastName() { return this.lastName; }
|
当然,你还可以加入很多自定义的验证规则,或者使用msgkey。
@struts.validator type="required" msgkey="errors.required"
|
现在,你可以保存Person.java文件,然后运行 ant clean webdoclet命令来生成验证文件。
生成后的验证文件如下:
<form name="personForm"> <field property="firstName" depends="required">
<arg0 key="personForm.firstName"/> </field> <field property="lastName" depends="required">
<arg0 key="personForm.lastName"/> </field> </form>
|
而在jsp文件中,你可以看到如下的客户端验证代码:
<html:javascript formName="personForm" cdata="false"
dynamicJavascript="true" staticJavascript="false"/>
<script type="text/javascript"
src="<html:rewrite page="/scripts/validator.jsp"/>"></script>
如果你希望使用服务器端验证方法,那么可以将上面的代码删除掉。
使用客户端验证的效果:
使用服务器端验证的效果:
加testGetPeople方法到PersonDAO和PersonManager测试方法当中。
打开PersonDAOTest.java文件,加入以下代码:
public void testGetPeople() { person = new Person(); List results = dao.getPeople(person); assertTrue(results.size() > 0); }
|
打开PersonManagerTest.java文件,加入以下代码:
public void testGetPeople() { List results = mgr.getPeople(new Person()); assertTrue(results.size() > 0); }
|
现在需要在DAO当中实现这样的方法:
public List getPeople(Person person);
|
在PersonManager中实现这样的方法:
public List getPeople(Person person) { return getHibernateTemplate().find("from Person"); }
|
在这里你可以看到区别。如果直接使用Hibernate的话,那么实现这样的一个功能至少需要有以下的代码:
Example example = Example.create(person) .excludeZeroes() // exclude zero valued properties .ignoreCase(); // perform case insensitive string comparisons try { return getSession().createCriteria(Person.class) .add(example) .list(); } catch (Exception e) { throw new DataAccessException(e.getMessage()); } return new ArrayList();
|
而现在代码的数量减少了很多。只有下面的一句就可以。
public List getPeople(Person person) { return dao.getPeople(person); }
|
在完成上述操作之后,我们可以运行下面的语言来进行编译和测试:
ant test-dao -Dtestcase=PersonDAO
ant test-service -Dtestcase=PersonManager
添加testSerach方法到Action的测试类中。
打开personActionTest.java加入下列代码:
public void testSearch() { setRequestPathInfo("/editPerson"); addRequestParameter("method", "Search"); actionPerform();
verifyForward("list");
assertNotNull(getRequest().getAttribute(Constants.PERSON_LIST)); verifyNoActionErrors(); }
|
现在这个类还无法被编译,因为你没有将PERSON_LIST加入到Constants.java文件中。
/** * The request scope attribute that holds the person list */ public static final String PERSON_LIST = "personList";
|
下面在Action中加入Serach方法。
public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { if (log.isDebugEnabled()) { log.debug("Entering 'search' method"); }
PersonManager mgr = (PersonManager) getBean("personManager"); List people = mgr.getPeople(null); request.setAttribute(Constants.PERSON_LIST, people);
// return a forward to the person list definition return mapping.findForward("list"); }
|
然后运行命令ant test-web -Dtestcase=PersonAction来进行测试。
建立列表页面。
将原来已经生成的PersonFormList.jsp拷贝到web/pages/目录下,修改其中的代码以便使其适合你的要求。
现在需要在metadata/web/global-forwards.xml文件中注册一个全局转向,以便能找到你的Action。
<forward name="editPerson" path="/editPerson.html"/> <forward name="viewPeople" path="/editPerson.html?action=Search"/>
|
完成以后,我们将这个功能加到菜单链接里面。
打开web/pages/mainMenu.jsp文件,加入下列代码:
<li>
<html:link forward=
"viewPeople"
>
<fmt:message key=
"menu.viewPeople"
/>
</html:link>
</li>
在上面代码中的menu.viewPeople是菜单项的名称,你需要在资源文件中加入这个名称的本地语言。
然后打开web/WEB-INF/menu-config.xml文件,加入这个菜单的配置。
<Menu name="PeopleMenu" title="menu.viewPeople" forward="viewPeople"/>
|
在页面上加入这个新的菜单。打开web/pages/menu.jsp
<%@ include file="/common/taglibs.jsp"%>
<div id="menu"> <menu:useMenuDisplayer name="ListMenu" permissions="rolesAdapter"> <menu:displayMenu name="AdminMenu"/> <menu:displayMenu name="UserMenu"/> <menu:displayMenu name="PeopleMenu"/> <menu:displayMenu name="FileUpload"/> <menu:displayMenu name="FlushCache"/> <menu:displayMenu name="Clickstream"/> </menu:useMenuDisplayer> </div>
|
现在你可以通过运行ant clean deploy命令启动tomcat并且部署应用程序,这样你可以运行该程序。
4、添加验证和列表页面
主要任务:
[1]添加验证标记到Person类中
[2]查看添加验证后的JSP页面,并且测试
[3]添加testGetPeople方法到DAO、Manager测试中
[4]添加testSerach方法到Action测试中
[5]在Action中添加Serach方法
[6]创建personFormList.jsp页面
[7]在菜单中添加链接
在Struts当中使用验证通常是将验证写到vaildtion.xml文件中,但是这样配置比较麻烦。我们现在使用XDoclet来自动生成这个验证配置文件。
在Person对象当中需要验证的字段的GET方法前加入验证标签,如下:
/** * @struts.validator type="required" * @hibernate.property column="first_name" length="50" */ public String getFirstName() { return this.firstName; }
/** * @struts.validator type="required" * @hibernate.property column="last_name" length="50" */ public String getLastName() { return this.lastName; }
|
当然,你还可以加入很多自定义的验证规则,或者使用msgkey。
@struts.validator type="required" msgkey="errors.required"
|
现在,你可以保存Person.java文件,然后运行 ant clean webdoclet命令来生成验证文件。
生成后的验证文件如下:
<form name="personForm"> <field property="firstName" depends="required">
<arg0 key="personForm.firstName"/> </field> <field property="lastName" depends="required">
<arg0 key="personForm.lastName"/> </field> </form>
|
而在jsp文件中,你可以看到如下的客户端验证代码:
<html:javascript formName="personForm" cdata="false"
dynamicJavascript="true" staticJavascript="false"/>
<script type="text/javascript"
src="<html:rewrite page="/scripts/validator.jsp"/>"></script>
如果你希望使用服务器端验证方法,那么可以将上面的代码删除掉。
使用客户端验证的效果:
使用服务器端验证的效果:
加testGetPeople方法到PersonDAO和PersonManager测试方法当中。
打开PersonDAOTest.java文件,加入以下代码:
public void testGetPeople() { person = new Person(); List results = dao.getPeople(person); assertTrue(results.size() > 0); }
|
打开PersonManagerTest.java文件,加入以下代码:
public void testGetPeople() { List results = mgr.getPeople(new Person()); assertTrue(results.size() > 0); }
|
现在需要在DAO当中实现这样的方法:
public List getPeople(Person person);
|
在PersonManager中实现这样的方法:
public List getPeople(Person person) { return getHibernateTemplate().find("from Person"); }
|
在这里你可以看到区别。如果直接使用Hibernate的话,那么实现这样的一个功能至少需要有以下的代码:
Example example = Example.create(person) .excludeZeroes() // exclude zero valued properties .ignoreCase(); // perform case insensitive string comparisons try { return getSession().createCriteria(Person.class) .add(example) .list(); } catch (Exception e) { throw new DataAccessException(e.getMessage()); } return new ArrayList();
|
而现在代码的数量减少了很多。只有下面的一句就可以。
public List getPeople(Person person) { return dao.getPeople(person); }
|
在完成上述操作之后,我们可以运行下面的语言来进行编译和测试:
ant test-dao -Dtestcase=PersonDAO
ant test-service -Dtestcase=PersonManager
添加testSerach方法到Action的测试类中。
打开personActionTest.java加入下列代码:
public void testSearch() { setRequestPathInfo("/editPerson"); addRequestParameter("method", "Search"); actionPerform();
verifyForward("list");
assertNotNull(getRequest().getAttribute(Constants.PERSON_LIST)); verifyNoActionErrors(); }
|
现在这个类还无法被编译,因为你没有将PERSON_LIST加入到Constants.java文件中。
/** * The request scope attribute that holds the person list */ public static final String PERSON_LIST = "personList";
|
下面在Action中加入Serach方法。
public ActionForward search(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { if (log.isDebugEnabled()) { log.debug("Entering 'search' method"); }
PersonManager mgr = (PersonManager) getBean("personManager"); List people = mgr.getPeople(null); request.setAttribute(Constants.PERSON_LIST, people);
// return a forward to the person list definition return mapping.findForward("list"); }
|
然后运行命令ant test-web -Dtestcase=PersonAction来进行测试。
建立列表页面。
将原来已经生成的PersonFormList.jsp拷贝到web/pages/目录下,修改其中的代码以便使其适合你的要求。
现在需要在metadata/web/global-forwards.xml文件中注册一个全局转向,以便能找到你的Action。
<forward name="editPerson" path="/editPerson.html"/> <forward name="viewPeople" path="/editPerson.html?action=Search"/>
|
完成以后,我们将这个功能加到菜单链接里面。
打开web/pages/mainMenu.jsp文件,加入下列代码:
<li>
<html:link forward=
"viewPeople"
>
<fmt:message key=
"menu.viewPeople"
/>
</html:link>
</li>
在上面代码中的menu.viewPeople是菜单项的名称,你需要在资源文件中加入这个名称的本地语言。
然后打开web/WEB-INF/menu-config.xml文件,加入这个菜单的配置。
<Menu name="PeopleMenu" title="menu.viewPeople" forward="viewPeople"/>
|
在页面上加入这个新的菜单。打开web/pages/menu.jsp
<%@ include file="/common/taglibs.jsp"%>
<div id="menu"> <menu:useMenuDisplayer name="ListMenu" permissions="rolesAdapter"> <menu:displayMenu name="AdminMenu"/> <menu:displayMenu name="UserMenu"/> <menu:displayMenu name="PeopleMenu"/> <menu:displayMenu name="FileUpload"/> <menu:displayMenu name="FlushCache"/> <menu:displayMenu name="Clickstream"/> </menu:useMenuDisplayer> </div>
|
现在你可以通过运行ant clean deploy命令启动tomcat并且部署应用程序,这样你可以运行该程序。