2011-10-24 59 views
1

什麼是最好的非骨架(僅JSP/Servlet的)的方式來創建這樣的形式,它可以:預填充,並重新顯示HTML表單

  1. 預填充從數據庫加載默認值/數據
  2. 重新顯示未能驗證的提交值

看起來相當直接的做一個或另一個,但創建一個同時支持這兩個表單是棘手的。

例如使用

${param.scheduledDate} 

重新顯示驗證失敗的日期的偉大工程,但不能很容易地在頁面加載編程設置。相反地​​,

${myBean.scheduledDate} 

工作很大,用於顯示從數據庫加載的值,但由於bean使用類型日期,而不是串的對象不能重新顯示驗證失敗的數據。

有幾件事情浮現在腦海中,但非似乎真的那麼好:

  • 使用中間豆與只是字符串
  • 使用Servlet過濾器設置在頁面加載參數

回答

2

在視圖方面做。使用條件運算符?:在EL:

<input name="foo" value="${fn:escapeXml(empty bean.foo ? param.foo : bean.foo)}" /> 

注意,我認爲不像GET POST請求不預填充${bean}驗證成功之前。

這種冗長是MVC框架存在的原因之一。例如,JSF通過EditableValueHolder接口完全透明地處理該接口,該接口由其他UIInput組件實現。

+0

這可能工作,但它似乎會有一些限制,如你只能使用一個請求範圍的bean和bean屬性不能爲空/空。 – Ryan

+1

+1用於提示MVC框架。 – Marvo

+0

@Ryan:爲什麼你想使用會話作用域bean來請求作用域數據?當相同表單顯示在同一個會話中的多個瀏覽器窗口/標籤上時,它只會導致不直觀的網站行爲(以及糟糕的用戶體驗)。你不想那樣做。僅將會話範圍用於實際會話範圍的數據,例如登錄用戶,其首選項,區域設置等。JSF順便提供了「查看範圍」以滿足您的目的(具有瀏覽器窗口/特定於選項卡的範圍) 。另見[this](http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes)。 – BalusC

0

將HTTP請求轉發回發佈該表單的同一頁面違反了Post-Redirect-Get最佳做法,應該避免。可以保存用戶在會話中提交的內容或使用URL參數來保存用戶提交的值並將其重定向回原始頁面,但這不夠高雅。表單提交的最佳解決方案之一是使用AJAX提交表單。

+0

這與PRG無關。 PRG只是爲了確保當您將當前瀏覽器的地址欄URL複製/共享/鏈接到新的瀏覽器會話/窗口/選項卡時,您可以獲得所需的結果。驗證失敗後的轉發根本無助於解決這個問題。閱讀食物:http://stackoverflow.com/a/15523045(確實,JSF有針對性,但適用於任何其他web應用程序)。 – BalusC

+0

PRG是關於書籤功能,但也維護瀏覽器後退按鈕功能,並避免重複的表單提交。如果您在發佈未在響應中包含重定向的表單後刷新頁面,則瀏覽器將重新提交表單。即使忽略PRG /頁面導航問題,「使用AJAX」的解決方案還具有其他優勢,例如表單提交時的性能。 – Ryan