2010-10-07 20 views
8

से दोनों त्रुटि संदेश और शरीर की स्थापना मैं एक सर्वलेट कि इतने की तरह एक http प्रतिक्रिया वापस आ जाएगी लिखना चाहते हैं:सर्वलेट

HTTP/1.1 500 <short custom message> 
Content-Length: ... 

<longer custom message> 

कारण यह है कि मैं एक कार्यक्रम संबंधी ग्राहक प्रतिक्रिया संदेश प्रोसेस करने में सक्षम होना चाहता हूँ है एक विशेष प्रतिक्रिया लेने के लिए, लेकिन मैं प्रतिक्रिया शरीर को एक लंबे स्पष्टीकरण के साथ भरना चाहता हूं ताकि ब्राउज़र का उपयोग करना आसान हो।

अब, HttpServletResponse में sendError (int, स्ट्रिंग) विधि है जो मुझे त्रुटि कोड और एक संदेश निर्दिष्ट करने की अनुमति देती है। जावाडॉक्स केवल इतना कहता है कि संदेश किसी प्रकार के एचटीएमएल पेज में एम्बेड किया जाएगा, लेकिन http प्रतिक्रिया संदेश सेट करने के बारे में कुछ नहीं। इस विधि को कॉल करने के बाद, आपको प्रतिक्रिया में कुछ और लिखने की अनुमति नहीं है। मेरे परीक्षणों में (जेटी के साथ), संदेश का उपयोग http प्रतिक्रिया और एचटीएमएल बॉडी दोनों के लिए किया जाता है, जो मेरे साथ ठीक होगा, सिवाय इसके कि मैं दो अलग-अलग तारों को निर्दिष्ट करना चाहता हूं और मुझे नहीं लगता कि http प्रतिक्रिया की सेटिंग संदेश को एक अलग कार्यान्वयन के साथ गारंटी दी जाती है।

एक सेटस्टैटस (int) विधि भी है जिसे आप किसी भी कोड से कॉल कर सकते हैं, और फिर आप अपना स्वयं का HTML बॉडी लिख सकते हैं। यह करीब है, सिवाय इसके कि आप http प्रतिक्रिया संदेश निर्दिष्ट नहीं कर सकते हैं।

अंत में, एक सेटस्टैटस (int, स्ट्रिंग) विधि है जो वास्तव में वही करता है जो वास्तव में करता है, लेकिन किसी प्रकार की अस्पष्टता के कारण इसे हटा दिया जाता है। मुझे लगता है कि कुछ सर्वलेट कंटेनर प्रतिक्रिया शरीर को संदेश लिख रहे थे और प्रतिक्रिया बंद कर रहे थे।

बहिष्कृत विधि का उपयोग करने के अलावा, मुझे लगता है कि मैं यहां खराब हूं, लेकिन अगर कोई और कोई चाल जानता है तो मुझे उत्सुकता है?

उत्तर

5

आप web.xml में त्रुटि विशिष्ट पृष्ठों को निर्दिष्ट करके त्रुटि पृष्ठों को अनुकूलित कर सकते हैं:

<error-page> 
    <error-code>500</error-code> 
    <location>/error500.jsp</location> 
</error-page> 

jsp फ़ाइल आप अनुरोध का उपयोग कर सकते में एक कस्टम संदेश और अन्य जानकारी को दिखाने के लिए जिम्मेदार बताते हैं।

+0

धन्यवाद, यह एक उत्कृष्ट बिंदु है और शायद इस समस्या के साथ ज्यादातर लोगों की सहायता करेगा :) मैं पूरे वेब ऐप सेटअप के बिना एम्बेडेड जेटी का उपयोग कर रहा हूं: यह एक पूरी तरह से स्टैंड-अलोन सर्वलेट है। मैं कम से कम यह देखने के लिए चारों ओर पोक कर सकता हूं कि त्रुटि पृष्ठ किसी भी तरह कोड में स्थापित किया जा सकता है, लेकिन मैं शायद प्रोग्रामेटिक कॉलर्स होने पर बस विवरण के लिए शरीर को देख सकता हूं। –

+0

बस एक चेतावनी का उल्लेख करना चाहता था जिसे मैंने पार किया। यदि आप jsp के बजाय एक HTML पृष्ठ का उपयोग करने का प्रयास करते हैं, तो सर्वर सही स्थिति कोड नहीं भेजेगा हालांकि त्रुटि पृष्ठ सामग्री प्रदर्शित की जाएगी। – Asa

9

एक सेटस्टैटस (int) विधि भी है जिसे आप किसी भी कोड से कॉल कर सकते हैं, और फिर आप अपना स्वयं का HTML बॉडी लिख सकते हैं। यह करीब है, सिवाय इसके कि आप http प्रतिक्रिया संदेश निर्दिष्ट नहीं कर सकते हैं।

क्या कोई कारण है कि आप HTTP स्थिति कोड सेट करने के लिए response.setStatus(500) का उपयोग नहीं करेंगे, इसके बाद प्रतिक्रिया की आउटपुट स्ट्रीम को लिखकर?

इस प्रकार "प्रतिक्रिया शरीर को लिखना" निम्नतम स्तर पर प्राप्त किया जाता है।

