Java EE web uygulamasında WEB-INF ne için kullanılır?


177

Aşağıdaki kaynak kodu yapısına sahip bir Java EE web uygulaması üzerinde çalışıyorum:

src/main/java                 <-- multiple packages containing java classes
src/test/java                 <-- multiple packages containing JUnit tests
src/main/resources            <-- includes properties files for textual messages
src/main/webapp/resources     <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views

İlgilendiğim bit WEB-INF- sunucuları web.xmlayarlamak için XML dosyaları, Spring bean kablolama bağlamları ve JSP etiketleri ve görünümleri içeriyor .

Bu yapıyı neyin kısıtladığını / tanımladığını anlamaya çalışıyorum. Örneğin, JSP dosyaları her zaman içeride olmalı WEB-INFveya başka bir yerde olabilir mi? Ve içeri girebilecek başka bir şey var WEB-INFmı? Wikipedia'nın WAR dosyalarıclasses , Java sınıfları ve libJAR dosyaları için girişten bahseder - diğer kaynak dosya konumlarına ek olarak bunlara ne zaman ihtiyaç duyulacağından emin değilim.



1
FYI… Servlet kaplarınınWEB-INF ve diğer konumlardan nasıl yüklendiği hakkında bilgi edinmek için, Bir sunucu uygulamasında sınıf yolunu denetleme , özellikle bu Yanıt .
Basil Bourque

Yanıtlar:


216

Servlet 2.4 spesifikasyonu diyor bu WEB-INF (sayfa 70) hakkında:

Adlı uygulama hiyerarşisinde özel bir dizin var WEB-INF. Bu dizin, uygulamanın belge kökünde bulunmayan uygulama ile ilgili her şeyi içerir. Düğüm uygulamasının kamu belge ağacının bir parçası değildir . Dizinde bulunan hiçbir dosya, kapsayıcı tarafından doğrudan bir istemciye sunulamaz. Ancak, dizinin içeriği , ve yöntem çağrıları kullanılarak sunucu uygulaması koduna görünür ve çağrılar kullanılarak açığa çıkarılabilir .WEB-INFWEB-INFWEB-INFgetResourcegetResourceAsStreamServletContextRequestDispatcher

Bu WEB-INF, kaynakların Web Uygulamanızın kaynak yükleyicisi tarafından erişilebilir olduğu ve doğrudan herkes tarafından görülemediği anlamına gelir .

Bu nedenle birçok proje JSP dosyaları, JAR'lar / kütüphaneler ve kendi sınıf dosyaları veya özellik dosyaları veya diğer hassas bilgileri WEB-INFklasöre koyar . Aksi takdirde, bunlara basit bir statik URL (örneğin CSS veya Javascript yüklemek için yararlı) kullanılarak erişilebilir.

JSP dosyalarınız teknik açıdan bakıldığında her yerde olabilir. Örneğin, Bahar aylarında bunları WEB-INFaçık olarak yapılandırabilirsiniz :

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" 
    p:suffix=".jsp" >
</bean>

WEB-INF/classesVe WEB-INF/libWikipedia'nın belirtilen klasörler SAVAŞ dosyaları makale zamanında Servlet şartname gereği klasörlerin örnekleridir.

Bir projenin yapısı ile ortaya çıkan WAR dosyasının yapısı arasında fark yaratmak önemlidir.

