arrays - Creando Array usando JSTL o EL
jsp scriptlet (6)
Los JSP no están diseñados para este tipo de productos. Están destinados a consumir, no a crear. Si desea crear una matriz, es probable que necesite un Servlet
aquí.
Agregue la lógica de la creación de la matriz (o incluso mejor, la creación de la Lista), en un Servlet, y utilícela para preprocesar la solicitud a su página JSP. Y luego, puede utilizar el atributo List
establecido en el servlet
en su página JSP
.
Estoy trabajando en una aplicación web utilizando Java y sus marcos (Spring 3.1.1). Y estoy tratando de evitar usar los scriptlets tanto como sea posible, sin embargo, no puedo encontrar otra manera para definir una matriz:
<%
String[] alphabet = {"A", "B", "C", ... , "Z"};
pageContext.setAttribute("alphabet", alphabet);
%>
Después de configurar el atributo pageContext, puedo usarlo con ${alphabet}
. Pero quiero saber, ¿es posible usar JSTL / EL sin formato para crear una matriz?
ACTUALIZACIÓN: Estoy usando esta matriz para crear enlaces. Por ejemplo, si el usuario hace clic en ''S'', aparece una lista de empleados cuyo nombre comienza con ''S''. Entonces, en lugar de crear enlaces uno por uno, estoy iterando ${alphabet}
.
No puro EL, pero una solución bastante limpia, sin embargo:
<c:set var="alphabet" value=''<%=new String[]{"A", "B"} %>''/>
Si desea iterar sobre tokens en una cadena, simplemente use forTokens
:
<c:set var="alphabet">A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z</c:set>
<c:forTokens items="${alphabet}" delims="," var="letter">
${letter}
</c:forTokens>
Si usa Java EE 7 / Expression Language 3.0 puede crear un literal de List
<c:set var="alphabet" value="${[''A'', ''B'', ''C'', ... , ''Z'']}" />
que luego puede iterar sobre una Array
.
Si ya está en EL 3.0 (Tomcat 8+, WildFly 8+, GlassFish 4+, Payara 4+, TomEE 7+, etc.), que admite nuevas operaciones en objetos de colección , puede usar ${[...]}
sintaxis para construir una lista, y ${{...}}
sintaxis para construir un conjunto.
<c:set var="alphabet" value="${[''A'',''B'',''C'',''D'',''E'',''F'',''G'',''H'',''I'',''J'',''K'',''L'',''M'',''N'',''O'',''P'',''Q'',''R'',''S'',''T'',''U'',''V'',''W'',''X'',''Y'',''Z'']}" scope="application" />
Si aún no está en EL 3.0, use el truco de la función ${fn:split()}
en una sola cadena que separa los caracteres individuales por un separador común, como una coma.
<c:set var="alphabet" value="${fn:split(''A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z'', '','')}" scope="application" />
Sin embargo, estoy de acuerdo en que es mejor usar el código Java normal para esto. Dado que aparentemente son datos estáticos, solo crea esta clase de oyente:
@WebListener
public class ApplicationData implements ServletContextListener {
private static final String[] ALPHABET = { "A", "B", "C", ..., "Z" };
@Override
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("alphabet", ALPHABET);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
// NOOP.
}
}
Se registrará automáticamente de forma automática en el inicio de la aplicación web y pondrá los datos deseados en el ámbito de la aplicación.
Sin saber qué marco está utilizando, el mejor enfoque para trabajar con JSP sin usar scriptlets es respaldar cada JSP (vista) con un bean Java (un objeto):
Frijol de respaldo:
public class MyBackingBean {
private List<String> alphabet;
public List<String> getAlphabet() {
if (alphabet == null) {
// Using lazy initialization here, this could be replaced by a
// database lookup or anything similar
alphabet= Arrays.asList(new String[]{ "A", "B", "C", ... });
}
return alphabet;
}
}
Luego instancia el bean en la JSP de esta manera:
<jsp:useBean id="backingBean" scope="page" class="com.example.MyBackingBean" />
Después de eso, puede usar EL ${backingBean.alphabet}
para acceder a esa lista.
Nota : si necesita un procesamiento más complejo, tendrá que usar Servlets o cualquiera de las funciones proporcionadas por cualquier marco.