2013-10-11 22 views
0

我對JSF非常陌生,一直試圖讓它在最近一個小時左右工作。JSF堆棧異常或託管bean問題

我正在處理的這個示例程序應該顯示一個包含多種不同形式的網頁。它沒有問題(因爲它至少可以工作,我真的不知道語法的正確性),現在我使用託管bean實現了表單的一些功能。我們的目標是讓頁面顯示用戶在下面輸入的內容以顯示它已經通過,但似乎有某種* * config.xml問題,我無法弄清楚,因爲我在netbeans中創建的項目沒有任何類型的config.xml文件,它只有一個beans.xml文件和一個web.xml文件。我不確定我需要添加到beans.xml文件中的什麼(如果有的話),或者如果我需要自己創建一個新的xml文件,或者它完全不同。

我還應該提到的是,當我運行這個程序,GUI部分運行,我可以輸入的東西到箱子,檢查單選按鈕等,但,當我點擊「註冊」按鈕,沒有任何反應

這是我的文件。

的index.xhtml

 <?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:f="http://java.sun.com/jsf/core"> 
    <h:head> 
    <title>Student Registration Form</title> 
    </h:head> 
    <h:body> 
    <h:form> 
     <!-- Use h:graphicImage --> 
     <h3>Student Registration Form 
     <h:graphicImage name="usIcon.gif" library="image"/> 
     </h3> 

     <!-- Use h:panelGrid --> 
     <h:panelGrid columns="6" style="color:green"> 
     <h:outputLabel value="Last Name"/> 
     <h:inputText id="lastNameInputText" 
        value="#{Registration.lastName}"/> 
     <h:outputLabel value="First Name" /> 
     <h:inputText id="firstNameInputText" 
        value="#{Registration.firstName}"/> 
     <h:outputLabel value="MI" /> 
     <h:inputText id="miInputText" size="1" 
        value="#{Registration.mi}"/> 
     </h:panelGrid> 

     <!-- Use radio buttons --> 
     <h:panelGrid columns="2"> 
     <h:outputLabel>Gender </h:outputLabel>   
     <h:selectOneRadio id="genderSelectOneRadio" 
          value="#{Registration.gender}"> 
      <f:selectItem itemValue="Male" 
         itemLabel="Male"/> 
      <f:selectItem itemValue="Female" 
         itemLabel="Female"/> 
     </h:selectOneRadio> 
     </h:panelGrid> 

     <!-- Use combo box and list --> 
     <h:panelGrid columns="4"> 
     <h:outputLabel value="Major "/> 
     <h:selectOneMenu id="majorSelectOneMenu" 
         value="#{Registration.major}"> 
      <f:selectItem itemValue="Computer Science"/> 
      <f:selectItem itemValue="Mathematics"/> 
     </h:selectOneMenu> 
     <h:outputLabel value="Minor "/> 
     <h:selectManyListbox id="minorSelectManyListbox" 
          value="#{Registration.minor}"> 
      <f:selectItem itemValue="Computer Science"/> 
      <f:selectItem itemValue="Mathematics"/> 
      <f:selectItem itemValue="English"/> 
     </h:selectManyListbox> 
     </h:panelGrid> 

     <!-- Use check boxes --> 
     <h:panelGrid columns="4"> 
     <h:outputLabel value="Hobby: "/> 
     <h:selectManyCheckbox id="hobbySelectManyCheckbox" 
           value="#{Registration.hobby}"> 
      <f:selectItem itemValue="Tennis"/> 
      <f:selectItem itemValue="Golf"/> 
      <f:selectItem itemValue="Ping Pong"/> 
     </h:selectManyCheckbox> 
     </h:panelGrid> 

     <!-- Use text area --> 
     <h:panelGrid columns="1"> 
     <h:outputLabel>Remarks:</h:outputLabel> 
     <h:inputTextarea id="remarksInputTextarea" 
         style="width:400px; height:50px;" 
         value="#{Registration.remarks}"/> 
     </h:panelGrid> 

     <!-- Use command button --> 
     <h:commandButton value="Register" /> 
     <br /> 
     <h:outputText escape="false" style="color:red" 
        value="#{Registration.response}" /> 
    </h:form> 
    </h:body> 
</html> 

Registration.java

package jsf2demo; 

import javax.inject.Named; 
import javax.enterprise.context.RequestScoped; 
import javax.faces.bean.ManagedBean; 

@ManagedBean 
@javax.faces.bean.RequestScoped 

public class Registration { 
    private String lastName; 
    private String firstName; 
    private String mi; 
    private String gender; 
    private String major; 
    private String[] minor; 
    private String[] hobby; 
    private String remarks; 

