2014-10-02 35 views
1

我正在通過oracle中的Java EE 7的tutorial第一次訪問bean如何?

下面是一個簡單的表格,在輸入框中獲取用戶名:

<h:body> 
     <h:form> 
      <h:graphicImage url="#{resource['images:duke.waving.gif']}" 
          alt="Duke waving his hand"/> 
      <h2>Hello, my name is Duke. What's yours?</h2> 
      <h:inputText id="username" 
         title="My name is: " 
         value="#{hello.name}" 
         required="true" 
         requiredMessage="Error: A name is required." 
         maxlength="25" /> 
      <p></p> 
      <h:commandButton id="submit" value="Submit" action="response"> 
      </h:commandButton> 
      <h:commandButton id="reset" value="Reset" type="reset"> 
      </h:commandButton> 
     </h:form> 

我看到value="#{hello.name}"在代碼中使用。這條線做什麼?

這就是在tutorial link提到:

該網頁連接至你好通過表達式語言(EL)值表達式#{} hello.name,其中檢索名稱的值託管bean來自託管bean的屬性。

Q1)但第一次載入表單時,沒有名稱屬性附加到hello bean。所以應該返回null應該返回正確?

Q2)其次,輸入框中輸入的值如何綁定到hello bean的name屬性?

實際上,在表單提交後,頁面被重定向到「response.xhtml」,其中hello bean的名稱屬性的值以相同的方式獲取,例如。

回答

1

簡短的回答:

  • Q1:正確
  • Q2:
    1. 在每一個頁面渲染的元素,勢必將獲得的價值,通過Hello.getName()方法返回。
    2. 在每個表單提交(如果表單有效),Hello.setName(param)param被稱爲等於元素的value,勢必

較長的答案:

你有:

  1. Hello.java,該類標註了w第i個對response.xhtml


先決條件在 index.xhtml
  • 內部<h2>@Named@RequestScoped
  • <h:inputText value="#{hello.name}" />內部<h:form>

    • @NamedCDI annotation

    • 當部署應用程序時,服務器將「註冊」爲Hello.java作爲託管bean。

    • @Named可以作爲@Named(name="explicitHelloName"),但如果不提供參數,bean將被註冊爲「下套管類名」,那麼,你的應用程序部署後,我們有你好使用的地方它需要。

    • @RequestScoped說,每Hello實例的數據將「活」僅在請求 - 響應(見this answer的作用域詳細信息)。

    • This article極大地描述了JSF的生命週期。我們感興趣的是它的兩個失敗: RENDER_RESPONSEUPDATE_MODEL_VALUES


    讓我們走一步看一步:

    一瀏覽器的請求index.xhtml

    FacesServlet的的責任(因爲我們是在映射所有*.xhtml文件Faces Servletweb.xml)是建立html和回報作爲迴應。

    大樓由以下幾個階段(看here瞭解詳細信息),其中之一,渲染響應:

    1. 構建一個UIViewRoot
    2. 遞歸構建UIViewRoot的孩子。

    期間2)爲兒童,有一些EL表達式,這些表達式被「解決」。

    在你的情況,我們有表達,勢必會的UIInputvalueh:inputTextUIInput)。

    <h:inputText>將呈現爲HTML的<input type="text">

    FacesServlet「理解」該輸入的值應取自表示的值。 來獲取值:

    1. FacesServlet的 「問」 爲你好從容器(服務器)
    2. 集裝箱搜索註冊你好,發現Hello.java,實例化,並給予FacesServlet的。
    3. FacesServlet的要求getName()JavaBean convention獲得「名」)Hello實例和接收Hello的私人領域name,其類的實例化後null的價值。
    4. FacesServlet在沒有value的情況下寫入<input>,並在index.xhtml上看到空白輸入。

    II。當您按提交按鈕

    ...和表格有效,有UPDATE_MODEL階段(更詳細的here),。

    對於我們h:inputText組件FacesServlet的再次搜索你好,發現的Hello一個實例,並調用它setName(value)。 作爲<h:commandButtons>action屬性是response,瀏覽器將要接收response.xhtml的內容(這不是一個重定向,見this answer,所以,@RequestScoped你好沒有被重新創建)。


    三, response.xhtml

    ...有<h3>Hello, #{hello.name}</h3>,所以,FacesServlet必須按照前面所述解決它。

    但在當前請求的Hello已經被實例化,它是你進入到input值字段name已經被設置(在UPDATE_MODEL_VALUES階段),因此,<h3>Hello, YOUR_SUBMITTED_TO_INPUT_TEXT_VALUE</h3>寫入響應,並在瀏覽器中顯示。可以發現


    更多關於表達式的詳細here

    編輯

    如果您在使用index.xhtml<h:comandButton action="response?faces-redirect=true"/>,再經過II會有一個重定向至response.xhtml,並Hello豆成爲所以,你會看到「你好」(name將是null

  • +0

    從II到III,瀏覽器重定向是相同的請求o提出不同的要求。因爲當第一個請求中設置'#{hello.name}'並且在重定向之後,該bean可以爲空,因爲它是'@ requestscoped' – 2014-10-08 21:31:55

    +0

    從II到III沒有重定向,但是轉發;我編輯了答案。 – n1k1ch 2014-10-08 22:18:30

    +0

    這有幫助!謝謝 – 2014-10-08 22:21:22