由于问题本身已经发生了一些变化(结果更多地是关于列表/下拉列表,我开始提出一个关于数据传递问题的新问题:new question
我正在尝试编写一个应用程序,其中我首先有一个对象列表,然后导航到只显示其中一个对象的页面。每个对象都有一个其他几个对象的列表(在我的程序中,它是一个考试列表,每个考试都有一个问题列表)。然后我按下一个按钮进入第三页,我可以填写表格来创建一个新的附加对象。
保存附加的对象时,我希望重定向到显示与以前相同的对象的第二页。 这是我的问题。我返回的页面上的表单字段为空。
现在,当调用SaveAttachedObject Action(AttachedObjectAction,方法“save”)时,我被重定向到object.jsp。但是,没有选择任何对象,并且当我单击objectlist.jsp
中的编辑按钮并且未选择对象时,我收到了我通常调用的错误消息。此消息在ObjectAction
的validate方法中生成,该方法通常检查对象或AttachObject是否为空。
我怀疑,缺少对象.jsp的输入。
在我的struts.xml中我有SaveAttachedObject操作,它有attachObject.jsp作为输入,因此attachObject(包括其变量对象)应该存在。 在那里我调用显示对象的ShowObject Action。
<action name="SaveAttachedObject" class="de.example.project.action.AttachedObjectAction"
method="save">
<result name="success" type="redirect">ShowObject.action</result>
<result type="tiles" name="input">attachedObjectForm</result>
</action>
<action name="ShowObject" class="de.example.project.action.ObjectAction"
method="load">
<result type="tiles">objectForm</result>
</action>
(所有图块都在tiles.xml中定义)
如果我添加
<result name= "input" type="tiles">attachedObjectForm</result>
到ShowObject操作。我总是收到错误,“dropdown-list”无法解析为集合/数组/映射/枚举/迭代器类型:
HTTP Status 500 - ServletException including path '/layout/mainLayout.jsp'.
堆栈跟踪:
tag 'select', field 'list', name 'attachedObject.type': The requested list key 'objectTypes' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
这是带有导致错误的选择字段的attachmentObject.jsp:
我不知道我是否可以将对象(id)赋予ShowObject操作而不是整个attachObjectForm?
或者,我不解读:为什么要读取整个objectTypes列表?我只想使用attachmentObject(仅使用列表中的选定项作为attachObject的新参数)。
如果您需要任何进一步的代码或信息,请告诉我。
以下是我项目主要类的相关代码部分:
ObjectAction:http://pastebin.com/q080N1NB
attachedObjectForm:http://pastebin.com/m2HMXHwP
答案 0 :(得分:1)
我没有完全跟随你; +1是一个非常好的第一个问题,虽然可能过于冗长。您可以添加所需的所有详细信息,但是您应该始终将“真实问题”(预期结果,获得的结果,问题)收缩在“单行”或短句中,由所有其他串联详细信息可能有助于更深入地调试问题。
根据我的情况,至少有一个您的问题是您正在使用load()
方法填充列表(not reached in case of INPUT
result returned by an Interceptor)。更改by using the prepare()
method如下:
public void prepare() throws Exception{
objectTypes = new ArrayList<String>();
ObjectType[] allTypes = ObjectType.values();
for (ObjectType objectType : allTypes) {
objectTypes.add(objectType.toString());
}
}
public String load() {
Long id = 0l;
if (objectId != null) {
id = objectId;
} else if (attachedObject.getObject() != null) {
id = attachtObject.getObject().getId();
}
if (id == (long) 0) {
return ERROR;
} else {
exam = objectService.loadObject(id);
return SUCCESS;
}
}
我不确定您的工作流程究竟是哪一个,但这就是方法。
如果您需要exam
填充INPUT
结果,请将load()
方法的所有内容放入prepare()
方法中,并确保使用the paramsPrepareParamsStack代替 defaultStack 。
您可能发现您的ObjectAction不再需要,并将其所有业务放在另一个操作的prepare()
方法中。
请注意,在发布的代码中(很可能在发布之前已经清理过),您错过了objectTypes
的getter。