java - 有人可以帮助我了解如何在 Tomcat 中使用我的上下文文件并从我的程序中调用它吗?

标签 java mysql eclipse struts2 tomcat7

我正在使用 Eclipse 用 Ja​​va 编写一个 Web 应用程序,使用 Struts2 框架连接到与 MySQL 数据库通信的 Tomcat 7 服务器。我的程序正在运行,但我的代码中硬编码了连接的值。我想使用 context.xml 或我创建的一个进行连接,这样它就可以移植,并且不需要登录页面进行连接。我没有完全遵循上下文配置。我创建了一个名为 OS1.xml 的上下文 xml 文件,并将其放在 C:\Users\Rich\Tomcat\conf\Catalina\localhost 中。该应用程序从 webapps 目录 C:\Users\Rich\Tomcat\webapps 启动,其中包含 OS1.war 文件。

有人可以帮助我了解如何在 Tomcat 中使用我的上下文文件并从我的程序中调用它吗?

这是我的 ConnectionModel 类中应该调用的部分。

public class ConnectionModel {  

public ArrayList<Table> Systems() throws SQLException                       {               
    Connection con = null;          
    ResultSet rs = null;   
    try {
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/os");

        con = ds.getConnection();           

这是我的 web.xml 文件

<display-name>OS1</display-name>

<welcome-file-list>
    <welcome-file>enter.jsp</welcome-file>      
</welcome-file-list>

<filter>
    <filter-name>struts2</filter-name>
     <filter-class>
                  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
             </filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>   

<resource-ref>
    <description>MySQL Datasource </description>
    <res-ref-name>jdbc/os</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref> 

这是我的上下文 xml 文件,名为 OS1.xml,位于
C:\Users\Rich\Tomcat\conf\Catalina\localhost

<Context docBase="C:/Users/Rich/Tomcat/webapps/OS1.war" path="/OS1" reloadable="true">
<Resource>
        name="jdbc/os"
            auth="Container"
            type="javax.sql.DataSource"
            maxActive="100"
            maxIdle="30"
            maxWait="10000"
            username="someone"
            password="password"
            driverClassName="com.mysql.jdbc.Driver"                                 

    url="jdbc:mysql://localhost:3306/os"
</Resource>
</Context>

我收到以下错误。

WARNING: A docBase C:\Users\Rich\Tomcat\webapps\OS1.war inside the host appBase has
been specified, and will be ignored

Jun 05, 2013 12:43:54 PM org.apache.catalina.deploy.NamingResources initInternal
WARNING: Failed to create MBean for naming resource [null]
java.lang.NullPointerException
at javax.management.ObjectName.quote(ObjectName.java:1833)
at org.apache.catalina.mbeans.MBeanUtils.createObjectName(MBeanUtils.java:569)
at org.apache.catalina.mbeans.MBeanUtils.createMBean(MBeanUtils.java:183)
at 
org.apache.catalina.deploy.NamingResources.initInternal(NamingResources.java:934)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5163)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657)
at 
org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1636)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

Jun 05, 2013 12:43:54 PM org.apache.catalina.core.ContainerBase addChildInternal
SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component 
 [StandardEngine[Catalina].StandardHost

[localhost].StandardContext[/OS1]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657)
at 
org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1636)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NullPointerException
at java.util.StringTokenizer.<init>(StringTokenizer.java:199)
at java.util.StringTokenizer.<init>(StringTokenizer.java:221)
at
org.apache.catalina.core.NamingContextListener.createSubcontexts(NamingContextListener.
java:1272)
at 
org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.
java:1083)
at

org.apache.catalina.core.NamingContextListener.createNamingContext(
NamingContextListener.java:672)
at org.apache.catalina.core.NamingContextListener.lifecycleEvent(
NamingContextListener.java:271)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(
LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(
StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 11 more

Jun 05, 2013 12:43:54 PM org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor
    C:\Users\Rich\Tomcat\conf\Catalina\localhost\OS1.xml
java.lang.IllegalStateException: ContainerBase.addChild: start:
 org.apache.catalina.LifecycleException: Failed to 

start component
[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/OS1]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657)
at    org.apache.catalina.startup.HostConfig$DeployDescriptor.run(
HostConfig.java:1636)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

然后我收到此错误,我认为是因为我的上下文文件未正确使用:

无法为连接 URL“null”创建类“”的 JDBC 驱动程序

感谢任何帮助!

提前致谢, 丰富

最佳答案

您的上下文 xml 文件应如下所示:

<Context docBase="C:/Users/Rich/Tomcat/webapps/OS1.war" path="/OS1" reloadable="true">
<Resource
        name="jdbc/os"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
        username="someone"
        password="password"
        driverClassName="com.mysql.jdbc.Driver"                                 
    url="jdbc:mysql://localhost:3306/os"
/>

使用资源节点的参数而不是资源正文文本。我在没有参数的资源中遇到了类似的错误

java.lang.NullPointerException
    at javax.management.ObjectName.quote(ObjectName.java:1833)

看起来 Catalina 没有强制字段验证。

关于java - 有人可以帮助我了解如何在 Tomcat 中使用我的上下文文件并从我的程序中调用它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949285/

相关文章:

php - SQL中如何处理重复记录?

android - 如何在android项目中搜索方法或变量名?

java - 无法解析 javax.media.nativewindow.Capability 类型。它是从所需的 .class 文件间接引用的

java - 将自定义 uri 方案与适用于 Windows 的 Java 自包含应用程序相关联

java - JAXB2,如何根据包含 xsd :any element? 的 XML 架构进行部分验证

mysql - 100K以上记录的mysql表如何正常添加一列?

java - 使用嵌入式 Tomcat 启动 Spring 应用程序 (STS) 时,java.exe 和 javaw.exe 进程都在同一端口上创建

java - NoiseInk 中的透明背景 (Java)

Java加密: encrypt integer values

MySQL Window函数计算百分比