Soru Tomcat 7 ve JSTL


Eclipse Tomcat ile bir web uygulaması yazdım ve bir Tomcat 7'de çevrimiçi yayınlamaya çalıştığımda yerel Tomcat 7'de çalışıyor, aşağıdaki hatayı aldım:

SEVERE: Servlet.service (), sunucuya [obliquid.servlet.Index] yol bağlamında [/ cp] istisna attı [Mutlak uri: http://java.sun.com/jsp/jstl/core web.xml dosyasında veya bu uygulama ile dağıtılan jar dosyalarında çözülemez]

Tomcat 7, "Spec sürümleri: Servlet 3.0, JSP 2.2, EL 2.2", yani JSTL dahil değildir?

Standard.jar ve jstl.jar yüklemeye çalıştığımda aşağıdaki hatayı aldım:

org.apache.jasper.JasperException: /jsp/index.jsp (satır: 3, sütun: 62) TLD "META-INF / c.tld" JAR dosyasından okunamıyor "jndi: / localhost / cp / WEB-INF /lib/standard.jar ": org.apache.jasper.JasperException: TagLibraryValidator sınıfı yüklenemedi veya başlatılamadı: org.apache.taglibs.standard.tlv.JstlCoreTLV

Biraz googling yaptım, ama bunu çözemedim, bazıları kavanozların çelişen versiyonlarından kaynaklanabileceğini söyledi. Belki bu kavanozları içermemeli ve farklı bir JSTL url kullanmamalıyım? Benim için JSTL 1.1 olduğunu düşünüyorum, JSTL 1.2 için yeni bir URL var mı?

Sorunu çözmek ve bu uygulamayı çalıştırmak için ne yapmalıyım?


44
2018-05-23 07:52


Menşei


u kodu gönderebilir misin - Ravi Parekh
Merhaba Ravi, ilgili bölümleri yayınlamaya çalışacağım. Bu arada, denemeye devam ettim ve rsync ile yayınlamak yerine (her zaman yaptığım gibi), savaşı yayınladım ve bu sefer uygulama işe yaradı. Çevrimiçi kalması gerektiğinden, bu sunucuya dokunmayacağım ve aynı Tomcat 7.0.14 ile yeni bir tane kurmayacağım. Birkaç dakikaya ihtiyacım olacak ... - stivlo
JSTL wiki sayfamıza göz atın: stackoverflow.com/tags/jstl/info Gezinirken bu türden sayfaları alabilirsiniz. [tag] Bir kutu açılana kadar ve ardından bilgi bağlantı. - BalusC
Teşekkürler BalusC, her zaman yararlı, belki de Servlet 3.0 bildirimi ile güncellenmelidir. <? xml version = "1.0" kodlama = "UTF-8"?> <web-app xmlns = "java.sun.com/xml/ns/javaee"; xmlns: Web =""java.sun.com/xml/ns/javaee/web-app_3_0.xsd; xmlns: xsi ="w3.org/2001/XMLSchema-instance"; xsi: schemaLocation ="java.sun.com/xml/ns/javaee  "java.sun.com/xml/ns/javaee/web-app_3_0.xsd; id = "Your_Webapp_ID" version = "3.0"> - stivlo


Cevaplar:


Tomcat asla JSTL'ye dahil edilmedi.

Jstl ve standart kavanozları WEB-INF/lib (bunu yaptınız) ve bunları okumak için gerekli izinlere sahip olduğunuzdan emin olun (chmod)

URI'nız doğru ve çalışmalı (burada çalışıyor)


42
2018-05-23 08:23



"Tomcat, JSTL'yi asla dahil etmedi": Teşekkürler, yeni Tomcat 7'nin bunu bildiğini, iyi bildiğini düşündüm. Bir izin problemi olabilir, şimdi tekrar kuruyorum ve kontrol edeceğim, sizi güncelleyeceğim, teşekkürler. - stivlo
Tamam, işte güncelleme şu: Yeni sunucuda olduğu gibi her şeyi yükledim ve her şey çalışıyor. Fark, daha önce kök kullanıcı olarak rsyncing oldu ve şimdi tomcat olarak rsynced. Bunun gerçekten bir izin problemi olduğu anlamına geleceğini düşünüyorum. - stivlo


Bununla birkaç saat boyunca kavga ettim. İşte tam bir çözüm.

  1. Servlet 3.0 uyumlu bir sunucu olan Tomcat 7 kullanıyorum.

  2. Servlet 3.0 spesifikasyonunu kullanmak isterseniz, web.xml'inizi aşağıdaki gibi olmalıdır:

    <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"> 
    
  3. Maven kullanıyorsanız, pom.xml dosyanızın bu satırlara sahip olması gerekir.

    <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>
    

    Bu bağımlılıklar çok önemlidir. JSTL 2.1 + Tomcat 7 + Servlet 3.0, bu satırları, özellikle dışlama bölümünü kullanarak düzeltmezseniz çok bozuk. Olan şey, JSTL 2.1 Kavanozlarının aslında 2.5'lık Servlet sürümünün yanlış sürümlerini çekiyor olmasıdır. Bunu engellemediğiniz sürece, bütün bir acı dünyasında olacaksınız. Özel bir teşekkür Bu anlayışlar için Bay Murray Todd Williams .

  4. Son olarak, Maven'in bu JARS'ı bulamaması durumunda, projenizle üç JARS'ı ekleyerek ve her zamanki Project -> Properties -> Java Build Path'u yaparak Eclipse'i mutlu edebilirsiniz. onunla ilgilenmek.

    javax.servlet-api-3.0.1.jar
    javax.servlet.jsp.jstl-1.2.1.jar
    javax.servlet.jsp.jstl-api-1.2.1.jar
    
  5. Lütfen aklınızda bulundurun! Bu tam yapılandırma, yalnızca şu sihirli kombinasyonunu kullanıyorsanız geçerlidir:

    1. Tomcat 7 gibi bir Servlet 3.0 uyumlu uygulama sunucusu

    2. Web.xml sunucunuzun, Servlet 3.0 spesifikasyonları için doğru ad alanı vardır.

    3. Bu üç JARS var ve sınıf yolunda başka JSTL veya Servlet JARS yok.

  6. Bu JAR'ların kopyalarını WEB-INF / lib dizinine yerleştirmediğinizden emin olun, çünkü bu durumda sunucuya gönderilecek ve böylece LinkageErrors'a neden olacaktır.

  7. JSP'nizde, tam olarak sahip olduğum şekilde biçimlendirilmiş olan bu PRECISE hattına sahip olmanız gerekir, aksi takdirde Eclipse c: blah etiketlerini tanımayacağına karar verir:

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
  8. Ne dans eden bir PITA! Bu, JSTL'nin diğer herhangi bir versiyonundan daha zor uygulanmasıdır. Bu, sonraki iterasyonlarda basitlikten çok daha karmaşıklaşan bir şeyin tek örneğidir.


54
2018-05-20 14:01



Teşekkürler! Aynı kesin problemden geçtim ... Günümün saatlerini emdi, bunu bildiğiniz için teşekkürler! - Daniel Macias
Herhangi birinin çözümün kendileri için işe yaramadığını düşünüyorsanız, EL'nin göz ardı edilmediğini kontrol edin. Aşağıdaki satırı JSP sayfalarınıza ekleyin. Bu, EL'nin göz ardı edilmemesiyle ilgilenir. <% @ sayfa isELIgnored = "false"%> - Vishnu
çok teşekkür ederim. En iyi anwser, maven config için özellikle teşekkür ederiz. 3.1.0 servlet ile kullanmak için değiştirdim ve bir çekicilik gibi çalışır - Oleg Abrazhaev


Uri'niz JSTL 1.2 için doğrudur. İki şey yapmalısın:

Değiştir web.xml En son web-uygulama sürümünü kullanmak için

Böyle bir şeye veya sonraki bir versiyona bakmalı;

<?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">

İkinci olarak jstl kavanozlarının doğru sürümünü kodunuza koyun. 1.2 için bunları indirebilirsiniz İşte.

Bu sana iki kavanoz vermeli:

  • JSTL-api.jar
  • JSTL-impl.jar

Bunları yerine standard.jar ve jstl.jar önceki sürümü için vardı.

Bunun sizin için nasıl çalıştığını bize bildirin.


15
2017-09-14 09:54



teşekkürler, bana yardım etti. - Kiran


Apache tomcat 7'de çalıştırmak için bunları POM'unuza eklemek muhtemelen uygun. Bu kavanozlar javax.servlet kavanozlarını cam balıkları gibi referans göstermezler, dolayısıyla dışlamalara gerek yoktur.

<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>

4
2017-07-23 17:40





Tomcat için JSTL 1.1.2 için daha basit bir bağımlılık çözümü var:

<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>

Görmek İşte Daha fazla detay için (kişisel blog).

REM: İstendiği gibi daha fazla detay, biri Tomcat'ta kullanılabilir hale getirmek için JSTL bağımlılıkları içermelidir. Yine de sürüm 1.2 gerçekten gerekli değildir, çünkü sürüm 1.1.2 (Apache tarafından, Tomcat gibi) işi de yapar. Tek gereksinimi Servlet 2.4 ve JSP 2.2 ve OP yeterlidir Servlet 3.0 ve JSP 2.0, söz.


0
2017-07-28 21:43



Cevabınızı düzenlemeyi düşünür müsünüz kodunuzun bir açıklamasını ve eldeki sorunun cevabını niçin / nasıl bir yanıtı içerir? - Andrew Barber
Ben Tomcat üzerinde JSP / JSTL kullanan kişiler için oldukça açıklayıcı olduğunu düşünüyorum. Bu bağımlılık seti de işe yarıyor. - Jérôme Verstrynge


Maven'i kullanırken bu sorunu nasıl çözeceğimiz konusunda çoğunlukla doğru olan iki cevap var. Bununla birlikte, her ikisi de% 100 tamamlanmamıştır.

İstisnaların Kullanımı @ Tom Hunter'ın cevabı

Bu cevap işe yarıyor. Ancak, Tomcat'ten çift TLD tanımları ile ilgili olarak hala mesajlar olacaktır. Bunun nedeni hem jstl hem de jstl-impl eserlerinin TLD tanımlarını içermesidir. Bu mesajları kaldırmak için daha iyi bir Maven kurulumu:

<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>

Bu, yalnızca, cevabın geri kalanında açıklanan problemlerden kaçınmak için gerekli istisnaları içeren jstl api sınıflarını içerir.

Başına daha yeni POM sürümlerini kullanma @ George'un cevabı

Bunu gerçekleştirmek biraz zamanımı aldı, fakat JSTL pom'ın yeni versiyonları mevcut. Bu gerçekten kafa karıştırıcı çünkü bu yeni paketler benzer ama biraz farklı adlandırma kuralları kullanıyor. Bu yeni sürümler javax.servlet, javax.jsp, vb. Bağımlılıkları kapsam dahilinde işaretlemekte, böylece dışlanmaları gerekmemektedir. 1.2.1 sürümü jstl-api'nin 1.2.1 sürümüne bağlıdır. Ve böylece bu olur Yukarıdaki cevapların yanı sıra:

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <scope>runtime</scope>
</dependency>

Bu, George'un cevabından biraz farklıdır çünkü kapsamı çalışma süresine değiştirdim. George belirtilen kapsamı belirledi. Sağlanan bir kapsamda, kavanozların Tomcat lib dizinine manuel olarak kopyalanması ya da başka bir bağımlılığın gerekli uygulamayı içermesi gerekecekti.

Ancak, Maven merkezi, jboss repo veya başka herhangi bir dosyada impll'in 1.2.1 versiyonunu bulamadım. Çevreler halinde dolaşmaya başladım ve sonunda sadece kavanoz saklamak için yerel bir dosya tabanlı repo kullandım. Bağımlılık ve kavanoz burada açıklanmaktadır:


0
2017-09-20 14:21





Bunların hiçbiri benim için işe yaramadı, sadece Maven'i kullanmadan ve JAR dosyalarını doğrudan eklemeden projeyi yarattım.


0
2017-12-16 19:18





Hatadan ıstırap ettim: yolla [/ cp] bağlamında servlet [obliquid.servlet.Index] için SEVERE: Servlet.service () istisnası attı [Mutlak uri: http://java.sun.com/jsp/jstl/core Tomcat 7'de web.xml veya bu uygulama ile dağıtılan jar dosyaları] çözümlenemez

Çözüm: jarlar jstl-1.2.jar ve javax.servlet.jsp.jstl-api-1.2.1.jar dosyasını Tomcat Library Directory dizinine kopyalayın. Tekrar Eclipse'de Tomcat Kütüphanesi yeniden dağıtın.


-1
2018-05-10 11:53