2009-06-15 28 views
24

Trong JSP, bạn có thể sử dụng response.sendError(int code, String message) để trả lại mã lỗi cụ thể (ví dụ: 404 không tìm thấy) và một thông báo. Các thông báo này hiển thị tốt, miễn là bạn sử dụng các trang lỗi Tomcat xấu xí mặc định. Tuy nhiên, nếu bạn tạo trang lỗi tùy chỉnh, bạn nhận được thông báo đó bằng cách nào? Tôi đã thử exception.getMessage() hoặc pageContext.getErrorData() nhưng không có kết quả. Tôi đã tìm kiếm điều này trong nhiều giờ và không ai có vẻ ngạc nhiên về điều tương tự! : SCách nhận thư trong trang lỗi tùy chỉnh (Tomcat)?

Tôi quên đề cập đến tôi đã chỉ thử nó với 404 cho đến nay, vì đó là những gì tôi cần nhất ... Ngoại lệ là null vì lý do nào đó, vì vậy hãy thử bất cứ điều gì trên nó ném một NullPointerException. Trang lỗi là trang lỗi 404, được đặt qua web.xml (vì tôi muốn trang này hiển thị cho mọi lỗi 404 đơn lẻ) và cho bất cứ ai tự hỏi, có nó có chỉ thị isErrorPage được đặt thành true ...

+0

Có trang 404 tuỳ chỉnh của bạn không bao giờ làm việc? Làm thế nào để bạn kiểm tra xem nó hoạt động? Bạn có kiểm tra xem các thuộc tính yêu cầu được đề cập bên dưới có tồn tại không? Cuối cùng hãy thử hướng dẫn này http://playground.greyscale.se/wiki/en/Custom_404_page_in_Tomcat – jitter

+0

Không có nó hoạt động tốt. Tôi chỉ không biết làm thế nào để có được thông báo, nếu được thiết lập thông qua response.sendError(). –

+0

response.sendError() sẽ gửi lỗi tới trình duyệt của khách hàng của bạn. Nó sẽ không đi đến trang lỗi của bạn sau đó trừ khi bạn sẽ làm điều đó cho mình tôi nghĩ. –

Trả lời

9

Hmm exception.getMessage() nên làm việc

Hãy thử thêm exception.getClass().getName()

  1. Nó có thể là một NullPointerException mà không có người nhắn
  2. hoặc ngoại lệ không phải là của Sun và thông điệp không được thiết lập đúng cách

Tất nhiên điều này chỉ hoạt động, nếu tôi nhớ chính xác, nếu lỗi được tạo bởi một jsp với <%@ page errorPage="/yourerrorpage.jsp" %> ở trên cùng.

Nếu lỗi xuất phát từ một servlet các chi tiết ngoại lệ được thông qua theo yêu cầu của các thuộc tính

javax.servlet.error.status_code java.lang.Integer 
javax.servlet.error.exception_type java.lang.Class 
javax.servlet.error.message  java.lang.String 
javax.servlet.error.exception  java.lang.Throwable 
javax.servlet.error.request_uri java.lang.String 
javax.servlet.error.servlet_name java.lang.String 

Kiểm tra Servlet Specification phần 9,9

+0

Xem chỉnh sửa của tôi, xin lỗi vì tôi quên thêm chi tiết ... –

+1

Thay vì sử dụng các chuỗi được cung cấp cho các thuộc tính yêu cầu trực tiếp, bạn nên sử dụng [hằng số] (http://docs.oracle.com/javaee/6/api/constant-values.html#javax.servlet .RequestDispatcher.INCLUDE_QUERY_STRING) được định nghĩa trong [RequestDispatcher] (http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html), ví dụ: [RequestDispatcher.ERROR_EXCEPTION] (http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html#ERROR_EXCEPTION). –

0

Điều bạn muốn trông lạ với tôi :). Điều đó nói rằng, tôi sẽ làm như sau:

  1. Thực hiện HttpResponseWrapper quấn bất kỳ khác HttpResponse theo cách này:

    public class HttpResponseWrapper implements HttpResponse { 
        private String errorMessage; 
    ... 
    
        @Override 
        public void sendError(...) { 
         <save error message here> 
        } 
    ... 
    } 
    
  2. Tạo Lọc và quấn bất kỳ phản ứng trong

  3. Đặt này lọc trên tất cả các yêu cầu và đầu tiên trong chuỗi

  4. Trong trang lỗi của bạn, hãy kiểm tra xem phản hồi có là không eof HttpResponseWrapper

  5. Nhận tin nhắn của bạn

