Java EE 웹 응용 프로그램에서 WEB-INF는 무엇입니까?


177

다음 소스 코드 구조로 Java EE 웹 응용 프로그램을 작성 중입니다.

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

내가 관심이있는 것은 서블릿 설정을위한 XML 파일, Spring bean 배선 컨텍스트 및 JSP 태그 및 뷰를 WEB-INF포함한다는 것 web.xml입니다.

이 구조를 제한 / 정의하는 것이 무엇인지 이해하려고합니다. 예를 들어 JSP 파일은 항상 내부에 있어야 WEB-INF합니까 아니면 다른 곳에있을 수 있습니까? 그리고 들어갈 다른 것이 WEB-INF있습니까? Java 클래스 및 JAR 파일에 대한 Wikipedia의 WAR 파일 항목에 대한 언급 -다른 소스 파일 위치 외에도 필요할 때 완전히 파악하지 못했습니다.classeslib



1
참고… 서블릿 컨테이너가WEB-INF 다른 위치 에서로드되는 방법 과 다른 위치에 대한 자세한 내용은 서블릿에서 클래스 경로 제어 , 특히이 답변을 참조하십시오 .
바질 부르 케

답변:


216

서블릿 2.4 스펙은 말한다이 WEB-INF (70 페이지)에 대한 :

응용 프로그램 계층 내에 특수 디렉토리가 있습니다 WEB-INF. 이 디렉토리에는 응용 프로그램의 문서 루트에없는 응용 프로그램과 관련된 모든 내용이 들어 있습니다. 노드는 응용 프로그램의 공용 문서 트리의 일부가 아닙니다 . 디렉토리에 포함 된 파일은 컨테이너 가 클라이언트에 직접 제공 할 수 없습니다. 그러나 디렉토리 의 내용은에서 및 메소드 호출을 사용하여 서블릿 코드에 표시되며 호출을 사용하여 노출 될 수 있습니다 .WEB-INFWEB-INFWEB-INFgetResourcegetResourceAsStreamServletContextRequestDispatcher

즉, WEB-INF웹 응용 프로그램의 리소스 로더에서 리소스에 액세스 할 수 있으며 일반에게 직접 표시되지 않습니다.

이것이 많은 프로젝트가 JSP 파일, JAR / 라이브러리 및 자체 클래스 파일 또는 특성 파일 또는 기타 민감한 정보와 같은 자원을 폴더에 넣는 이유 WEB-INF입니다. 그렇지 않으면 간단한 정적 URL을 사용하여 액세스 할 수 있습니다 (예 : CSS 또는 Javascript를로드하는 데 유용).

JSP 파일은 기술적 인 관점에서 어느 곳에 나있을 수 있습니다. 예를 들어 Spring에서는 다음과 같이 구성 할 수 있습니다WEB-INF 명시 적으로 .

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

그만큼 WEB-INF/classesWEB-INF/lib위키 백과의에서 언급 한 폴더 WAR 파일 문서 실행시 서블릿 사양에 필요한 폴더의 예입니다.

프로젝트 구조와 결과 WAR 파일의 구조를 다르게하는 것이 중요합니다.

프로젝트 구조는 경우에 따라 WAR 파일의 구조를 부분적으로 반영합니다 (JSP 파일 또는 HTML 및 JavaScript 파일과 같은 정적 자원의 경우). 그러나 항상 그런 것은 아닙니다.

프로젝트 구조에서 결과 WAR 파일로의 전환은 빌드 프로세스에 의해 수행됩니다.

일반적으로 자신 만의 빌드 프로세스를 자유롭게 설계 할 수 있지만 요즘 대부분의 사람들은 Apache Maven. 무엇보다도 Maven은 프로젝트 구조의 리소스가 결과 아티팩트의 리소스에 매핑되는 기본값을 정의합니다 (이 경우 결과 아티팩트는 WAR 파일 임). 어떤 경우에는 매핑이 일반 복사 프로세스로 구성되고 다른 경우에는 매핑 프로세스에 필터링 또는 컴파일 등의 변환이 포함됩니다.

한 가지 예 : WEB-INF/classes폴더에는 나중에 컴파일 된 모든 Java 클래스 및 리소스가 포함됩니다 (src/main/javasrc/main/resources 응용 프로그램을 시작하기 위해 클래스 로더가로드해야하는 및 )가 포함됩니다.

다른 예 : WEB-INF/lib폴더에는 나중에 응용 프로그램에 필요한 모든 jar 파일이 포함됩니다. maven 프로젝트에서 종속성이 관리되고 maven은 필요한 jar 파일을 자동으로 WEB-INF/lib폴더에 복사합니다. 그것은 libmaven 프로젝트에 폴더 가없는 이유를 설명합니다 .



