Доступ к методам контроллера в JSP скриплет Java, а не с помощью тегов?
Моя конфигурация распорок:
<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);
%>
У меня вопрос, как мне ссылаться на контроллер действий (заменить myActionBean
в коде выше) внутри блока кода JSP, так же, как s:property
тег делает в своем синтаксисе, что исключает "get" часть метода? Я хотел бы получить доступ myActionBean.getSomeValue()
в Java в JSP, а не делать это в теге. Я знаю, что это не рекомендуемый способ делать вещи, но это только для отладки.
2 ответа
По предложению @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);
%>
Я должен был импортировать ActionContext
на вершине JSP:
<%@ page import="com.opensymphony.xwork2.ActionContext" %>
Я понимаю, что некоторым людям это не нравится, и я бы хотел сделать это, но на самом деле это именно то, что я хотел сделать. Я хорошо знаю, что я мог бы сделать System.out
в getFoo()
сам, но я хотел сделать это в JSP.
Вы можете получить bean-компонент action из вызова action, как вы делаете это в перехватчике или из стека значений, в который он уже помещен. Поскольку у вас есть доступ к стеку значений из JSP, и вы знаете, как распечатать свойство, проще всего установить компонент действия в атрибут запроса с помощью <s:set>
тег.
<s:set var="action" value="action" scope="request"/>
Теперь вы можете получить бин действия
<%
MyAction myActionBean = request.getAttribute("action");
String someVal = myActionBean.getSomeValue();
System.out.println(someVal);
%>