+0

Cảm ơn bạn đã dành thời gian, nhưng bạn có thực sự đọc bài đăng của tôi không? Tôi đã thiết lập isErrorPage là true, và 404 của tôi hoạt động tốt (có nghĩa là tôi đã thực hiện nó ngay trong web.xml, vì vậy không cần phải đề cập đến thẻ trang lỗi). Tôi cũng đã đề cập rằng câu hỏi của tôi là về 404, không phải ngoại lệ. –

+0

Vâng, lỗi của tôi.Bằng cách nào đó đã bỏ lỡ điểm của câu hỏi. Xảy ra. Cập nhật câu trả lời của tôi –

0

Các exception phần của ErrorData sẽ chỉ được thiết lập nếu các trang lỗi đã được nạp như là kết quả của một ngoại lệ và không phải là một mã lỗi phản ứng.

Xem javadoc cho sendError trên HttpServletResponse.Nó đề cập đến lý do tại sao bạn không thấy thông báo bạn đã chuyển đến sendError (nhấn mạnh mỏ):

Gửi phản hồi lỗi cho khách hàng bằng trạng thái được chỉ định. Máy chủ mặc định tạo phản hồi giống như trang lỗi máy chủ định dạng HTML chứa thông báo được chỉ định, đặt loại nội dung thành "text/html", để lại cookie và các tiêu đề khác chưa được sửa đổi. Nếu khai báo trang lỗi được thực hiện cho ứng dụng web tương ứng với mã trạng thái được truyền vào, nó sẽ được phân phối ngược lại tùy theo tham số msg được đề xuất.

Nếu phản hồi đã được cam kết, phương pháp này sẽ ném ra một IllegalStateException. Sau khi sử dụng phương pháp này, phản hồi phải được xem là cam kết và không được ghi vào.

+0

Cảm ơn. Tôi đã đọc điều đó trước đây, nhưng không chú ý đến phần bạn đã nhấn mạnh. Vì vậy, để cắt một câu chuyện dài ngắn, nó không phải là có thể ở tất cả? :-( –

12

Thông báo lỗi có sẵn thông qua thuộc tính yêu cầu javax.servlet.error.message của đối tượng yêu cầu trong trang lỗi jsp.

Đây là cú pháp jsp để truy cập nó:

<c:out value="${requestScope['javax.servlet.error.message']}"/> 

Bạn có thể tìm kiếm thông tin lỗi liên quan khác có sẵn trong các trang lỗi here dưới Lỗi New Thuộc tính.

+0

Cảm ơn nhưng ... nope.Không hoạt động: -/ –

+0

Nó nên theo spec và nó thực sự làm trong ứng dụng dựa trên Tomcat của chúng tôi.Bạn có thể có một số vấn đề cấu hình lạ. –

+2

@Lea Verou: Nó hoạt động Có lẽ bạn không có jstl được kích hoạt trong ứng dụng của bạn vì vậy thẻ c: out được in trên HTML mà bạn chưa bao giờ thấy là kết xuất được hiển thị . – cherouvim

3

Tôi xin lỗi vì đã trả lời quá muộn, nhưng tôi đã gặp vấn đề này chỉ một tuần trước, tôi đã duyệt rất nhiều trang web khác nhau nhưng không ai thực sự giải quyết vấn đề này theo cách tôi muốn nghe. Trong bài viết này, tôi đã tìm ra một vài giải pháp thú vị và sau đó tự mình đưa ra giải pháp. Chỉ cần bao gồm nguồn này trong trang của bạn:

<% 
    out.println(pageContext.getErrorData().getRequestURI()); 
    out.println("<br/>"); 
    out.println(pageContext.getErrorData().getStatusCode()); 
    out.println("<br/>"); 
    out.println(pageContext.getException()); 
    out.println("<br/>"); 
%> 

Nó hoạt động hoàn toàn tốt với tôi.

0

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

${requestScope['javax.servlet.error.message']} 

nếu bạn không có JSTL trên trang

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