1

这是我用来重新填充ArrayList

<form method = "POST" action = "addItemsToTemplate">
    <s:iterator value = "myQuestions" var = "quizItem"  status="key">
        <s:textfield name = "quizItem.question"/> 
    </s:iterator>
    <input type = "submit" value = "submit"/>
</form>

这是动作类

public class QuizTest extends ActionSupport{



    public String execute(){

            List<Question>  q=  myQuestions;
            System.out.println(myQuestions);

            return "success";
        }


   public String populateQuestions(){
             //more code here
   }

    public void setMyQuestions(List<Question> myQuestions) {
        this.myQuestions = myQuestions;
    }
    private List<Question> myQuestions = new ArrayList<Question>();

}

myQuestions问题对象列表在哪里。提交后,这给了我一个错误

Unexpected Exception caught setting 'quizItem.question' on 'class quiz.actions.QuizTemplateAction: Error setting expression 'quizItem.question' with value '[Ljava.lang.String;@1b3409f'

System.out.println(myQuestions);打印一个空列表。但是在提交表单之前,myQuestions已经通过这种方法从另一个填充 了populateQuestions()

4

3 回答 3

2

在“类 quiz.actions.QuizTemplateAction”上设置“quizItem.question”时出现意外异常:使用值“[Ljava.lang.String;@1b3409f”设置表达式“quizItem.question”时出错

您正在尝试将所有问题(属性)描述作为 a 发送到第一个问题(对象)中List<String>,因为您没有指定索引(正如您<s:property/>在其他问题中正确所做的那样......?!)。

改变这个

<s:textfield name = "quizItem.question"/> 

对此

<s:textfield name = "quizItem[%{#key.index}].question"/>

String向每个对应Question对象发送一个,而不是List<String>向第一个Question对象发送一个。

于 2013-03-27T11:09:32.820 回答
2
    Where myQuestions is a List of Question Objects. 
    upon submission this gives me an error

由于它是问题对象的列表,因此您尝试使用字符串填充问题对象。请检查您是否定义了转换器以将 String 转换为 Question 并在 xwork-conversion.properties 文件中指定

System.out.println(myQuestions); prints an empty list.

而不是这样做

private List<Question> myQuestions = new ArrayList<Question>();

做这个

private List<Question> myQuestions;

提交表单时,会创建 Action 类的新对象,并且每次提交都会重新初始化实例变量“myQuestions”。

希望这可以帮助 :)

于 2013-03-27T04:27:40.647 回答
0

当您提交表单时,Struts2 使用名称与字段名称相同的参数。这些参数由将值设置为的params拦截器valueStack填充到操作中。由于该操作位于堆栈顶部,因此将设置其属性。

在你的行动中,你有一个List<Question>但通过List<String>

内置类型转换支持:

集合 - 如果不能确定对象类型,则假定为 a并创建String一个新的ArrayList

要解决此问题,请使用这样的索引属性名称

<s:textfield name = "myQuestions[%{#key.index}].question"/> 

于 2013-03-27T11:19:04.940 回答