使用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!