Jsf 2 Web应用程序加载失败
我正在使用Netbeans 7.2.1和GlassFish 3.1 我使用JSF、ejb类和JDBC数据源创建了web应用程序。 xhtml页面引用了支持托管bean,它调用ejb类上的本地接口函数,ejb类通过数据源运行查询,直接获取连接并执行查询 项目成功生成,但当我运行项目时,浏览器显示错误“未收到数据”,浏览器选项卡标题显示加载失败。我想我可能缺少一些配置,因为当我运行同一个项目时,没有引用托管bean(因此也没有引用ejb和数据库),就没有这样的消息 坦率地说,我对这样一个项目需要哪些配置文件以及需要在那里配置什么感到困惑。我看到了许多解释,每一个都说了些别的,我不清楚哪一个与此相关。如果你能给我一些明确的相关解释,我将不胜感激 我是否需要为此项目数据源进行配置?ejb类?还有别的吗 web.xml:Jsf 2 Web应用程序加载失败,jsf-2,ejb,datasource,glassfish-3,java-ee-6,Jsf 2,Ejb,Datasource,Glassfish 3,Java Ee 6,我正在使用Netbeans 7.2.1和GlassFish 3.1 我使用JSF、ejb类和JDBC数据源创建了web应用程序。 xhtml页面引用了支持托管bean,它调用ejb类上的本地接口函数,ejb类通过数据源运行查询,直接获取连接并执行查询 项目成功生成,但当我运行项目时,浏览器显示错误“未收到数据”,浏览器选项卡标题显示加载失败。我想我可能缺少一些配置,因为当我运行同一个项目时,没有引用托管bean(因此也没有引用ejb和数据库),就没有这样的消息 坦率地说,我对这样一个项目需要哪些
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
Userejb类:
@Stateful
@Local(UserejbLocal.class)
public class Userejb implements UserejbLocal {
private Connection connection = null;
private PreparedStatement getUser = null;
private PreparedStatement addUser = null;
private PreparedStatement getUserSalt = null;
private boolean exist;
private String status;
@Resource( name = "jdbc/Movies")
DataSource dataSource;
@PostConstruct
@Override
public void prepareStatements() {
try {
if (dataSource == null) {
throw new SQLException("Unable to obtain DataSource");
}
connection = dataSource.getConnection();
if (connection == null) {
throw new SQLException("Unable to connect to DataSource");
}
try {
getUser = connection.prepareStatement(
"SELECT STATUS "
+ "FROM Users"
+ "WHERE NAMEU= ? and HASHP=?");
addUser = connection.prepareStatement(
"insert into Users values ('?','?','?','?')");
getUserSalt = connection.prepareStatement(
"SELECT SALTP "
+ "FROM Users"
+ "WHERE NAMEU= ? ");
} catch (SQLException sqlException) {
sqlException.printStackTrace();
System.exit(1);
}
} catch (SQLException sqlException) {
sqlException.printStackTrace();
System.exit(1);
}
}
@Override
public void addUser(String name, String password, String status) {
String salt = Security.salt();
try {
addUser.setString(1, name);
addUser.setString(2, Security.hash(password + salt));
addUser.setString(3, salt);
addUser.setString(4, status);
addUser.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(Userejb.class.getName()).log(Level.SEVERE, null, ex);
}
}
....
UserejbLocal接口:
public interface UserejbLocal {
void prepareStatements();
void addUser(String name, String password, String status);
public java.lang.String getUser(java.lang.String name, java.lang.String password);
}
谢谢你的帮助 问题在于SQLSyntaxErrorException。只需要查看服务器日志(输出选项卡,glassfish服务器选项卡),看看问题出在哪里。正在修复正确呈现页面的SQL语法。查询中的
用户
和位置
之间缺少空格。这导致查询被解析为:
SELECT STATUS FROM UsersWHERE NAMEU ...............
好的,问题是它由于某种原因无法访问数据库。可能是因为数据库密码吗?你的问题太广泛了:如果是数据层失败了,那么JSF部分就令人困惑了。快速查看有状态会话bean:缓存的prepared语句可能有问题。尝试准备并执行
addUser
中的语句。无论如何,prepareStatements
不应该是公共界面的一部分。我提供了所有信息,因为我一开始不知道问题出在哪里。但是现在我发现问题出在访问数据库上,尽管我不知道问题出在哪里。我创建了连接池(以javax.sql.DataSource作为资源类型,org.apache.derby.jdbc.ClientDataSource40作为数据源类名,并成功地从服务器管理控制台ping到它),还创建了jndc资源,JNDI名称为:jdbc/Movies Name,以前创建的池名称为池名)
@Stateful
@Local(UserejbLocal.class)
public class Userejb implements UserejbLocal {
private Connection connection = null;
private PreparedStatement getUser = null;
private PreparedStatement addUser = null;
private PreparedStatement getUserSalt = null;
private boolean exist;
private String status;
@Resource( name = "jdbc/Movies")
DataSource dataSource;
@PostConstruct
@Override
public void prepareStatements() {
try {
if (dataSource == null) {
throw new SQLException("Unable to obtain DataSource");
}
connection = dataSource.getConnection();
if (connection == null) {
throw new SQLException("Unable to connect to DataSource");
}
try {
getUser = connection.prepareStatement(
"SELECT STATUS "
+ "FROM Users"
+ "WHERE NAMEU= ? and HASHP=?");
addUser = connection.prepareStatement(
"insert into Users values ('?','?','?','?')");
getUserSalt = connection.prepareStatement(
"SELECT SALTP "
+ "FROM Users"
+ "WHERE NAMEU= ? ");
} catch (SQLException sqlException) {
sqlException.printStackTrace();
System.exit(1);
}
} catch (SQLException sqlException) {
sqlException.printStackTrace();
System.exit(1);
}
}
@Override
public void addUser(String name, String password, String status) {
String salt = Security.salt();
try {
addUser.setString(1, name);
addUser.setString(2, Security.hash(password + salt));
addUser.setString(3, salt);
addUser.setString(4, status);
addUser.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(Userejb.class.getName()).log(Level.SEVERE, null, ex);
}
}
....
public interface UserejbLocal {
void prepareStatements();
void addUser(String name, String password, String status);
public java.lang.String getUser(java.lang.String name, java.lang.String password);
}
SELECT STATUS FROM UsersWHERE NAMEU ...............