[Java/Tomcat] servlet-mapping: excluden bepaalde mappen

Pagina: 1
Acties:

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Ik heb een servlet gemaakt en heb hem draaiend in Tomcat met onderstaande web.xml:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
    <display-name>MijnApp</display-name>
    <description>MijnApplicatie</description>

    <servlet>
      <servlet-name>mijnServlet</servlet-name>
      <servlet-class>com.md.mijnapp.mijnServlet</servlet-class>

    </servlet>
    
    <servlet-mapping>
      <servlet-name>mijnServlet</servlet-name>
      <url-pattern></url-pattern>
    </servlet-mapping>
</web-app>


Hiermee worden alle requests in de context van mijnapp doorgestuurd/gemapped naar de mijnServlet. Maar nu wil ik graag bepaalde mappen uitsluiten (bijvoorbeeld images). Ik heb echter nergens kunnen vinden hoe dit het beste is aan te pakken. Ik heb ook dit geprobeerd: http://www.caucho.com/support/resin-interest/0003/0176.html (maar dan met de Tomcat file servlet, uit Tomcat's web.xml gehaald) maar dat werkt niet echt :( Weet er iemand hoe het wel kan?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Waarom wil je er voor zorgen dat die images niet beschikbaar zijn? Als je dat niet wilt, waarom zet je ze dan op je webserver? Aangezien jij ze wel in een bepaalde vorm beschikbaar wilt zetten (anders had je ze niet op je webserver gezet) dan komt de vraag: wanneer wil je wel images kunnen downloaden en wanneer niet?

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Ik wil ze juist wél beschikbaar hebben, maar dat gaat niet als de servlet alle requests afvangt :) En aangezien er blijkbaar geen manier is om bepaalde URL's te excluden van de mapping....

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Voorbeeld:
code:
1
2
3
4
<servlet-mapping>
    <servlet-name>springDispatcher</servlet-name>
    <url-pattern>*.spring</url-pattern>
</servlet-mapping>


Zo kan je alles met de extensie spring mappen naar de springDispatcher (ook een servlet).

[ Voor 36% gewijzigd door Alarmnummer op 25-12-2004 10:16 ]


  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Ja, maar ik wil geen extensie gebruiken ;) De volgende URLs wil ik mappen:

http://www.mijnsite.com/mijnapp/view/1 ---> Servlet
http://www.mijnsite.com/mijnapp/login/ --> Servlet
http://www.mijnsite.com/images/bla.gif --> bla.gif in map images

Wat ik wel zou kunnen doen is alles zonder extensie mappen, maar ik denk niet dat dat wel gaat? Of ik map alle extensies .gif, .jpg, .js enzo naar de templates-map, maar dat vind ik ook een beetje vies...

[ Voor 5% gewijzigd door MisterData op 25-12-2004 10:20 ]


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
MisterData schreef op zaterdag 25 december 2004 @ 10:19:
Ja, maar ik wil geen extensie gebruiken ;) De volgende URLs wil ik mappen:

http://www.mijnsite.com/mijnapp/view/1 ---> Servlet
http://www.mijnsite.com/mijnapp/login/ --> Servlet
http://www.mijnsite.com/images/bla.gif --> bla.gif in map images

Wat ik wel zou kunnen doen is alles zonder extensie mappen, maar ik denk niet dat dat wel gaat? Of ik map alle extensies .gif, .jpg, .js enzo naar de templates-map, maar dat vind ik ook een beetje vies...
Misschien is het een idee servlet en overige content te scheiden? Dus de mapping uit je openingspost laten mappen naar /mijnapp ?

Overige content is dan gewoon benaderbaar.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
zneek schreef op zaterdag 25 december 2004 @ 10:49:
[...]


Misschien is het een idee servlet en overige content te scheiden? Dus de mapping uit je openingspost laten mappen naar /mijnapp ?

