자바 웹 애플리케이션 폴더 구조


18

J2EE의 초보자로서 최근에 J2EE의 핵심 인 Servlets & Jsps를 사용하여 프로젝트를 처음부터 새로 개발하기 시작했습니다.

프로젝트 폴더 구조가 올바른지 평가할 수 없습니다. 여기 내 프로젝트 폴더 구조가 있습니다. 여기에 이미지 설명을 입력하십시오

질문하기 전에, 누군가가 나에게 묻는다면 왜 이런 유형의 폴더 구조인지 대답 할 수 없거나 정당화 할 수 없다는 것을 인정합니다. 질문 : 내 jsp를 web-inf 외부에 두는 것이 좋은 징조입니까? 그렇지 않다면 왜 그렇습니까? 그렇다면 왜 그렇습니까?

J2EE 웹 응용 프로그램에 대한 표준 폴더 구조 규칙이 있습니까? 저는 maven이 몇 가지 표준을 제시했지만 여전히 요구 사항에 따라 사용자 정의 할 수 있음을 알고 있습니다.

나는 약간의 인터넷 검색을 수행하고 두 참조를 발견했습니다. 1 2

대답에서 같은 페이지에 있지 않아서 결론을 도출 할 수 없었습니다.

J2EE 웹 애플리케이션의 폴더 구조를 배치 할 때 고려해야 할 사항은 무엇입니까? 중요한 Jsp, 정적 컨텐츠는 어디로 이동해야하며 왜 그 이유는 무엇입니까?



MVC 이론을 연구하는 것이 좋습니다 . Wikipedia 기사 에는 훌륭한 자료가 있습니다. Java webapp에서 MVC를 실험하고 싶다면 Stripes 는 아키텍처에 대한 개요를 제공하는 탁월한 경량 프레임 워크입니다.
Michael K


답변:


7

WAR 파일의 표준 구조는 다음과 같습니다.

/META-INF
   Standard jar stuff like manifest.xml
/WEB-INF
  web.xml
  /classes
    /com...etc.
  /lib

mavenmaven-webapp-plugin 에서 src / main / java, resources, webapp 및 종속성 (/ lib에 배치)을 사용하여 이것을 생성 하지만 구현입니다. WEB-INF에 넣은 것은 외부에서 액세스 할 수 없지만 WAR의 루트 디렉토리에있는 모든 것은 공개되어 있다는 사실을 알아야 합니다.

일반적으로 응용 프로그램이 web.xml에 정의한 서블릿 및 필터를 사용하여 모든 액세스를 처리하기를 원하므로 루트에 많이 넣기를 원하지 않습니다. 루트에서 서블릿으로 리디렉션되는 index.html (또는 .jsp) (예 : Struts 조치)이 일반적 입니다.

Stripes 또는 Struts와 같은 일반적인 MVC 구현에서는 JSP가보기 전용 인 것을 선호하여 사용자의 JSP 액세스를 직접 권장하지 않습니다. 요청을 처리 한 후 JSP로 전달하는 컨트롤러를 작성하는 것이 좋으며 JSP는 결과 만 렌더링합니다. 예를 들어, 양식을 제출 /login하면 로그인 요청을 처리하고 사용자 세션을 작성하며 사용자를 홈페이지 JSP의 로그인 된보기로 전달하는 조치를 실행합니다.


5

"올바른 방법은 무엇입니까?"에 대한 일반적인 대답 또는 "이것이 올바른 방법입니까?" ..... 그것은 달려있다 .

내가 할 수있는 것은 당신에게 특정 아이디어에 대한 장단점을 알려주는 것입니다. 다음은 100 % 내 의견입니다. 특정 요구 사항이나 규칙을 모르겠습니다. 누군가 나에게 동의하지 않을 것입니다.

JSP

JSP를 WEB-INF에 넣을지 여부에 대해 작업 해 봅시다.

WEB-INF에 JSP를 넣는 장점 :

  • JSP 실행 방법을 제어합니다. JSP를 매개 변수화하고 재사용 할 수 있기를 원한다면 (어쨌든 JSP로는 어렵습니다) WEB-INF에 넣고 서블릿 또는 Struts 액션 컨트롤러 또는 다른 프론트 컨트롤러를 사용하여 사전 처리를 수행 할 수 있습니다 그런 다음 제어를 JSP에 전달하고 올바른 환경 컨텍스트 (예 : 요청 속성, 보안 검사, 매개 변수 위생 등)를 전달합니다.
  • 프로그래밍 방식으로 또는 방화벽 또는 IDS 수준에서 HTTP 요청을 * .jsp로 차단하여 누군가 JSP를 웹 루트에 업로드 한 다음 웹 서버로 코드를 실행할 수있는 가능성을 줄입니다. 기존 JSP를 덮어 써야합니다. 큰 보안 이점은 아니지만 타협을 약간 어렵게 만듭니다.
  • MVC, 프론트 컨트롤러, 서블릿 필터, 의존성 주입 등과 같은 좋은 습관을 강요하여 모든 작업 자체를 수행하고 읽기 / 유지하기 어려운 거대한 괴물 JSP와는 대조적입니다.

