【问题标题】:Effectively sharing JSPs among different Struts action classes在不同的 Struts 动作类之间有效地共享 JSP
【发布时间】:2009-07-20 20:22:15
【问题描述】:

我想为多个 Struts 动作呈现相同的 JSP。我遇到了麻烦,因为在渲染 JSP 时,bean 名称会根据调用的 Action 而有所不同。所以,我不能这样称呼:

<c:out value="${myBean.myProperty}" />

因为 bean 不一定叫 myBean。

目前,我通过将 JSP 中需要的任何常见对象放入 HttpSession 中来解决这个问题。例如:

public class SampleAction extends Action
{
    public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response) throws Exception
    {
        String string = "TEST";
        HttpSession session = request.getSession();
        session.setAttribute("sampleString", string);

        return mapping.findForward("sampleAction");
    }
}

然后,在 JSP 中,我可以简单地引用“sampleString”,它不会根据渲染动作而改变。

当然,我使用的对象比字符串大得多,如果没有必要,我不想将对象放入会话中。有什么方法可以将一个对象放入页面上下文或其他东西而不是会话中,以便在不同的 JSP 之间共享它?

我来自 Rails 世界,所以我对 Struts 很陌生,发现自己有点迷茫。我必须扩展用 Struts 编写的现有应用程序。该程序实际上使用 BeanAction 将 ActionForm 与 A​​ction 结合起来,因此上面的示例与我的代码不完全一样。

感谢您为我解惑!

【问题讨论】:

    标签: java jsp struts


    【解决方案1】:

    我的第一个想法是尝试将其实现为自定义标签,就像 krosenvold 在他的回答中所说的那样。但是您说您是 Struts 的新手,我假设您也是 JSP 和 J2EE Web 开发的新手。而且自定义标签不是一个很容易的主题。

    您可以使用“代理”页面通过 jsp 调用:包括您的目标 JSP。 jsp:include 标记可以有一个带有 jsp:param 标记的主体,您可以在其中将一个公共变量名称映射到不同的引用。

    See here for an example in jsp:param in jsp:include.

    通过这样做,您将拥有一个包含真实代码的页面,以及 N 个代理来处理对您的复杂对象的引用。 使用自定义标签也可以,这只是另一种方式,我个人认为对于非 SCWCD 来说更容易实现。

    【讨论】:

      【解决方案2】:

      我认为你想使用三个不同动作类实现的接口,这样你就可以让同一个jsp使用接口类型。请注意,这使得三个动作类对那个jsp“相同”,所以我基本上说这是要走的路。如果您不能/不会使用它,那么我可能会使用自定义 jsp 标签来封装公共位,并为每个页面使用单独的 jsp 调用相同的公共标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 1970-01-01
        • 2022-08-06
        • 1970-01-01
        • 2019-08-05
        相关资源
        最近更新 更多