使用Struts2在JSP中访问Action类

有没有人知道如何在使用Struts2时轻松访问JSP中的Action类? 虽然我知道通常可以使用Struts标签和OGNL,但实际上我发现它们都令人困惑(显然是由于无知)并且坦率地发现在JSP中维护Java更容易(更不用说它更容易解释为新的众所周知的程序员Java)。

我已经搜索了多年的解决方案,我找到的最好的解决方案是从类中调用静态方法,如下所示:

public static BaseAction getCurrentAction(HttpServletRequest request) { OgnlValueStack ognlStack = (OgnlValueStack)request.getAttribute(org.apache.struts2.ServletActionContext.STRUTS_VALUESTACK_KEY); return (BaseAction)ognlStack.getRoot().get(0); } 

…将在您自己的Action类扩展的BaseAction类中,以便在您的JSP中可以说:

  

然而,这一切似乎过于复杂,它假设OgnlValueStack的精确顺序 – 必须有更好的方法,非?

非常感谢任何建议!

如果您不想使用struts2标记,则同样有效的方法是使用JSTL标记。 这些标签由struts2支持,我猜测大多数主要的Java Web框架。

强烈建议您在使用任何Java Web Framework的典型业务编程中避免使用servlet / scriplets。

您可能已经知道这一点,但要从动作中获取一个属性,只需说:

  

或者使用JSTL同样有效(有些人甚至会说更有效,因为视图不再依赖于struts2)

  

很少有程序员(我会说没有经验丰富的struts2程序员)会发现这比人们更难理解

 <% MyAction action = (MyAction)BaseAction.getCurrentAction(request); String myValue = action.getMyValue(); %> 

生成页面只需要少量标签,您需要获取属性,迭代生成表/列表,这就是它。 学习这些标签的时间将节省大量时间。

要跟进Quaternion的答案,您可以按照他的建议从OGNL标签或JSTL访问操作类中的任何公共方法。

您还可以通过标记将参数传递给操作类:

 public String getHello(String value){ return "Hello " + value + "!"; } 

这是在JSP上调用的​​:

  

哪个输出:

 Hello Russell!