仅在刷新JSF项目中的页面之后,才会在网页上填充来自PostgreSQL数据库的数据

时间:2019-07-17 11:12:47

标签: postgresql jsf

我正在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而第二次却没有?

0 个答案:

没有答案
相关问题