Доступ к методам контроллера в 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);
%>
Другие вопросы по тегам