我的struts配置:
<action name="myAction" class="my.controller.MyAction">
<result name="myPage">/myPage.jsp</result>
MyAction
有一个方法public String getSomeValue() { ... }
。
在myPage.jsp
中,我可以轻松地将该值打印到HTML流中:
<s:property value="someValue" />
但是,我想将它打印到控制台:
<%
//how do I reference myActionBean
String someVal = myActionBean.getSomeValue();
System.out.println(someVal);
%>
我的问题是,如何在JSP代码块中引用操作控制器(在上面的代码中替换myActionBean
),就像s:property
标记在其语法中所做的那样消除了&# 34;获得&#34;方法的一部分?我想在JSP中访问Java中的myActionBean.getSomeValue()
而不是在标记中进行访问。我知道这不是推荐的做事方式,但这仅用于调试。
答案 0 :(得分:1)
正如@DaveNewton所建议的那样,我能够从上下文中访问动作类:
<%
ActionContext context = ActionContext.getContext();
//this will access actionClass.getFoo() just like the tag
//<s:property value="%{foo}"/> does but outputs to HTML
Object fooObj = context.getValueStack().findValue("foo");
String fooStr = (String)fooObj;
//so that we can print it to the console
//because the tag can only output to HTML
//and printing to the console is the objective of the question
System.out.println("foo = " + fooStr);
%>
我必须在JSP上导入ActionContext
:
<%@ page import="com.opensymphony.xwork2.ActionContext" %>
我理解有些人不喜欢我应该这样做,但这实际上就是我想做的事情。我很清楚我可以在System.out
本身做getFoo()
,但我想在JSP中这样做。
答案 1 :(得分:0)
您可以像在拦截器中那样从动作调用中获取动作bean,也可以从已经推送它的值堆栈中获取动作bean。由于您可以从JSP访问值堆栈并且知道如何打印属性,因此最简单的方法是将操作bean设置为带有<s:set>
标记的请求属性。
<s:set var="action" value="action" scope="request"/>
现在你可以获得动作bean
<%
MyAction myActionBean = request.getAttribute("action");
String someVal = myActionBean.getSomeValue();
System.out.println(someVal);
%>