Struts2将action的方法结果传递给自定义标记

时间:2010-11-05 18:56:46

标签: jsp tags struts2

我想创建一个可以与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的String或者为null。

我无法将对象传递给标记属性。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先,我强烈建议您避免JSP页面中的scriptlet块。它被推荐了很长一段时间。使用JSP EL / JSTL(或Struts2中的OGNL)是一种更好的方法。

如果您的操作通过getRoot()方法公开部门,那么您可以将其传递给JSP标记:

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

注意:您无法以对Struts2标记的方式将OGNL表达式传递给JSP简单标记。

然后,假设标签中的“树”指的是部门:

<%@ 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}

答案 1 :(得分:0)

谢谢,我不知道访问操作的方式:$ {action.root} 在等待回复的同时,我找到了基于jn Struts2的其他解决方案。

我的解决方案更好,因为它与struts2没有紧密结合。 谢谢!

&lt;%@ tag language =“java”pageEncoding =“UTF-8”body-content =“empty”%&gt; &lt;%@ attribute name =“tree”required =“true”%&gt; &lt;%@ taglib uri =“http://java.sun.com/portlet_2_0”prefix =“p”%&gt; &lt;%@ tag import =“web.tag.TreeTagHelper”%&gt; &lt;%@ tag import =“ejb.model.Department”%&gt;&lt;%

    /** 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()+"]");
    }
%>