如何在Apache Tomcat的web.xml中使用Struts 2创建MySQL数据库连接

问题描述:

我想在应用程序级进行数据库连接,所以我想在Apache Tomcat服务器的web.xml文件中创建连接。我正在使用Struts2 MVC框架开发我们的应用程序。其实我不想在每个Java文件上创建数据库连接。所以,请给我一个建议,如何在应用程序中建立数据库连接。如何在Apache Tomcat的web.xml中使用Struts 2创建MySQL数据库连接

我正在尝试在web.xml中创建连接,但是java.lang.NullPointerException等错误正在Connection conn = ds.getConnection();处显示。正在显示的所有代码在下面

META-INFO/context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 

<Resource name="jdbc/dbmy" auth="Container" type="javax.sql.DataSource" 
      maxActive="50" maxIdle="30" maxWait="10000" 
      username="root" password="mysql" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/dbmy"/> 
</Context> 

lib/web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
<display-name>MY</display-name> 
<welcome-file-list> 
<welcome-file>index.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/dbmy</res-ref-name> 
<res-type>javax.sql.DataSource</res-type> 
<res-auth>Container</res-auth> 
</resource-ref> 
</web-app> 

我的Action类,如:

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import javax.annotation.Resource; 
import javax.servlet.ServletContext; 
import javax.sql.DataSource; 

import com.opensymphony.xwork2.*; 


public class GEtResponseObject extends ActionSupport { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
ServletContext context =null; 
PreparedStatement ps =null; 
ResultSet rs =null; 


@Resource(name="jdbc/dbmy") 
private DataSource ds; 

public String execute() {  
try{ 
    Connection conn = ds.getConnection(); //At this line, A java.lang.NullPointerException error is being occured. 
    ps = conn.prepareStatement("select * from dbmy.mytable "); 
    rs = ps.executeQuery(); 
    if (rs.next()) { 
     System.out.println(rs.getString("mycolom")); 
    }   
} 
catch(SQLException e) 
{ 
     e.printStackTrace();  
}  
    return Action.SUCCESS; 
} 
} 

@Resource放在动作bean属性上是没有意义的。如果您需要更多关于注射资源的信息,您应该阅读tutorial。相反,请创建一个ServletContextListener并在其中添加注释。上下文初始化事件中设置上下文属性

public class MyServletContextListener implements ServletContextListener { 

    @Resource(name="jdbc/dbmy") 
    private DataSource ds; 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
    System.out.println("contextInitialized"); 
    ServletContext context = servletContextEvent.getServletContext(); 
    context.setAttribute("ds",ds); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    System.out.println("contextDestroyed"); 

    } 
} 

web.xml(应该是在WEB-INF):

<listener> 
    <listener-class>com.servlet.MyServletContextListener</listener-class> 
</listener> 

现在你可以在execute方法获取数据源

ds = (DataSource)ServletActionContext.getServletContext().getAttribute("ds"); 
+0

你应该接受回答有帮助。 – 2017-12-24 23:53:18