Cấu trúc thư mục ứng dụng web Java


18

Là người mới bắt đầu với J2EE, gần đây tôi đã bắt đầu phát triển dự án của riêng mình từ đầu bằng cách sử dụng Core của J2EE: Servlets & Jsps.

Tôi không thể đánh giá liệu cấu trúc thư mục dự án của tôi có đúng hay không. Đây là cấu trúc thư mục dự án của tôi. nhập mô tả hình ảnh ở đây

Trước khi đặt câu hỏi, tôi thừa nhận rằng tôi không thể trả lời hoặc không biện minh nếu ai đó hỏi tôi, tại sao loại cấu trúc thư mục này. Câu hỏi: Có phải là một dấu hiệu tốt để đặt jsps của tôi bên ngoài web-inf. Nếu không, tại sao nó lại như vậy? Nếu đúng thì tại sao?

Có quy ước cấu trúc thư mục tiêu chuẩn nào cho ứng dụng web J2EE không, tôi biết maven đã đưa ra một số tiêu chuẩn nhưng vẫn có thể tùy chỉnh theo yêu cầu mà tôi tin.

Tôi đã thực hiện một chút googling và tìm thấy hai tài liệu tham khảo 1 2

trong đó các câu trả lời không nằm trên cùng một trang, từ đó tôi không thể rút ra bất kỳ kết luận nào.

Các điểm cần xem xét khi bố trí cấu trúc thư mục cho ứng dụng web J2EE là gì, quan trọng là Jsps, nội dung tĩnh nên đi vào đâu & tại sao?



Tôi đặc biệt khuyên bạn nên nghiên cứu lý thuyết MVC - bài viết trên wikipedia có một số tài nguyên tuyệt vời về nó. Nếu bạn muốn thử nghiệm với MVC trong một ứng dụng web Java, thì Sọc là một khung công tác nhẹ tuyệt vời có thể cung cấp cho bạn một cái nhìn tổng quan về kiến ​​trúc.
Michael K

1
Đây là một cách xử lý cụ thể hơn về cách MVC hoạt động trong webapps.
Michael K

Câu trả lời:


7

Cấu trúc tiêu chuẩn cho tệp WAR là:

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

Maven tạo điều này cho bạn bằng cách sử dụng src / main / java, tài nguyên, webapp và các phụ thuộc của bạn (đặt chúng vào / lib) trong plugin maven-webapp-plugin , nhưng đó là cách triển khai. Điều quan trọng cần nhận ra là mọi thứ bạn đặt trong WEB-INF đều không thể truy cập được từ bên ngoài , trong khi mọi thứ trong thư mục gốc của WAR đều công khai.

Nói chung, bạn không muốn đặt nhiều trong thư mục gốc, vì bạn muốn ứng dụng của mình xử lý tất cả quyền truy cập bằng cách sử dụng các tiện ích và bộ lọc mà bạn xác định trong web.xml. Rất phổ biến để xem index.html (hoặc .jsp) trong thư mục gốc chuyển hướng đến một servlet, ví dụ như một hành động Struts .

Các triển khai MVC điển hình như Sọc hoặc Struts khuyên bạn không nên truy cập trực tiếp vào các tệp tin của người dùng, ưu tiên các tệp JSP chỉ xem. Họ khuyên bạn nên tạo các bộ điều khiển chuyển tiếp tới các tệp tin sau khi xử lý yêu cầu và các tệp chỉ hiển thị kết quả. Chẳng hạn, việc gửi một biểu mẫu /loginsẽ chạy một hành động xử lý yêu cầu đăng nhập, tạo phiên của người dùng và chuyển người dùng đến chế độ xem đăng nhập của trang chủ JSP.


5

Câu trả lời thông thường cho "cách nào là đúng?" hoặc "đây có phải là cách đúng đắn?" là ..... nó phụ thuộc .

Tất cả những gì tôi có thể làm là cho bạn biết những ưu và nhược điểm đối với những ý tưởng cụ thể. Những gì tiếp theo là 100% ý kiến ​​của tôi. Tôi không biết bất kỳ yêu cầu hoặc quy tắc cụ thể. Tôi chắc chắn ai đó sẽ không đồng ý với tôi.

JSP

Chúng ta hãy nghiên cứu xem có nên đưa JSP vào WEB-INF hay không.

Ưu điểm của việc đưa JSP vào WEB-INF:

  • Bạn kiểm soát cách thức thực thi của JSP. Nếu bạn muốn một tệp JSP được tham số hóa và có thể sử dụng lại được (điều này thực sự khó khăn với một bản sao), bạn có thể đặt chúng vào WEB-INF và sử dụng một servlet hoặc bộ điều khiển hành động Struts hoặc một số bộ điều khiển phía trước khác để xử lý trước và sau đó chuyển điều khiển tới JSP, chuyển vào ngữ cảnh môi trường phù hợp (như thuộc tính yêu cầu, mọi kiểm tra bảo mật, vệ sinh tham số, v.v.)
  • Bạn có thể lập trình hoặc thậm chí ở cấp độ tường lửa hoặc IDS chặn các yêu cầu HTTP thành * .jsp để giảm khả năng ai đó tải tệp tin lên root web và sau đó có thể thực thi mã dưới dạng máy chủ web. Họ sẽ phải ghi đè lên một bản JSP hiện có. Không phải là một lợi ích bảo mật lớn, nhưng nó làm cho sự thỏa hiệp hơi khó khăn hơn.
  • Thực thi các thói quen tốt, như MVC, bộ điều khiển phía trước, bộ lọc servlet, nội xạ phụ thuộc, v.v. trái ngược với một bản sao khổng lồ khổng lồ làm tất cả công việc và rất khó đọc / duy trì.

