我正在使用 Struts 2 和 Freemarker。这是我的动作课:
package test;
import java.util.ArrayList;
import java.util.List;
public class WelcomeAction {
private String userName;
private String gender;
private List<String> fruits;
private String fruit;
public String execute() {
// if(!userName.equals("a"))
// {
// return "fail";
// }
// else {
// return "SUCCESS";
// }
return "SUCCESS";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getFruitsPicked() {
return fruit;
}
public void setFruitsPicked(String fruitsPicked) {
this.fruit = fruitsPicked;
}
public List<String> getFruits() {
return fruits;
}
public void setFruits(List<String> fruits) {
this.fruits = fruits;
}
public WelcomeAction(){
fruits = new ArrayList<String>();
fruits.add("apples");
fruits.add("oranges");
fruits.add("pears");
fruits.add("peaches");
}
}
这就是我的
.ftl
:
<input type="checkbox" list="fruits" name="friut[]" value="apples" /> Apples<br />
<input type="checkbox" list="fruits" name="friut[]" value="oranges" /> Oranges<br />
<input type="checkbox" list="fruits" name="friut[]" value="pears" /> Pears<br />
<input type="checkbox" list="fruits" name="friut[]" value="peaches" /> Peaches<br />
这就是我尝试打印的方式:
<#list fruits as item>${item}</#list>
但是上面的命令打印了我在构造函数中添加的列表中的所有项目。当然,我只想要提交表单时检查过的项目。
name="friut[]"
应该是name="fruits"
。 JavaBean 属性名称是 fruits
,而不是 fruit
(也不是 friut
...注意拼写错误)。我不知道 []
对于 Struts 是否有意义,更好的说法是对于 ValueStack.setValue
使用的 OGNL/ParametersIntercaptor
有意义。 (它理解 fruits[0]
,这对于在现有列表中设置元素很有用。)。所以最后 Struts 忽略了这些参数,所以你最终得到的是原始列表。 list="fruits"
从哪里来?
你可以使用
<s:checkboxlist name="fruit" list="fruits"/>
您不需要在多个
<input>
字段中保留多个复选框的值,因此不需要很多 <input>
字段。 Struts2 应该适当地呈现它。多个值将出现在操作中,并使用 逗号分隔值。
在代码中,您必须为
list
添加 getter 和 setter,其方式与包含所选值的 fruit
相同。提交表单时,params
拦截器将完成填充您使用设置器调用的操作的工作。