# Tomcat - Mehrere Verzeichnisse für die jsp



## mmaki (7. Jun 2009)

Hallo.

Ich brauche mal eure Hilfe. Ist es möglich Tomcat so zu konfigurieren, dass die jsp eines gleichen Contexts in mehreren Verzeichnissen abgelegt sind? 

Im Detail: In unserer Firma gibt es Basis-jsp und Kundenspezifische jsp. Die sind im SVN folgendermassen abgelegt:

/base/jsp/*
/kunde1/jsp/*
/kunde2/jsp/*
/kunde3/jsp/*

Bei der Auslieferung an den Kunden werden da einfach zuerst die Basis-jsp kopiert und dann die Kundenspezifischen jsp drüberkopiert. Soweit ist das ja auch in Ordnung, nur zum Entwickeln ist diese Struktur echt mühsam. Tomcat ist lokal so konfiguriert, dass die jsp vom /base/jsp kommen. Wenn ich jetzt etwas in den jsp von kunde2 mach, muss ich immer diese jsp ins /base/jsp/ kopieren, damit ich das bei mir lokal testen kann. Ausserdem hab ich dann das jsp immer doppelt in meiner IDE; BreakPoints muss ich in der base-jsp setzen und ändern in der kunden-jsp...

Gibt es irgendeine Möglichkeit, Tomcat dazu zu bringen, dass er zuerst die jsp im kunden-verzeichnis holt und wenn nicht gefunden vom base?

Ich möchte möglichst auf FileSyncs und dergleichen verzichten um mich möglichst einfach und effizient auf das wesentliche zu konzentrieren. Leider kann ich auch nichts an den SVN-Strukturen ändern... Ich hoffe jemand kann mir helfen...

Danke & Gruss
mmaki.


----------



## Noctarius (7. Jun 2009)

Apache davor hängen und mit URL Rewrite "http://xxx.localhost" umbiegen nach "http://localhost/xxx", so zumind. mach ich das in der Firma. Alternativ könntest du deinem base.jsp einen Parameter mitgeben "cs" (für CustomerDesign) und überprüfen ob dieser gesetzt wurde, falls ja Redirect senden.


----------



## mmaki (8. Jun 2009)

Danke erst mal für die Antwort. Ich weiss jetzt nicht ob das mein Problem löst?

Vielleicht muss ich noch präzisieren. Im SVN sind die jsp folgendermassen abgelegt:

```
base/
	jsp/
		a.jsp
		b.jsp

kunde1/
	jsp/
		c.jsp
		d.jsp

kunde2/
	jsp/
		c.jsp
		d.jsp
```
Beim Kunden wird dann jeweils folgendermassen ausgeliefert

```
jsp/
	a.jsp
	b.jsp
	c.jsp
	d.jsp
```
Also ins gleiche Verzeichnis wird dann jeweils zuerst das base, danach das Kundenspezifische drüber kopiert.

Ich würde jetzt gerne bei mir lokal Tomcat so konfigurieren, dass es bei mir lokal so verhält, wie wenn obiges gemacht werden würde. Dadurch könnte ich lokal immer an den SVN-Files direkt arbeiten, ohne dass ich zum Testen die kundenspezifischen ins base/jsp/ kopieren muss.

Zur Zeit ist bei mir lokal das base.xml folgendermassen:

[XML]
<Context path="/base" 
reloadable="true" 
docBase="...\base\jsp" 
workDir="...\base\jsp\.work" />
[/XML]
Ich suche eine Lösung in der Form (das ist jetzt keine gültige Definition, aber nur mal so zum besseren Verständnis des Problems):
[XML]
docBase="...\kunde1\jsp;...\base\jsp" 
[/XML]

Sozusagen zuerst kunde1\jsp, dann base\jsp. Vielleicht hat jemand eine gute Lösung wie ich lokal an den verschiedenen SVN-Files arbeiten kann (also base und kunden), ohne jedes Mal die kundenspezifischen in die base kopieren zu müssen… 

Danke und Gruss
mmaki.


----------



## Noctarius (8. Jun 2009)

Warum kopier ihr diese drüber und lasst nicht nachschauen ob es ein Kundendesign gibt und dann eventuell weiterleiten?

Ansonsten keine Ahnung ob man den Tomcat so einrichten kann, da wir alle Kundendesigns parallel brauchen und erst zur Laufzeit entschieden wird, welches anzuzeigen ist.


----------



## maki (8. Jun 2009)

Finde dieses ganze "System" suboptimal, würde da persönlich zu einem Branch pro Kunde tendieren, mit den genau den Dateien in der Version die für den Kunden gedacht sind.


----------



## Noctarius (8. Jun 2009)

Ich würde das ganze eigentlich mit einem Templatesystem ausstatten und nur das Design zur Laufzeit anpassen. Hunderte JSPs anpassen wenn irgendwo ein Bug ist, würde mich zum kot.... bringen


----------



## maki (8. Jun 2009)

Dafür gibt es doch SVN Merge 

Aber wenn wirklich nur das Layout betroffen ist und keine Logik dann ist ein Templatemechanismus wirklich die bessere Lösung


----------



## Noctarius (8. Jun 2009)

maki hat gesagt.:


> Dafür gibt es doch SVN Merge



Musst trotzdem die Branches einzeln mergen  Also wir haben 75 Kundendesigns. Wenn du hier anfangen willst und das machst bitte


----------



## mmaki (8. Jun 2009)

maki hat gesagt.:


> Finde dieses ganze "System" suboptimal, würde da persönlich zu einem Branch pro Kunde tendieren, mit den genau den Dateien in der Version die für den Kunden gedacht sind.



Natürlich wäre das bezüglich Übersicht "welcher Kunde was hat" am Besten... Nur (wie Noctorius bereits erwähnte) ist das viel zu aufwendig, da man bei Änderungen in der Basis diese dann 'hunderte' mal machen (respektive in allen Kundenprojekten portieren) muss... Abgesehen davon ist es ja auch gut diese Basis-jsp nicht redundant zu haben...



Noctarius hat gesagt.:


> Ich würde das ganze eigentlich mit einem Templatesystem ausstatten und nur das Design zur Laufzeit anpassen. Hunderte JSPs anpassen wenn irgendwo ein Bug ist, würde mich zum kot.... bringen



Mit einem Templatesystem wäre das vom Aufbau sicherlich gut zu lösen. Nur, ich bin ziemlich neu in der Firma und kann jetzt nicht gleich mit einer architekturiellen/organisatorischen Änderungen in Haus fallen...  :shock:


----------



## Noctarius (8. Jun 2009)

mmaki hat gesagt.:


> Mit einem Templatesystem wäre das vom Aufbau sicherlich gut zu lösen. Nur, ich bin ziemlich neu in der Firma und kann jetzt nicht gleich mit einer architekturiellen/organisatorischen Änderungen in Haus fallen...  :shock:



Echt nicht? Mist, dann hab ich hier vor 2 Jahren was falsch gemacht 

Solange es das System einfacher zu warten macht kann man alles


----------



## mmaki (8. Jun 2009)

Ja, bin auch deiner Meinung... Nur bin ich hier in einem Tochter-Unternehmen und der Base-Teil wird nicht hier gemacht. Da ist es schon etwas schwieriger als 'Aussenstehender' gleich so etwas anzuzetteln...

Ich werd mal schauen was sich machen lässt...

Bezüglich mehereren Pfaden für den gleichen Context hab ich nochmals ge'googelt... konnte aber nichts finden... ;( auch in der Tomcat-Doku steht dazu nichts... Ich denke es wird wohl nicht gehen (wäre aber sicherlich keine schlechte Sache gewesen...)


----------



## mmaki (8. Jun 2009)

Danke jedenfalls für eure Hilfe und den Input... Melde mich wenn sich was ergeben hat...

Gruss
mmaki.


----------



## Noctarius (8. Jun 2009)

mmaki hat gesagt.:


> wäre aber sicherlich keine schlechte Sache gewesen...



Dazu haben maki und ich ja schon unsere Meinungen abgegeben. Doch wäre es. Das hat gleich mal mehrere Gründe.
- Wie wird der richtige CP ausgewählt?
- Wann ist welcher CP richtig?
- Soll in bestimmten Fällen der Basis-CP genommen werden?
- In welcher Reihenfolge sollen die CP nach entsprechend vorhandenen JSPs überprüft werden?
- Warum gibt es Template-Systeme und MVC?

edit:
1. Apache Anfrage: "xyz.domain.tld"
2. mod_rewrite: routing an tomcat mit www.domain.tld/?design=xyz
3. index.jsp: if "webapp/ROOT/design/xyz" exists ? weiter 4 : weiter 6
4. index.jsp: if "webapp/ROOT/design/xyz/index.jsp" exists ? weiter 5 : weiter 6
5. index.jsp: sendRedirect("design/xyz/index.jsp")
6. index.jsp: if "webapp/ROOT/design/xyz/design.css" exists ? template.setCss("design/xyz/design.css") : template.setCss("design/default/design.css")
7. index.jsp: Daten senden

-----> Bis Punkt 6 könntest du ein ähnliches System implementieren, dass prüft ob im Kundendesign die Datei existiert und wenn ja dahin weiterleiten. Ansonsten wäre auch ein Servletfilter möglich um ein minimales MVC zu bauen. Diese Variante war für uns einfacher, weil von über 70 Designs nur 1 Design soweit abweicht, dass es ein eigenes JSP braucht.


----------

