2011-02-18 13 views
25

OutputStream'i HttpServletResponse'den "yıkamak" zorunda mıyım?Servlet çıktı akışını temizlemem gerekir mi?

Daha önce Should I close the servlet outputstream? numaralı bağlantı noktasını, kapatmam gerekmediğini gördüm, ancak temizlemem gerekmediği belli değil. Konteynerden de beklemeli miyim?

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    byte[] response = getResponse(); 
    String responseType = getResponseType(); 

    response.setContentLength(response.length); 
    response.setContentType(responseType); 
    response.getOutputStream().write(response); 
    response.getOutputStream().flush(); // yes/no/why? 
} 

cevap

37

Gerek yok. Servletcontainer sizin için temizleyecek ve kapatacaktır. Bu arada kapanma, örtük olarak gizli olarak çağırır.

da Servlet 3.1 specification bölüm 5.6 bakınız: Tepki Nesne bir yanıt kapalıdır

ait

5,6 Kapatma, konteyner Derhal floş istemciye yanıt tamponu içinde kalan tüm içeriği.

  • servlet'ten service yöntemin sonlandırma: Aşağıdaki olaylar servlet isteğini yerine getirdiği sonucuna ve yanıt nesnesi kapatılması olduğunu göstermektedir.
  • Yanıtın setContentLength veya setContentLengthLong yönteminde belirtilen içerik miktarı sıfırdan büyük ve yanıtına yazılmıştır.
  • sendError yöntemi çağrılır.
  • sendRedirect yöntemi çağrılır.
  • AsyncContext üzerinde complete yöntemi çağrılır.

çağrılması gömme süre hala aynı akışta birden yazarlar olduğunda servlet'in hizmet genellikle yalnızca faydalıdır çalışan ve (örneğin karışık ikili/karakter verileri ile dosyası) veya zaman yazarın geçmek istediğiniz Akış işaretçisini belirsiz bir süre için açık tutmak istersiniz (örneğin bir günlük dosyası).

+0

Bu, konuma dayanıyor mu (mdrg başına) veya bir yerde belgeleniyor mu? – shmosel

+0

@shmosel: Belirtimi, belirtimden alıntı içermesi için güncelledim. – BalusC

2

Diğer sorunuzda gördüğünüz aynı yanıtın burada geçerli olduğunu tahmin edin: akışınız buysa, yıkayın ve kapatın. Aksi takdirde akış oluşturucu, aksi belirtilmedikçe, bunu yapmalıdır.

1
java.lang.Object 
    extended byjava.io.Writer 
     extended byjavax.servlet.jsp.JspWriter 


close 
public abstract void close() 
        throws IOException 
Close the stream, flushing it first. 
This method needs not be invoked explicitly for the initial JspWriter as the code generated by the JSP container will automatically include a call to close(). 

Closing a previously-closed stream, unlike flush(), has no effect. 


Throws: 
IOException - If an I/O error occurs 

============================ 

So, DO NOT close the output stream explicitly. 
0

kuralı “temizlemek gerek” sinsi bir istisna işaret etmek: Ben ihtiyaç duyulduğu anlaşılmıştır IBM WebSphere Application Server ile çalışma ve Yanıt (ziyade OutputStream) Writer kullanarak yıkayın; aksi halde yanıt veremin son kısmı kayboldu. IBM'in HttpServletResponse sınıfının gerçekten Çıkış Akışı'u temizlediğini, ancak Writer için ayrı bir arabellek kullandığını ve temizlemediğini varsayalım. Diğer uygulama sunucuları bunu yapıyor gibi görünüyor.

Yanıt verilerinizi Yazarı'a gönderirseniz, onu temizlemek daha güvenlidir. Ancak, OutputStream'u pazarlığa akıtmaya gerek yoktur.

(Bunu bir yorum olarak gönderdim, ancak bunu yapmak için bir itibartan yoksundur).)

İlgili konular