问题描述
我想在应用程序级别建立数据库连接,所以我想在 Apache Tomcat 服务器的 web.xml 文件中创建连接.我正在使用 Struts2 MVC 框架开发我们的应用程序.实际上我不想在每个 Java 文件上创建数据库连接.如何在应用程序中建立数据库连接?
I want to make database connection at application level, so I want create connection in web.xml file of Apache Tomcat server. I am developing our application using Struts2 MVC framework. Actually I don't want to create database connection at each Java file. How to make a database connection in application?
我正在尝试在 web.xml 中创建连接,但是 Connection conn = ds.getConnection 行显示了类似 java.lang.NullPointerException 的错误();代码>.所有代码都显示在下面
I am trying create a connection in web.xml but a error like java.lang.NullPointerException is being displayed at line Connection conn = ds.getConnection();. All code is being displayed in below
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://www.51sjk.com/Upload/Articles/1/0/333/333792_20221024092551674.jpg xsi:schemaLocation="http://www.51sjk.com/Upload/Articles/1/0/333/333792_20221024092552409.jpg http://www.51sjk.com/Upload/Articles/1/0/333/333792_20221024092552409.jpg/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 没有意义.如果您需要有关注入资源的更多信息,您应该阅读 教程.而是创建一个 ServletContextListener 并将注释放在那里.关于上下文初始化事件设置上下文属性
Putting @Resource on the action bean property makes no sense. If you need more information about injecting resources you should read a tutorial. Instead create a ServletContextListener and put annotation there. On context initialized event set context attribute
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中):
web.xml (should be in WEB-INF):
<listener> <listener-class>com.servlet.MyServletContextListener</listener-class> </listener>
现在可以在execute方法中获取数据源
now you can get datasource in the execute method
ds = (DataSource)ServletActionContext.getServletContext().getAttribute("ds");