2014-01-26 34 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

相关问题