有没有人知道在使用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
中的确切顺序 - 必须有更好的方法,非?
非常感谢任何建议!
答案 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