我正在使用带有 Glassfish 3.1.2 的 NetBeans 7.1 来开发一个简单的 Java EE 6 Web 应用程序(一种地址簿)。我在网上广泛搜索了我的问题,但没有有用的结果。
我的应用程序使用 PrimeFaces 3.2 和 JSF 2.1.7。
文件 ContactsBean.java
package com.organizer.ejb;
import com.organizer.entity.Contact;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
@ManagedBean
@RequestScoped
public class ContactsBean {
private List<Contact> contacts;
private Contact contact=new Contact();
@PersistenceUnit(unitName="PersonalOrganizerJPA")
private EntityManagerFactory emf;
@Resource
private UserTransaction utx;
public ContactsBean()
{
}
public List<Contact> getContacts() {
EntityManager em = emf.createEntityManager();
Query query = em.createQuery("SELECT c FROM Contact c");
contacts = (List<Contact>)query.getResultList();
return contacts;
}
public void salva(ActionEvent event){
EntityManager em = emf.createEntityManager();
try {
utx.begin();
em.joinTransaction();
em.persist(contact);
utx.commit();
showGrowlInsMessage();
} catch (Exception e) {
try {
utx.rollback();
} catch (IllegalStateException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
} catch (SecurityException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
} catch (SystemException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
}
}finally{
em.close();
}
contact=null;
}
public void aggiorna(ActionEvent event){
EntityManager em = emf.createEntityManager();
try {
utx.begin();
em.joinTransaction();
em.merge(contact);
utx.commit();
showGrowlUpdMessage();
} catch (Exception e) {
try {
utx.rollback();
} catch (IllegalStateException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
} catch (SecurityException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
} catch (SystemException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
}
}finally{
em.close();
}
contact=null;
}
public void elimina(ActionEvent event){
EntityManager em = emf.createEntityManager();
try {
utx.begin();
em.joinTransaction();
Contact c = em.find(Contact.class, contact.getId());
em.remove(c);
utx.commit();
this.showGrowlDelMessage();
} catch (Exception e) {
try {
utx.rollback();
} catch (IllegalStateException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
} catch (SecurityException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
} catch (SystemException e1) {
showGrowlErrorMessage();
e1.printStackTrace();
}
}finally{
em.close();
}
contact=null;
}
public void setContacts(List<Contact> contacts) {
this.contacts = contacts;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
private void showGrowlUpdMessage(){
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Successful", "Contatto aggiornato con successo"));
}
private void showGrowlInsMessage(){
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Successful", "Contatto inserito con successo"));
}
private void showGrowlDelMessage(){
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Successful", "Contatto eliminato con successo"));
}
private void showGrowlErrorMessage(){
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Errore", "Operazione fallita"));
}
}
文件 web.xml
<?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>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>faces/ContactsPage.xhtml</welcome-file>
</welcome-file-list>
</web-app>
文件 ContactsPage.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Contacts</title>
<p:resources />
<style>
form{font-size:12px;}
</style>
</h:head>
<h:body>
<h:form>
<p:spacer height="10"></p:spacer>
<p:graphicImage value="Contacts" fontName="Tahoma" fontStyle="bold" fontSize="24"/>
<p:spacer height="10"/>
<p:panel header="Contacts">
<p:dataTable var="contact" value="#{contactsBean.contacts}" id="tbl"
selection="#{contactsBean.contact}" selectionMode="single"
update="updForm:updDisplay" onselectComplete="updDialog.show()"
paginator="true" rows="5">
<p:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{contact.name}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Cognome" />
</f:facet>
<h:outputText value="#{contact.surname}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Telefono" />
</f:facet>
<h:outputText value="#{contact.telephone}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Professione" />
</f:facet>
<h:outputText value="#{contact.job}" />
</p:column>
<f:facet name="footer">
<h:panelGroup>
<h:commandLink>
<p:graphicImage value="/images/excel.png" style="border:none" />
<p:dataExporter type="xls" target="tbl" fileName="contacts"
pageOnly="true" />
</h:commandLink>
<h:commandLink>
<p:graphicImage value="/images/pdf.png" style="border:none" />
<p:dataExporter type="pdf" target="tbl" fileName="contacts"
pageOnly="true" />
</h:commandLink>
<h:commandLink>
<p:graphicImage value="/images/csv.png" style="border:none" />
<p:dataExporter type="csv" target="tbl" fileName="contacts"
pageOnly="true" />
</h:commandLink>
<h:commandLink>
<p:graphicImage value="/images/xml.png" style="border:none" />
<p:dataExporter type="xml" target="tbl" fileName="contacts"
pageOnly="true" />
</h:commandLink>
</h:panelGroup>
</f:facet>
</p:dataTable>
</p:panel>
</h:form>
<p:spacer height="10" />
<h:form id="updForm">
<h:panelGrid columns="2">
<p:commandButton oncomplete="newDialog.show()" value="Nuovo Contatto"
update="newDisplay" ajax="true" />
<p:themeSwitcher initialText="Cambia tema"></p:themeSwitcher>
</h:panelGrid>
<p:dialog widgetVar="updDialog" header="Contatto" width="430"
height="220" modal="true">
<p:outputPanel id="updDisplay">
<h:inputHidden value="#{contactsBean.contact.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="Nome" />
<p:inputText value="#{contactsBean.contact.name}"></p:inputText>
<h:outputLabel value="Cognome" />
<p:inputText value="#{contactsBean.contact.surname}"></p:inputText>
<h:outputLabel value="Telefono" />
<p:inputText value="#{contactsBean.contact.telephone}"></p:inputText>
<h:outputLabel value="Professione" />
<p:inputText value="#{contactsBean.contact.job}"></p:inputText>
</h:panelGrid>
<p:commandButton value="Aggiorna" ajax="true"
actionListener="#{contactsBean.aggiorna}" update="tbl,growl"
onclick="updDialog.close()"></p:commandButton>
<p:commandButton value="Elimina" ajax="true"
actionListener="#{contactsBean.elimina}" update="tbl,growl"
onclick="updDialog.close()"></p:commandButton>
<p:growl id="growl" showDetail="true" />
</p:outputPanel>
</p:dialog>
</h:form>
<h:form>
<p:dialog widgetVar="newDialog" header="Inserisci Contatto"
width="430" height="220" modal="true">
<p:outputPanel id="newDisplay">
<h:panelGrid columns="2">
<h:outputLabel value="Nome" />
<p:inputText value="#{contactsBean.contact.name}"></p:inputText>
<h:outputLabel value="Cognome" />
<p:inputText value="#{contactsBean.contact.surname}"></p:inputText>
<h:outputLabel value="Telefono" />
<p:inputText value="#{contactsBean.contact.telephone}"></p:inputText>
<h:outputLabel value="Professione" />
<p:inputText value="#{contactsBean.contact.job}"></p:inputText>
</h:panelGrid>
<p:commandButton value="Salva" ajax="true"
actionListener="#{contactsBean.salva}" update="tbl"
onclick="newDialog.close()"></p:commandButton>
</p:outputPanel>
</p:dialog>
</h:form>
</h:body>
</html>
这就是 GlassFish 给我的警告。
Warning: WEB9052: Unable to load class com.organizer.ejb.ContactsBean, reason: java.lang.ClassNotFoundException: com.organizer.ejb.ContactsBean
异常堆栈跟踪。
Warning: Cannot create update center Image for C:\glassfish3; Update Center functionality will not be available in Admin Console
Information: p:resources component is deprecated and has no use in PrimeFaces 2.0 as JSF 2.0 resource apis are used instead to place resources on page.
Grave: Error Rendering View[/ContactsPage.xhtml]
javax.el.PropertyNotFoundException: /ContactsPage.xhtml @28,31 value="#{contactsBean.contacts}": Target Unreachable, identifier 'contactsBean' resolved to null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:100)
at org.primefaces.component.datatable.DataTable.isLazy(DataTable.java:968)
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:191)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:108)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:61)
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45)
at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:185)
at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:108)
at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:55)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1786)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
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:594)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)
编辑:这是整个应用程序的结构。 关联