2009-02-15 25 views
49

Tôi đang sử dụng JSF với các bảng và tôi cần nhận các tham số phiên và yêu cầu bên trong trang JSF. Trong các trang JSP, tôi nhận được thông số này như sau: "${requestScope.paramName}" hoặc "${sessionScope.paramName}". Nhưng bây giờ sau khi sử dụng JSF chỉ có đậu và bạn không thể nhận được bất kỳ giá trị ngoại trừ các thuộc tính bean.Nhận Yêu cầu và Tham số Phiên và Thuộc tính từ các trang JSF

LƯU Ý: Phiên thuộc tính những gì tôi cần được tự động điền bằng cách sử dụng bảo mật acegi vì vậy tôi không thể truy cập vào chúng.

Vì vậy, phải làm gì bây giờ?

Trả lời

81

Bạn có thể lấy một tham số yêu cầu id sử dụng biểu thức:

<h:outputText value="#{param['id']}" /> 
  • param -An Bản đồ bất biến của các thông số yêu cầu cho yêu cầu này, keyed bởi tên tham số. Chỉ có giá trị đầu tiên cho mỗi tên tham số được bao gồm.
  • sessionScope —Một bản đồ thuộc tính phiên cho yêu cầu này, được khóa bởi tên thuộc tính.

Mục 5.3.1.2 của JSF 1.0 specification xác định các đối tượng phải được giải quyết bởi trình phân giải biến.

34

Bạn cũng có thể sử dụng bean (yêu cầu phạm vi được đề xuất) và truy cập trực tiếp ngữ cảnh theo cách của FacesContext.

Bạn có thể nhận các đối tượng HttpServletRequest và HttpServletResposne bằng cách sử dụng đoạn mã sau:.

HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

Lý do tôi đề nghị một yêu cầu scoped đậu là bạn có thể sử dụng những trong quá trình khởi (trường hợp xấu nhất là các nhà xây dựng Hầu hết các khung công tác cung cấp cho bạn một số vị trí để thực hiện mã tại thời điểm khởi tạo bean) và chúng sẽ được thực hiện theo yêu cầu của bạn.

Tuy nhiên, một chút hack. ;) Bạn có thể muốn xem xét nếu có một mô-đun JSF Acegi sẽ cho phép bạn truy cập vào các biến mà bạn cần.

+7

+1, nhưng ai trên thế giới, đã đưa ra API vô lý để nhận một tham số? –

3

Bạn có chắc chắn không thể truy cập vào các biến phạm vi yêu cầu/phiên từ một trang JSF không?

Đây là những gì tôi đang làm trong trang đăng nhập của chúng tôi, sử dụng Spring Security:

<h:outputText 
    rendered="#{param.loginFailed == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}"> 
    <span class="msg-error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span> 
</h:outputText> 
5

Bạn cũng có thể sử dụng một công cụ như OcpSoft của PrettyFaces để bơm giá trị tham số động trực tiếp vào JSF Đậu.

29

Bạn có thể sử dụng

<h:outputText value="#{param['id']}" /> hoặc

<h:outputText value="#{request.getParameter('id')}" />

Tuy nhiên nếu bạn muốn vượt qua các thông số để đậu ủng hộ của bạn, sử dụng f:viewParam có lẽ là những gì bạn muốn. "Tham số chế độ xem là ánh xạ giữa tham số chuỗi truy vấn và giá trị mô hình."

<f:viewParam name="id" value="#{blog.entryId}"/>

này sẽ thiết lập param id của tham số GET đến lĩnh vực entryId đậu blog của Xem http://java.dzone.com/articles/bookmarkability-jsf-2 cho các chi tiết

11

Bạn có thể như thế này:..

#{requestScope["paramName"]} ,#{sessionScope["paramName"]} 

requestScope hoặc sessionScope là đối tượng Bản đồ.

4

Giả sử bạn lready đặt đối tượng của bạn là thuộc tính trên bản đồ phiên họp của dụ hiện tại của FacesContext từ managed-bean của bạn, bạn có thể lấy nó từ trang JSF bởi:

<h:outputText value="#{sessionScope['yourObject'] }" /> 

Nếu đối tượng của bạn có một tài sản, có được nó bằng cách :

<h:ouputText value="#{sessionScope['yourObject'].anyProperty }" /> 
+0

Làm thế nào tôi có thể đặt đối tượng phiên làm thuộc tính trên bản đồ phiên của cá thể hiện tại của FacesContext từ bean được quản lý của tôi ??? –

+0

http://stackoverflow.com/questions/4495404/how-do-i-get-and-set-an-object-in-session-scope-in-jsf – Omar

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