2014-01-26 54 views
1

我在META-INF已經context.xml的定義如下自定義變量:查找數據源在運行時

<Context path="/7Restaurant"> 
<Resource name="datasource" 
     type="javax.sql.DataSource" 
     auth="Container" 
     maxActive="10" 
     maxIdle="3" 
     maxWait="10000" 
     username="work" 
     password="" 
     driverClassName="org.postgresql.Driver" 
     url="jdbc:postgresql://127.0.0.1:5432/7restaurant"/> 
</Context> 

我即將部署我的web應用程序(Servlet中,在Tomcat中7)。唯一的問題是,我如何更改網址,用戶名等以與WAR包部署的環境匹配。

所以,實質上,這樣的文件怎麼可能被修改;或任何其他技術,以便用戶可以在將要部署的環境中精確地連接到數據庫。

我在web-app eclipse,tomcat,postgresql堆棧中很新;所以我希望我的問題是錯的,如果是這樣的話;請讓我知道任何其他方式來解決這個問題。

我的上下文初始化在Java中:從您的構建

package com.restaurant.web; 

import java.io.File; 
import java.io.InputStream; 
import java.io.StringWriter; 
import java.net.URL; 

import javax.naming.*; 
import javax.servlet.*; 
import javax.sql.*; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.*; 

import com.restaurant.dao.dbpostgres.DBDAO; 
import com.restaurant.setup.GeneralConfigurerSetup; 
import com.restaurant.web.Logger; 

import sun.java2d.loops.DrawGlyphListAA.General; 

public class Database implements ServletContextListener { 
    private void contextInitialized2(ServletContext servletContext) throws Exception 
    { 
     /* 
     //prepare META-INF/context.xml 
     DocumentBuilder docbldr = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document doc = docbldr.newDocument(); 
     Element context = doc.createElement("Context"); 
     context.setAttribute("path", "/7Restaurant"); 
     Element resource = doc.createElement("Resource"); 
     resource.setAttribute("name", "datasource"); 
     resource.setAttribute("type", "javax.sql.DataSource"); 
     resource.setAttribute("auth", "Container"); 
     resource.setAttribute("maxActive", "10"); 
     resource.setAttribute("maxIdle", "3"); 
     resource.setAttribute("maxWait", "10000"); 
     resource.setAttribute("username", Configurer.get(GeneralConfigurerSetup.DB_USERNAME)); 
     resource.setAttribute("password", Configurer.get(GeneralConfigurerSetup.DB_PASSWORD)); 
     resource.setAttribute("driverClassName", Configurer.get(GeneralConfigurerSetup.DB_CLASS)); 
     resource.setAttribute("url", Configurer.get(GeneralConfigurerSetup.DB_JDBCURL)); 
     context.appendChild(resource); 
     doc.appendChild(context); 

     System.out.println(System.getProperty("java.class.path")); 

     File fOut = new File("META-INF/context.xml");  
     System.out.println(fOut.getAbsolutePath()); 
     if (fOut.exists()) fOut.delete(); 
     TransformerFactory tff = TransformerFactory.newInstance(); 
     Transformer tf = tff.newTransformer(); 
     Source input = new DOMSource(doc); 
     Result output = new StreamResult(fOut); 
     tf.transform(input, output);   
     */ 

     //META-INF/context 
     InitialContext enc = new InitialContext(); 
     Context compContext = (Context) enc.lookup("java:comp/env"); 
     DataSource dataSource = (DataSource) compContext.lookup("datasource"); 
     DBDAO.setDataSource(dataSource); 
    } 

    public void contextInitialized(ServletContextEvent sce) { 
     ServletContext servletContext = sce.getServletContext(); 
     try { 
      contextInitialized2(servletContext); 
     } catch(Exception e) { 
      Logger.error("Initializing failed: " + e.getMessage()); 
      System.exit(-1); 
     }  
    } 

    public void contextDestroyed(ServletContextEvent sce) { 

    } 
} 

回答

0

刪除context.xml中(以防萬一),並把它放在conf下/卡塔利娜/本地主機Tomcat的文件夾。重命名它,以便它可以是任何你想要的應用上下文名稱(比如myapp.xml)。

正如你所看到的那樣,它允許每個環境擁有不同的myapp.xml文件,並且在部署戰爭時,它會選擇它而不是使用內部文件。

+0

如何加載myapp.xml?是上下文compContext =(上下文)enc.lookup(「java:comp/env」);還在工作? – user1056373

+0

是的。它可以像在戰爭中捆綁時一樣加載。 –

+0

哇。我只知道這一點。你能推薦我用來學習servlet的書籍/資源嗎? – user1056373

相關問題