2
Servlet 3.0 & 3.1 ( JSR 340 ) 의 변경으로 WEB-INF / lib에 저장된 JAR 내에서 정적 자원 및 JSP를 제공 할 수 있습니다. Servlet 3.1 스펙 섹션 10.5를 인용하려면 WEB-INF / lib 디렉토리에있는 JAR 파일의 META-INF / resources에 패키지 된 정적 자원 및 JSP를 제외하고 WEB-INF 디렉토리에 포함 된 다른 파일은 없습니다. 컨테이너에 의해 클라이언트에게 직접 제공됩니다. : 그래서 예외에만 적용 WAR> WEB-INF> lib> JAR> 파일resources
바질 우르 큐

1
으악에 마지막 문장 것을 변화, 위에서 내 댓글에서 정적 파일에서 제공 할 수 있습니다 : WAR파일> WEB-INF> lib> JAR파일> META-INF> resources> yourStaticFilesGoHere .
Basil Bourque

@mwhs 새 서블릿 3 섹션으로 답변을 수정하고 현재 컨텐츠를 서블릿 2 섹션으로 레이블 지정하십시오.
Basil Bourque

61

프레임 워크를 사용하거나 사용하지 않고 Java EE 웹 응용 프로그램을 배포 할 때 해당 구조는 일부 요구 사항 / 사양을 따라야합니다. 이러한 사양은 다음과 같습니다.

  • 서블릿 컨테이너 (예 : Tomcat)
  • 자바 서블릿 API
  • 응용 프로그램 도메인
  1. 서블릿 컨테이너 요구 사항
    Apache Tomcat을 사용하는 경우 애플리케이션의 루트 디렉토리는 webapp 폴더에 있어야합니다. 다른 서블릿 컨테이너 또는 애플리케이션 서버를 사용하는 경우에는 다를 수 있습니다.

  2. Java Servlet API 요구 사항
    Java Servlet API는 루트 애플리케이션 디렉토리가 다음 구조를 가져야한다고 명시합니다.

    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

이러한 요구 사항은 Java Servlet API에 의해 정의됩니다.

응용 프로그램 도메인 -일부 프레임 워크를 사용하는 경우 종종 구성 파일을 사용합니다. 이러한 프레임 워크 (스트럿, 스프링, 최대 절전 모드)의 대부분은 구성 파일을 클래스 경로 ( "classes"디렉토리)에 배치해야합니다.
이제 Servlet 컨테이너 (또는 애플리케이션 서버)의 요구 사항과 Java Servlet API 요구 사항을 준수 했으므로 필요한 사항에 따라 웹앱의 다른 부분을 구성 할 수 있습니다.
-리소스 (JSP 파일, 일반 텍스트 파일, 스크립트 파일)를 응용 프로그램 루트 디렉토리에 넣을 수 있습니다. 그러나 사람들은 응용 프로그램에서 제공하는 일부 논리로 요청을 처리하는 대신 브라우저에서 직접 액세스 할 수 있습니다. 따라서 리소스가 직접 액세스되는 것을 방지하기 위해 서버에서만 액세스 할 수있는 WEB-INF 디렉토리에 리소스를 넣을 수 있습니다.


12

공개하고 싶지 않은 페이지 또는 페이지를 WEB-INF에 넣어야합니다. 일반적으로 JSP 또는 Facelet은 WEB-INF 외부에 있지만이 경우 모든 사용자가 쉽게 액세스 할 수 있습니다. 일부 권한 제한이있는 경우 WEB-INF를 사용할 수 있습니다.

WEB-INF / lib에는 시스템 수준으로 팩킹하지 않으려는 (자사 서버에서 실행중인 모든 응용 프로그램에서 JAR을 사용할 수 있음) 타사 라이브러리를 포함 할 수 있지만이 특정 응용 프로그램에서만 사용할 수 있습니다.

일반적으로 많은 구성 파일도 WEB-INF로 들어갑니다.

WEB-INF / classes에 관해서는 모든 웹 응용 프로그램에 존재합니다. 왜냐하면 모든 컴파일 된 소스가있는 폴더이기 때문입니다 (JARS가 아니라 직접 작성한 .java 파일).


4

이 규칙은 보안상의 이유로 준수됩니다. 예를 들어, 권한이없는 사람이 URL에서 직접 루트 JSP 파일에 액세스 할 수 있으면 인증없이 전체 애플리케이션을 탐색 할 수 있으며 모든 보안 데이터에 액세스 할 수 있습니다.


jsp 파일이 여전히 요청 세션을 찾지 않습니까? 그리고 아무것도 찾지 못하면 사이트의 일부를 표시하지 않습니다.
parsecer

3

jsp 페이지를 WEB-INF 디렉토리 아래에 배치하여 딥 링크하거나 책갈피에 추가 할 수없는 규칙이 있습니다 (필요하지 않음). 이 방법으로 jsp 페이지에 대한 모든 요청은 응용 프로그램을 통해 전달되어야하므로 사용자 경험이 보장됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.