2008-10-22 20 views
14

Estoy trabajando en un JSP donde necesito llamar a métodos en objetos que provienen de un Bean. La versión anterior de la página no usa JSTL y funciona correctamente. Mi nueva versión cuenta con un conjunto de esta manera:JSTL, Frijoles y llamadas a métodos

<jsp:useBean id="pageBean" scope="request" type="com.epicentric.page.website.PageBean" /> 
<c:set var="pageDividers" value="<%= pageBean.getPageDividers() %>" /> 
<c:set var="numColumns" value="${pageDividers.size()}" /> 

La variable pageDividers es un objeto List.

Me encuentro con este problema: cuando solicito el tamaño pageDivider, se produce una excepción. Sé que este es un error simple de JTSL: ¿qué estoy haciendo mal?

El mensaje de error es:

El tamaño función debe utilizarse con un prefijo cuando un espacio de nombres por defecto no está especificado

¿Cómo correctamente acceso o llamar a los métodos de mi objeto pageDividers ?

Respuesta

27

Cuando se utiliza el operador de punto de acceso a la propiedad de JSTL, ${pageDividers.size} (no hay ) necesarios() resulta en una llamada a un método denominado getSize().
Como java.util.List ofrece un método llamado size() (en lugar de getSize()), no podrá acceder a la longitud de la lista utilizando ese código.


Con el fin de acceder a un tamaño de la lista, JSTL ofrece el fn : longitud función, utilizado como

${fn:length(pageDividers)} 

Tenga en cuenta que con el fin de utilizar el espacio de nombres fn, debe declarar de la siguiente manera

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

Además, la misma función se puede utilizar con cualquier tipo de colección, y con Stri ngs también.

+0

Esto funciona, ¡gracias! –

+1

Tenga cuidado. Me encontré con un error oscuro en Websphere 6.12, que ocurrió cuando se ejecutó una función JSTL en un cuerpo de etiqueta. Esto se soluciona en Websphere 6.13+, pero no más bajo que 6.13. A medida que usamos 6.11, tuvimos que ir y crear etiquetas personalizadas para las funciones que usamos, delegando en el código real. – MetroidFan2002

+5

Esto apesta grandes cahones. ¿Por qué diablos no te dejan invocar un método que usa la clase/instancia en sí? Te encuentras con todo tipo de agujeros de gusano en la plataforma JEE ... ffs! – momomo

2

Para acceder a la propiedad de un frijol utilizando EL, simplemente debe nombrar la propiedad (no invocar el método). Así que digamos que usted tiene un método llamado getSize() en el grano después

${pageDividers.size} 

Notificación no().

EDITAR: Perdón ... ha cometido un error en la publicación original.

Cuestiones relacionadas