2012-04-02 27 views
7

Tôi đã đấu tranh trong vài ngày qua với phần đăng nhập của ứng dụng web của tôi. Tôi đã nhận được đến điểm mà tôi có thể xác thực thành công một người dùng bằng cách sử dụng JDBCRealm trên tomcat (bằng cách đọc người dùng từ một cơ sở dữ liệu máy chủ sql). Bây giờ Tôi muốn gửi một số loại phản hồi khi tài khoản của người dùng bị chặn hoặc khi thông tin đăng nhập không chính xác, đây là nơi tôi bị kẹt ngay bây giờ.Cách sử dụng FacesContext.getCurrentInstance(), nó trả về null

Tôi muốn sử dụng này:

try { 
     request.login(request.getParameter("user"), request.getParameter("pass")); 
    } catch (ServletException se) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Wrong Username/Password combination")); 
     log(se.getMessage()); 
    } 

Nhưng FacesContext.getCurrentInstance() luôn trả về null ..

Sau khi thực hiện một số nghiên cứu tôi phát hiện ra rằng yêu cầu phải đến từ một trang nằm trong/khuôn mặt để FacesServlet được gọi và FacesContext được khởi tạo (ít nhất đó là những gì tôi đã hiểu).

Vì vậy, tôi đã di chuyển trang đăng nhập vào một thư mục mới có tên là khuôn mặt, bên trong thư mục Trang Web. Nhưng bây giờ mọi tôi cố gắng gọi trang login.xhtml, tôi nhận được lỗi này:

/login.xhtml Not Found in ExternalContext as a Resource 

Và đây là stacktrace:

com.sun.faces.context.FacesFileNotFoundException: /login.xhtml Not Found in ExternalContext as a Resource 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:232) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:273) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:201) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:764) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:619) 

tôi nhận được lỗi này ngay cả khi tôi nhập URL trực tiếp vào Trình duyệt.

Im sử dụng Netbeans 7.1 với Apache Tomcat 7 (mà bằng cách này là một nỗi đau vì tôi nhận được rất nhiều PermGen ra khỏi ngoại lệ bộ nhớ -.-)

Bất kỳ giúp đỡ về làm thế nào để sửa lỗi này sẽ được đánh giá rất .

Trả lời

8

Nó sẽ trả lại null khi bạn không ở trong một bean được quản lý hoặc bất kỳ tạo phẩm JSF nào khác. Ví dụ, trong một servlet vani thuần hoặc một bộ lọc servlet chạy trước FacesServlet chạy. FacesServlet là một trong những người tạo ra các FacesContext và đặt nó như là một ThreadLocal trong yêu cầu HTTP hiện tại. Bạn cần phải thực hiện công việc đăng nhập trong một bean được quản lý JSF thay vì cách thông thường. Phần đăng nhập mã mà bạn đã ở đó thuộc về một bean được quản lý JSF.

Đối với trang đăng nhập, nó không khác với bất kỳ trang JSF nào khác mà bạn từng phát triển. Hoặc có bạn thực sự không bao giờ phát triển với JSF và đây có phải là nỗ lực JSF đầu tiên của bạn không? Vâng, bạn nên có được rõ ràng hơn về điều này trong câu hỏi của bạn là tốt. Loại bỏ thư mục /faces đó, chỉ cần đặt login.xhtml thẳng vào nội dung web và đảm bảo rằng mẫu URL của FacesServlet trong web.xml được đặt thành *.xhtml. Sau đó, bạn chỉ có thể mở nó bằng http://localhost:8080/yourapp/login.xhtml.

Để tìm hiểu JSF tốt hơn, hãy đọc một cuốn sách/hướng dẫn khá tốt trước và không cố gắng ghép các mảnh rời mà bạn tìm thấy trên Internet cùng nhau mà không thực sự hiểu những dòng mã đó đang làm gì. Bạn được cho là có thể viết/giải thích nó mình khi bạn thực sự hiểu nó. Bắt đầu tại đây: Our JSF wiki page.

+0

Yea, đây là lần thử JSF đầu tiên của tôi :) Cảm ơn câu trả lời của bạn, nó trả lời câu hỏi của tôi. Về cơ bản tôi không thể truy cập FacesContext ở bất cứ đâu trước khi FacesServlet chạy, vì vậy tôi phải sử dụng bean được quản lý bất cứ khi nào tôi muốn truy cập Fctx. Về phần học, tôi muốn thử làm những thứ cơ bản về ngôn ngữ trước khi tôi bắt đầu đọc một cuốn sách, theo cách đó khi tôi đọc nó, nó sẽ trở nên dễ dàng hơn và tôi thực sự biết cuốn sách đang nói về . Dù bằng cách nào tôi vẫn không chắc tại sao tôi không thể đặt trang bên trong thư mục/mặt? Tôi sẽ làm theo lời khuyên của bạn và thay đổi mẫu Khuôn mặt Servlet. –

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