2012-01-08 33 views
5

Một trang/bean của tôi có sự kiện preRenderView được kích hoạt hai lần trên lần tải trang đầu tiên sau đó 2 + n lần cho mỗi postback, trong đó n là số lượng postback (bao gồm cả hiện tại).JSF preRenderView được gọi là quá nhiều lần

Sau khi đọc một vài bài đăng khác ở đây, tôi đã di chuyển <f:event type="preRenderView" listener="myBean.preRenderView"/> bên ngoài <f:metadata/> và điều đó làm giảm số lượng cuộc gọi preRenderView. Tức là, nó được gọi một lần khi tải trang đầy đủ và 1 + n lần cho mỗi lần đăng lại. Tôi thậm chí đã cố gắng di chuyển thẻ <f:event/> bên ngoài <f:view/>, nhưng nó không có hiệu lực.

Tôi không chắc chắn nếu điều này là có liên quan: Các trang sử dụng một mẫu:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <f:view contentType="text/html"> 
     <ui:insert name="metadata"/> 
     <h:head> 
      <!-- Some stuff here --> 
      <ui:insert name="content"/> 
      <!-- More stuff here --> 
     </h:head> 
     <h:body> 
     </h:body> 
    </f:view> 
</html> 

Và các bit tương ứng của trang:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <h:head> 
     <title></title> 
    </h:head> 
    <h:body> 
     <ui:composition template="/WEB-INF/templates/myLayout.xhtml"> 
      <ui:define name="windowTitle">My Page</ui:define> 
      <ui:define name="metadata"> 
       <f:event type="preRenderView" listener="#{myBean.preRenderView}"/> 
      </ui:define> 
      <ui:define name="content"> 
       <!-- Some content here --> 
       <h:panelGroup id="reRenderable" layout="block"> 
        <!-- More content here --> 
        <h:form prependId="false"> 
         <h:outputLabel for="mySelector" value="Item:"/> 
         <h:selectOneMenu id="mySelector" 
             value="#{myBean.item}" 
             converter="#{myConverter}" 
             validator="#{itemActiveValidator.validate}"> 
          <f:selectItems value="#{myBean.myItems}"/> 
          <f:ajax render=":reRenderable"/> 
         </h:selectOneMenu> 
        </h:form> 
        <!-- More content here --> 
       </h:panelGroup> 
       <!-- More content here --> 
      </ui:define> 
     </ui:composition> 
    </h:body> 
</html> 

Trả lời

5

Dường như chưa một lỗi cá móm: JAVASERVERFACES-2162

Tôi đã áp dụng giải pháp thay thế như sau và hoạt động:

<ui:define name="metadata"> 
    <f:metadata> 
     <f:viewParam name="dummy"/> 
     <f:event type="preRenderView" listener="#{myRecordsBean.preRenderView}"/> 
    </f:metadata> 
</ui:define> 

Tất cả những gì còn lại cần làm là đẩy dummy lên đến mẫu để giữ cho các trang sử dụng miễn phí từ phần này.

+3

Đó là một lỗi khó chịu :(Nếu bạn, hoặc bất cứ ai khác, đang bận tâm của thành viên này, hãy bỏ phiếu cho các lỗi. –

+1

Đã đã làm. Tôi đến qua lỗi cá móm cách rất rõ ràng với sự gia tăng tần số thời gian gần đây. Nó không phải –

+3

Bạn nói đúng, mặc dù thành thật mà nói, tôi đang gặp phải những lỗi rõ ràng trong các phần mềm tôi sử dụng (Hibernate, Firefox, tên bạn) it) :( –

-1

thử

@ManagedBean 
@XScoped --sessionScope,viewScope 
Public class MyRecordsBean{ 
public void preRenderView(){ 
if (!FacesContext.getCurrentInstance().isPostback(){ 
//put initView codes here 
} 

}

+0

Tôi nghĩ bạn không hiểu vấn đề cụ thể. – BalusC

+0

@BalusC là đúng. Vấn đề này xảy ra với postbacks do đó kiểm tra postback của bạn sẽ vượt qua cho mỗi sự kiện trùng lặp. Bạn trả lời giải quyết vấn đề * a *, không phải vấn đề này. -1 –

+0

Ok. Bạn đúng rồi. Tôi nhớ đọc 2 + n lần cho mỗi phần postback. –

-1

Hãy thử điều này. Tôi không biết sự khác biệt tecnical giữa mã của bạn và tôi dưới đây. Tôi đã thay đổi <ui:insert name="content"/> vị trí giữa các thẻ body từ thẻ head. Và thêm f:metadata. Nhưng khi tôi sử dụng như thế này thì không gọi hai lần. Hoạt động tốt. nó có thể là về cấu trúc trang. Có thể về việc sử dụng thẻ html hai lần. Bạn cần một. Nhưng các trang hoàn chỉnh thiếu các phần, chỉ thiếu các phần có khối thành phần.

<!DOCTYPE html> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fb="http://www.facebook.com/2008/fbml"> 

    <f:view contentType="text/html"> 
     <f:metadata> 
      <ui:insert name="metadata"/> 
      </f:metadata> 


     <h:body> 
       <!-- Some stuff here --> 
       <ui:insert name="content"/> 
       <!-- More stuff here --> 
     </h:body> 
    </f:view> 
    </html> 




<?xml version="1.0" encoding="UTF-8"?> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
      xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       template="/WEB-INF/templates/myLayout.xhtml"> 




     <ui:define name="windowTitle">My Page</ui:define> 
     <ui:define name="metadata"> 
      <f:event type="preRenderView" listener="#{myBean.preRenderView}"/> 
     </ui:define> 
     <ui:define name="content"> 
      <!-- Some content here --> 
      <h:panelGroup id="reRenderable" layout="block"> 
       <!-- More content here --> 
       <h:form prependId="false"> 
        <h:outputLabel for="mySelector" value="Item:"/> 
        <h:selectOneMenu id="mySelector" 
            value="#{myBean.item}" 
            converter="#{myConverter}" 
            validator="#{itemActiveValidator.validate}"> 
         <f:selectItems value="#{myBean.myItems}"/> 
         <f:ajax render=":reRenderable"/> 
        </h:selectOneMenu> 
       </h:form> 
       <!-- More content here --> 
      </h:panelGroup> 
      <!-- More content here --> 
     </ui:define> 
    </ui:composition> 
+0

Không có gì liên quan đến việc bao gồm thẻ html trong cả mẫu và trang sử dụng nó. Mọi thứ bên ngoài '' đều bị bỏ qua. –

+0

Những điều tôi đã nói về ui: comp có thể là về vấn đề. Nhưng thay đổi thực sự tôi đã thực hiện trong mã nếu bạn xem xét cẩn thận. Tôi đặt '' vào thẻ f: metadata và di chuyển nội dung của bạn từ đầu đến nội dung.Nó hoạt động hoàn hảo trong trường hợp có thể. Tôi điều đó là về f: siêu dữ liệu. Bạn có thể thử? Điều này không hoạt động Tôi không viết bất cứ điều gì hứa hẹn :-) –

+0

Thật không may, bạn không thể đặt '' trong mẫu. Các spec nói nhiều và tôi có thể cho bạn biết từ kinh nghiệm đầu tay (như một phần của nghiên cứu câu trả lời cho câu hỏi này) nó chỉ không hoạt động trong Mojarra. Nếu không tôi chắc chắn sẽ làm điều đó và đặt cách giải quyết ('dummy' view parameter) trong mẫu. –

Các vấn đề liên quan