2012-03-07 12 views
10

Sto lavorando per riscrivere alcune applicazioni Web obsolete. Ci sono due in particolare che sono molto, molto simili, ma non condividono alcun codice oggi e ho intenzione di risolverlo.Best practice per la condivisione del codice di livello Web (controller e JSP) tra applicazioni Web simili

I progetti vengono riscritti con Maven, Spring MVC e Sitemesh.

Il codice di livello modello è abbastanza semplice da condividere utilizzando JAR. Ma non conosco alcun buon metodo per condividere codice web-tier comune (JSP e controller) tra app simili.

Ecco alcuni retroscena. Queste app sono webstores. Uno è un negozio normale (si pensi su amazon.com) a cui un utente può accedere, cercare prodotti, aggiungere a un carrello e controllare. L'altro è fondamentalmente la stessa cosa, solo che è un sito di punchout. Le voci di ricerca del prodotto e del carrello sono identiche. L'accesso e il checkout, tuttavia, sono completamente diversi.

Sto semplificando eccessivamente, ma è sufficiente per illustrare il problema. C'è una parte significativa del codice di livello Web nelle sezioni di ricerca del prodotto e di carrello degli acquisti che dovrebbero essere condivise tra i due.

Non penso sia possibile avere semplicemente lo stesso file WAR in esecuzione come "modalità" in base a una variabile di ambiente o impostazioni da un database diverso. Una delle differenze è una configurazione di sicurezza Spring completamente diversa. Sarebbe anche preferibile lasciare i controller di accesso e di checkout dell'altro sito fuori dal componente-scan in modo che nessuno possa in qualche modo passare a quello sbagliato con la manipolazione degli URL.

Originariamente ho iniziato a utilizzare Maven Profiles e il filtro per mantenere due diversi set di configurazione (web.xml, spring configs, ecc.) Nello stesso progetto WAR. Sulla base del quale è selezionato il profilo di Maven, la WAR risultante è costruita con un set di configurazione diverso (e un nome diverso per chiarezza). Questo viola il principio di Maven che un pom produce un artefatto.

C'è un modo migliore per farlo? Che ne pensi di Maven WAR Overlays? Vedo persone che parlano dell'uso di overlay per condividere risorse comuni come CSS, JS, immagini e persino alcuni JSP comuni. Ma non vedo nessuno menzionare la condivisione di classi come i Controllori in questo modo.

Potrei spingere le classi Controller verso i JAR, ma logicamente sembra che dovrebbero rimanere con i loro rispettivi JSP. E i JSP non possono essere portati ai JAR (giusto?).

Inoltre, ho pensato di renderlo un EAR contenente più file WAR: un WAR per l'esperienza di acquisto comune e un altro WAR per l'accesso e il checkout appropriati. Credo che la sessione possa essere condivisa tra due WAR nello stesso EAR, ma non sono sicuro che giochi con i bean di scope di Spring. Ho sentito che non sono davvero memorizzati nella sessione. Dovrei anche capire cosa fare con i decoratori Sitemesh utilizzati per l'intestazione/piè di pagina. La stessa configurazione di Sitemesh e le sue risorse dovrebbero essere copiate in entrambe le WAR, giusto? Quindi, alla fine, l'artefatto commerciale di WAR sarebbe ancora diverso in ogni circostanza.

Devo credere che altre persone lo abbiano già trattato prima. Ci sto pensando nel modo sbagliato? C'è una soluzione comune per questo genere di cose?

risposta

1

Buon lavoro in battaglia contro il copia-incolla. Perché dici che è difficile condividere i JSP? è possibile copiare da un vaso condivisa utilizzando la dipendenza plugin di 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

Questo è un trucco accurato, e potrei finire per andare con esso sinc e non ci vedo mai rinunciare a Maven. Il lato negativo che è diventato immediatamente evidente è che gli sviluppatori non possono più aggiornare un JSP in tempo reale se è stato copiato da un JAR. Ci vuole una ricostruzione e ridistribuzione dall'IDE per vedere una semplice modifica. Dubito che ci sia qualcosa che possa essere fatto a riguardo, ma sono tutto orecchie se hai un'idea. – KevinF

+0

Beh ... probabilmente potresti fare qualcosa di sporco con i collegamenti simbolici, a seconda di quanto sei preparato a rendere il tuo ambiente di sviluppo dall'artefatto finale. Oppure, se stai usando una WAR esplosa, non ci vorrà molto per eseguire il singolo maven 'unpack' goal da solo dopo ogni cambio JSP. – artbristol

0

mia opzione preferita in questi casi è messo tutti i file correlati (controllori, JS, immagini ...) in un barattolo.Ma il problema qui è l'uso dei file JSP: non c'è un modo semplice di usarli se sono in un barattolo. Ma con altre tecnologie vista come Velocity o Freemarker questo è possibile in modo semplice, tra gli altri vantaggi. Non so se questo può portare a troppo lavoro, ma per un nuovo progetto con queste esigenze è l'opzione migliore.

+0

Interessante ... quindi stai dicendo che potremmo estrarre i modelli Velocity/Freemarker da/WEB-INF/velocity o da un JAR? Ciò richiederebbe un ViewResolver personalizzato da realizzare con Spring MVC? Tutti gli esempi che sto cercando si riferiscono a/WEB-INF. – KevinF

+0

Ecco un buon esempio: http://www.springbyexample.org/examples/velocity-email-template.html – sinuhepop

0

Qui stiamo usando Subversion e usiamo svn: externals (tipo di link simbolici simili) per condividere determinati codici comuni (per lo più file .jsp) tra i progetti. Funziona abbastanza bene, stavamo usando OC4J che in realtà ha un modo per condividere .jsp tra più progetti, ma dal momento che ci stiamo attualmente spostando verso Tomcat (o qualcos'altro) volevo creare un modo agnostico del contenitore per farlo.

0

Sinuhepop ha ragione, ma la sua risposta non è perfetta.

Ecco la risposta perfetta. devi riferirti al seguente url, può fartelo sapere.

click here

nella URL della pagina, l'esempio per la casella di contenuti di proprietà non è esatto, mi segui:

se necessità di condividere un file:

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

se necessità di condividere una cartella:

xml svn://myhome.com/svn/myproject/trunk/xml 
Problemi correlati