在Succeeding with Struts的前面安裝部分
我間接提到了DynaForms在運行期內可以動態的控制表格大小
換句話說
就是能夠根據需要得到
行
或者
行
或者
行長的表格
可能有點不明智
我把這種策略的實際實現作為一種練習留給了讀者自己
在接下來的幾個月內
我收到了幾十個讀者的請求
他們請求給出詳細的實現細節
所以這個月我將用兩種不同的方法來實現動態調整的表格
第一個方法就是我在前面的欄目中提到的那個方法
將尺寸參數留給DynaForm 的form
property 屬性來實現
為了演示詳細過程
我們來看看一個非常簡單的應用
添加關於不同Star Wars 演員的注釋
在這個應用中我們感興趣的關鍵事實是
演員的數量在表格配置中動態設定
而不是在struts
config
xml文件中動態設定
首先
我們先來看看struts
config
xml 文件
<?xml version=
encoding=
UTF
?>
<!DOCTYPE struts
config PUBLIC
//Apache Software Foundation//DTD Struts Configuration
//EN
config_
_
dtd
;>
<struts
config>
<form
beans>
<form
bean name=
dynamicArrayForm
type=
org
apache
struts
validator
DynaValidatorForm
>
<form
property name=
people
type=
demo
Person[]
/>
</form
bean>
</form
beans>
<action
mappings>
<action path=
/setupForm
type=
demo
SetupFormAction
name=
dynamicArrayForm
scope=
session
validate=
false
>
<forward name=
success
path=
/displayForm
jsp
/>
</action>
<action path=
/processActorComments
type=
demo
ProcessFormAction
name=
dynamicArrayForm
scope=
session
validate=
false
>
<forward name=
success
path=
/displayForm
jsp
/>
</action>
</action
mappings>
</struts
config>
如你所見
這是一個相當簡單的配置文件
只定義了一個表格和兩個動作
第一個動作
/setupForm
用來在初始顯示之前配置表格
另一個動作
/processActorComments 用來處理用戶輸入的注釋
在這個文件中有兩個重要的事情需要注意
它們對於事態的發展很關鍵
people 表格屬性定義為demo
Person[] 類型(即demo
Person的一個排列)
但不給出任何size 參數
這就為要創建的排列產生了一個占位符
但是沒有任何例示的實排列
這兩個動作將表格定義在會話期范圍內
這是很關鍵的
因為用戶在填寫數值之後提交表格時
數值在動作執行之前已經填充到表格內了
這就意味著沒有機會手動創建具有恰當空位數的排列
正如你在表格顯示之前在SetupFormAction 類中看到的情況一樣
換句話說
當表格提交時
必須已經有恰當的空位來接受表格值
唯一能保證這個的方法就是在會話期范圍內就已經有了這個表格
基本上在Person bean 中是沒有值的
他只是一個具有lastName
firstName
dateOfBirth
gender 和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 java
io
IOException;
import javax
servlet
ServletException;
import javax
servlet
http
*;
import org
apache
struts
action
*;
import org
apache
struts
validator
DynaValidatorForm;
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
);
df
set(
people
p);
return mapping
findForward(
success
);
}
}
這一次也沒有許多東西要看的
execute 方法要做的第一件事情
和任何基於DynaForm的動作所做的一樣
就是將泛型ActionForm 類放到DynaValidatorForm內
這就使得我們可以在表格上使用get和set 方法
第二件事情就是
創建一個具有三個元素的類型Person 的排列
在這個方法中
尺寸是硬布線的
在實際應用中可以從數據庫中選擇一個尺寸
我們需要考慮的重要事情是排列應該在代碼中創建
而不是由Struts引擎自己創建
這樣行數可根據應用要求由代碼隨意指定
一旦排列已經確定
方法將創建三個Person 類實例並賦與數值
同樣
在實際的應用中可通過一個循環來實現
這個循環不斷地從數據庫中讀取行和填充表格行
最後
動作返回成功
導致Struts轉移控制到displayForm
jsp 頁
<!
Copyright
James M Turner
All Rights Reserved
>
<%@ taglib uri=
/WEB
INF/struts
html
tld
prefix=
html
%>
<%@ taglib uri=
/WEB
INF/c
tld
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=
${dynamicArrayForm
map
people}
>
<tr><td><c:out value=
${people
lastName}
/></td>
<td><c:out value=
${people
firstName}
/></td>
<td><c:out value=
${people
dateOfBirth}
/></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 屬性的訪問)
顯示演員的姓
名和出生日期
並提供文本域以便輸入注釋
當我們聚焦我們的浏覽器合請求時
(假設你把struts
war 文件放在你本地機器的Tomcat 內)
將會出現下列頁面
Start Wars Actor Fact Page Last Name First Name Date of Birth Comment
Ford Harrison
/
/
Fisher Carrie
/
/
Hamill Mark
/
/
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28402.html