Projenin yapısı bazı durumlarda WAR dosyasının yapısını kısmen yansıtacaktır (JSP dosyaları veya HTML ve JavaScript dosyaları gibi statik kaynaklar için, ancak bu her zaman böyle değildir.

Proje yapısından sonuçta ortaya çıkan WAR dosyasına geçiş bir derleme işlemi ile yapılır.

Genellikle kendi oluşturma sürecinizi tasarlamakta özgür olsanız da, günümüzde çoğu insan Apache Maven gibi standart bir yaklaşım kullanacaktır . Diğer şeylerin yanı sıra Maven, proje yapısındaki hangi kaynakların sonuçta ortaya çıkan eserde hangi kaynaklarla eşleştiğini varsayılan olarak tanımlar (sonuçta ortaya çıkan eser, bu durumda WAR dosyasıdır). Bazı durumlarda haritalama, düz bir kopyalama işleminden oluşur, diğer durumlarda haritalama işlemi, filtreleme veya derleme ve diğerleri gibi bir dönüşüm içerir.

Bir örnek : WEB-INF/classesKlasör daha sonra uygulamayı başlatmak için Classloader tarafından yüklenmesi gereken derlenmiş tüm java sınıflarını ve kaynaklarını ( src/main/javave src/main/resources) içerecektir.

Başka bir örnek : WEB-INF/libKlasör daha sonra uygulamanın ihtiyaç duyduğu tüm jar dosyalarını içerecektir. Bir maven projesinde bağımlılıklar sizin için yönetilir ve maven gerekli jar dosyalarını sizin için otomatik olarak WEB-INF/libklasöre kopyalar . Bu, libbir maven projesinde neden bir klasörünüz olmadığını açıklar .



2
Servlet 3.0 ve 3.1'deki ( JSR 340 ) değişiklik, WEB-INF / lib'de depolanan bir JAR içinden statik kaynakların ve JSP'lerin sunulmasına izin verir. Servlet 3.1 spec bölüm 10.5: WEA-INF / lib dizininde bulunan bir JAR dosyasının META-INF / kaynakları içinde paketlenmiş statik kaynaklar ve JSP'ler dışında, WEB-INF dizininde başka hiçbir dosya bulunmayabilir konteyner tarafından doğrudan müşteriye sunulur. : Yani istisna için geçerlidir WAR> WEB-INF> lib> JAR> dosyasınınresources
Fesleğen Bourque

1
Hay aksi, son cümle bu değişim, yukarıda benim yorumun: Statik dosyalarından servis edilebilir WARdosyasında> WEB-INF> lib> JARdosya> META-INF> resources> yourStaticFilesGoHere .
Basil Bourque

@mwhs Yanıtınızı yeni bir Servlet 3 bölümü ile gözden geçirmenizi ve mevcut içeriğinizi bir Servlet 2 bölümü olarak etiketlemenizi öneririm.
Basil Bourque

61

Bir Java EE web uygulamasını (çerçeveler kullanarak veya kullanmadan) dağıtırken, yapısının bazı gereksinimlere / özelliklere uyması gerekir. Bu özellikler:

  • Sunucu uygulaması kabı (örn. Tomcat)
  • Java Servlet API'sı
  • Uygulama alanınız
  1. Servlet kapsayıcı gereksinimleri
    Apache Tomcat kullanıyorsanız, uygulamanızın kök dizini webapp klasörüne yerleştirilmelidir. Başka bir sunucu uygulaması kapsayıcısı veya uygulama sunucusu kullanıyorsanız bu durum farklı olabilir.

  2. Java Servlet API gereksinimleri
    Java Servlet API, kök uygulama dizininizin aşağıdaki yapıya sahip olması gerektiğini belirtir:

    ApplicationName
    |
    |--META-INF
    |--WEB-INF
          |_web.xml       <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
          |_classes       <--Here goes all the classes of your webapp, following the package structure you defined. Only 
          |_lib           <--Here goes all the libraries (jars) your application need

Bu gereksinimler Java Servlet API'sı tarafından tanımlanır.

3. Uygulama etki alanınız
Artık Servlet kapsayıcısının (veya uygulama sunucusunun) ve Java Servlet API gereksinimlerinin gereksinimlerini izlediğinize göre, web uygulamanızın diğer bölümlerini ihtiyacınıza göre düzenleyebilirsiniz.
- Kaynaklarınızı (JSP dosyaları, düz metin dosyaları, komut dosyaları) uygulama kök dizininize koyabilirsiniz. Ancak, kullanıcılar isteklerinin uygulamanız tarafından sağlanan bazı mantık tarafından işlenmesi yerine doğrudan tarayıcılarından erişebilirler. Bu nedenle, kaynaklarınıza doğrudan bu şekilde erişilmesini önlemek için, kaynaklara yalnızca sunucu tarafından erişilebilen WEB-INF dizinine koyabilirsiniz.
-Bazı çerçeveler kullanırsanız, genellikle yapılandırma dosyaları kullanırlar. Bu çerçevelerin çoğu (payandalar, yay, hazırda bekletme) yapılandırma dosyalarını sınıfyoluna ("sınıflar" dizini) koymanızı gerektirir.


12

WEB-INF'e herkese açık olmak istemediğiniz sayfaları veya sayfa parçalarını koymalısınız. Genellikle, JSP veya yüzler WEB-INF dışında bulunur, ancak bu durumda herhangi bir kullanıcı için kolayca erişilebilir. Bazı izin kısıtlamalarınız olması durumunda, WEB-INF bunun için kullanılabilir.

WEB-INF / lib, sistem düzeyinde paketlemek istemediğiniz 3. taraf kitaplıkları içerebilir (JAR'lar sunucunuzda çalışan tüm uygulamalar için kullanılabilir), ancak yalnızca bu uygulama için.

Genel olarak, birçok yapılandırma dosyası da WEB-INF'e girer.

WEB-INF / sınıflarına gelince - herhangi bir web uygulamasında bulunur, çünkü derlenen tüm kaynakların yerleştirildiği klasör budur (JARS değil, kendi yazdığınız derlenmiş .java dosyaları).


4

Bu sözleşme güvenlik nedeniyle takip edilir. Örneğin, yetkisiz kişinin kök JSP dosyasına doğrudan URL'den erişmesine izin verilirse, kimlik doğrulaması yapmadan tüm uygulamada gezinebilir ve tüm güvenli verilere erişebilir.


Jsp dosyası hala bir isteğin oturumunu aramaz mı? Ve hiçbiri bulamazsa, sitenin bazı bölümlerini göstermez.
parsecer

3

Jsp sayfalarını WEB-INF dizininin altına yerleştirmek için derin bir bağlantı veya yer imi konulmaması için bir kural (gerekli değildir) vardır. Bu şekilde, jsp sayfasına yapılan tüm istekler uygulamamız aracılığıyla yönlendirilmelidir, böylece kullanıcı deneyimi garanti edilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.