gpt4 book ai didi

java - 在运行时使用自定义变量查找数据源

转载 作者:行者123 更新时间:2023-11-28 22:30:31 25 4
gpt4 key购买 nike

我在 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>

我即将部署我的网络应用程序(Servlet,在 Tomcat 7 中)。唯一的问题是,如何更改 url、用户名等以使其与部署 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) {

}
}

最佳答案

从您的构建中删除 context.xml(为了安全起见),并将其放入 conf/Catalina/localhost 下的 tomcat 文件夹中。重命名它,使其成为您想要的应用程序上下文名称(如 myapp.xml)。

如您所见,这允许每个环境具有不同的 myapp.xml 文件,并且当您部署 war 时,它将选择该文件而不是使用内部文件。

关于java - 在运行时使用自定义变量查找数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com