2012-03-07 23 views
10

Tôi đang viết lại một số ứng dụng web cũ. Có hai đặc biệt là rất, rất giống nhau, nhưng không chia sẻ mã ngày hôm nay và tôi cố gắng sửa chữa điều đó.Các phương pháp hay nhất để chia sẻ mã cấp web (Bộ điều khiển và JSP) giữa các ứng dụng web tương tự

Các dự án đang được viết lại với Maven, Spring MVC và Sitemesh.

Mã lớp mô hình đủ dễ dàng để chia sẻ bằng cách sử dụng các JAR. Nhưng tôi không biết cách nào tốt để chia sẻ mã cấp web phổ biến (JSP và Bộ điều khiển) giữa các ứng dụng tương tự.

Dưới đây là một số thông tin cơ bản. Các ứng dụng này là webstores. Một là một cửa hàng bình thường (nghĩ amazon.com) mà người dùng có thể đăng nhập, tìm kiếm sản phẩm, thêm vào giỏ hàng và kiểm tra. Cách khác về cơ bản là giống nhau, chỉ là một trang web đột kích. Phần trình duyệt sản phẩm và giỏ mua hàng giống hệt nhau. Tuy nhiên, đăng nhập và thanh toán hoàn toàn khác.

Tôi đang đơn giản hóa, nhưng đủ để minh họa sự cố. Có một phần đáng kể của mã cấp web trong phần duyệt qua sản phẩm và giỏ hàng sẽ có thể được chia sẻ giữa hai phần.

Tôi không nghĩ rằng có thể chỉ có cùng một tệp WAR đang chạy dưới dạng "chế độ" dựa trên biến môi trường hoặc cài đặt từ cơ sở dữ liệu khác. Một trong những khác biệt đó là cấu hình Spring Security hoàn toàn khác. Nó cũng sẽ là thích hợp hơn để rời khỏi bộ kiểm soát đăng nhập và kiểm xuất của trang web khác trong quá trình quét thành phần để không ai bằng cách nào đó có thể vượt qua được sai với thao tác URL.

Ban đầu tôi bắt đầu sử dụng Maven Profiles và lọc để giữ hai tập cấu hình khác nhau (web.xml, spring configs, vv) trong cùng một dự án WAR. Dựa trên đó Maven hồ sơ được chọn, kết quả WAR được xây dựng với một tập cấu hình khác nhau (và một tên khác nhau cho rõ ràng). Điều này vi phạm hiệu trưởng Maven rằng một pom tạo ra một tạo phẩm.

Có cách nào tốt hơn để thực hiện việc này không? Điều gì về Maven WAR Overlays? Tôi thấy mọi người nói về việc sử dụng lớp phủ để chia sẻ các tài nguyên phổ biến như CSS, JS, hình ảnh và thậm chí một số JSP phổ biến. Nhưng tôi không thấy ai đề cập đến việc chia sẻ các lớp như Controllers theo cách này.

Tôi có thể đẩy các lớp Controller xuống JAR, nhưng về mặt logic thì có vẻ như chúng nên ở lại với các JSP tương ứng của chúng. Và các JSP cũng không thể bị đẩy xuống các JAR (phải không?).

Tôi cũng nghĩ đến việc biến nó thành một tệp EAR chứa nhiều tệp WAR - một WAR cho trải nghiệm mua sắm chung và WAR khác để đăng nhập và thanh toán thích hợp. Tôi tin rằng phiên có thể được chia sẻ giữa hai WAR trong cùng một EAR, nhưng tôi không chắc chắn rằng nó có thể chơi tốt với các bean phiên phạm vi của Spring hay không. Tôi nghe chúng không thực sự được lưu trữ trong phiên. Tôi cũng phải tìm ra những điều cần làm về các trang trí Sitemesh được sử dụng cho đầu trang/chân trang. Cùng một cấu hình Sitemesh và tài nguyên của nó sẽ cần phải được sao chép vào cả hai WAR, phải không? Vì vậy, cuối cùng, vật phẩm WAR mua sắm sẽ vẫn khác nhau trong từng trường hợp.

Tôi phải tin rằng những người khác đã xử lý vấn đề này trước đây. Tôi đang nghĩ về nó một cách sai lầm? Có một giải pháp chung cho loại điều này?

Trả lời

1

