2013-09-02 3 views
0

Возможно ли передать объект из сеанса в атрибут тега JSP?Передача атрибута сеанса в пользовательский тег JSP

I.e. У меня есть класс, хранящий информацию о узлах меню. Я хранил его объект в сессии под "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']"/> 

Unfortunatelly Я всегда получаю исключение:

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



OFC я могу передать ключ "app.menu" в menu атрибут и внутри MenuTagHandler данных меню чтения из сессии, но мне интересно, если это возможно с помощью OGNL.

ответ

4

Если вы хотите получить доступ к объекту меню в сеансе, вам не нужно устанавливать его как атрибут для класса тега. Попробуйте следующее, который включает в себя удаление 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; 
    } 
} 
+0

Это хорошая идея. Благодаря! –

+0

Это может быть сокращено до «Меню меню = (Меню) pageContext.getSession(). GetAttribute (« app.menu »); –

1

В отличии от EL, которая анализируется движком JSP, OGNL выражение в JSP являются просто строками. Только когда тег анализирует эту строку как выражение OGNL, он создает или дает объект из ValueStack. Вам нужно будет обрабатывать значение (в вашем случае, меню) как строку и затем анализировать его как выражение OGNL. Так работают теги Struts2. Обратите внимание, что вы также можете получить доступ к сеансу с помощью EL и передать значение своему пользовательскому тегу.

Смежные вопросы