首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Struts 的动态复选框实例(2)

Struts 的动态复选框实例(2)

第 3 步. 编写 Action 类最后一步是编写 Action 类。清单 3 比起其他清单,做的事并不多。我做的只是得到 selectedMountains 的  String[] 数组,并使它可以用于页面:
清单 3. 表单的 Action
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
* A simple Action for Checkbox test.
*
* @author Danilo Gurovich
*/
public final class CheckboxTestAction
extends Action {
// -------------------------- OTHER METHODS --------------------------

/**
* The execute method
*
* @param mapping ActionMapping
* @param form CheckboxTestForm
* @param request HttpServletRequest
* @param response HttpServletRespons
* @return success to the confirmation page
* @throws ServletException not thrown, but could be!
* @throws Exception ditto.
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, Exception {

// Extract attributes needed
String[] selectedMountains =
((CheckboxTestForm) form).getSelectedMountains()
;

System.out.println("htmlString RETURNED*\n" +
selectedMountains.toString());

//Save the htmlString in the session for later...
HttpSession session = request.getSession();
session.setAttribute(CheckboxConstants.MOUNTAINS, selectedMountains);

return (mapping.findForward("success"));
}
}




扩充 Himalayas有了这个代码,工作就完成了,差不多可以展示成果了!用户现在可以提交 JSP 表单并在 Action 类引用的对应页面中查看结果。清单 4 中的代码段显示了用户在简单 JSP 页面的表单中选中的复选框列表:
清单 4. 复选框选择的结果
1
2
3
4
5
6
7
8
9
10
11
12
<%@taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>

<%-- html code, etc... -->

<logic:iterate id="mountain" property="mountains" name="testForm">
<bean:write name="mountain"/><br/>
</logic:iterate>
<hr size=5 color="black"/>

<%-- some more html code, etc... -->




这个诀窍的工作方式这个诀窍的关键是表单 bean 中的字段被传递到页面。查看相关 JSP 代码有助于澄清这点。一旦表单 bean 被实例化:
1
2
3
<html:form action="/FormAction"
name="testForm"
type=" com.strutsrecipes.CheckboxTestForm">




下一步为 Java 类的 mountains 变量中的每个 mountain 创建一个复选框。要做到这一点,我必须像下面这样在 String[] 数组中迭代:
1
2
3
<logic:iterate id="mountain"
property="mountains"
name="testForm">




使用 <logic:iterate> 标记,我调用了 testForm bean 中的 getMountains()  方法。它在这个数组中迭代,并把每个值作为已经命名的 pageContext() 级的 String mountain[]  数组变量返回(即 id="mountain")。
在这里可以看到 <html:multibox/> 标记的效果以及如何显示它:
1
2
3
4
<html:multibox property="selectedMountains">
<bean:write name="mountain"/>
</html:multibox>
<bean:write name="mountain"/><br/>




注意 property 属性被 selectedMountains 填充,这是我选中的变量。当这个变量与 <html:multibox/> 值(即 multibox 标记中的 <bean:write/>)对应时,在呈现表单的时候它就表现为选中。如果用户选中表单或取消选中,那么新的 selectedMountains 值就被发送给 Action 类进行处理。这个迭代中的第二个 <bean:write/> 标记创建该标记使用的标签,后面跟着 <br/> 标记,让视图在一长列中显示这些标记。
扩展这个诀窍通过使用 Struts LabelValueBean 类代替简单的 String[] 数组,可以对动态复选框这个诀窍进行扩展,从而为复选框创建不同的标签。先从添加 LabelValueBeans 到 java.util.List 开始。然后对列表进行迭代,把 LabelValueBeans 标签和值释放到适当的位置。这个略微复杂的诀窍与动态复选框诀窍的效果相同,但是它的结果更适合实际的用户界面设计。清单 5 显示了扩展的动态复选框诀窍:
清单 5. 添加标签到动态复选框
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<logic:iterate id="mountainlb"
property="mountainslb"
name="testForm">

<bean:define id="mountainbean"
name="mountainlb
"type="org.apache.struts.util.LabelValueBean"/>

<html:multibox property="selectedMountains">
<bean:write name="mountainbean"
property="value"/>
</html:multibox>
<bean:write name="mountainbean"
property="label"/><br/>

</logic:iterate>




注意,这里大的变化是用 <bean:define/> 在迭代的时候创建 LabelValueBean。然后用 <bean:write/> 输出每个 mountainbean 的属性(即 org.apache.struts.util.LabelValueBean 类的 getLabel() 和 getValue() 方法)。
返回列表