【发布时间】:2013-04-29 15:45:44
【问题描述】:
简而言之,这是我的问题:我正在尝试创建一个 JSF 页面和一个 Java 类来连接到数据库(postgres)。目标是从数据库中提取结果,然后在 JSF 上显示,很简单吧?
我的代码如下:
JSF 是:
<?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:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
Hello from Facelets
<p>${calendar.form}</p>
</h:body>
</html>
至于Java:
import java.sql.*;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
@ManagedBean(name="calendar")
@ViewScoped
@RequestScoped
public class Calendar {
private String form = null;
public String getForm() {
return form;
}
public void setForm(String form) {
this.form = form;
}
public Calendar(){
/* Connexion à la base de données */
String url = "jdbc:postgres://localhost:5432/postgres";
String utilisateur = "postgres";
String motDePasse = "123456789";
Connection connexion = null;
try {
connexion = DriverManager.getConnection( url, utilisateur, motDePasse );
/* Ici, nous placerons nos requêtes vers la BDD */
/* ... */
/* Création de l'objet gérant les requêtes */
Statement statement = connexion.createStatement();
/* Exécution d'une requête de lecture */
ResultSet resultat = statement.executeQuery( "SELECT * FROM detaillant WHERE date= \"2013-04-25\" ;" );
resultat.next();
setForm(resultat.getString( "form" ));
/* Traiter ici les valeurs récupérées. */
} catch ( SQLException e ) {
/* Gérer les éventuelles erreurs ici */
} finally {
if ( connexion != null )
try {
/* Fermeture de la connexion */
connexion.close();
} catch ( SQLException ignore ) {
/* Si une erreur survient lors de la fermeture, il suffit de l'ignorer. */
}
}
}//END of constructor
}
在我的 web.xml 中,我确保从 JSF 页面(在我的例子中名为 index)启动我的应用程序,如下所示:
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
所以,我以为我已经拥有它,直到我运行整个过程只是遇到了一个小问题:页面出现了,但我仍然没有得到任何价值!
那么,有什么想法可以改变以使其正常工作吗?提前致谢!
编辑:
堆栈跟踪结果包含以下内容:
com.sun.faces.mgbean.ManagedBeanCreationException: Impossible dinstancier la classe Calendar.
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71)
at org.apache.el.parser.AstValue.getValue(AstValue.java:147)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at com.sun.faces.facelets.el.ELText$ELTextVariable.writeText(ELText.java:224)
at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:85)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: javax.faces.FacesException: java.sql.SQLException: No suitable driver found for jdbc:postgres://localhost:5432/postgres
at Calendar.<init>(Calendar.java:48)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at java.lang.Class.newInstance0(Class.java:374)
at java.lang.Class.newInstance(Class.java:327)
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188)
... 41 more
Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgres://localhost:5432/postgres
at java.sql.DriverManager.getConnection(DriverManager.java:604)
at java.sql.DriverManager.getConnection(DriverManager.java:221)
at Calendar.<init>(Calendar.java:27)
... 48 more
对于初学者来说,这是一个热盘哈哈...
【问题讨论】:
-
您如何访问您的页面?为什么不捕获 SQLException 以查看 PostgreSQL 连接代码中是否存在问题?此外,托管 bean 必须只有一个范围,您的有
@ViewScoped和@RequestScoped,删除最后一个。 -
好的,删除了@RequestScoped,还没有工作。关于 SQLException :我正在捕捉它,只是没有对它做任何事情:p 我添加了一个 println() 来查看它是否被调用,它似乎不是这样......你认为这是一个连接问题吗?我认为这是 jsf 的问题(或者我犯了一些错误,可以这么说......)。
-
好吧,展示你如何访问你的页面,也就是你在浏览器中写的地址
-
我已(如您所推荐)将这段代码添加到捕获异常括号中: System.out.println("erratum connectum !");并且它打开了,它是 erratum connectum ! (一开始没看到,估计是瞎了……)。至于访问页面:我只是将 xhtml 文件的名称添加到 web.xml 中的欢迎文件中,它正在工作,不必担心。所以连接的问题,想知道为什么......
-
您根本没有打印异常的堆栈跟踪。您正在打印当前的调用堆栈。这完全没有意义。在 catch 块内,执行
e.printStackTrace();或更好的throw new FacesException(e);。我强烈建议您暂停一下 JSF,这样您就可以直接了解基本的 Java 概念。 Oracle 有一个不错的在线 Java 教程,其中还包括处理异常。
标签: jsf managed-bean