Konfigurace webové aplikace

Z FI WIKI
Přejít na: navigace, hledání


Webové aplikace se zabalí do souboru WAR, který stačí nasadit (deploy) do servletového kontejneru. Ovšem webová aplikace často potřebuje přístup k vnějším zdrojům, a to zejména

  • k relační databázi
  • k e-mailovému serveru
  • k souborům na disku

Proto TomCat a Jetty, i když jsou jen servletové kontejnery, a ne plné Java EE aplikační servery, poskytují spojení na databázi a e-mailový server stejným způsobem, jako Java EE servery. Přístup k vnějším souborům lze zadat přes inicializační parametry.

Výhodou je, že konfigurace není uvedena uvnitř webové aplikace samotné, ale ve vnějším souboru, takže ji lze při nasazení aplikace měnit beze změny aplikace.

Přístup k databázi

Spojení na databázi lze nadefinovat v souboru context.xml, specifickém pro TomCat, a ten lze umístit do META-INF/context.xml v souboru WAR, nebo do $CATALINA_BASE/conf/Catalina/localhost/context.xml. Příklad:

 
<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/mojedatabaze" auth="Container" type="javax.sql.DataSource"
            maxActive="10" maxIdle="5" maxWait="10000"
            driverClassName="org.postgresql.Driver"
            username="makub" password="heslo"
            url="jdbc:postgresql://stroj.nekde.cz:5432/mojedb"/>
</Context>

TomCat 6+

TomCat 6 a novější verze imlementují Servlet API 2.5, a umí dependency injection. Takže stačí v servletu udělat:

 
import javax.sql.DataSource;
import javax.annotation.Resource;
//...
public class MujServlet extends HttpServlet {
    @Resource(name = "jdbc/mojedatabaze")
    private DataSource pool;
 
//...
        Connection con = pool.getConnection();
//...
}

TomCat 5.5 a starší

Starší TomCaty nepodporují anotace a dependency injection, takže je nutné jít přes JNDI (Java Naming and Directory Interface):

V souboru web.xml je třeba uvést odkaz na tento zdroj:

 
   <!-- spojeni na databazi -->
    <resource-ref>
       <res-ref-name>jdbc/mojedatabaze</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
     </resource-ref>

V kódu aplikace pak lze získat pool databázových spojení pomocí JNDI :

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection
...
Context init = new InitialContext();
Context ctx = (Context) init.lookup("java:comp/env");
DataSource  pool = (DataSource) ctx.lookup("jdbc/mojedatabaze");
...
Connection con = pool.getConnection();

Přístup k e-mailovému serveru

Obdobně lze nadefinovat přístup k odesílání e-mailů:

<Context>
<Resource name="mail/Session" auth="Container"
          type="javax.mail.Session"
          mail.smtp.host="localhost"/>
</Context>

V souboru web.xml je oppět potřeba uvést odkaz na zdroj

 
    <!-- spojeni na mailovaci server -->
     <resource-ref>
      <res-ref-name>mail/Session</res-ref-name>
      <res-type>javax.mail.Session</res-type>
      <res-auth>Container</res-auth>
     </resource-ref>

a v kódu aplikace opět přes JNDI získat spojení:

import javax.mail.Session;
 ...
 Context init = new InitialContext();
 Context ctx = (Context) init.lookup("java:comp/env");
 Session mailSession = (Session) ctx.lookup("mail/Session");

Nastavení inicializačních parametrů

Webové aplikaci lze nastavovat tzv. incializační parametry souboru web.xml:

<web-app> ...
 <context-param>
    <param-name>adresarSeSoubory</param-name>
    <param-value>/var/soubory</param-value>
 </context-param>

a v kódu servletu je pak lze získat ze ServletContextu:

getServletContext().getInitParameter("adresarSeSoubory");

případně v JSP stránce pomocí EL jazyka:

${initParam.adresarSeSoubory}

Soubor web.xml je však uvnitř aplikace, proto TomCat umožňuje nastavit tyto inicializační parametry ještě v context.xml:

<Context>
  ...
  <Parameter name="adresarSeSoubory" value="/var/soubory" override="true"/>
  ...
 </Context>