यहाँ एक उदाहरण है:

public class ErrorServlet extends HttpServlet { 

    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 

     // 500 error 
     resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     resp.getWriter().print("<html><head><title>Oops an error happened!</title></head>"); 
     resp.getWriter().print("<body>Something bad happened uh-oh!</body>"); 
     resp.getWriter().println("</html>"); 
    } 
} 

web.xml:

<web-app> 
    <servlet> 
     <servlet-name>myerror</servlet-name> 
     <servlet-class>brown.testservlet.ErrorServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>myerror</servlet-name> 
     <url-pattern>/myErrorPage</url-pattern> 
    </servlet-mapping> 
</web-app> 

और उत्पादन:

$ curl -I http://localhost:8080/testservlet/myErrorPage 
HTTP/1.1 500 Internal Server Error 
Content-Length: 108 
Server: Jetty(6.1.16) 

$ curl -v http://localhost:8080/testservlet/myErrorPage 
* About to connect() to localhost port 8080 (#0) 
* Trying 127.0.0.1... connected 
* Connected to localhost (127.0.0.1) port 8080 (#0) 
> GET /testservlet/myErrorPage HTTP/1.1 
> User-Agent: curl/7.20.0 (i686-pc-mingw32) libcurl/7.20.0 OpenSSL/0.9.8k zlib/1.2.3 
> Host: localhost:8080 
> Accept: */* 
> 
< HTTP/1.1 500 Internal Server Error 
< Content-Length: 108 
< Server: Jetty(6.1.16) 
< 
<html><head><title>Oops an error happened!</title></head><body>Something bad happened uh-oh!</body></html> 
* Connection #0 to host localhost left intact 
* Closing connection #0 
+0

हां, मेरे प्रश्न का हिस्सा आपने उद्धृत किया है कि मैं इस विकल्प को समझता हूं। यह भी इंगित करता है कि यह आपको http प्रतिक्रिया संदेश (आपके उदाहरण में "आंतरिक सर्वर त्रुटि" सेट करने की अनुमति नहीं देता है, जो स्वचालित रूप से सर्वलेट कंटेनर द्वारा प्रदान किया जाता है)। –

+0

भले ही 'response.setStatus (int, स्ट्रिंग)' को बहिष्कृत किया गया है, आप * स्टेटस लाइन संदेश –

0

आप हेडर क्यों में एक कस्टम त्रुटि संदेश करना चाहते हैं response.addHeader(String, String) के साथ अपना हेडर नहीं जोड़ना? मैट बी के जवाब के साथ इसे जोड़ना नौकरी कर सकता है।

1

अच्छा, क्षमा करें, त्रुटि प्रतिक्रिया के लिए शरीर रखने का सबसे स्पष्ट कारण यह है कि कोई त्रुटि होने पर ब्राउज़र में कुछ मानव-पठनीय दिखाना है।यही वजह है कि HTML उत्पन्न करना Servlet spec में sendError का डिफ़ॉल्ट व्यवहार है।

मेरे मामले में, मुझे कुछ अलग चाहिए, क्योंकि मैं वेब सेवाएं बना रहा हूं, और यह ठोस एक प्रतिक्रिया वापस नहीं करता है अगर सब ठीक काम करता है।

0

जेबॉस 6 का उपयोग करके मैं निष्कर्ष पर आया कि जेबॉस कस्टम त्रुटि पृष्ठ प्रतिक्रिया को अक्षम करने के लिए getWriter को कॉल करने के बाद प्रतिक्रिया कोड सेट किया जाना चाहिए। मुझे लगता है कि कार्यान्वयन प्रतिक्रिया की स्थिति के आधार पर विभिन्न लेखकों को प्रदान करता है।

response.getWriter().print(message); 
response.setStatus(500); 
1

सभी HTTP में कारण परिच्छेद की स्थापना के लिए बनाया गया एपीआई की तरह लगता है इस वजह से अप्रचलित हो रही है:

आरएफसी 7230, हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल (HTTP/1.1): संदेश सिंटेक्स और रूटिंग, जून 2014 Section 3.1.2:

कारण-वाक्यांश तत्व उपलब्ध कराने के संख्यात्मक स्थिति कोड, राज्यमंत्री के साथ जुड़े एक टेक्स्ट का वर्णन करने के एकमात्र उद्देश्य के लिए मौजूद है पहले इंटरनेट एप्लिकेशन प्रोटोकॉल के प्रति सम्मान से बाहर निकलें जो अक्सर इंटरैक्टिव टेक्स्ट क्लाइंट के साथ उपयोग किए जाते थे। ए क्लाइंट कारण-वाक्यांश सामग्री को अनदेखा करना चाहिए।

बिलाव version 8.5.0 में org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER संपत्ति के लिए समर्थन हटा दिया।

+0

धन्यवाद सेट करने के लिए इसका उपयोग करने में सक्षम होना चाहिए। इस बिंदु पर, मुझे अब याद नहीं है कि मैं क्यों चाहता था कि कोई ग्राहक कारण वाक्यांश का निरीक्षण करने में सक्षम हो, लेकिन ऐसा प्रतीत नहीं होता कि यह एक बहुत अच्छा विचार था। –