0

我用 ajax 事件编写了我的第一个 JSF 页面,但没有工作;当提交表单异常发生时 IllegalStateException 想法是在选中复选框时更改激活写作的 inputText 的颜色。看看下面的内容。

    <!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Ins Student</title> 
</h:head>
    <h:form id="windowPrinc" prependId="false">
        <h:panelGrid id="griglia" columns="4">    
            <h:outputLabel value="Matricola....................:"></h:outputLabel>
                <h:inputText id="id_matricola" style="background-color:#{controllerInsertStudent.color_idStudente};border-style:solid; 
                        border-color:Brown;border-width:medium;"
                        readonly="#{!controllerInsertStudent.forzaMatricola}" title="matricola dello studente"
                        value="#{controllerInsertStudent.idStudente}">  
                </h:inputText>       

            <h:outputLabel value=" Forza Matricola...........:"/>  
            <h:selectBooleanCheckbox id="id_checkBox"  value="#{controllerInsertStudent.forzaMatricola}">
                <f:ajax>  execute="id_checkBox" listener="#{controllerInsertStudent.changeForzaMatricola}" render="id_matricola" </f:ajax>  
            </h:selectBooleanCheckbox>
        </h:panelGrid>  
   <h:outputLabel value="Nome:........................:" />
        <h:inputText id="id_nome" style="border-style:solid;border-color:Brown;border-width:medium;" value="#{controllerInsertStudent.nome}">       
        </h:inputText>
    <h:commandButton value="Inserisci" action="#{controllerInsertStudent.CreateStudente}">
    <f:ajax execute="@form"  />
   </h:commandButton>
    </h:form>
</html>

这个托管 bean

@ManagedBean
@ViewScope
public class ControllerInsertStudent {
            FacesContext ctx = FacesContext.getCurrentInstance();   
        private Long idStudente; 
            // etc.
        public Boolean getForzaMatricola()
        {
            return forzaMatricola;
        }


        public void setForzaMatricola(Boolean forzaMatricola)
        {
            this.forzaMatricola = forzaMatricola;

        }

        public void changeForzaMatricola(AjaxBehaviorEvent ev) throws AbortProcessingException
        {
            // dummy
        }
      public String CreateStudente()
  {

    String value = ctx.getExternalContext().getRequestParameterMap().get("id_matricola");
    if(!value.equals(""))
        this.idStudente = new Long(value);
            // etc.
    }

}

堆栈错误(控制台 Eclipse)

17:54:52,916 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http-  localhost-127.0.0.1-8080-1) #{controllerInsertStudent.CreateStudente}: java.lang.IllegalStateException: javax.faces.FacesException: #{controllerInsertStudent.CreateStudente}: java.lang.IllegalStateException
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.component.UICommand.broadcast(UICommand.java:315) [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(Thread.java:722) [rt.jar:1.7.0_13]
 Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) [jsf-impl-2.1.7-jbossorg-2.jar:]
... 20 more
 Caused by: java.lang.IllegalStateException
at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:655) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.context.FacesContextImpl.getExternalContext(FacesContextImpl.java:140) [jsf-impl-2.1.7-jbossorg-2.jar:]
at org.controllers.beans.ControllerInsertStudent.CreateStudente(ControllerInsertStudent.java:237) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_13]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_13]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_13]
at java.lang.reflect.Method.invoke(Method.java:601) [rt.jar:1.7.0_13]
at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
... 21 more
4

1 回答 1

1

我将忽略代码中的红鲱鱼错误地<f:ajax>在标签本身之外拥有标签属性,这将导致监听器方法永远不会被调用。但是,这与堆栈跟踪相矛盾,因此表明您已经在实际代码中解决了问题,但没有费心相应地更新问题,因此仍然保留了红鲱鱼,这使得问题可能令人困惑和无法回答。

回到堆栈跟踪中可见的具体问题:

Caused by: java.lang.IllegalStateException
    at com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:655) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at com.sun.faces.context.FacesContextImpl.getExternalContext(FacesContextImpl.java:140) [jsf-impl-2.1.7-jbossorg-2.jar:]
    at org.controllers.beans.ControllerInsertStudent.CreateStudente(ControllerInsertStudent.java:237) [classes:]

这表明您错误地将FacesContext前一个请求的 获取为支持 bean 的实例变量,该 bean 被放置在比请求范围更广的范围内。

换句话说,你有一个

@ManagedBean
@ViewScoped // Or session or application scoped.
public class ControllerInsertStudent {

    private FacesContext context = FacesContext.getCurrentInstance();

    public void CreateStudente() { // Eeeek, method name starts with uppercase? Fix it!
        // ...

        ExternalContext externalContext = context.getExternalContext(); // Fail!

        // ...
    }

}

这是绝对不正确的。这样的 bean 是在与调用其操作的 HTTP 请求不同的 HTTP 请求中创建的。您不应该使用FacesContext不同 HTTP 请求的实例。内部FacesContext存储为ThreadLocal<FacesContext>服务于 HTTP 请求的线程中,该请求在请求结束时被释放/丢弃,因此在任何其他线程中不再有效(阅读:任何其他 HTTP 请求)。

您应该获取它 threadlocal (阅读:在方法块内),而不是将其分配为比单个 HTTP 请求寿命更长的对象的实例变量,例如视图范围的托管 bean。

@ManagedBean
@ViewScoped // Or session or application scoped.
public class ControllerInsertStudent {

    public void CreateStudente() { // Eeeek, method name starts with uppercase? Fix it!
        // ...

        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext externalContext = context.getExternalContext(); // OK!

        // ...
    }

}

但是,我不确定这与迄今为止发布的显示请求范围 bean 的代码有何关系。看起来你在用代码准备问题时又一次粗心了。即到目前为止显示的代码根本不是真正的代码,或者与最初的问题完全无关,因此您混淆了各种问题。

于 2013-05-28T16:47:02.170 回答