Overige content is dan gewoon benaderbaar.
Ja, dat kan wel, maar is natuurlijk iets minder mooi.. een andere optie waar ik aan zat te denken is om de servlet in kwestie zelf de bestanden te laten serveren... als ik het met de fileservlet doe dan gaat ie overigens gek doen:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<servlet>
        <servlet-name>file</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <url-pattern>/templates/*</url-pattern>
        <servlet-name>file</servlet-name>
    </servlet-mapping>


Als ik dan naar /template ga dan krijg ik de dirlist van /. Ik kan bestanden in templates dan benaderen via http://www.mijnsite.com/mijnapp/templates/templates/test.gif oid... hij 'weet' dus niet precies wat z'n beginmap is, enig idee om dat aan te passen? want dan zou het dus werken :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Waarom wil jij in godsnaam zelf dat soort bestanden serveren??? Ga alleen aanpassingen doen waar het hoeft en laat de rest gewoon door tomcat zelf doen. Ik zou trouwens echt even werken met een extensie of met een andere vorm van url pattern (die standaard is). Persoonlijk vind ik een extensie het meest handige.

Alles wat eindig met de extensie : servlet laat jij via je eigen servlet regelen en de rest gewoon via tomcat. Als je verder wilt aanprutsen moet je dat zelf weten, maar er is geen toegevoegde waarde.

[ Voor 26% gewijzigd door Alarmnummer op 25-12-2004 12:38 ]


  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Alarmnummer schreef op zaterdag 25 december 2004 @ 12:36:
Ik zou trouwens echt even werken met een extensie of met een andere vorm van url pattern (die standaard is). Persoonlijk vind ik een extensie het meest handige.

Alles wat eindig met de extensie : servlet laat jij via je eigen servlet regelen en de rest gewoon via tomcat. Als je verder wilt aanprutsen moet je dat zelf weten, maar er is geen toegevoegde waarde.
Voor mij is de toegevoegde waarde dat mijn Java-webapplicatie zich straks precies hetzelfde kan gedragen als zijn PHP5-broertje die al bestaat :) (die het overigens met mod_rewrite gewoon wel lukt)

[ Voor 4% gewijzigd door MisterData op 25-12-2004 12:40 ]


Verwijderd

Het jammere van <url-pattern> is dat je er niet gewoon een reguliere expressie voor kunt gebruiken. Sommige application servers / containers kunnen dat wel, maar het is niet standaard.

Als je met servlet filters werkt is het nog moeilijker, want die werken precies andersom: die matched de ruimst mogelijke ipv de meest specificieke. Je kunt dat dan 'oplossen' door in je filter als eerste regel meteen te checken op de aangevraagde resource en bij de uitzonderings gevallen meteen het volgende filter aan te roepen. Als er een meer specificiek filter op de resource gemapped stond wordt die aangeroepen, anders wordt de default servlet van de je server / container aangeroepen. In de rest van je eerste filter kun je dan nog de dingen processen waar het filter eigenlijk voor bedoeld was.

Dat je in het filter zelf uitzonderingen hard moet gaan zettem is mijns inziens een groot nadeel van de implementatie die gewoon voorkomt uit het feit dat <url-pattern> een zeer gering aantal 'pattern' aankan.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Maargoed, ik heb eigenlijk niet zo'n zin om een filter te schrijven... weet er echt niemand hoe ik die File-servlet vertel waar 'ie moet zoeken? want dan werkt het als een trein... :)

[edit]
Is er niet een nette manier om die file-servlet te callen vanuit mijn eigen servlet? dan kies ik namelijk zelf wel of ik een bepaalde URL wil afhandelen in mijn servlet, en de rest gooi ik dan door naar die fileservlet...

[ Voor 41% gewijzigd door MisterData op 26-12-2004 18:01 ]


  • flowerp
  • Registratie: September 2003
  • Laatst online: 04-02 02:01
MisterData schreef op zondag 26 december 2004 @ 17:49:
Maargoed, ik heb eigenlijk niet zo'n zin om een filter te schrijven...
Een filter heeft bijna dezelfde interface als een servlet hoor. Feitelijk is het een servlet met het verschil dat je ze kunt 'chainen' -> aan de hand van URL patterns kun je een hele ketting van 'servlets' opzetten die elkaar aanroepen zonder elkaar expliciet hoeven te kennen. Denk aan Unix pipe & filters "ls / | grep foo | mail me@bar.com" etc.

Als je een servlet hebt zet je hem echt zo in een filter om.
Is er niet een nette manier om die file-servlet te callen vanuit mijn eigen servlet? dan kies ik namelijk zelf wel of ik een bepaalde URL wil afhandelen in mijn servlet, en de rest gooi ik dan door naar die fileservlet...
Fiters, filters, filters ;)

De standaard manier om vanuit de ene servlet de andere servlet aan te roepen is het filter mechanisme. Dat is daar juist voor bedoeld.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
imho ben je nu een probleem aan het oplossen wat er niet is. Die images dir kun je gewoon door TomCat laten afhandelen. Je hoeft alleen je mapping maar zo aan te passen dat alleen de applicatie servlets aangeroepen worden als het nodig is, dus bijv ipv / laten mappen naar /mijnapp.

Als het dan per se precies hetzelfde moet zijn als in php, waarom heb je het dan in java gebouwd?

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
zneek schreef op zondag 26 december 2004 @ 23:16:
imho ben je nu een probleem aan het oplossen wat er niet is. Die images dir kun je gewoon door TomCat laten afhandelen. Je hoeft alleen je mapping maar zo aan te passen dat alleen de applicatie servlets aangeroepen worden als het nodig is, dus bijv ipv / laten mappen naar /mijnapp.

Als het dan per se precies hetzelfde moet zijn als in php, waarom heb je het dan in java gebouwd?
Het is natuurlijk niet helemaal dezelfde applicatie ;) Daarnaast kan ik met servlets véél meer dan met PHP5 (als voorbeeld: mijn XSLT templates moet ik met PHP5 steeds opnieuw laden, met Java maak ik 1x een Transformer die gewoon voor een hele hoop requests gebruikt kan worden... scheelt een hoop tijd als het goed is)

Ik denk dat ik straks eens ga kijken of dat met filters een beetje wil werken :)

[edit]
Ik heb net deze gevonden, een filter die op basis van regexen requests kan redirecten: http://www.zlatkovic.com/httpredirectfilter.en.html :)

[ Voor 9% gewijzigd door MisterData op 27-12-2004 12:19 ]

Pagina: 1