java - servlet - Tomcat 7 y JSTL
upload files with java (9)
Escribí una aplicación web con Eclipse Tomcat y funciona en mi Tomcat 7 local, cuando traté de publicarlo en línea en un Tomcat 7, tuve el siguiente error:
SEVERE: Servlet.service () para servlet [obliquid.servlet.Index] en contexto con la ruta [/ cp] lanzó excepción [La uri absoluta:
http://java.sun.com/jsp/jstl/core
no se puede resolver en ya sea web.xml o los archivos jar implementados con esta aplicación]
Tomcat 7 tiene "Versiones de especificaciones: Servlet 3.0, JSP 2.2, EL 2.2", ¿por lo que JSTL no está incluido?
Cuando intenté subir standard.jar y jstl.jar, tuve el siguiente error:
org.apache.jasper.JasperException: /jsp/index.jsp (línea: 3, columna: 62) No se puede leer el TLD "META-INF / c.tld" del archivo JAR "jndi: / localhost / cp / WEB-INF /lib/standard.jar ": org.apache.jasper.JasperException: Error al cargar o instanciar la clase TagLibraryValidator: org.apache.taglibs.standard.tlv.JstlCoreTLV
Hice algunos google, pero no pude resolverlo, algunos dijeron que podría ser causado por versiones conflictivas de los frascos. Tal vez no debería incluir esos frascos y usar una URL JSTL diferente? El mío es para JSTL 1.1. ¿Existe una nueva URL para JSTL 1.2?
¿Qué debo hacer para resolver el problema y hacer que esta aplicación se ejecute?
Aquí hay dos respuestas que son en su mayoría correctas con respecto a cómo resolver este problema cuando se usa Maven cuando se trata de este problema. Sin embargo, ambos no están 100% completos.
Uso de exclusiones por respuesta de @Tom Hunter
Esta respuesta funciona Sin embargo, todavía habrá mensajes de registro de Tomcat con respecto a las definiciones de TLD duplicados. Esto se debe a que tanto los artefactos jstl como jstl-impl incluyen las definiciones de TLD. Para eliminar esos mensajes, creo que una mejor configuración de Maven es esta:
<dependency>
<version>1.2</version>
<scope>runtime</scope>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
</exclusion>
<exclusion>
<artifactId>jstl-api</artifactId>
<groupId>javax.servlet.jsp.jstl</groupId>
</exclusion>
</exclusions>
</dependency>
Esto incluye solo las clases jstl api con las exclusiones necesarias para evitar los problemas explicados en el resto de esa respuesta.
Usar las versiones de POM más nuevas según la respuesta de @George
Me tomó un tiempo darme cuenta, pero hay versiones más nuevas de JSTL pom disponibles. Es realmente confuso porque estos paquetes más nuevos usan convenciones de nombres similares, pero ligeramente diferentes. Estas versiones más nuevas marcan las dependencias javax.servlet, javax.jsp, etc. como alcance provisto para que no necesiten ser excluidas. La versión 1.2.1 depende de una versión 1.2.1 de jstl-api. Y entonces esto funcionaría tan bien como la respuesta anterior:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<scope>runtime</scope>
</dependency>
Esto difiere ligeramente de la respuesta de George porque cambié el alcance al tiempo de ejecución. George especificó el alcance según lo provisto. Con un ámbito proporcionado, los archivos jar deberían copiarse manualmente en el directorio lib de Tomcat, o cualquier otra dependencia debería incluir la implementación necesaria.
Sin embargo, no pude encontrar la versión 1.2.1 de la impl en maven central, jboss repo, o cualquier otro repositorio. Terminé dando vueltas en círculos y finalmente usé un repositorio local basado en archivos para almacenar el contenedor. La dependencia y el jar se describen aquí:
He estado luchando con esto por varias horas. Aquí hay una solución completa.
Estoy usando Tomcat 7, que es un servidor compatible con Servlet 3.0.
Si desea utilizar la especificación de Servlet 3.0, debe tener su web.xml de la siguiente manera:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
Si está utilizando Maven, su pom.xml debería tener estas líneas.
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jstl-impl</artifactId> <version>1.2</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> <exclusion> <artifactId>jstl-api</artifactId> <groupId>javax.servlet.jsp.jstl</groupId> </exclusion> </exclusions> </dependency>
Estas dependencias son muy importantes. JSTL 2.1 + Tomcat 7 + Servlet 3.0 está muy roto a menos que lo solucione utilizando estas líneas, especialmente la parte de exclusión. Lo que está sucediendo es que los JSTL 2.1 Los jars realmente están extrayendo las versiones incorrectas de la especificación de Servlet - 2.5. A menos que evites que eso suceda, estarás en un mundo de dolor. Un agradecimiento especial al Sr. Murray Todd Williams por estas ideas .
Finalmente, en caso de que Maven no pueda encontrar esos JARS, puede contentar a Eclipse incluyendo tres JARS con su proyecto y haciendo el Proyecto habitual -> Propiedades -> Ruta de compilación de Java e incluirlos de esa manera - aunque Maven debería tomar preocuperase por ello.
javax.servlet-api-3.0.1.jar javax.servlet.jsp.jstl-1.2.1.jar javax.servlet.jsp.jstl-api-1.2.1.jar
¡Tenga en cuenta! Esta configuración exacta solo se aplica si está usando la combinación mágica de:
Un servidor de aplicaciones compatible con Servlet 3.0 como Tomcat 7
Su web.xml tiene el espacio de nombres correcto para la especificación de Servlet 3.0
Tienes esos tres JARS y ningún otro JSTL o JAVS de servlets en tu classpath.
Asegúrese de no colocar copias de estos archivos JAR en su directorio WEB-INF / lib porque en ese caso se enviarían al servidor y causarían LinkageErrors.
En su JSP, necesita tener esta línea PRECISE, formateada exactamente como la tengo o de lo contrario, Eclipse se quejará de que no reconoce las etiquetas c: blah:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
¡Qué PITA en peligro! Esto es MUCHO más difícil de implementar que cualquier otra versión de JSTL. Este es el único ejemplo de que algo se vuelve mucho más complicado en lugar de simplificarlo en iteraciones posteriores.
Las siguientes dependencias en el pom.xml parecen resolver el problema:
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>javax.servlet.jsp.jstl-api</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
Esa fue una combinación extraña, dos grupos diferentes, pero funciona :). Mi expectativa era ver el mismo ID de grupo para ambos frascos. Logré volver a implementar sin problemas a Tomcat 7.
Además, si ve "Etiqueta desconocida"
Ninguno de estos funcionó para mí, simplemente creé el proyecto sin usar Maven y agregué los archivos JAR directamente.
Para Tomcat, existe una solución de dependencia más simple para JSTL 1.1.2:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!-- Apache Taglibs does not implement version 1.2 -->
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>c</artifactId>
<version>1.1.2</version>
<type>tld</type>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>fmt</artifactId>
<version>1.1.2</version>
<type>tld</type>
</dependency>
<dependency>
Mira here para más detalles (blog personal).
REM: Más detalles según lo solicitado, uno tiene que incluir dependencias JSTL para que estén disponibles en Tomcat. Sin embargo, la versión 1.2 no es realmente necesaria, ya que la versión 1.1.2 (entregada por Apache, como Tomcat) hace el trabajo también. Su único requisito es Servlet 2.4 y JSP 2.2, y el OP menciona Servlet 3.0 y JSP 2.0, que es lo suficientemente bueno.
Para ejecutar en apache tomcat 7 agregar esto a su POM es probablemente apropiado. Estas jarras no hacen referencia a los jar javax.servlet como los glassfish, por lo que no hay necesidad de exclusiones.
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.1</version>
</dependency>
Sufrí el error: SEVERE: Servlet.service () para servlet [obliquid.servlet.Index] en contexto con ruta [/ cp] lanzó excepción [The absolute uri: http://java.sun.com/jsp/jstl/core no se puede resolver ni en web.xml ni en los archivos jar implementados con esta aplicación] en Tomcat 7
La solución: copie jars jstl-1.2.jar y javax.servlet.jsp.jstl-api-1.2.1.jar directamente en el directorio de la biblioteca Tomcat. Volver a implementar la Biblioteca Tomcat en Eclipse nuevamente.
Tomcat nunca ha incluido JSTL.
Debes poner los jstl y los jar estándar en WEB-INF/lib
(ya lo has hecho), y asegurarte de tener los permisos para leerlos (chmod)
Su URI es correcto y debería funcionar (funciona aquí)
Tu uri es correcto para JSTL 1.2. Tienes que hacer dos cosas:
Cambie su web.xml
para usar la última versión de la aplicación web.
Debería verse algo como esto o una versión posterior;
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
En segundo lugar, coloque la versión correcta de jstl jar en su código. Para 1.2 Puede descargarlos here .
Esto debería darte dos jarras:
- jstl-api.jar
- jstl-impl.jar
Use estos, en lugar de standard.jar
y jstl.jar
que eran para la versión anterior.
Háganos saber cómo esto funciona para usted.