2010-07-28 40 views
16

Tôi có thành phần <odc:tabbedPanel/>. Bên trong này tôi có một trang trong thành phần <odc:bfPanel/>. Tôi muốn truy cập một giá trị (của một văn bản nhập liệu hoặc nút tắt) từ trang trong số <odc:bfPanel/> trong lớp đậu được quản lý <odc:tabbedPanel/> của tôi. Xin vui lòng hướng dẫn tôi như thế nào để tôi đi về điều này. Xin lưu ý ở đây tôi không muốn sử dụng phiên tại đây. Tôi chỉ muốn nó theo yêu cầu. Tôi đã thử các tùy chọn dưới đây nhưng chúng không hiệu quả với tôi.Nhận giá trị tham số yêu cầu trong JSF

lựa chọn một

String value = (String) ctx.getExternalContext() 
         .getRequestParameterValuesMap() 
         .get("managedbean.property"); 

tùy chọn hai

String value = (String) ctx.getExternalContext() 
         .getRequestParameterValuesMap() 
         .get("property"); 

tùy chọn ba

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance() 
         .getExternalContext().getRequest(); 
System.out.println(req.getParameter("property")); 

tùy chọn Bốn

Map requestMap = FacesContext.getCurrentInstance() 
         .getExternalContext().getRequestHeaderValuesMap(); 
String msgId = (String) requestMap.get("property"); 
System.out.println(msgId); 

tùy chọn lăm

HttpServletRequestWrapper r = new HttpServletRequestWrapper(req); 
String value1 = r.getParameter("managedbean.property"); 

tôi muốn giá trị không phải ở bean được quản lý của jsp ... nhưng tôi muốn nó trong một số bean được quản lý khác. ở đây tôi có các trang bên trong một trang (như tôi đã đề cập đến một bảng điều khiển theo thẻ của nó). bây giờ tôi muốn giá trị trong bean được quản lý của tab ngoài -

Trả lời

25

Hãy đầu tiên giải thích tại sao các tùy chọn bạn đã cố gắng không làm việc:

Lựa chọn 1 và 2 là không hợp lệ vì nó sẽ trả về giá trị (!!) như là một String[], không phải là một giá trị duy nhất như String.

Tùy chọn 3 sẽ hoạt động nếu tham số ở đó. Nhưng đây không phải là một cách JSF-ish tốt đẹp.

Tùy chọn 4 không hợp lệ vì các tham số không được đặt trong tiêu đề yêu cầu.

Tùy chọn 5 không hợp lệ vì nó đơn giản là không có ý nghĩa. Bạn chỉ thêm một lớp trừu tượng bổ sung ở giữa mà trên thực tế không thay đổi bất cứ điều gì ở đây.


Cách JSF-ish sẽ là sử dụng ExternalContext#getRequestParameterMap():

Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap(); 
String param = parameterMap.get("paramName"); 

Là tại sao lựa chọn 3 không hoạt động có khả năng bởi vì tên tham số không phải là những gì bạn nghĩ/mong đợi nó được. JSF cụ thể là các ID khách hàng prepend (woodstocks) dựa trên các thành phần cha UINamingContainer trong cây xem. Nhấp chuột phải vào đầu ra HTML được tạo của trang JSF trong trình duyệt web của bạn và chọn Xem nguồn. Kiểm tra tên của yếu tố quan tâm được tạo ra <input>. Sử dụng tên để thay thế tên làm tên thông số.


Điều đó nói rằng sau khi giải quyết xong, đây không phải là giải pháp. Nhưng chúng tôi không thể đề xuất một cách hợp lý giải pháp thực vì yêu cầu chức năng và mã bạn có chưa hoàn toàn rõ ràng. Bạn thường ràng buộc các phần tử đầu vào vào một bean sao lưu. Nếu bạn đang thực sự bên trong một bean sao lưu khác, thì bạn cũng có thể truy cập rằng sao lưu đậu từ bên trong bean sao lưu và sau đó lần lượt truy cập giá trị đầu vào được liên kết với nó. Xem Injecting Managed Beans in each other để biết cách thực hiện.

0

Tôi không hiểu chính xác câu hỏi của bạn. Nếu inputtext hoặc radiobutton được ràng buộc chính xác với giá trị trong bean sao lưu, thì bạn có thể truy cập trực tiếp giá trị trong Java. Nếu những gì bạn quan tâm là việc tra cứu theo chương trình của một bean được quản lý, thì đó là làm thế nào tôi làm điều đó:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean"); 
2

Thực tế là điều khiển của bạn đang ở trong tấm IBM ODC là không có liên quan.

Thông thường, bạn sẽ liên kết điều khiển đầu vào với giá trị bean được quản lý.

Bean định nghĩa:

<managed-bean> 
    <managed-bean-name>demo</managed-bean-name> 
    <managed-bean-class>foo.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

Xem tags:

<!-- needs to be inside a form control --> 
<h:inputText value="#{demo.foo}" /> 
<h:commandButton value="Click Me" action="#{demo.invokeMe}" /> 

Bean:

package foo; 
public class MyManagedBean { 
    private String foo; 
    public String getFoo() { return foo; } 
    public void setFoo(String foo) { this.foo = foo; } 

    public String invokeMe() { 
    System.out.println(foo); 
    return null; //no navigation 
    } 
} 

Nếu bạn muốn để ràng buộc kiểm soát đầu vào của bạn để một bean khác nhau đối với một với logic ứng dụng, bạn có thể sử dụng thuộc tính tiêm để chỉ các bean khác.

<managed-bean> 
    <managed-bean-name>demo</managed-bean-name> 
    <managed-bean-class>foo.MyManagedBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
    <property-name>propName</property-name> 
    <value>#{someExpression}</value> 
    </managed-property> 
</managed-bean> 

Bạn có thể tìm công cụ lên trực tiếp thông qua các ngữ cảnh, hoặc sử dụng các lớp biểu thức để giải quyết những thứ thông qua mã, nhưng đây là một cách tiếp cận rõ ràng hơn.

+0

tôi muốn giá trị không nằm trong bean được quản lý của jsp ... nhưng tôi muốn nó ở một số bean được quản lý khác. ở đây tôi có các trang bên trong một trang (như tôi đã đề cập đến một bảng điều khiển theo thẻ của nó). bây giờ tôi muốn giá trị trong bean được quản lý của tab ngoài – user265950

+0

@ tejas-a - sử dụng một 'thuộc tính được quản lý' để chèn thuộc tính từ một bean này sang bean khác - xem phần cuối cùng. – McDowell

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