0

私はJSFに非常に慣れていないため、これを機能させるために過去1時間ほど試してきました。

私が取り組んでいるこのサンプル プログラムは、いくつかの異なるフォームを含む Web ページを表示することになっています。それはうまくいきます(少なくとも機能するので、構文がどれほど正しいかは本当にわかりません)。今、マネージドBeanを使用してフォームにいくつかの機能を実装しました。目標は、ユーザーが下に入力した内容をページに表示して、それが通過したことを示すことですが、netbeans で作成したプロジェクトが解決しないため、特定できない* *config.xml の問題があるようです。任意の種類の 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>

登録.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>"; 
    }
  }
}
4

2 に答える 2

3

JSF フレームワークの目標の 1 つは、「MVC」アーキテクチャをサポートすることです。そのため、JSF フレームワークは、MVC の原則を詳しく説明するための非常に多くの機能とテクノロジを提供します。そのため、ビューとコントローラー層を混在させることは強く推奨されません。各層には特別な役割があるため、これら 2 つの層を分離する必要があります。まず、JSF 2.X バージョンを使用している場合は、他の xml ファイルを追加/変更しないでください。例で登録プロセスを説明するために、たとえば、登録情報を という名前の 2 番目の単純なページに表示できますresult.xhtml。まず、メソッドをコンテンツgetResponse()だけに置き換えます。response()

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

上記の方法で提供される結果の文字列は単純に記述できますreturn "result";。ブラウザ バーの URI アドレスは、宛先ページへの転送中に変更されません。または、例のように文字列 (ページの名前) の後に続くfaces-redirect=true場合は、URI アドレスが変更され、宛先の名前もブラウザーのアドレス バーに表示されます。

参照:
JSF での転送とリダイレクトの違い: http://www.mkyong.com/jsf2/jsf-page-forward-vs-page-redirect/

次に、 で、例で不要な属性をindex.xhtml作成したため、最後の部分を次のように置き換える必要があります。<h:commandButton />action

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

<h:outputText />そしてもちろん、 の最後のタグも省略する必要がありますindex.xhtml

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>
于 2013-10-11T19:21:19.923 に答える