2011-09-09 28 views
6

Mục 3.1.4 của đặc tả JSF 2.1 nói rằng tất cả các thuộc tính của các thành phần tiêu chuẩn là biểu thức giá trị được bật.JSF 2.1 ValueExpression trong thuộc tính action

Tôi muốn gán một biểu thức giá trị cho các thuộc tính hành động của một CommandButton:

<h:commandButton value="OK" action="#{myBean.valExp}" /> 

Tôi cũng định nghĩa tương ứng getValExp và phương pháp setValExp trong lớp học của đậu.

Tuy nhiên triển khai JSF của tôi (JBoss 6) nhận biểu thức đó là biểu thức phương thức và do đó tạo ra lỗi "không tìm thấy phương thức" vì không có phương thức valExp().

Tôi có làm điều gì đó sai hoặc là đặc điểm kỹ thuật quá cẩu thả và thực sự không có nghĩa là tất cả, nhưng chỉ có thuộc tính biểu thức không thuộc tính? Hay tôi hiểu lầm thông số?

[Ghi chú: Lý do cho câu hỏi này là không có vấn đề kỹ thuật thực tế nhưng tôi cố gắng để hiểu được sự khác biệt của biểu thức giá trị và phương pháp.]

Trả lời

8

biểu thức giá trị đang bị ràng buộc để tính được tiếp xúc bởi getter/setter công cộng .

<h:inputText value="#{bean.value}" /> 

Điều này yêu cầu public T getValue()public void setValue(T value) phương pháp. Lưu ý rằng sự hiện diện của thuộc tính private T value; với nghĩa đen chính xác cùng tên là không phải là bắt buộc. Trong các thành phần đầu ra thuần túy như <h:outputText>, <h:dataTable>, <f:selectItems>, v.v., phương pháp setter cũng là không phải là bắt buộc.

Biểu thức phương thức được ràng buộc với phương pháp không getter/setter (phương pháp "hành động").

<h:commandButton value="submit" action="#{bean.submit}" /> 

Điều này đòi hỏi một phương pháp public T submit() nơi T cuối cùng có thể được void và phương pháp cuối cùng có thể một vài tham số bổ sung, tùy thuộc vào chữ ký biểu hiện phương pháp của thuộc tính. Bạn có thể đọc chi tiết chính xác trong số view declaration language documentation, ví dụ: <h:inputText>, <h:commandButton><f:ajax>. Dưới đây là một trích lục các định nghĩa actionactionListener thuộc tính của <h:commandButton>:

Name:  action 
Type:  javax.el.MethodExpression (signature must match java.lang.Object 
      action()) 
Description: MethodExpression representing the application action to invoke when 
      this component is activated by the user. The expression must 
      evaluate to a public method that takes no parameters, and returns an 
      Object (the toString() of which is called to derive the logical 
      outcome) which is passed to the NavigationHandler for this 
      application. 

Name:  actionListener 
Type:  javax.el.MethodExpression (signature must match void 
      actionListener(javax.faces.event.ActionEvent))  
Description: MethodExpression representing an action listener method that will be 
      notified when this component is activated by the user. The 
      expression must evaluate to a public method that takes an 
      ActionEvent parameter, with a return type of void, or to a public 
      method that takes no arguments with a return type of void. In the 
      latter case, the method has no way of easily knowing where the event 
      came from, but this can be useful in cases where a notification is 
      needed that "some action happened". 

Vâng, tôi đồng ý rằng spec là hơi cẩu thả trong tuyên bố rằng tất cả các thuộc tính biểu thức giá trị hỗ trợ. Nói chung, chúng thực sự có nghĩa là tất cả các thuộc tính đều hỗ trợ ngôn ngữ biểu thức như trong #{}. Mặt khác, bạn cũng có thể giải thích các biểu thức phương thức như thể chúng chỉ là các biểu thức giá trị "đặc biệt", mặc dù chúng không chính xác như vậy. Tôi đã đăng một báo cáo vấn đề cụ thể về vấn đề này với yêu cầu xóa một số nhầm lẫn: issue 1036.

+0

Có thể gán biểu thức phương thức thay cho biểu thức giá trị không? I E. '' –

+0

@ St.Antario: http://stackoverflow.com/search?q=javax.el.propertynotwritableexception+h%3Ainputtext – BalusC

+0

Vì vậy, , câu trả lời ngắn là không, bởi vì nó không có ý nghĩa .... –

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