在Succeeding with Struts的前面安装部分我间接提到了DynaForms在运行期内可以动态的控制表格大小换句话说就是能够根据需要得到行或者行或者行长的表格可能有点不明智我把这种策略的实际实现作为一种练习留给了读者自己在接下来的几个月内我收到了几十个读者的请求他们请求给出详细的实现细节所以这个月我将用两种不同的方法来实现动态调整的表格
第一个方法就是我在前面的栏目中提到的那个方法将尺寸参数留给DynaForm 的formproperty 属性来实现为了演示详细过程我们来看看一个非常简单的应用添加关于不同Star Wars 演员的注释在这个应用中我们感兴趣的关键事实是演员的数量在表格配置中动态设定而不是在strutsconfigxml文件中动态设定
首先我们先来看看strutsconfigxml 文件
<?xml version= encoding=UTF?>
<!DOCTYPE strutsconfig PUBLIC //Apache Software Foundation//DTD Struts Configuration //EN
config__dtd;>
<strutsconfig>
<formbeans>
<formbean name=dynamicArrayForm type=orgapachestrutsvalidatorDynaValidatorForm>
<formproperty name=people type=demoPerson[]/>
</formbean>
</formbeans>
<actionmappings>
<action path=/setupForm type=demoSetupFormAction name=dynamicArrayForm scope=session
validate=false>
<forward name=success path=/displayFormjsp/>
</action>
<action path=/processActorComments
type=demoProcessFormAction
name=dynamicArrayForm scope=session
validate=false>
<forward name=success path=/displayFormjsp/>
</action>
</actionmappings>
</strutsconfig>
如你所见这是一个相当简单的配置文件只定义了一个表格和两个动作第一个动作/setupForm用来在初始显示之前配置表格另一个动作/processActorComments 用来处理用户输入的注释
在这个文件中有两个重要的事情需要注意它们对于事态的发展很关键
people 表格属性定义为demoPerson[] 类型(即demoPerson的一个排列)但不给出任何size 参数这就为要创建的排列产生了一个占位符但是没有任何例示的实排列
这两个动作将表格定义在会话期范围内这是很关键的因为用户在填写数值之后提交表格时数值在动作执行之前已经填充到表格内了这就意味着没有机会手动创建具有恰当空位数的排列正如你在表格显示之前在SetupFormAction 类中看到的情况一样换句话说当表格提交时必须已经有恰当的空位来接受表格值唯一能保证这个的方法就是在会话期范围内就已经有了这个表格
基本上在Person bean 中是没有值的他只是一个具有lastName firstName dateOfBirthgender 和comment字段的普通bean源文件包括在WAR 文件内
现在我们来看看SetupFormAction 类它在表格第一次显示之前调用
package demo;
/**
*Copyright James M Turner
* All Rights Reserved
*
* A Struts action that sets up a DynaForm which is globally scoped
*/
import javaioIOException;
import javaxservletServletException;
import javaxservlethttp*;
import orgapachestrutsaction*;
import orgapachestrutsvalidatorDynaValidatorForm;
public class SetupFormAction extends Action {
public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request
HttpServletResponse response)
throws ServletException IOException {
DynaValidatorForm df = (DynaValidatorForm) form;
Person[] p = new Person[];
p[] = new Person();
p[]setDateOfBirth(//);
p[]setLastName(Ford);
p[]setFirstName(Harrison);
p[]setGender(M);
p[] = new Person();
p[]setDateOfBirth(//);
p[]setLastName(Fisher);
p[]setFirstName(Carrie);
p[]setGender(F);
p[] = new Person();
p[]setDateOfBirth(//);
p[]setLastName(Hamill);
p[]setFirstName(Mark);
p[]setGender(M);
dfset(people p);
return mappingfindForward(success);
}
}
这一次也没有许多东西要看的execute 方法要做的第一件事情和任何基于DynaForm的动作所做的一样就是将泛型ActionForm 类放到DynaValidatorForm内这就使得我们可以在表格上使用get和set 方法第二件事情就是创建一个具有三个元素的类型Person 的排列在这个方法中尺寸是硬布线的在实际应用中可以从数据库中选择一个尺寸我们需要考虑的重要事情是排列应该在代码中创建而不是由Struts引擎自己创建这样行数可根据应用要求由代码随意指定
一旦排列已经确定方法将创建三个Person 类实例并赋与数值同样在实际的应用中可通过一个循环来实现这个循环不断地从数据库中读取行和填充表格行最后动作返回成功导致Struts转移控制到displayFormjsp 页
<!
Copyright James M Turner
All Rights Reserved
>
<%@ taglib uri=/WEBINF/strutshtmltld prefix=html %>
<%@ taglib uri=/WEBINF/ctld prefix=c %>
<head>
<title>Star Wars Actor Fact Page</title>
</head>
<H><center>Start Wars Actor Fact Page</title>
<html:form action=/processActorComments >
<table border= width=%>
<tr><th>Last Name</th><th>First Name</th><th>Date of Birth</th><th>Comment</th></tr>
<c:forEach var=people items=${dynamicArrayFormmappeople}>
<tr><td><c:out value=${peoplelastName}/></td>
<td><c:out value=${peoplefirstName}/></td>
<td><c:out value=${peopledateOfBirth}/></td>
<td><html:text name=people indexed=true property=comment/></td>
</tr>
</c:forEach>
</table>
<P/>
<html:submit value=Update Comments/>
</html:form>
同样这里也没有很多东西要看的他与我们上一篇文章查看固定长度的行时的代码完全一样该页迭代行(记住在JSTL中我们必须使用map 属性来获得到DynaForm 属性的访问)显示演员的姓名和出生日期并提供文本域以便输入注释
当我们聚焦我们的浏览器合请求时 (假设你把strutswar 文件放在你本地机器的Tomcat 内)将会出现下列页面
Start Wars Actor Fact Page Last Name First Name Date of Birth Comment
Ford Harrison //
Fisher Carrie //
Hamill Mark //