【问题标题】:Redirecting to a page displaying a specific object重定向到显示特定对象的页面
【发布时间】:2014-11-11 18:16:59
【问题描述】:

更新

由于问题本身发生了一些变化(结果更多的是关于列表/下拉列表,我提出了一个关于数据传递问题的新问题:new question


我正在尝试编写一个应用程序,其中我首先有一个对象列表,然后导航到仅显示一个对象的页面。每个对象都有一个其他几个对象的列表(在我的程序中,它是一个考试列表,每个考试都有一个问题列表)。然后我按下一个按钮被定向到第三个页面,在那里我可以填写一个表单来创建一个新的附加对象

保存附加对象时,我想重定向到显示与以前相同的对象的第二页。 这是我的问题。我返回的页面上的表单域是空的。

现在,当调用 SaveAttachedObject 操作(AttachedObjectAction,方法“保存”)时,我被重定向到 object.jsp。但是,没有选择任何对象,当我单击objectlist.jsp 中的编辑按钮并且没有选择对象时,我通常会调用该错误消息。此消息在ObjectAction 的 validate 方法中产生,该方法通常检查 object 或 attachObject 是否为 null。

我怀疑 object.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 动作。我总是收到“下拉列表”无法解析为集合/数组/映射/枚举/迭代器类型的错误:

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]

这是带有导致错误的选择字段的附加对象.jsp:

我不知道我是否可以只将对象(id)提供给 ShowObject 动作而不是整个 attachObjectForm?
或者,我不明白:为什么要读取整个 objectTypes 列表?我只想使用attachedObject(只使用列表中的选中项作为attachedObject的新参数)。

如果您需要任何进一步的代码或信息,请告诉我。

以下是我项目主要类的相关代码部分:

ObjectAction:http://pastebin.com/q080N1NB

attachedObjectForm:http://pastebin.com/m2HMXHwP

【问题讨论】:

  • +1 适合初学者的好问题!
  • 看起来您缺少 (a) 某种形式的 prepare 实现,其中准备了必要的表单数据,以及 (b) 加载相关对象。
  • 我需要把准备实现放在哪里?在 ObjectAction 中?我知道我可以在那里启动导致错误的 objectTypes 列表,但我仍然不知道,我将在哪里获得我之前正在处理的附加对象(它具有它所属的对象 ID,并且我想在其上显示我要返回的页面)

标签: hibernate jsp redirect struts2


【解决方案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;
    }
}

我不确定您的工作流程到底是什么,但就是这样。

如果您还需要在INPUT 结果的情况下填充exam,则将load() 方法的所有内容放入prepare() 方法中,并确保您使用的是the paramsPrepareParamsStack 而不是defaultStack.

可能发现您的 ObjectAction 甚至不再需要,并将其所有业务放在另一个操作的 prepare() 方法中。

请注意,在发布的代码中(很可能在发布之前已清理),您缺少 objectTypes 的 getter。

【讨论】:

  • 非常感谢您的回答,也感谢您对我的问题风格提出的建议。我会尝试将它包含在我的下一个问题中!关于您的建议: prepare 方法已经帮助了我。现在我不再有关于列表的错误了。但是,我仍然“错过”我的考试。这就是为什么我想使用 paramsPrepareParamsStack 遵循您的建议。不幸的是,到目前为止,我只使用 defaultStack 并且不知道我需要在哪里定义用法。我在互联网上的搜索也没有成功。你能帮我多做一点吗?
  • 抱歉,当您回复时,我正在编辑我的第一条评论。它解决了我问题的第一部分,所以谢谢你!我只有在使用 paramsPrepareParamsStack 时遇到问题
  • 啊,错过了 :) 在我链接the paramsPrepareParamsStack 答案的问题中...该堆栈取自文档。将所有这些内容复制并粘贴到您的 struts.xml 中(在 &lt;struts&gt;&lt;package&gt;&lt;interceptors&gt;HERE&lt;/interceptors&gt; 中,然后在添加 &lt;default-interceptor-ref name="paramsPrepareParamsStack"/&gt; 之后立即。首先声明“您的”新堆栈,然后指示 struts 将其应用于每个操作。这是最简单的方法,否则你只能将其应用于某些操作,但这里不需要它,就这样吧
  • 恐怕这并没有改变任何东西。我将代码添加到我的 struts.xml 中,结果仍然与以前相同(添加准备方法后:我停留在第三页(attachedObjectForm)但收到错误消息“请选择一个对象”。:(
  • 拜托,您能否编辑您的问题(在顶部放置一个#UPDATE 并用--- 将旧问题向下推),并简短描述现在发生的事情(在准备( ) 调整),哪个是期望的结果,哪个是获得的结果?我没有时间重新阅读您的所有问题,非常感谢您提供简短的段落,其中包含基本的相关信息(并且仅这些信息):)
猜你喜欢
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2010-12-06
  • 1970-01-01
  • 2017-09-09
相关资源
最近更新 更多