简体   繁体   English

将会话属性传递到自定义JSP标记中

[英]Passing session attribute into custom JSP tag

Is it possible to pass object from session into JSP tag attribute? 是否可以将对象从会话传递到JSP标签属性?

Ie I have a class storing information about menu nodes. 即我有一个存储有关菜单节点信息的类。 I store its object in session under "app.menu" key. 我将其对象存储在会话中的"app.menu"键下。

I've created menu tag handler: 我已经创建了菜单标签处理程序:

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 file: 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> 

Invocation in JSP file: 在JSP文件中的调用:

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

Unfortunatelly I always get Exception: 不幸的是,我总是得到异常:

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



Ofc I can pass key "app.menu" into menu attribute and inside MenuTagHandler read menu data from session, but I wonder if it is possible using OGNL. 我可以将"app.menu"键传递给menu属性,并且可以在MenuTagHandler内部从会话中读取菜单数据,但是我想知道是否可以使用OGNL。

If you want to access a Menu object in session, you don't need to set it as an attribute to the tag class. 如果要在会话中访问Menu对象,则无需将其设置为标记类的属性。 Try the following, which involves removing the Menu member of the class: 请尝试以下操作,其中涉及删除该类的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;
    }
}

Unlike EL, which is parsed by the JSP engine, OGNL expressions in JSP are just strings. 与由JSP引擎解析的EL不同,JSP中的OGNL表达式只是字符串。 Only when a tag parses that string as an OGNL expression does it create or yield an object from the ValueStack. 仅当标签将字符串解析为OGNL表达式时,它才会从ValueStack中创建或产生一个对象。 You would need to treat the value (in your case, menu) as a String and then parse it as an OGNL expression. 您需要将值(在您的情况下为菜单)视为字符串,然后将其解析为OGNL表达式。 This is how the Struts2 tags work, as well. 这也是Struts2标签的工作方式。 Note that you can also access the session using EL and pass the value to your custom tag. 请注意,您还可以使用EL访问会话并将该值传递给自定义标签。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM