Struts表单属性的高级应用
立即解锁
发布时间: 2025-08-18 02:19:20 阅读量: 1 订阅数: 7 

### Struts表单属性的高级应用
在Web开发中,表单处理是一个常见且重要的任务。Struts框架为我们提供了丰富的功能来处理表单,本文将介绍几种高级的表单属性使用方法,包括列表支持的表单属性、映射支持的表单属性、懒动态动作表单以及如何从动作表单填充值对象。
#### 1. 使用列表支持的表单属性
有时候,我们需要一个表单属性来表示一组值,而不是单个值。Java的`java.util.List`可以很好地实现这一需求。
##### 1.1 问题
希望创建并使用一个由`java.util.List`支持的表单属性,能够通过一个方法访问整个数据列表,并使用索引属性访问列表中的特定值。
##### 1.2 解决方案
将表单属性创建为索引属性,并由`java.util.List`支持。以下是示例代码:
```java
package com.oreilly.strutsckbk.ch05;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class ListForm extends ActionForm {
private int size = 3;
private List friends = new ArrayList(size);
public List getFriends( ) {
return friends;
}
public String getFriend(int index) {
return (String) friends.get(index);
}
public void setFriend(int index, String name) {
friends.set(index, name);
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
// prepopulate the list with empty strings
friends = new ArrayList( );
for (int i=0; i<size;i++) friends.add("");
}
}
```
在JSP页面上,可以通过以下方式访问列表支持的表单属性:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<head>
<title>Struts Cookbook - Chapter 5 : List-backed Form Property</title>
</head>
<body>
<h2>List Form Test</h2>
<html:form action="/ProcessListForm">
Who are your 3 friends:<br />
Friend 1: <html:text property="friend[0]"/><br />
Friend 2: <html:text property="friend[1]"/><br />
Friend 3: <html:text property="friend[2]"/><br />
<html:submit/>
</html:form>
<hr />
<c:forEach var="item" items="${ListForm.friends}">
<c:out value="${item}"/><br />
</c:forEach>
</body>
</html>
```
##### 1.3 讨论
要使列表支持的属性可从HTML表单访问,需要提供遵循JavaBean约定的索引属性的getter和setter方法:
```java
public Foo getFoo(int index);
public void setFoo(int index, Foo foo);
```
只要属性遵循此约定,无论底层实现如何,都可以访问该属性。需要注意的是,虽然列表是可调整大小的,但必须确保getter和setter方法不会尝试访问超出列表大小的索引,否则会抛出`IndexOutOfBoundsException`。可以在`ActionForm`的`reset()`方法中预加载列表,或者在getter和setter方法中根据需要动态调整列表大小。
#### 2. 使用映射支持的表单属性
当表单属性定义为`Map`时,我们希望使用键来访问该`Map`中的值。
##### 2.1 问题
有一个表单,其中一个属性定义为`Map`,希望使用键访问该`Map`中的值。
##### 2.2 解决方案
定义使用以下模式的getter和setter方法:
```java
public Object getFoo(String key) {...}
public void setFoo(String key, Object value) {...}
```
以下是示例代码:
```java
package com.oreilly.strutsckbk.ch05;
import java.util.HashMap;
import java.util.Map;
import org.apache.struts.action.ActionForm;
public class MapForm extends ActionForm {
private static String[] skillLevels =
new String[] {"Beginner","Intermediate","Advanced"};
private Map skills = new HashMap( );
public Object getSkill(String key) {
return skills.get(key);
}
public void setSkill(String key, Object value) {
skills.put(key, value);
}
public Map getSkills( ) {
return skills;
}
public String[] getSkillLevels( ) {
return skillLevels;
}
}
```
在JSP页面上,可以使用`property="value(key)"`语法访问映射支持的表单属性:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html>
<head>
<title>Struts Cookbook - Chapter 5 : Map-backed Form</title>
</head>
<body>
<h2>Map Form Test</h2>
<html:form action="/ProcessMapForm">
Java Skill:
<html:select property="skill(java)">
<html:options property="skillLevels"/>
</html:select><br />
JSP Skill:
<html:select property="skill(jsp)">
<html:options property="skillLevels"/>
</html:select><br />
Struts Skill:
<html:select property="skill(struts)">
<html:options property="skillLevels"/>
</html:select><br />
<html:submit/>
</html:form>
<hr />
<c:if test="${not empty MapForm.skills}">
Java Skill: <c:out value="${MapForm.skills.java}"/><br />
JSP Skill: <c:out value="${MapForm.skills.jsp}"/><br />
Struts Skill: <c:out value="${MapForm.skills.struts}"/><br />
</c:if>
</body>
</html>
```
##### 2.3 讨论
映射支持的表单属性值通过其键进行访问,键和值用于在映射中添加或替换值。这种属性提供了一种很好的方式来创建可以容纳不确定值集的属性。对于映射支持的属性,键应该始终是字符串。JSTL不支持访问使用`getValue(String key)`模式的属性,但如果实际的`Map`通过公共getter方法暴露,则可以使用JSTL表达式访问映射支持的属性。
#### 3. 懒动态动作表单
有时候,我们需要创建一个表单,其中的属性是可变的,并且完全在运行时确定。
##### 3.1 问题
希望创建一个表单,其属性是可变的,并且完全在运行时确定。
##### 3.2 解决方案
使用Niall Pemberton的Lazy DynaBean表单,可以从[http://www.niallp.pwp.blueyonder.co.uk/](http://www.niallp.pwp.blueyonder.c
0
0
复制全文
相关推荐










