【问题标题】:Passing session attribute into custom JSP tag将会话属性传递给自定义 JSP 标记
【发布时间】:2016-03-15 03:22:46
【问题描述】:

是否可以将会话中的对象传递到 JSP 标记属性中?

即我有一个类存储有关菜单节点的信息。 我将其对象存储在"app.menu" 键下的会话中。

我已经创建了菜单标签处理程序:

public class MenuTagHandler extends TagSupport {

    private static final long serialVersionUID = 7116890687703774365L;

    private Menu menu;
    private String id;
    private String cssClass;
    private Logger logger = Logger.getLogger(this.getClass());

    @Override
    public int doStartTag() throws JspException {
        logger.info("tagSupport doStartTag method entered");

        return SKIP_BODY;
    }

    public Menu getMenu() {
        return menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCssClass() {
        return cssClass;
    }

    public void setCssClass(String cssClass) {
        this.cssClass = cssClass;
    }

}

TLD 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>2.0</jsp-version>
    <short-name>menu</short-name>
    <description>Vertical menu tag</description>
    <tag>
        <name>cloudUMLMenu</name>
        <tag-class>clouduml.menu.MenuTagHandler</tag-class>
        <description>Menu tag handler</description>
        <attribute>
            <name>menu</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>clouduml.menu.Menu</type>
        </attribute>
        <attribute>
            <name>id</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>cssClass</name>
            <required>false</required>
        </attribute>
    </tag>
</taglib> 

在 JSP 文件中调用:

<menu:cloudUMLMenu menu="#session['app.menu']"/>

不幸的是,我总是遇到异常:

org.apache.jasper.JasperException: Unable to convert string "#session['clouduml.menu']" to class clouduml.menu.Menu



Ofc 我可以将密钥 "app.menu" 传递给 menu 属性并在 MenuTagHandler 内部从会话中读取菜单数据,但我想知道是否可以使用 OGNL。

【问题讨论】:

    标签: java jsp session struts2


    【解决方案1】:

    如果你想在会话中访问一个菜单对象,你不需要将它设置为标签类的属性。尝试以下方法,其中涉及删除类的 Menu 成员:

    public class MenuTagHandler extends TagSupport {
    
        private String id;
        private String cssClass;
        private Logger logger = Logger.getLogger(this.getClass());
    
        @Override
        public int doStartTag() throws JspException {
            logger.info("tagSupport doStartTag method entered");
    
            HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
            HttpSession session = request.getSession();
    
            Menu menu = (Menu)session.getAttribute("app.menu");
    
            // do whatever you need to do with the menu data
    
            return SKIP_BODY;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getCssClass() {
            return cssClass;
        }
    
        public void setCssClass(String cssClass) {
            this.cssClass = cssClass;
        }
    }
    

    【讨论】:

    • 这可以缩短为Menu menu = (Menu) pageContext.getSession().getAttribute("app.menu");
    【解决方案2】:

    与由 JSP 引擎解析的 EL 不同,JSP 中的 OGNL 表达式只是字符串。只有当标签将该字符串解析为 OGNL 表达式时,它才会从 ValueStack 创建或产生一个对象。您需要将值(在您的情况下为菜单)视为字符串,然后将其解析为 OGNL 表达式。这也是 Struts2 标签的工作方式。请注意,您还可以使用 EL 访问会话并将值传递给您的自定义标签。

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 2011-09-12
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多