2010-07-28 32 views
9

tôi cần phải có liên kết này:tham số trong URL jsf2

http://myserver:/myproject/innerpage/clip.jsf&id=9099

để trích xuất các id từ một mã như thế này:

HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
String clipId = request.getParameter("id"); 

Khi tôi chạy nó trên tomcat tôi nhận được:

tin nhắn /OnAir/innerpage/clip.jsf & id = 9099

mô tả Tài nguyên được yêu cầu (/OnAir/innerpage/clip.jsf & id = 9099) không khả dụng.

Khi tôi chạy nó mà không cần & id = 9099 nó chạy ổn.

Tôi làm cách nào để chạy?

Trả lời

24

Ký tự phân cách giữa đường dẫn và chuỗi truy vấn trong URL là ?, không phải &. & là ký tự phân cách cho nhiều tham số trong chuỗi truy vấn, ví dụ: name1=value1&name2=value2&name3=value3. Nếu bạn bỏ qua ?, thì chuỗi truy vấn sẽ được xem như là một phần của đường dẫn trong URL, điều này sẽ dẫn đến lỗi trang 404/tài nguyên không tìm thấy lỗi khi bạn gặp phải.

Vì vậy, liên kết này nên làm việc http://myserver:port/myproject/innerpage/clip.jsf?id=9099


Điều đó nói rằng, có một cách tốt hơn để truy cập vào các thông số yêu cầu. Đặt làm thuộc tính được quản lý với giá trị là #{param.id}.

public class Bean { 

    @ManagedProperty(value="#{param.id}") 
    private Long id; 

    @PostConstruct 
    public void init() { 
     System.out.println(id); // 9099 as in your example. 
    } 

    // ... 
} 

EL #{param.id} trả về giá trị của request.getParameter("id").

Mẹo: bất cứ khi nào bạn cần chuyển API Servlet "thô" từ bên dưới mũ trùm JSF bên trong một bean được quản lý, hãy luôn tự hỏi mình (hoặc ở đây tại SO): "Không có cách JSF-ish?" . Cơ hội lớn, bạn không cần thiết quá nhiều thứ;)

+0

cảm ơn. Tôi là thằng ngốc – Dejell

+8

Bạn được chào đón. Không, bạn chỉ cần bắt đầu một nơi nào đó. Tôi đã phạm sai lầm tương tự hơn 10 năm trước. Học hỏi từ những sai lầm của bạn. Hãy nhớ chúng bất cứ khi nào bạn gặp lại các triệu chứng cùng một vấn đề. Những bài học kinh nghiệm có giá trị cho tương lai. – BalusC

+0

Thực ra, nó sẽ không làm việc cho tôi. Phạm vi đậu của tôi là xem và tôi nhận được ngoại lệ khó chịu: Phạm vi của đối tượng được tham chiếu bởi biểu thứC# {param.id}, yêu cầu, ngắn hơn phạm vi được quản lý giới thiệu (clipBean) của chế độ xem – Dejell

3

Trước tiên, bạn phải cho chúng tôi biết cách bạn đang gửi tham số trong JSF của mình, đó có phải là một commandButton/Link không? Một outputLink? A? Bạn cũng đang sử dụng redirect = true?

Rất có thể bạn đang mất id ở đâu đó trong khi yêu cầu.

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