2010-07-19 43 views
20

Làm cách nào để JSF 2.0 gọi phương thức hoặc phương thức trực tiếp với đối số/biến/tham số trong EL?Gọi phương pháp hoặc phương pháp trực tiếp với tham số/biến/tham số trong EL

Ví dụ, nhận được kích thước danh sách trong EL:

<h:outputText value="#{bean.list.size()}" /> 

Hoặc gọi một phương pháp hành động với đối số:

<h:commandButton value="edit" action="#{bean.edit(item)}" /> 

này dường như không làm việc trong môi trường của tôi. Nó không có vẻ giống như dấu ngoặc đơn.

javax.el.ELException: Lỗi Parsing: # {bean.list.size()}
com.sun.el.parser.ParseException: Gặp "("

+0

lặp lại? http: // stackoverflow.com/questions/206161/ –

Trả lời

51

Trong tiêu chuẩn EL trước EL 2.2 from Java EE 6 bạn không thể trực tiếp gọi các method như
#{bean.method()} cũng không gọi các phương pháp với lập luận như #{bean.method(arg1, arg2).

Nếu nâng cấp lên một EL 2.2/Java EE 6 thùng chứa phù hợp (Tomcat 7, Glassfish 3, JBoss AS 6, vv) là không phải một tùy chọn và bạn hiện đang sử dụng EL 2.1/Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS 4, v.v.), sau đó đặt cược tốt nhất của bạn là cài đặt JBoss EL. JBoss EL là một thực thi tương thích EL 2.1 hỗ trợ các tính năng tương tự như EL 2.2. Cài đặt JBoss EL là một vấn đề đặt jboss-el.jar trong /WEB-INF/lib và thêm dòng sau vào các web.xml, giả định rằng bạn đang sử dụng cá móm:

<context-param>  
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
</context-param> 

Hoặc, khi bạn đang sử dụng MyFaces:

<context-param>  
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
</context-param> 

Một thay thế cho trường hợp cụ thể của bạn là sử dụng JSTL của fn:length:

<h:outputText value="#{fn:length(bean.list)}" /> 

Một giải pháp thay thế khác là thêm một bộ nạp vào hạt trả về List#size() hoặc trong một số trường hợp cụ thể là custom EL function.


Xin lưu ý rằng việc gọi phương thức với đối số trong EL không phải là tính năng cụ thể của JSF 2.0. Đó là một tính năng cụ thể của EL 2.2. EL 2.2 là một phần của Java EE 6, mà JSF 2.0 cũng là một phần của. Vì vậy, nó trông giống như một tính năng cụ thể JSF 2.0, nhưng nó không phải là. JSF 2.0 tương thích ngược với Servlet 2.5/EL 2.1 thiếu tính năng này. Mặt khác, JSF 1.x tương thích với Servlet 3.0/EL 2.2, vì vậy nó cũng có thể sử dụng tính năng này trong JSF 1.x sau đó, cũng sử dụng JBoss EL trên Servlet 2.5/EL 2.1.

+0

Nó có sử dụng phương pháp giá trị 'ui: repeate' với yêu cầu ajax không? Tham khảo: http://stackoverflow.com/questions/12884049/does-not-uirepeat-work-when-ajax-request – CycDemo

0

Trả lời bởi Arend rất tốt, ngoại trừ một phần về nhập ngữ cảnh-param cho Mojarra: thêm rằng để web.xml thực sự phá vỡ nó trên JBoss 7. Hãy thử sử dụng JBoss EL mà không cần nhập bất cứ điều gì vào web.xml. câu trả lời

0

BalusC là đúng, tuy nhiên, khi bạn sử dụng maven, bạn nên loại trừ el-api 1.0 bắc cầu phụ thuộc như thế này:

<dependency> 
    <groupId>org.jboss.seam</groupId> 
    <artifactId>jboss-el</artifactId> 
    <version>2.0.0.GA</version> 
    <!-- exclude el-api 1.0 transitive dependency --> 
    <exclusions> 
     <exclusion> 
      <groupId>javax.el</groupId> 
      <artifactId>el-api</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
Các vấn đề liên quan