2012-03-07 18 views
10

Pracuję nad przepisywaniem niektórych starzejących się aplikacji internetowych. Są dwa w szczególności bardzo, bardzo podobne, ale nie dzielą się dzisiaj żadnym kodem i staram się to naprawić.Najlepsze praktyki dotyczące udostępniania kodu warstwy sieci (kontrolerów i stron JSP) między podobnymi aplikacjami WWW

Projekty są przerobione na Mavena, Spring MVC i Sitemesh.

Kod warstwy modelu jest wystarczająco łatwy do udostępnienia przy użyciu plików JAR. Ale nie znam żadnych dobrych sposobów na udostępnianie wspólnego kodu warstwy WWW (JSP i kontrolerów) między podobnymi aplikacjami.

Oto niektóre tła. Te aplikacje to sklepy internetowe. Jednym z nich jest normalny sklep (think amazon.com), w którym użytkownik może się zalogować, wyszukać produkty, dodać do koszyka i wyewidencjonować. Drugi to w zasadzie to samo, tylko że jest to strona dziurkacza. Przegląd produktów i części koszyka są identyczne. Zaloguj się i sprawdź, są jednak zupełnie inne.

Upraszczam, ale wystarczy zilustrować problem. W sekcji przeglądania produktów i koszy na zakupy znajduje się znaczna część kodu warstwy sieciowej, którą należy udostępnić między tymi dwoma.

Nie sądzę, że można po prostu uruchomić ten sam plik WAR jako "tryb" na podstawie zmiennej środowiskowej lub ustawień z innej bazy danych. Jedną z różnic jest zupełnie inna konfiguracja Spring Security. Lepiej byłoby zostawić kontrolery logowania i kontroli drugiej strony poza kontrolą składnika, aby nikt nie mógł w jakiś sposób przejść do niewłaściwej z manipulowaniem adresami URL.

Pierwotnie zacząłem używać profili Maven i filtrowania, aby zachować dwa różne zestawy konfiguracyjne (web.xml, konfiguracje sprężyn itp.) W tym samym projekcie WAR. Na podstawie którego wybrany jest profil Maven, wynikowa WAR jest budowana z innym zestawem konfiguracyjnym (i inną nazwą dla jasności). Narusza to zasadę Mavena, że ​​jedna pom wytwarza jeden artefakt.

Czy jest lepszy sposób to zrobić? A co z nakładkami Maven WAR? Widzę ludzi mówiących o używaniu nakładek do udostępniania wspólnych zasobów, takich jak CSS, JS, obrazy, a nawet niektórych typowych stron JSP. Ale nie widzę nikogo, kto wspominałby o dzieleniu się klasami takimi jak Kontrolery w ten sposób.

Mogłem przesunąć klasy kontrolerów do JARów, ale wydaje się, że logicznie powinny pozostać z odpowiednimi stronami JSP. I JSP nie można również przesłać do JARów (prawda?).

Pomyślałem także o zrobieniu z niego pliku EAR zawierającego wiele plików WAR - jedną WAR dla zwykłych zakupów i inną WO dla odpowiedniego logowania i kasy. Sądzę, że sesja może być dzielona między dwiema jednostkami WAR w tym samym pliku EAR, ale nie jestem pewien, czy jest ona dobra w przypadku ziaren SES z zakresu Spring. Słyszałem, że tak naprawdę nie są przechowywane w sesji. Musiałbym również dowiedzieć się, co zrobić z dekoratorami Sitemesh używanymi do nagłówka/stopki. Ta sama konfiguracja Sitemesh i jej zasoby musiałyby zostać skopiowane do obu WAR, prawda? Koniec końców, artefakt handlowy WAR nadal będzie się różnić w każdej sytuacji.

Muszę wierzyć, że inni ludzie radzili sobie z tym wcześniej. Czy myślę o tym w niewłaściwy sposób? Czy istnieje wspólne rozwiązanie tego typu rzeczy?

Odpowiedz

1

Dobra robota podczas bitwy przeciwko kopiowaniu i wklejaniu. Dlaczego mówisz, że trudno jest udostępniać strony JSP? można je skopiować z udostępnionego słoika za pomocą wtyczki maven zależność:

<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

To fajna sztuczka, a ja mogę skończyć z tym cackiem Nie widzę, żebyśmy kiedykolwiek rezygnowali z Mavena. Jedyną wadą, która od razu stała się widoczna, jest to, że programiści nie mogą już aktualizować strony JSP w locie, jeśli jest ona skopiowana z pliku JAR. Wykonanie przebudowy i przeniesienie z IDE wymaga prostej edycji. Wątpię, czy można coś na to poradzić, ale ja mam tylko uszy, jeśli masz jakiś pomysł. – KevinF

+0

Cóż ... możesz zrobić coś paskudnego z dowiązaniami symbolicznymi, w zależności od tego, jak bardzo jesteś przygotowany na stworzenie środowiska programistycznego z ostatecznego artefaktu. Lub, jeśli używasz rozbitego WAR, nie trzeba długo czekać, aby pojedynczy cel "rozpakuj" pojedynczo po zmianie każdej JSP. – artbristol

0

Moje preferowanym rozwiązaniem w takich przypadkach jest umieścić wszystkie powiązane pliki (sterowniki, js, obrazy ...) w słoiku.Ale problemem tutaj jest użycie plików JSP: nie ma łatwego sposobu ich użycia, jeśli są w słoiku. Ale z innymi technologiami widoku, takimi jak Velocity lub Freemarker jest to możliwe w łatwy sposób, pośród innych zalet. Nie wiem, czy to może doprowadzić do zbyt dużej pracy, ale dla nowego projektu z tymi potrzebami jest to najlepsza opcja.

+0

Interesujące ... więc mówisz, że możemy pobrać szablony prędkości/Freemarker z/WEB-INF/prędkości lub z JAR? Czy wymagałoby to niestandardowego ViewResolver do osiągnięcia w Spring MVC? Wszystkie przykłady, które właśnie znajduję, odnoszą się do/WEB-INF. – KevinF

+0

Oto dobry przykład: http://www.springbyexample.org/examples/velocity-email-template.html – sinuhepop

0

Używamy tutaj Subversion i używamy svn: externals (coś w rodzaju dowiązań symbolicznych), aby dzielić pewien wspólny kod (głównie pliki .jsp) pomiędzy projektami. Działa całkiem dobrze, używaliśmy OC4J, który faktycznie ma sposób udostępniania .jsp między wieloma projektami, ale ponieważ obecnie przechodzimy w kierunku Tomcat (lub czegoś innego), chciałem wymyślić sposób, aby to zrobić w sposób agnostyczny.

0

Sinuhepop ma rację, ale jego odpowiedź nie jest doskonała.

Oto idealna odpowiedź. musisz odnieść się do podanego adresu URL, możesz go przesłać.

click here

w adresie URL strony, przykład na polu zawartości nieruchomość nie jest dokładna, za mną:

razie potrzeby udostępnić plik:

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

jeśli potrzeba udostępnij folder:

xml svn://myhome.com/svn/myproject/trunk/xml 
Powiązane problemy