WEB-INF에 JSP를 배치하는 단점 :

  • 선행 처리가 필요없는 단순한 독립형 페이지 인 경우에도 페이지에 직접 액세스 할 수 없습니다. / WEB-INF 아래의 파일은 서블릿 컨테이너에서 제공 할 수 없기 때문입니다.

정적 파일

HTML, 이미지, 스타일 시트, 자바 스크립트 등과 같은 순수 정적 파일의 관점에서 파일을 웹 루트 (귀하의 경우 my_app) 아래에 두지 만 NOT / WEB-INF (액세스 할 수 없기 때문에).

전체 레이아웃

전체 디렉토리 레이아웃은 빌드 프로세스에 따라 다릅니다. 나는 "src"또는 "source"에 모든 것을 저장하는 것을 좋아한다. 왜냐하면 어떤 파일을 빌드하여 어떤 파일이 생성되고 어떤 것이 순수한 소스 파일인지 명확하게하기 때문이다. mainjunit 클래스와 같은 테스트 코드를 기본 소스 코드와 분리하면 좋습니다. 그러나 단위 테스트가 없다면 (아뇨!) 무의미한 구별입니다.

반면에 빌드 도중 웹 루트를 전혀 조작하지 않으면 (예 : 모든 JSP 및 정적 파일 인 경우) 웹 루트를 최상위 레벨로 유지 /webroot하거나 /deploy필요에 따라 파일을 복사 하거나 복사합니다. .class 또는 .jar 파일. 인간 (특히 개발자)이 과도하게 조직하는 습관입니다. 초과 구성의 좋은 신호는 하나의 하위 폴더 만있는 폴더가 많이 있다는 것입니다.

당신이 보여준 것

maven에서 설정 한 규칙을 따르고 있음을 나타내므로 이미 maven을 사용하는 경우 해당 레이아웃을 사용하십시오. 설명 한 레이아웃에는 아무런 문제가 없습니다.


1

음, src / main / webapp은 필자에게 maven 프로젝트를 상기시킵니다. 어느 것이 좋니.

my_app / jsps의 경우 확실하지 않습니다. 개발자는 일반적으로 jsp를 webapp 폴더에 두거나 약간의 URL 매핑을 원할 경우 webapp / jsp 디렉토리에 둡니다.

!경고! : web-inf에 jsp 파일을 넣지 마십시오. WEB-INF에는 웹 사이트를 구성하기위한 xml 파일 만 포함해야합니다. jsp는 웹 페이지 또는 웹 페이지의 일부입니다.

템플릿, 부분 등의 폴더 이름을 사용할 수 있습니다. 낯선 사람을 쉽게 찾을 수 있어야합니다. 전체 페이지, 템플릿, 부분보기와 같은 다른 유형의 컨텐츠를 분리하십시오 ...


src / main / webapp에는 표준 WAR 레이아웃 파일이 포함되어 있으며 Java webapp를 컴파일 할 때 maven-war-plugin 에서 읽습니다 .
Michael K

1
web.xml에서 서블릿을 전달하도록 구성한 경우에는 JSP를 WEB-INF에 넣지 말아야 할 이유가 없습니다. 이는 Struts 앱을 구현하는 표준 방법입니다. 모든 요청은 Struts 서블릿을 통해 요청에 조치와 JSP로 맵핑됩니다.
Michael K

나는 jsp에 직접 액세스해서는 안되며 그것을 예방하는 것이 좋은 습관으로 간주되어야한다는 사실에 동의합니다. 그러나 다른 방법이 있습니다.
Brice Ruppen

1

나는 브라이스 동의합니다 . J2EE 초보자도 있지만 처음에는 쉽고 명확하게 작동하는 것이 좋습니다.

루트 폴더는 WEBAPP이며 대부분의 페이지가 해당 위치에 있다고 생각하는 웹 구조를 만들어야합니다. 그렇지 않은 경우 페이지가 서로 통신 할 때 오류없이 파일 관계를 관리 할 수 ​​없습니다.


1

실제로 WAR 애플리케이션은없이 구축 할 수 있습니다 WEB-INF/web.xml. 내부에 Java 클래스만으로 WAR 응용 프로그램을 작성할 수 있습니다.

출처 : web.xml 배포 설명자 요소

Java EE 주석의 경우 표준 web.xml 배치 디스크립터는 선택 사항입니다. http://jcp.org/en/jsr/detail?id=315 의 서블릿 3.0 스펙에 따르면 서블릿, 필터, 리스너 및 태그 핸들러와 같은 특정 웹 컴포넌트에서 주석을 정의 할 수 있습니다.

그래서 오늘날에는 .war확장 기능을 가진 JAR처럼 보이는 것보다 WAR을 빌드 할 수 있습니다 :)

질문에 대답하면 WAR 구조는 요구 사항에 따라 다릅니다.

http://en.wikipedia.org/wiki/WAR_(Sun_file_format)

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