2009-10-28 20 views
10

Estoy tratando de pasar una variable java desde una etiqueta jsp personalizada (estoy usando struts2 aquí para obtener la variable de la clase java). Aquí está el error que estoy recibiendo.Pasar un valor de objeto Java en la etiqueta JSP personalizada

javax.servlet.ServletException: /pages/editBidForm.jsp(51,8) According to TLD or attribute directive in tag file, attribute parentId does not accept any expressions 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515) 
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419) 
    .... 

Aquí está mi página JSP (parte)

<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="custom" %> 
... 
... 
<table> 
      <tr> 
      <% 

     String bidformoid=null; 
     bidFormOid=request.getParameter("bidFormOid"); 
     %> 

      <td> <custom:zorancustomtag parentType = "BIDFORM" parentId = "<%= pageContext.getAttribute("bidFormOid") %>" /></td> 


      </tr> 
     </table> 

que no soy capaz de pasar el parámetro parentId correctamente. Pude pasar el parámetro parentType correctamente ya que solo implicaba pasar la cadena

Aquí está el archivo taglib.

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag 
Library 1.2//EN" 
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
<taglib> 
     <tlibversion>1.0</tlibversion> 
     <jspversion>1.1</jspversion> 
     <shortname>custom</shortname> 
    <tag> 
     <name>zorancustomtag</name> 
     <tagclass>com.zoran.action.CustomizedTag</tagclass> 
     <bodycontent>JSP</bodycontent> 
     <info>Tag having a body and attributes</info> 
     <attribute> 
     <name>name</name> 
     <required>false</required> 
     <rtexpvalue>false</rtexpvalue> 
     </attribute> 

     <attribute> 
     <name>parentType</name> 
     <required>true</required> 
     <rtexpvalue>true</rtexpvalue> 
     </attribute> 

     <attribute> 
     <name>parentId</name> 
     <required>true</required> 
     <rtexpvalue>false</rtexpvalue> 
     </attribute> 



    </tag> 

</taglib> 

Y la clase java de la etiqueta personalizada.

public class CustomizedTag implements Tag { 
    private PageContext pageContext; 
    private Tag parent; 
    private String name; 
    private int parentId; 
    private String parentType; 
    List list = null; 




    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

/* public CustomizedTag() { 
     super(); 
    } 
*/ 
    public int doStartTag() throws JspException { 
     Session session = SessionUtil.getSession(); 
     session.beginTransaction(); 


     try { 
      JspWriter out = pageContext.getOut(); 
      String parId = getParentId()+""; 
     // out.println(getParent()+"&nbsp;"); 
      String quer = "from ContentBase cb where cb.parentType=? AND cb.parentId=? ";//+parId; 
      Query query = session.createQuery(quer); 

      query.setParameter(0, getParentType()); 
      query.setParameter(1, getParentId()); 

      list = query.list(); 
      ContentBase cb = new ContentBase(); 
      if (null != list && !list.isEmpty()) { 
       cb = (ContentBase) list.get(0); 
      } 

     // pageContext.getOut().print("Sri "+getName()); 

      out.println(cb.getDescription()); 


     } catch (IOException ioe) { 
     throw new JspException("Error:"+ioe.getMessage()); 
     } 
     return SKIP_BODY; 
    } 

    public int doEndTag() throws JspException { 
     return SKIP_PAGE; 
    } 
    public void release() { 
    } 



    public void setPageContext(PageContext pageContext) { 
     this.pageContext = pageContext; 
    } 

    public void setParent(Tag parent) { 
     this.parent = parent; 
    } 

    public Tag getParent() { 
     return parent; 
    } 

public int getParentId() { 
    return parentId; 
} 

public void setParentId(int parentId) { 
    this.parentId = parentId; 
} 

public String getParentType() { 
    return parentType; 
} 

public void setParentType(String parentType) { 
    this.parentType = parentType; 
} 

} 

¿Alguien me puede dejar saber cómo pasar una variable de Java a través de una etiqueta jsp personalizada?

Gracias, Aditya

Respuesta

13

El elemento <rtexpvalue> en su dominio de nivel superior debe ser <rtexprvalue> y necesita ser ajustado en true:

<attribute> 
    <name>parentId</name> 
    <required>true</required> 
    <rtexprvalue>true</rtexprvalue> 
    </attribute> 

Esto permite que las expresiones de tiempo de ejecución que se entregarán como el valor del atributo. Sigo confundido en cuanto a quién en el equipo de diseño de JSP pensó que era una buena idea permitir que esto se configurara en false.

+0

Gracias por la respuesta, pero incluso después de establecer el atributo de 'verdadero' Estoy recibiendo el mismo mensaje de error. ¿La etiqueta jsp personalizada con el atributo es correcta? –

+4

Hubo un error tipográfico (también presente en la publicación de OP), debería ser 'rtexprvalue' en lugar de' rtexpvalue'. Actualicé la respuesta. – BalusC

+0

Ese fue exactamente mi problema también, ¡muchas gracias! –

-2

Trate de envolver el valor parentId en $ {}

<custom:zorancustomtag parentType = "BIDFORM" parentId = "${<%= pageContext.getAttribute("bidFormOid") %>}" /> 
Cuestiones relacionadas