在不同的Struts操作类之间有效地共享JSP

时间:2009-07-20 20:22:15

标签: java jsp struts

我想为多个Struts Actions呈现相同的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”,它不会根据渲染Action而改变。

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

我来自Rails世界,所以我对Struts很新,我发现自己有点失落。我必须扩展用Struts编写的现有应用程序。该程序实际上使用BeanAction将ActionForm与Action结合,因此上面的示例并不完全是我的代码。

感谢任何帮助,以解决我的困惑!

2 个答案:

答案 0 :(得分:1)

我认为您希望使用三个不同操作类实现的接口,因此您可以使用相同的jsp使用接口类型。请注意,这使得三个动作类与jsp“相同”,所以我基本上说这是要走的路。如果您不能/不会使用它,那么我可能会使用自定义jsp标记来封装公共位,并为每个页面调用相同的公共标记分别使用jsp。

答案 1 :(得分: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更容易实现。