    public String getLastName() { 
    return lastName; 
    } 

    public void setLastName(String lastName) { 
    this.lastName = lastName; 
    } 

    public String getFirstName() { 
    return firstName; 
    } 

    public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 

    public String getMi() { 
    return mi; 
    } 

    public void setMi(String mi) { 
    this.mi = mi; 
    } 

    public String getGender() { 
    return gender; 
    } 

    public void setGender(String gender) { 
    this.gender = gender; 
    } 

    public String getMajor() { 
    return major; 
    } 

    public void setMajor(String major) { 
    this.major = major; 
    } 

    public String[] getMinor() { 
    return minor; 
    } 

    public void setMinor(String[] minor) { 
    this.minor = minor; 
    } 

    public String[] getHobby() { 
    return hobby; 
    } 

    public void setHobby(String[] hobby) { 
    this.hobby = hobby; 
    } 

    public String getRemarks() { 
    return remarks; 
    } 

    public void setRemarks(String remarks) { 
    this.remarks = remarks; 
    } 

    public String getResponse() { 
    if (lastName == null) 
     return ""; // Request has not been made 
    else { 
     String allMinor = ""; 
     for (String s: minor) { 
     allMinor += s + " "; 
     } 

     String allHobby = ""; 
     for (String s: hobby) { 
     allHobby += s + " "; 
     } 

     return "<p style=\"color:red\">You entered <br />" + 
     "Last Name: " + lastName + "<br />" + 
     "First Name: " + firstName + "<br />" + 
     "MI: " + mi + "<br />" + 
     "Gender: " + gender + "<br />" + 
     "Major: " + major + "<br />" + 
     "Minor: " + allMinor + "<br />" + 
     "Hobby: " + allHobby + "<br />" + 
     "Remarks: " + remarks + "</p>"; 
    } 
    } 
} 
+0

你的按鈕既沒有行動,也沒有一個ActionListener。我想你必須綁定一個方法才能在用戶點擊按鈕時運行。 –

回答

0

嘗試改變:

@javax.faces.bean.RequestScoped 

@RequestScoped 

欲瞭解更多,你可以看到this @BalusC答案。

+1

他有兩個導入,但他實際上只使用Faces註釋('ManagedBean'和'RequestScoped'),所以他應該*確定,我認爲。也就是說,最好不要導入它們,並消除可能的歧義。 –

3

JSF框架的目標之一是支持「MVC」架構,這就是爲什麼它提供了許多功能和技術來闡述MVC原則。這就是爲什麼不強烈建議將視圖與控制器層混合,因此您應該在這兩個層之間分開,因爲每個層都有特殊的角色。 首先,如果您使用JSF 2.X版本,則不應添加/修改任何其他xml文件。 爲了說明您的示例中的註冊過程,您可以在名爲result.xhtml的第二個簡單頁面中顯示註冊填充信息。

public String response(){ 
    return "result?faces-redirect=true"; 
} 

通過上面可以簡單地然後被寫入return "result";的方法提供的結果字符串,在瀏覽器欄的URI ADRESS不會同時轉發到目的地改變:一是通過剛剛response()與內容替換方法getResponse()頁。否則,如果字符串(頁面的名稱)後面緊跟faces-redirect=true(如示例),則URI地址將被更改,並且目標的名稱也將顯示在瀏覽器地址欄中。

請參閱:在JSF轉發和重定向之間
區別:http://www.mkyong.com/jsf2/jsf-page-forward-vs-page-redirect/

然後,在index.xhtml,你沒有在你的例子action進行必要的屬性做出的<h:commandButton />,所以你應該有更換的最後一部分:

<h:commandButton value="Register" style="color:red" action="#{Registration.response()}" /> 

當然,你也應該忽略在index.xhtml最後<h:outputText />標籤。

最後,創建新頁面result.xhtml顯示註冊信息:

<?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:f="http://java.sun.com/jsf/core"> 
<head> 
    <title>Registration informations</title> 
</head> 
<body> 

    <h2>Your registration informations :</h2> 

    <h:outputText value="Last name : #{Registration.lastName }" /><br /> 
    <h:outputText value="First name : #{Registration.firstName }" /><br /> 
    <h:outputText value="MI : #{Registration.mi}" /><br /> 
    ... 

</body> 
</html> 
+2

爲了學習的目的,我會發布'response'方法的兩個實現:一個簡單地返回'「result」'和另一個返回'「result?faces-redirect = true」'並解釋兩者之間的區別或者指向這是涵蓋和解釋的鏈接。除此之外,很好的答案。 –

+0

你說得對。發佈編輯。謝謝。 – Omar