程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JSF頁面出錯的時DataTable不能恢復原有值的解決辦法

JSF頁面出錯的時DataTable不能恢復原有值的解決辦法

編輯:關於JAVA

在使用JSF的時候,它的事件驅動模式是一個很好的開發方法,但是由於JSF 畢竟現在的版本才1.2,所以對於有些細節上面處理就不一定如人意了,一般來說 ,當JSF的頁面驗證有錯或者有其它的錯誤的時候,我們以前輸入的值會在渲染 頁面的時候,恢復回來,也就是說,一個域我們綁定在後台的屬性是一個int值 ,但是我們前台輸入了“abcd”,這個時候,後台在驗證階段就過不去了。然後 直接渲染頁面,JSF 會把我們輸入錯誤的abcd渲染出來。而不是把我們以前綁定 在後台的那個屬性的值,取出來,這樣也正是我們想要的結果,但是當我們的頁 面包括了dataTable的時候,並且DataTable裡面的值是可以編輯的時候,當頁面 上有錯誤的時候,別的域都會顯示剛才我們輸入的值,唯有DataTable裡面的輸 入域的值沒有還原為我們剛才輸入的值,而是綁定在後台的值,這顯然不是我們 想要看到的。但是當DataTable有錯誤的輸入的時候,DataTable才會把它的值恢 復回來。說了這麼說,感覺有點語無倫次了,還是拿代碼說話吧。

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"% >

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01  Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%--
     This file is an entry point for JavaServer Faces  application.
--%>
<f:view>
     <html>
         <head>
             <meta http-equiv="Content-Type" content="text/html; charset=UTF -8">
             <title>JSP Page</title>
             <style>
                 .header{
                     background-color:white;
                 }
                 #mainForm\:data input{
                     border:0;
                     color:red;
                 }
             </style>
         </head>
         <body>
             <h:form id="mainForm">
                 <h:messages style="color:red" />
                 名字:<h:inputText  id="listName"  value="#{Test1.listName}" >
                     <f:validateLength maximum="5"/>
                 </h:inputText>
                 <h:commandButton value="Submit" action="#{Test1.save}"/>
                 測試用的:<h:inputText  id="testName" value="#{Test1.testName}"/>
                 <h:dataTable headerClass="header" rowClasses="header"  bgcolor="blue" cellspacing="1" cellpadding="0" 

border="0" value="#{Test1.listDataModel}" id="data"  var="p">
                     <h:column>
                         <f:facet name="header">
                             <h:outputText value="Name"/>
                         </f:facet>
                         <h:outputText style="background-color:white;width:100%" id="name"  value="#{p.name}"/>
                     </h:column>
                     <h:column>
                         <f:facet name="header">
                             <h:outputText value="Sex"/>
                         </f:facet>
                         <h:inputText  id="sex" value="#{p.sex}"/>
                     </h:column>
                     <h:column>
                         <f:facet name="header">
                             <h:outputText value="Age"/>
                         </f:facet>
                         <h:inputText  id="age" value="#{p.age}"/>
                     </h:column>
                     <h:column>
                         <f:facet name="header">
                             <h:outputText value="Email"/>
                         </f:facet>
                         <h:inputText id="email" value="#{p.email}"/>
                     </h:column>
                 </h:dataTable>
             </h:form>
         </body>
     </html>
</f:view>

通過以上的代碼我們就可以發現問題了。在查看了JSF的源代碼才發現, DataTable有一個特殊的處理機制,那就是只有它自己包含在另外一個DataTable 的時候,或者它自己內部的值有錯的時候,才會渲染submittedValue,否則,它 只會渲染綁定在後台的值。知道這一點以後,就非常好解決了,那就是在我們的 DataTable有外層再包括一個DataTable,當然,它外層的DataTable最好不要有 具體的值,所有我們就包含一個空的DataTable來實現它了,這樣解決有點不太 好看,但是也是沒有辦法的辦法了。呵呵,希望JSF2.0中對此會有一些改進。

改後的代碼如下:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"% >

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01  Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%--
     This file is an entry point for JavaServer Faces  application.
--%>
<f:view>
     <html>
         <head>
             <meta http-equiv="Content-Type" content="text/html; charset=UTF -8">
             <title>JSP Page</title>
             <style>
                 .header{
                     background-color:white;
                 }
                 #mainForm\:data input{
                     border:0;
                     color:red;
                 }
             </style>
         </head>
         <body>
             <h:form id="mainForm">
                 <h:messages style="color:red" />
                 名字:<h:inputText  id="listName"  value="#{Test1.listName}" >
                     <f:validateLength maximum="5"/>
                 </h:inputText>
                 <h:commandButton value="Submit" action="#{Test1.save}"/>
                 測試用的:<h:inputText  id="testName" value="#{Test1.testName}"/>
                 <h:dataTable value="1"><!--只是在這裡加了一個空的DataTable- ->
                     <h:column>
                         <h:dataTable headerClass="header" rowClasses="header"  bgcolor="blue" cellspacing="1" 

cellpadding="0" border="0" value="#{Test1.listDataModel}"  id="data" var="p">
                             <h:column>
                                 <f:facet name="header">
                                      <h:outputText value="Name"/>
                                 </f:facet>
                                 <h:outputText style="background-color:white;width:100%" id="name"  value="#

{p.name}"/>
                             </h:column>
                             <h:column>
                                 <f:facet name="header">
                                      <h:outputText value="Sex"/>
                                 </f:facet>
                                 <h:inputText  id="sex" value="#{p.sex}"/>
                             </h:column>
                             <h:column>
                                 <f:facet name="header">
                                      <h:outputText value="Age"/>
                                 </f:facet>
                                 <h:inputText  id="age" value="#{p.age}"/>
                             </h:column>
                             <h:column>
                                 <f:facet name="header">
                                      <h:outputText value="Email"/>
                                 </f:facet>
                                 <h:inputText id="email" value="#{p.email}"/>
                             </h:column>
                         </h:dataTable>
                     </h:column>
                 </h:dataTable>
             </h:form>
         </body>
     </html>
</f:view>

如果大家還有什麼更好的方法,也希望能分享一下,這裡只帖出來了JSP的代 碼,JAVA代碼就沒帖了,因為都是一些getter,setter方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved