重定向到显示特定对象的页面

时间:2014-11-11 18:16:59

标签: hibernate jsp redirect struts2

更新

由于问题本身已经发生了一些变化(结果更多地是关于列表/下拉列表,我开始提出一个关于数据传递问题的新问题: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

1 个答案:

答案 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。