2011-10-18 33 views
6

Tôi đang tìm hiểu về các thành phần phức hợp với JSF 2.0 và tôi muốn thành phần của tôi có thể kích hoạt các phương thức sao lưu đậu, vì vậy tôi đã tạo một ví dụ đơn giản.Thêm các phương thức hành động vào một thành phần phức hợp

Đây là thành phần i tạo:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
     <composite:attribute name="attribute1"/> 
     <composite:attribute name="attribute2"/> 
     <composite:attribute name="actionBtnText"/> 
     <composite:attribute name="actionMethod" method-signature="java.lang.String action()"/> 
</composite:interface> 

<composite:implementation> 
    <h:form> 
      <h:inputText value="#{cc.attrs.attribute1}"/> 
      <br/> 
      <h:inputText value="#{cc.attrs.attribute2}"/> 
      <br/> 
      <h:commandButton action="#{cc.attrs.actionMethod}" value="#{cc.attrs.actionBtnText}"/>   
    </h:form> 

</composite:implementation> 

</html> 

này được làm thế nào tôi sử dụng nó trong một trang JSF

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:custom="http://java.sun.com/jsf/composite/custom"> 

... 

    <h:body> 
    <custom:demoCustomComponent attribute1="#{demoBB.value1 }" attribute2="#{demoBB.value2 }" actionBtnText="Button text!" actionBtn="#{demoBB.act}"/> 
    </h:body> 

Và đây là đậu ủng hộ cung cấp cho hỗ trợ trang có thành phần là

@Named("demoBB") 
@RequestScoped 
public class DemoBB { 

    private String value1; 
    private String value2; 
    public String getValue1() { 
     return value1; 
    } 

    public String act() { 
     System.out.println("Input 1: " + value1 + "\nInput 2: " + value2); 
     return null; 
    } 

    //Getters and setters 
    public void setValue1(String value1) { 
     this.value1 = value1; 
    } 
    public String getValue2() { 
     return value2; 
    } 
    public void setValue2(String value2) { 
     this.value2 = value2; 
    } 
} 

Thành phần dường như để làm cho tốt, nhưng khi tôi bấm nút tôi nhận được một ngoại lệ mà nói:

javax.faces.FacesException: Không thể giải quyết phần tổng hợp từ sử dụng trang sử dụng biểu EL '# {cc.attrs.actionMethod} '

Tôi có phạm sai lầm trong giao diện hoặc triển khai thành phần không? Tại sao không hoạt động?

Trả lời

10

Bạn definied phương pháp hành động sử dụng tên thuộc tính actionBtn:

<custom:demoCustomComponent ... actionBtn="#{demoBB.act}"/> 

nhưng bạn đang mong nó sẽ được các thuộc tính tên actionMethod:

<composite:attribute name="actionMethod" method-signature="java.lang.String action()"/> 

Căn nó. Chắc họ giống nhau.

+0

Ups, tôi thấy bây giờ, một sai lầm ngớ ngẩn là gì. Tôi đã tất cả thời gian nhìn vào customComponent nhưng sai lầm của tôi là trong index.xhtml, tôi chỉ viết sai tên của thuộc tính :) Cảm ơn! – sfrj

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