Struts2 передает результат метода действия в пользовательский тег - PullRequest
0 голосов
/ 05 ноября 2010

Я хочу создать простой фиктивный тег, который может работать со Struts2.

У меня есть действие:

class MyAction extends ActionSupport{

  /** 
    Some code
   */
  public Department getRoot(){
    /** Some code foes here...*/
    return departmentInstance;
  }
}

тег:

<%@tag language="java" pageEncoding="UTF-8"  body-content="empty"  %>
<%@ attribute name="tree" required="true"%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="p"%>
<p:defineObjects />
<%@tag import="ejb.model.Department"%><%
 Object attrTree = pageContext.getAttribute("tree");
 System.out.println("TreeTagHelper->tree=["+attrTree+"]");
 if(attrTree!=null){
  System.out.println("TreeTagHelper->tree.class=["+attrTree.getClass().getName()+"]");
 }else{
  System.out.println("TreeTagHelper->tree.class=[NULL]");
 }
 try{
 //some code...
 }catch(Exception e){
  System.out.println("Error while drawing tree["+e.getMessage()+"]");
 }
%>

и мойjsp с тэгом:

<%-- pass instance of Department to tag --%>

Что мне нужно сделать, если я хочу передать результат MyAction#getRoot в мой фиктивный тег?

Я пробовалк ним:

Ничего не происходит, в теге я получаю строку со значением root или получаю ноль.

Я не могу передать объект в атрибут tag.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 06 ноября 2010

Во-первых, я настоятельно рекомендую вам избегать блоков скриптлетов на ваших страницах JSP.Это давно устарело.Использование JSP EL / JSTL (или OGNL в Struts2) является гораздо лучшим подходом.

Если ваше действие предоставляет доступ к Department с помощью метода getRoot(), то вы можете передать его тегу JSP как:

<your:jspTag tree="${action.root}"/>

Примечание: Вы не можете передавать выражения OGNL в простые теги JSP, как в тег Struts2.

Затем, если предположить, что «дерево» в вашем теге ссылается на Department:

<%@ tag language="java" pageEncoding="UTF-8" body-content="empty" %>
<%@ attribute name="tree" required="true" type="ejb.model.Department" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="p" %>
<p:defineObjects />

${tree.someProperty}
0 голосов
/ 06 ноября 2010

Спасибо, я не знал об этом способе доступа к действиям: $ {action.root} В ожидании ответа я нашел другое решение на основе jn Struts2.

Ваше решение лучше, потому что оно не тесно связано со стойками2. Спасибо!

<% @ tag language = "java" pageEncoding = "UTF-8" body-content = "empty"%> <% @ attribute name = "tree" обязательный = "true"%> <% @ taglib uri = "http://java.sun.com/portlet_2_0" prefix =" p "%> <% @ tag import = "web.tag.TreeTagHelper"%> <% @ tag import = "ejb.model.Department"%> <% </p>

    /** Get value of tag attribute. */
    String attrTree = (String)pageContext.getAttribute("tree");

    /** Find attribute value in stack*/
    Department department = (Department)com.opensymphony.xwork2.ActionContext.getContext().getValueStack().findValue(attrTree);
    try{
        TreeTagHelper tth = new TreeTagHelper(department, out);
        tth.printTree();
    }catch(Exception e){
        System.out.println("Error while drawing tree["+e.getMessage()+"]");
    }
%>
...