Toon posts:

[j2ee] Relatieve links en context root

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik vraag me af hoe iedereen hier relatieve links (bv <a href="rel_link"> ) in JSP pagina's gebruikt.

Als ik de link met een "/" begin, dan verwijzen deze altijd naar de root van mijn website. Het kan echter voorkomen dat ik mijn webapp helemaal niet op die website root draai, maar bijvoorbeeld onder myapp, zoals in: www.example.com/myapp .

Ik kan eenvoudig weg mijn link niet met een "/" laten beginnen, maar dan klopt het niet meer als mijn jsp's in submappen staan. Simpele oplossing is dan om de context root van je web applicatie als base in de head van je pagina op te geven.

Tot zover geen problemen. Mijn vraag is echter, dit lijkt zo vanzelfsprekend, maar toch zie ik het nooit staan in JSP pagina's die ik zie. Je zou zeggen dat elke web applicatie dit toch nodig heeft? Een web app wordt via de standaard deploy methode via een .war bijna altijd gemount aan een context root die niet gelijk is aan de website root.

Andersom gevraagt, waarom zou het default zo zijn dat je -geen- base in je pagina's zet?

Verwijderd

Topicstarter
Om even op mezelf te replyen, na nader onderzoek blijkt er niet eens een makkelijke functie in de J2EE API te zitten om de context root te achterhalen.

Hoe doen andere web apps dat dan uberhaupt met relatieve links? Je weet toch nooit van te voren onder welke context root men jouw applicatie mount?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Het is gewoon belangrijk om een goede directory structuur te bedenken voor je applicatie en op basis daarvan met relatieve links te werken. Op die manier gaat het altijd goed. Voorbeeldje:
code:
1
2
3
4
./gfx/
./admin/
./styles/
./jsp/

Ik zorg er altijd voor dat mijn JSP files "aware" zijn waar ze staan in de directorystructuur. Als ik dus aan de hand van de bovenstaande directory structuur verwijs vanuit een jsp file naar een plaatje (om maar iets te noemen), dan doe ik dat zo:
Java Server Page:
1
[img]"../gfx/plaatje.gif"[/img]

Om ervoor te zorgen dat die awareness niet verdwijnt, doe ik bijna nooit een forward naar een andere jsp pagina, maar een response.sendRedirect als ik content uit een andere pagina wil halen. Mocht je toch een forward willen, dan zul je ervoor moeten zorgen dat de pagina waarnaar je forward op dezelfde diepte in je directory structuur staat en dat kan dus flink messy worden.

Kortom, de oplossing waarvoor ik zou kiezen is relatieve paden, want dat is (bijna) automatisch context onafhankelijk.

Verwijderd

Om ervoor te zorgen dat die awareness niet verdwijnt, doe ik bijna nooit een forward naar een andere jsp pagina, maar een response.sendRedirect als ik content uit een andere pagina wil halen.
Is het nadeel hiervan niet dat je de client het probleem op laat lossen? HttpServletResponse.sendRedirect stuurt namelijk een redirect naar de client die vervolgens de pagina in de redirect weer gaat opvragen.

Zelf vraag ik net als TS altijd de contextroot van mijn webapplicatie op en die gebruik ik vervolgens. Hiervoor is een goede directorystructuur altijd belangrijk. Enige vorm van logica hierin maakt het onderhouden en het ontwikkelen van het systeem ook een stuk prettiger.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik leg de verantwoordelijkheid inderdaad bij de client neer, maar of dat nu zo'n enorm probleem is? Het gebruik van zowel sendRedirect en forward vermijd ik zelf ook liever, uitgezonderd de incidentele loginpagina.
Echter, mensen die van Struts of andere frameworks gebruik maken zullen weer op een andere manier ermee om moeten gaan, omdat er daar veel geforward wordt. Dan kan het werken met de contextroot inderdaad een uitkomst zijn.

Overigens verstuur je bij gebruik van absolute paden (=contextroot) wel meer informatie naar de browser ;)

Verwijderd

Topicstarter
In mijn geval gaat het overigens niet om includes, sendredirects of forwards etc, maar om de gewone links die op mijn page staan.

Het probleem is dat ik een frame om mijn pagina's heb. De links daarin zijn relatief, maar moeten wel altijd relatief zijn aan de context root van de web applicatie. Ik ben het er mee eens dat als je niet zo'n frame hebt, dat je dan met behulp van kennis waar een individuele page zich in de structuur bevind van de ../ syntax gebruik kan maken.

Ik heb het nu opgelost door het volgende scriptlet in mijn head te zetten:

Java:
1
2
String path = request.getContextPath();
            String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 


En dan de volgende base:
HTML:
1
<base href="<%=basePath%>" >


Als het goed is kan ik nu mijn web app onder elke context root mounten (bv www.example.com, of www.example.com/myapp, www.example.com/myapp/foo, etc). Nadeel is wel dat ik dus altijd links vanaf die root moet specificeren en geen ../ syntax kan gebruiken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-05 08:48

Janoz

Moderator Devschuur®

!litemod

Ikzelf gebruik de base tag van struts. Op die manier kan ik elke plaatje of stylesheet relatief linken vanaf die jsp pagina, maar bovenstaande zou ook goed kunnen werken natuurlijk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1