【问题标题】:Struts2 pass action's method result to custom tagStruts2 将动作的方法结果传递给自定义标签
【发布时间】:2010-11-05 18:56:46
【问题描述】:

我想创建可以与 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:

&lt;%-- pass instance of Department to tag --%&gt;

如果我想将MyAction#getRoot 的结果传递给我的虚拟标签,我该怎么做?

我试过这些:

什么都没有发生,在标签中我得到值为root 的字符串或得到空值。

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

我做错了什么?

【问题讨论】:

    标签: jsp tags struts2


    【解决方案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}
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多