使用Struts2在JSP中访问Action类

时间:2011-09-21 17:55:22

标签: java jsp struts2 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中说:

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

然而,这一切看起来都过于复杂,并假设OgnlValueStack中的确切顺序 - 必须有更好的方法,非?

非常感谢任何建议!

3 个答案:

答案 0 :(得分:3)

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

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

您可能已经知道这一点,但是要从行动中获取一个属性,请说:

<s:property value="myProperty"/>

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

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

很少有程序员(我会说没有经验丰富的struts2程序员)会发现这比

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

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

答案 1 :(得分:2)

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

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

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

在JSP上调用它:

<s:property value="getHello('Russell')"/>

哪个输出:

Hello Russell!

答案 2 :(得分:0)

除了Quaternion的答案外,我想在此处添加另一种调用操作对象的方法。该操作对象位于valueStack的顶部。在您的jsp中,您可以像这样访问struts操作,

<% MyAction myAction = (MyAction) ActionContext.getContext().getValueStack().peek(); %>

参考: https://struts.apache.org/tag-developers/access-to-valuestack-from-jsps.html

如果您想了解更多如何通过ognl表达式进行访问,以下讨论可能对您有所帮助 What are different ways to access variables with OGNL in Struts 2