Làm việc tốt khi chiến đấu chống sao chép-dán. Tại sao bạn nói khó chia sẻ JSP? Bạn có thể sao chép chúng ra khỏi một jar chia sẻ bằng cách sử dụng phụ thuộc Plugin maven:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <version>2.4</version> 
     <executions> 
      <execution> 
      <id>unpack</id> 
      <phase>package</phase> 
      <goals> 
       <goal>unpack</goal> 
      </goals> 
      <configuration> 
       <artifactItems> 
       <artifactItem> 
        <groupId>com.example</groupId> 
        <artifactId>webapp-common</artifactId> 
        <version>1.0-SNAPSHOT</version> 
        <outputDirectory>[target jsp directory]</outputDirectory> 
        <includes>**/*.jsp</includes> 
       </artifactItem> 
       </artifactItems> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
+0

Đây là một mẹo nhỏ gọn và tôi có thể kết thúc bằng nó e Tôi không thấy chúng tôi từ bỏ Maven. Một trong những bên xuống mà ngay lập tức trở nên rõ ràng là các nhà phát triển không còn có thể cập nhật một JSP trên bay nếu nó được sao chép ra khỏi một JAR. Phải mất một xây dựng lại và triển khai lại từ IDE để xem một chỉnh sửa đơn giản. Tôi nghi ngờ có bất cứ điều gì có thể được thực hiện về điều đó, nhưng tôi là tất cả các tai nếu bạn có một ý tưởng. – KevinF

+0

Vâng ... bạn có thể làm điều gì đó bẩn thỉu với các liên kết tượng trưng, ​​tùy thuộc vào cách bạn chuẩn bị khác nhau để tạo môi trường phát triển của bạn từ tạo tác cuối cùng. Hoặc, nếu bạn đang sử dụng một WAR đã phát nổ, nó sẽ không mất nhiều thời gian để chạy một mục tiêu 'unpack' maven đơn lẻ sau mỗi lần thay đổi JSP. – artbristol

0

lựa chọn ưa thích của tôi trong trường hợp này được đưa tất cả các file liên quan (bộ điều khiển, js, hình ảnh ...) trong một cái lọ.Nhưng vấn đề ở đây là việc sử dụng các tệp JSP: không có cách nào dễ dàng để sử dụng chúng nếu chúng ở trong một cái bình. Nhưng với các công nghệ xem khác như Vận tốc hoặc Freemarker, điều này có thể thực hiện một cách dễ dàng, trong số các lợi thế khác. Tôi không biết nếu điều này có thể dẫn bạn đến quá nhiều công việc, nhưng đối với một dự án mới với những nhu cầu này nó là lựa chọn tốt nhất.

+0

Thú vị ... vì vậy bạn đang nói rằng chúng tôi có thể kéo các mẫu Velocity/Freemarker từ/WEB-INF/vận tốc hoặc từ một JAR? Điều đó có đòi hỏi một ViewResolver tùy chỉnh để thực hiện với Spring MVC không? Tất cả các ví dụ tôi tìm thấy chỉ đề cập đến/WEB-INF. – KevinF

+0

Ở đây bạn có một ví dụ điển hình: http://www.springbyexample.org/examples/velocity-email-template.html – sinuhepop

0

Chúng tôi đang sử dụng Subversion tại đây và sử dụng svn: externals (loại liên kết tượng trưng) để chia sẻ một số mã phổ biến nhất (chủ yếu là tệp .jsp) giữa các dự án. Hoạt động khá tốt, chúng tôi đã sử dụng OC4J mà thực sự có một cách để chia sẻ .jsp giữa nhiều dự án, nhưng vì chúng tôi hiện đang di chuyển về phía Tomcat (hoặc cái gì khác) tôi muốn đến với một cách không thuyết phục container để làm điều đó.

0

Sinuhepop đúng, nhưng câu trả lời của anh ấy không hoàn hảo.

Đây là câu trả lời hoàn hảo. bạn phải tham khảo url theo sau, nó có thể làm hỏng bạn.

click here

trong trang url, ví dụ cho hộp nội dung bất động sản không phải là chính xác, bạn làm theo tôi:

nếu cần thiết phải chia sẻ một tập tin:

a.jsp svn://myhome.com/svn/myproject/trunk/a.jsp 

nếu cần chia sẻ một thư mục:

xml svn://myhome.com/svn/myproject/trunk/xml 
Các vấn đề liên quan