我正在Eclipse中进行一个JSF项目,该项目从PostgreSQL数据库中获取数据并用它填充网页。该代码看起来不错,但问题是只有刷新后该页面才会填充数据。以下是我到目前为止尝试过的内容:
Author.java
package jsf.postgres.db.test;
public class Author
{
public String authorID;
public String name;
public String getAuthorID()
{
return authorID;
}
public void setAuthorID(String authorID)
{
this.authorID = authorID;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
DBHelper.java
package jsf.postgres.db.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
@SessionScoped
@ManagedBean
public class DBHelper implements Serializable
{
private static final long serialVersionUID = 1L;
private final String url = "jdbc:postgresql://localhost:5432/postgres";
private final String user = "postgres";
private final String password = "postgres";
public static int queryType = 0;
public static final int QUERY_TYPE_SELECT = 1;
public static final int QUERY_TYPE_INSERT = 2;
public static final int QUERY_TYPE_UPDATE = 3;
public static final int QUERY_TYPE_ALTER = 4;
public String query = "";
Connection conn = null;
public Connection connect()
{
try
{
conn = DriverManager.getConnection(url, user, password);
System.out.println("Connected to Database");
}
catch(SQLException e)
{
System.out.println("Database Connection Failed - " + e.getMessage());
}
return conn;
}
public ResultSet execQuery(String receivedQuery, int QUERY_TYPE_SELECT) throws SQLException
{
ResultSet res = null;
try
{
PreparedStatement stmt = conn.prepareStatement(receivedQuery);
res = stmt.executeQuery();
return res;
}
catch(SQLException e)
{
e.printStackTrace();
System.out.println("Unable to execute SELECT Query");
return null;
}
}
public List<Author> getAuthorList() throws SQLException
{
conn = connect();
queryType = QUERY_TYPE_SELECT;
List<Author> list = new ArrayList<Author>();
query = "SELECT * FROM public.authors;";
ResultSet result = execQuery(query, QUERY_TYPE_SELECT);
while(result.next())
{
Author auth = new Author();
auth.setAuthorID(result.getString("id"));
auth.setName(result.getString("name"));
list.add(auth);
}
return list;
}
}
index.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:head>
<h:outputStylesheet library="css" name="table-style.css"/>
</h:head>
<h:body>
<h:dataTable value="#{dBHelper.getAuthorList()}" var="c"
styleClass="order-table"
headerClass="order-table-header"
rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">Author - ID</f:facet>#{c.authorID}
</h:column>
<h:column>
<f:facet name="header">Name</f:facet>#{c.name}
</h:column>
</h:dataTable>
</h:body>
</html>
启动项目后的页面: Link to malfunctioning page
刷新后的页面: Link to error free page
这是启动项目后的控制台消息:
INFO: Creating instance of jsf.postgres.db.test.DBHelper
Database Connection Failed - No suitable driver found for jdbc:postgresql://localhost:5432/postgres
Jul 17, 2019 9:59:36 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/jsf.postgres.db.test] threw exception [javax.el.ELException: java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at jsf.postgres.db.test.DBHelper.execQuery(DBHelper.java:53)
at jsf.postgres.db.test.DBHelper.getAuthorList(DBHelper.java:71)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:158)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:79)
at org.apache.el.parser.AstValue.getValue(AstValue.java:159)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:96)
at javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:246)
at javax.faces.component.UIData.getValue(UIData.java:2028)
at javax.faces.component.UIData.createDataModel(UIData.java:1976)
at javax.faces.component.UIData.getDataModel(UIData.java:1953)
at javax.faces.component.UIData.getRowCount(UIData.java:478)
at org.apache.myfaces.shared.renderkit.html.HtmlTableRendererBase.encodeInnerHtml(HtmlTableRendererBase.java:328)
at org.apache.myfaces.shared.renderkit.html.HtmlTableRendererBase.encodeChildren(HtmlTableRendererBase.java:198)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:549)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:749)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:758)
at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1900)
at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:115)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
以及刷新页面后:
Connected to Database
从DBHelper.java中可以明显看出
对于数据库驱动程序,我正在使用:
postgresql-42.2.6.jar
[编辑]
乍看之下,这似乎是NullPointerException,但刷新页面后,该异常就会消失,并且页面会很好地加载数据。据我所知,NullPointerExceptions是持久的,但在这种情况下似乎不是。为什么我的数据库查询逻辑在页面第一次加载时得到NullPointerException而第二次却没有?