<acronym id="cr5pu"></acronym>
  • <kbd id="cr5pu"><font id="cr5pu"></font></kbd>
  • <li id="cr5pu"><output id="cr5pu"></output></li>
    <del id="cr5pu"><li id="cr5pu"></li></del><center id="cr5pu"></center>
    <output id="cr5pu"><kbd id="cr5pu"></kbd></output>
  • <rp id="cr5pu"></rp>
    <var id="cr5pu"></var>
  • <nav id="cr5pu"></nav>
  • 千里冰封
    JAVA 濃香四溢
    posts - 151,comments - 2801,trackbacks - 0
    在使用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方法。








    盡管千里冰封
    依然擁有晴空

    你我共同品味JAVA的濃香.
    posted on 2009-02-28 11:17 千里冰封 閱讀(5800) 評論(2)  編輯  收藏 所屬分類: JAVAEE

    FeedBack:
    # re: JSF頁面出錯的時候,DataTable不能恢復原有值的解決辦法
    2009-02-28 11:41 | 打醬油的
    不看好JSF,雖然是事件驅動,但在速度、語法、效率上都沒有優勢,唯一優點就是易重用,但遠不如ASP.NET簡便,甚至連Tapestry也有所不及。因為是sun提供,倒是很適合企業開發的標準化(招工和辭人都方便),但不會有大的發展。  回復  更多評論
      
    # re: JSF頁面出錯的時候,DataTable不能恢復原有值的解決辦法
    2009-02-28 11:50 | 千里冰封
    @打醬油的
    呵呵,仁者見仁,智者見智吧,這種東西不會因為某些人的不看好就一定不好,也不會因為某些人的看好,就一定有好的發展。
    這些都只是工具,能從這些工具中,總結出自己的想法,那才是最重要的。
    每一個框架都有它設計的優秀的地方。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    久久一级片
    <acronym id="cr5pu"></acronym>
  • <kbd id="cr5pu"><font id="cr5pu"></font></kbd>
  • <li id="cr5pu"><output id="cr5pu"></output></li>
    <del id="cr5pu"><li id="cr5pu"></li></del><center id="cr5pu"></center>
    <output id="cr5pu"><kbd id="cr5pu"></kbd></output>
  • <rp id="cr5pu"></rp>
    <var id="cr5pu"></var>
  • <nav id="cr5pu"></nav>