2013-03-04 105 views
0

我想嘗試一個簡單的例子來啓用和禁用基於表單提交的按鈕。如果有人還可以將jsf:id的概念指向我,因爲我將純html5與jsf混合在一起。啓用禁用按鈕在jsf 2.2

下面是相關代碼:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:jsf="http://java.sun.com/jsf" 
    xmlns:f="http://java.sun.com/jsf/core"> 
    <head jsf:id="head"> 
     <title>Putting it all together </title> 
     <!-- script jsf:target="body" jsf:name="js.js"/> 
     <link jsf:name="css.css" rel="stylesheet" type="text/css" /--> 
    </head> 
    <body jsf:id="body"> 
     <form jsf:id="form" jsf:prependId="false"> 
      <label jsf:for="name">Name </label> 
      <input jsf:id="name" type="text" jsf:value="#{complex.name}"> 
       <f:ajax execute="@this" render="progress"/> 
      </input> 
      <label jsf:for="tel">Tel </label> 
      <input jsf:id="tel" type="tel" jsf:value="#{complex.tel}"> 
       <f:ajax execute="@this" render="progress"/> 
      </input> 

      <label jsf:for="email">Email </label> 
      <input jsf:id="email" type="email" jsf:value="#{complex.email}"> 
       <f:ajax execute="@this" render="progress"/> 
      </input> 

      <label for="progress">Progress </label> 
      <progress jsf:id="progress" max="3">#{complex.progress} of 3 </progress> 


      <input jsf:id="submit" type="submit" value="submit"> 
       <f:ajax execute="@this" render="login" event="click" listener="#{complex.process}" /> 
      </input> 

      <!-- label jsf:id="status"></label--> 
      <button jsf:id="login" disabled="#{complex.status}">Login</button> 

     </form> 
    </body> 
</html> 

管理bean是:

package mypackage.bean; 
import java.io.Serializable; 

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

@ManagedBean 
@SessionScoped 
public class Complex implements Serializable { 
    public Complex() {} 

    private String name; 
    private String tel; 
    private String email; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getTel() { 
     return tel; 
    } 
    public void setTel(String tel) { 
     this.tel = tel; 
    } 
    public String getEmail() { 
     return email; 
    } 
    public void setEmail(String email) { 
     this.email = email; 
    } 
    private boolean status; 

    public void process(AjaxBehaviorEvent event) { 
     status = !status; 
    } 


    public boolean isStatus() { 
     return status; 
    } 

    public boolean getStatus() { 
     return status; 
    } 

    public void setStatus(boolean status) { 
     this.status = status; 
    } 

    public String getProgress() { 
     int progress = 0; 
     if(name != null) { 
      progress++; 
     } 
     if(tel != null) { 
      progress++; 
     } 
     if(email != null) { 
      progress++; 
     } 
     return progress + ""; 
    } 


} 

下面是錯誤打印到網頁:

HTTP Status 500 - java.lang.Boolean cannot be cast to java.lang.String 

type Exception report 

message java.lang.Boolean cannot be cast to java.lang.String 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

javax.servlet.ServletException: java.lang.Boolean cannot be cast to java.lang.String 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 

root cause 

java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
    com.sun.faces.renderkit.html_basic.HtmlResponseWriter.getAttributeValue(HtmlResponseWriter.java:1210) 
    com.sun.faces.renderkit.html_basic.HtmlResponseWriter.flushAttributes(HtmlResponseWriter.java:1170) 
    com.sun.faces.renderkit.html_basic.HtmlResponseWriter.closeStartIfNecessary(HtmlResponseWriter.java:1112) 
    com.sun.faces.renderkit.html_basic.HtmlResponseWriter.writeText(HtmlResponseWriter.java:935) 
    com.sun.faces.facelets.compiler.LiteralTextInstruction.write(LiteralTextInstruction.java:76) 
    com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82) 
    com.sun.faces.facelets.compiler.UILeaf.encodeAll(UILeaf.java:183) 
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176) 
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:900) 
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1847) 
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176) 
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:900) 
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1847) 
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1850) 
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1850) 
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443) 
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:202) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) 

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.35 logs. 
Apache Tomcat/7.0.35 
+0

因爲我不使用JSF,所以我不能把它固定下來,但它必須使用''。關於'complex.status'是一個布爾值的東西正在拋棄它。 – Makoto 2013-03-04 05:57:55

+0

您可以使用查看範圍 – Jaider 2013-03-23 04:38:24

+0

@Jaider該響應具有有效的屬性值,但仍不反映在UI上。我想用命令按鈕更有可能解決它。 – Miten 2013-03-24 13:59:31

回答

5

你的代碼的關鍵部分是

<button jsf:id="login" disabled="#{complex.status}">Login</button> 

,然後這個異常

java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 

現在它意味着<button>標籤,disabled屬性的值不是booleanString
所以這個屬性的值是disabled="disabled"
see this question as well處理HTML5的disabled屬性
您需要設置管理bean的字符串值並將status屬性聲明爲String而不是boolean

+0

我更改爲字符串的狀態屬性,現在錯誤消失,但如何啓用按鈕。基本上提交我嘗試處理切換行爲,以瞭解如何控制它。如果我返回空字符串登錄按鈕仍然保持禁用。 - Miten。 – Miten 2013-03-04 06:45:37

+0

爲此目的,你需要發佈一個新的線程。請接受這個答案,如果它幫助你出來,併爲你的下一個問題開始一個新的線程。順便說一下,它不應該繼續其禁用的行爲,當你返回空String.Keep記住,要啓用,不要返回空字符串,而要返回一個由空字符串初始化的字符串。類似狀態的值應該是'status =「'' – Freak 2013-03-04 06:47:36

+0

public void process(AjaxBehaviorEvent event){ \t \t System.out.println(」listener process called「); \t \t status =(status ==「disabled」?「」:「disabled」); \t}所以我確實返回status =「」;正如你所提到的,但按鈕仍然被禁用。 – Miten 2013-03-04 06:57:13