Toon posts:

[JAVA/Tomcat]

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met een probleem waar ik onderhand echt helemaal gek van wordt.

Laat ik bij het begin beginnen...
Ik heb een tijdje geleden de Java Web Services Developer Pack gedownload en geinstalleerd.
Daar zit dus Tomcat 5, Ant en nog een hele hoop andere interessante dingetjes in. Ik ben nu dus een beetje
aan het uitproberen en ik had gedacht om een klein servletje te schrijven die wat data uit een Mysql-db haalt en deze op het scherm tovert. Omwille van portabiliteit enzo heb ik mijn database-naam, wachtwoord, host etc in een file db.properties gegooid. En daar begint dus het gemieter, waar plaats ik dit bestand zodat het op een veilige locatie staat (niet-leesbaar door de wereld) maar wel kan worden gevonden vanuit mijn servlet??

In de documentatie van Tomcat5 staat dat als ik belangrijke files heb (zoals dus mijn db.properties) dat ik deze in de directory /web/WEB-INF moet gooien omdat deze (volgens de servlet-specs) nooit kan worden ge'served'

Oke, ik gooi de property-file dus in die directory, maak mijn servletje, start ant om alles in te pakken en te deployen op de Tomcat server. Voor Ant heb ik de volgende directory structuur aangemaakt:
/docs
/src/nl/jmaasland/athena/servlets/
/web/WEB-INF

Na het doorlopen van vanalles en nogwat maakt Ant voor mij een .war waar het volgende allemaal in staat:
--
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/nl/
WEB-INF/classes/nl/jmaasland/
WEB-INF/classes/nl/jmaasland/athena/
WEB-INF/classes/nl/jmaasland/athena/servlets/
WEB-INF/lib/
WEB-INF/classes/nl/jmaasland/athena/servlets/LokalenManagerServlet.class
WEB-INF/web.xml
WEB-INF/db.properties
index.html
--

In de servlet probeer ik de property file te laden met de volgende code

Properties dbProperties = new Properties();
dbProperties.load(new FileInputStream("WEB-INF/db.properties"));

En daar krijg ik dus een foutmelding dat hij het bestand niet kan vinden.

Ik heb al een aantal dingen geprobeerd. Ik heb de file db.properties in de
src/nl/jmaasland/athena/servlets directory gegooid, vervolgens proberen de file te laden met ./db.properties
Geen resultaat... Dat bracht me op het idee om te kijken waarnaar de . entry naar verwijst. Met behulp van
File(".").getAbsolutePath() kijk ik en zie ik dat dit verwijst naar /usr/local/jwsdp/bin !! De directory van de Tomcat server! Als ik db.properties daar dan neerzet en laad met "./db.properties" dan vindt hij het bestand wel, maar dit is natuurlijk geen oplossing.
Ik wil gewoon de db.properties vanuit mijn war lezen.

Heeft iemand hier suggesties want ik heb echt geen idee meer hoe ik dit voor elkaar kan krijgen.....

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 19:39
ik heb totaal geen ervaring met TomCat, en met Java eigenlijk ook niet zo veel (ben c++ programmeur), het kan dus compleet verkeerde raad zijn, maar moet je niet

dbProperties.load(new FileInputStream("/WEB-INF/db.properties"));

zetten ipv

dbProperties.load(new FileInputStream("WEB-INF/db.properties"));

?

Verwijderd

Het veiligste is waarschijnlijk het te doen met de ClassLoader resource toestand:

Java:
1
dbproperties.load( getClass().getClassLoader().getResource("db.properties").openStream() );


Dit haalt een resource op van de classroot, dwz. of de directory waar de servlet staat minus het package path of de war/jar/archive waar de servlet in zit. Om dit dus te laten werken moet je je db.properties in je classes directory zetten, maar dan ben je er wel vanaf.

Ook een mooie oplossing is om die db.properties in de user home directory (of een subdirectory) te zetten. Met behulp van System.getProperty("user.home") kun je zo makkelijk het bestand terug vinden zonder dat je afhankelijk bent van de locatie van het programma/de servlet.

[ Voor 7% gewijzigd door Verwijderd op 12-11-2003 17:30 . Reden: Code tags ]


Verwijderd

Als je een servlet gebruikt, moet je voor dat soort zaken gebruik maken van de servlet-API, zie bv:

http://java.sun.com/products/servlet/2.3/javadoc/

Zoek voor je probleem naar:
Servlet.getServletConfig(),
ServletConfig.getServletContext(),

en dan met name de methods:
getRealPath(java.lang.String path)
getResource(java.lang.String path)
getResourceAsStream(java.lang.String path)

Verwijderd

Topicstarter
Dat was idd de oplossing, het duurde alleen behoorlijk lang voor dat ik het allemaal gevonden en aan elkaar had geknoopt.... Uiteindelijk is het vrij eenvoudige code:

InputStream is =
getServletContext().getResourceAsStream("/WEB-INF/db.properties");

:)