我是 Servlet 的新手,我试图创建一个用于数据库访问的帮助程序类。我创建了这个简单的类,它或多或少有效。我可以在"startUp"方法中毫无问题地访问数据库,但是当我访问Servlets中的方法时,"数据源"总是为空。我做错了什么?
我将Netbeans与Glassfish 4.1和Java 7一起使用。
数据库.class
@Singleton
@Startup
public class Database {
@Resource( lookup = "jdbc/resBookStoreMySql" )
private DataSource dataSource;
@PostConstruct
private void startUp() {
System.err.println("=====================");
System.err.println(this.dataSource == null); //false
}
@Lock( LockType.READ )
public boolean isPasswordCorrect(String username, String password) {
boolean isPasswordCorrect = false;
System.err.println(this.dataSource == null); //true
// . . .
return isPasswordCorrect;
}
@Lock(LockType.READ)
public List<Book> getBooks() {
List<Book> books = new ArrayList<>();
System.err.println(this.dataSource == null); //true
// . . .
return books;
}
}
SomeServlet.jsp:
....
<jsp:useBean id="db" class="at.laubi.servlet.data.Database" scope="page" />
....
通过使用
useBean
,您正在实例化新的Database
对象,而不是注入它,然后不处理@Resource
,这就是dataSource为空的原因。
正如其他人建议的那样,您不应该直接在 jsp 中使用 EJB,但是如果您必须这样做,则需要:
- 将
@Named("database")
添加到您的豆子中 - 例如,在 JSP 中使用
#{database.books}
来获取书籍列表