0

我在 JSF2 中用两页制作了简单的示例。在第一页上,我有带有 actionListener 的命令按钮通过接口类发布。目标是当我单击第一页上的按钮时,第二页将显示更改值。但是当第一次启动 Web 服务器(JBOSS)时,我得到了错误页面,直到我启动第二个页面。在这种情况下,第二页将以默认值显示。在第一页之后工作正常。即使我关闭第二页,一切工作正常。发生了什么,做了什么?以下是错误消息:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/ActionListenerWithInterface].[Faces Servlet]] (http--0.0.0.0-8080-1) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
at com.tutoriali.test.UserActionListener.processAction(UserActionListener.java:14) [classes:]
at com.sun.faces.facelets.tag.jsf.core.ActionListenerHandler$LazyActionListener.processAction(ActionListenerHandler.java:129) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UICommand.broadcast(UICommand.java:300) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_37]

这里是 xhtml 页面: FirstPage:

<!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"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head><title>JSF primer</title></h:head> 
<h:body> 
    <h1>Primer ActionListenera realizovan preko interface-a</h1>
    <h:form>
        <h2>ActionListener</h2>
        <hr />
        <h:commandButton id="SubmitButton" value="Submit" action="#{userData.showResult()}" >
            <f:actionListener type="com.tutoriali.test.UserActionListener"/>
        </h:commandButton>
    </h:form>
</h:body> 
</html>

这是第二页:

    <!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"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head><title>JSF primer</title></h:head> 
<h:body> 
    <h1>Primer kako se ostvaruje Action Listener preko interface-a</h1>
    <h2>Rezultat</h2>
    <hr />

        #{userData.data}

</h:body> 
</html>

这是接口类:

    package com.tutoriali.test;

import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;

public class UserActionListener implements ActionListener {

    @Override
    public void processAction(ActionEvent arg0) throws AbortProcessingException {

        UserData userData = (UserData)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("userData");
        userData.setData("Hello World!");
        System.out.println("******* We are in interface!*************");

    }

}

这是后端 Bean UserData.java:

package com.tutoriali.test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name="userData", eager=true)
@SessionScoped

public class UserData implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String data="Difoltna vrednost";

    public String showResult(){
        return "result";
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

}
4

0 回答 0