Лучшие практики для совместного использования кода веб-уровня (контроллеров и JSP) между аналогичными веб-приложениями - PullRequest
10 голосов
/ 07 марта 2012

Я работаю над переписыванием некоторых устаревших веб-приложений.В частности, есть два, которые очень, очень похожи, но сегодня не имеют общего кода, и я собираюсь это исправить.

Проекты переписываются с помощью Maven, Spring MVC и Sitemesh.

Код уровня модели достаточно легко распространить с помощью JAR.Но я не знаю каких-либо хороших способов совместного использования общего кода веб-уровня (JSP и контроллеров) между похожими приложениями.

Вот некоторые предпосылки.Эти приложения интернет-магазины.Одним из них является обычный магазин (например, amazon.com), в который пользователь может войти, выполнить поиск товаров, добавить его в корзину и оформить заказ.Другое - это в основном то же самое, только это сайт с комментариями.Обзор товара и корзины покупок идентичны.Вход и выход, однако, совершенно разные.

Я упрощаю, но этого достаточно, чтобы проиллюстрировать проблему.В разделах обзора продукта и корзины покупок содержится значительная часть кода веб-уровня, который должен быть доступен для всех.

Я не думаю, что можно просто запустить тот же WAR-файл, что илибо «режим», основанный на переменной среды, либо на настройках из другой базы данных.Одно из отличий - это совершенно другая конфигурация Spring Security.Также было бы предпочтительнее оставить контроллеры входа и извлечения другого сайта вне проверки компонентов, чтобы никто не мог каким-то образом перейти на неправильный с помощью URL-манипуляции.

Я изначально начал использовать профили Maven и фильтрациюхранить два разных набора настроек (web.xml, весенние конфигурации и т. д.) в одном и том же проекте WAR.В зависимости от того, какой профиль Maven выбран, результирующая WAR создается с другим набором настроек (и для ясности с другим именем).Это нарушает принцип Maven, что один пом производит один артефакт.

Есть ли лучший способ сделать это?Как насчет Maven WAR Overlays?Я вижу людей, говорящих об использовании оверлеев для совместного использования общих ресурсов, таких как CSS, JS, изображения и даже некоторые распространенные JSP.Но я не вижу, чтобы кто-то упоминал о таких классах совместного использования, как Controllers.

Я мог бы перенести классы Controller в JAR, но логически кажется, что они должны остаться со своими соответствующими JSP.И JSP также не могут быть перенесены в JAR (верно?).

Я также думал о том, чтобы сделать его EAR, содержащим несколько файлов WAR - один WAR для обычного шоппинга и другой WAR длясоответствующая регистрация и оформление заказа.Я полагаю, что сеанс может быть разделен между двумя WAR-ами в одном EAR-файле, но я не уверен, что он хорошо работает с bean-компонентами Spring.Я слышал, что они не хранятся в сессии.Я также должен был бы выяснить, что делать с декораторами Sitemesh, используемыми для верхнего / нижнего колонтитула.Одна и та же конфигурация Sitemesh и ее ресурсы должны быть скопированы в обе WAR-ы, верно?Таким образом, в конце концов, артефакт WAR для покупки все равно будет отличаться в каждом случае.

Я должен поверить, что другие люди уже имели дело с этим раньше.Я думаю об этом неправильно?Есть ли общее решение для такого рода вещей?

Ответы [ 4 ]

1 голос
/ 07 марта 2012

Хорошая работа в битве с копипастой.Почему вы говорите, что трудно поделиться JSP?Вы можете скопировать их из общего JAR-файла с помощью плагина зависимостей 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 голосов
/ 14 марта 2013

Синухепоп прав, но его ответ не идеален.

Вот идеальный ответ.Вы должны ссылаться на следующий URL-адрес, он может помочь вам.

нажмите здесь

на странице URL, пример для поля содержимого не является точным, выСледуйте за мной:

если необходимо предоставить общий доступ к файлу:

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

если необходимо предоставить общий доступ к папке:

xml  svn://myhome.com/svn/myproject/trunk/xml
0 голосов
/ 20 апреля 2012

Мы используем здесь Subversion и используем svn: externals (вроде символьных ссылок), чтобы делиться определенным общим кодом (в основном .jsp-файлами) между проектами. Работает довольно хорошо, мы использовали OC4J, у которого на самом деле есть способ обмениваться файлами .jsp между несколькими проектами, но поскольку в настоящее время мы движемся к Tomcat (или что-то еще), я хотел придумать способ, независимый от контейнера, чтобы сделать это.

0 голосов
/ 07 марта 2012

Мой предпочтительный вариант в этом случае - поместить все связанные файлы (контроллеры, js, изображения ...) в банку. Но проблема здесь заключается в использовании JSP файлов: нет простого способа их использования, если они находятся в банке. Но с другими технологиями просмотра, такими как Velocity или Freemarker , это возможно простым способом, помимо других преимуществ. Я не знаю, может ли это привести вас к слишком большой работе, но для нового проекта с такими потребностями это лучший вариант.

...