Nhược điểm của việc đưa JSP vào WEB-INF:

  • Bạn không thể truy cập trang trực tiếp, ngay cả khi đó là một trang độc lập đơn giản không cần xử lý trả trước. Điều này là do các tệp trong / WEB-INF không thể được phục vụ bởi một thùng chứa servlet.

Tệp tĩnh

Đối với các tệp hoàn toàn tĩnh như HTML, hình ảnh, biểu định kiểu, javascript, v.v. hãy đặt chúng dưới gốc web (my_app trong trường hợp của bạn), nhưng KHÔNG / WEB-INF (vì không thể truy cập được).

Bố cục tổng thể

Đối với bố cục thư mục tổng thể, nó phụ thuộc phần nào vào quá trình xây dựng của bạn. Tôi thích lưu trữ mọi thứ trong "src" hoặc "nguồn" bởi vì nó cho thấy rõ những tệp nào được tạo bằng cách xây dựng và đó là các tệp nguồn thuần. maincho phép bạn tách mã kiểm tra như các lớp Junit khỏi mã nguồn chính của bạn, điều này cũng tốt. Nhưng nếu bạn không có bất kỳ bài kiểm tra đơn vị nào (ồ không!), Thì đó là một sự khác biệt vô nghĩa.

Mặt khác, nếu bạn hoàn toàn không thao túng root web trong quá trình xây dựng (như nếu đó là tất cả các tệp tin tĩnh và tệp tĩnh), thì có lẽ bạn giữ nó ở cấp cao nhất, thích /webroothoặc /deploysao chép các tệp khi cần, chẳng hạn như tập tin. Class hoặc .jar. Đó là thói quen của con người (đặc biệt là các nhà phát triển) tổ chức quá mức. Một dấu hiệu tốt của việc tổ chức quá mức là có rất nhiều thư mục chỉ có một thư mục con duy nhất.

Những gì bạn đã thể hiện

Bạn đã chỉ ra rằng bạn đang theo một quy ước được thiết lập bởi maven, vì vậy nếu bạn đã sử dụng maven, chỉ cần sử dụng bố cục đó. Hoàn toàn không có gì sai với bố cục bạn mô tả.


1

Chà, src / main / webapp của bạn chắc chắn làm tôi nhớ đến một dự án maven. Cái nào tốt.

Đối với my_app / jsps tôi không chắc chắn. Các nhà phát triển thường để jsp của họ trong thư mục webapp hoặc nếu bạn muốn thực hiện một chút ánh xạ url, trong thư mục webapp / jsp.

!Cảnh báo! : Bạn không bao giờ nên đặt tệp jsp trong web-inf. WEB-INF của bạn chỉ nên chứa các tệp xml để định cấu hình trang web của bạn. Hãy nhớ rằng, jsp của bạn là một trang web hoặc một phần của trang web.

Bạn có thể sử dụng tên thư mục như mẫu, một phần ... bất cứ điều gì cảm thấy tốt cho bạn. Nó nên dễ dàng tìm thấy cho một người lạ. Chỉ cần tách các loại nội dung khác nhau như trang đầy đủ, mẫu, chế độ xem một phần ...


src / main / webapp chứa tệp bố cục WAR tiêu chuẩn và được đọc bởi maven-war-plugin khi biên dịch một ứng dụng web Java.
Michael K

1
Không có lý do tại sao bạn không nên đưa các tệp JSP vào WEB-INF, miễn là bạn đã định cấu hình các máy chủ trong tệp webDB của mình mà cuối cùng sẽ chuyển tiếp đến chúng. Đây là cách tiêu chuẩn để triển khai ứng dụng Struts - tất cả các yêu cầu đều đi qua servlet Struts, ánh xạ chúng thành một hành động và sau đó đến một JSP.
Michael K

Tôi đồng ý với thực tế là không nên truy cập jsp trực tiếp và ngăn chặn điều đó nên được coi là thực hành tốt. Nhưng có những cách khác để làm điều đó.
Brice Ruppen

1

Tôi đồng ý với Brice . Tôi cũng mới bắt đầu tham gia J2EE, nhưng tôi nghĩ rằng ban đầu nó hoạt động tốt hơn và dễ dàng hơn.

Thư mục gốc là WEBAPP và bạn nên làm cho cấu trúc web của mình nghĩ rằng hầu hết các trang sẽ nằm ở đó. Nếu không, khi các trang giao tiếp giữa chúng có thể bạn không thể quản lý các mối quan hệ tệp mà không có lỗi.


1

Thực tế ứng dụng WAR có thể được xây dựng mà không cần WEB-INF/web.xml. Có thể tạo ứng dụng WAR chỉ với các lớp Java bên trong.

Nguồn: Các phần tử mô tả triển khai web.xml

Với các chú thích Java EE, bộ mô tả triển khai web.xml tiêu chuẩn là tùy chọn. Theo đặc tả của servlet 3.0 tại http://jcp.org/en/jsr/detail?id=315 , các chú thích có thể được xác định trên một số thành phần Web nhất định, chẳng hạn như servlets, bộ lọc, trình nghe và trình xử lý thẻ.

Vì vậy, ngày nay có thể xây dựng WAR hơn là trông giống như JAR với các .warphần mở rộng :)

Trả lời câu hỏi của bạn, cấu trúc WAR phụ thuộc vào yêu cầu của bạn.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.