2013-08-29 25 views
8

Một Redirect từ Bean trong JSF có thể được thực hiện bằng cáchLàm thế nào để làm cho chuyển hướng sử dụng navigation-rule

externalContext.redirect("foo.xhtml"); 

Nhưng tôi muốn sử dụng các quy tắc, quy định tại <navigation-rule/> (faces-config.xml) cho <from-outcome/> & & chuyển đối số dòng lệnh.

externalContext.redirect("from-outcome?param=bar"); 

Không hoạt động. Làm thế nào để làm điều đó?

Trả lời

13

ExternalContext#redirect()takes an URL, không phải là kết quả điều hướng.

Bạn cần trả lại kết quả điều hướng từ các phương thức hành động được khai báo để trả lại String.

public String submit() { 
    // ... 

    return "from-outcome"; 
} 

Bạn có thể định cấu hình trường hợp điều hướng để gửi chuyển hướng bằng cách thêm <redirect>.

<navigation-rule> 
    <navigation-case> 
     <from-outcome>from-outcome</from-outcome> 
     <to-view-id>/foo.xhtml</to-view-id> 
     <redirect> 
      <view-param> 
       <name>param</name> 
       <value>bar</value> 
      </view-param> 
     </redirect> 
    </navigation-case> 
</navigation-rule> 

Lưu ý rằng bạn cũng có thể chỉ tận dụng JSF chuyển hướng ngầm mà không cần này lộn xộn XML:

public String submit() { 
    // ... 

    return "/foo.xhtml?faces-redirect=true&param=bar"; 
} 

Nếu bạn đang ở trong một sự kiện hay ajax phương pháp nghe mà không thể trở về một kết quả chuỗi, sau đó bạn luôn có thể lấy NavigationHandler#handleNavigation() để thực hiện điều hướng mong muốn.

public void someEventListener(SomeEvent event) { // AjaxBehaviorEvent or ComponentSystemEvent or even just argumentless. 
    // ... 

    FacesContext context = FacesContext.getCurrentInstance(); 
    NavigationHandler navigationHandler = context.getApplication().getNavigationHandler(); 
    navigationHandler.handleNavigation(context, null, "from-outcome"); 
} 

Tương đương không điều hướng cho trường hợp đang sử dụng ExternalContext#redirect().

+1

Cảm ơn @BalusC, nhưng làm cách nào để sửa đổi giá trị trong quy tắc điều hướng từ bean? – timmornYE

+1

Bạn có thể sử dụng EL trong ' 'như vậy' # {bean.param} '. Điều này tương đương với 'return" /foo.xhtml?faces-redirect=true¶m= "+ URLEncoder.encode (param," UTF-8 ");' (mặc dù một số phiên bản Mojarra có lỗi với bộ ký tự đang được sử dụng). – BalusC

+0

Cảm ơn, tôi hiểu. Nhưng để quay lại câu hỏi của tôi: Vì vậy, không có cách nào để sử dụng 'quy tắc điều hướng' mà không trả về một chuỗi? Bởi vì có những tình huống mà điều này là không thể. Phải làm gì, nếu tôi muốn chuyển hướng từ một cuộc gọi Ajax? Ở đó tôi không thể trả lại điều hướng dưới dạng Chuỗi hoặc tôi sai? – timmornYE

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