English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Servlet 服务器 HTTP 响应

Come discusso nei capitoli precedenti, quando un server web risponde a una richiesta HTTP, la risposta di solito include una riga di stato, alcuni header di risposta, una riga vuota e il documento. Un esempio tipico di risposta è il seguente:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (Riga vuota)
!doctype ...
<html>
<head>...</head>
<body>
...
</body>
</html>

La riga di stato include la versione HTTP (in questo esempio HTTP/1.1), un codice di stato (in questo esempio 200) e un messaggio breve corrispondente al codice di stato (in questo esempio OK).

La tabella seguente riassume i più utili header di risposta HTTP 1.1 che vengono restituiti dal server web al browser, che utilizzerai spesso nella programmazione web:

Intestazioni di headDescrizione
AllowQuesta intestazione specifica i metodi di richiesta supportati dal server (GET, POST ecc.).
Cache-ControlQuesta intestazione specifica in quali circostanze il documento di risposta può essere archiviato in modo sicuro. I valori possibili sono:public, private o no-cache ecc. Public significa che il documento è archiviabile, Private significa che il documento è un documento privato per un singolo utente e può essere memorizzato solo nella cache privata (non condivisa), no-cache significa che il documento non dovrebbe essere archiviato.
ConnectionQuesta intestazione indica se il browser utilizza una connessione HTTP persistente. Valore close Indica che il browser non utilizza una connessione HTTP persistente, valore keep-alive Significa utilizzare una connessione persistente.
Content-DispositionQuesta intestazione consente di richiedere al browser di salvare la risposta come file con un nome specificato.
Content-EncodingDurante il trasporto, questa intestazione specifica il metodo di codifica della pagina.
Content-LanguageQuesta intestazione indica la lingua utilizzata per scrivere il documento. Ad esempio, en, en-us, ru ecc.
Content-LengthQuesta intestazione indica il numero di byte nel corpo della risposta. Queste informazioni sono necessarie solo quando il browser utilizza una connessione HTTP persistente (keep-alive).
Content-TypeQuesta intestazione fornisce il tipo MIME (Multipurpose Internet Mail Extension) del documento di risposta.
ExpiresQuesta intestazione specifica quando il contenuto diventa non più archiviabile, dopo di che il contenuto non viene più archiviato.
Last-ModifiedQuesta intestazione indica l'ora dell'ultima modifica del documento. Dopo di che, il client può memorizzare il file nella cache e richiedere il file in futuro tramite If-Modified-Since L'intestazione di richiesta fornisce una data.
LocationQuesta intestazione dovrebbe essere inclusa in tutte le risposte con codice di stato. Entro 300 secondi, avvisa il browser dell'indirizzo del documento. Il browser si riconnetterà automaticamente a questa posizione e otterrà il nuovo documento.
RefreshQuesta intestazione specifica come il browser dovrebbe richiedere il refresh della pagina il più rapidamente possibile. È possibile specificare il numero di secondi per il refresh della pagina.
Retry-AfterQuesta intestazione può essere utilizzata insieme al codice di risposta 503 (Service Unavailable - Servizio non disponibile), il che avvisa il client di quanto tempo deve attendere prima di ripetere la sua richiesta.
Set-CookieQuesta intestazione specifica un cookie associato alla pagina.

Metodi per impostare gli header di risposta HTTP

I seguenti metodi possono essere utilizzati per impostare gli header di risposta HTTP in un programma Servlet. Questi metodi passano HttpServletResponse Oggetto disponibile.

NumeroMetodo & Descrizione
1String encodeRedirectURL(String url)
Codificare l'URL specificato utilizzato nel metodo sendRedirect, o restituire l'URL non modificato se la codifica non è necessaria.
2String encodeURL(String url)
Codificare l'URL specificato che contiene l'ID di sessione, o restituire l'URL non modificato se la codifica non è necessaria.
3boolean containsHeader(String name)
Restituire un valore booleano che indica se è stato già impostato un header di risposta nome specificato.
4boolean isCommitted()
Restituire un valore booleano che indica se la risposta è stata già inviata.
5void addCookie(Cookie cookie)
Aggiungere il cookie specificato alla risposta.
6void addDateHeader(String name, long date)
Aggiungere un header di risposta con un nome e un valore di data dati.
7void addHeader(String name, String value)
Aggiungere un header di risposta con un nome e un valore dati.
8void addIntHeader(String name, int value)
Aggiungere un header di risposta con un nome e un valore intero dati.
9void flushBuffer()
Forzare qualsiasi contenuto nel buffer a essere scritto al client.
10void reset()
Pulire qualsiasi dato esistente nel buffer, inclusi lo stato e gli header.
11void resetBuffer()
Pulire il contenuto del buffer di base nella risposta, senza pulire lo stato e gli header.
12void sendError(int sc)
Inviare una risposta di errore al client utilizzando il codice di stato specificato e pulire il buffer.
13void sendError(int sc, String msg)
Inviare una risposta di errore al client utilizzando lo stato specificato.
14void sendRedirect(String location)
Inviare una risposta di redirezione temporanea al client utilizzando l'URL di posizione di redirezione specificato.
15void setBufferSize(int size)
为响应主体设置首选的缓冲区大小。
16void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
17void setContentLength(int len)
设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头。
18void setContentType(String type)
如果响应还未被提交,设置被发送到客户端的响应的内容类型。
19void setDateHeader(String name, long date)
设置一个带有给定的名称和日期值的响应报头。
20void setHeader(String name, String value)
设置一个带有给定的名称和值的响应报头。
21void setIntHeader(String name, int value)
设置一个带有给定的名称和整数值的响应报头。
22void setLocale(Locale loc)
如果响应还未被提交,设置响应的区域。
23void setStatus(int sc)
为该响应设置状态码。

HTTP Header 响应示例

您已经在前面的示例中看到 setContentType() 方法,下面的示例也使用了同样的方法,此外,我们会用 setIntHeader() 方法来设置 Refresh 头。

//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Refresh")
//Extend HttpServlet class
public class Refresh extends HttpServlet {
    //Method to handle GET method requests
      public void doGet(HttpServletRequest request,
                        HttpServletResponse response)
                throws ServletException, IOException
      {
          //Set the automatic reload time to 5 seconds
          response.setIntHeader("Refresh", 5);
          //Set response content type
          response.setContentType("text/html;charset=UTF-8");
         
          //Get a calendar using the default time zone and language environment  
          Calendar cale = Calendar.getInstance();  
          //Convert Calendar type to Date type  
          Date tasktime = cale.getTime();  
          //Set the date output format  
          SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
          //Formatted output  
          String nowTime = df.format(tasktime);
          PrintWriter out = response.getWriter();
          String title = "Automatic Refresh Header Setting - Basic Tutorial Website Example";
          String docType =
          "<!DOCTYPE html>\n"
          out.println(docType +
            "<html>\n"
            "<head><title>" + title + "</title></head>\n"
            "<body bgcolor="#f0f0f0">\n"
            "<h1 align="center">" + title + "</h1>\n"
            "<p>Current time is: " + nowTime + "</p>\n"
      }
      // Metodo per gestire la richiesta POST
      public void doPost(HttpServletRequest request,
                         HttpServletResponse response)
          throws ServletException, IOException {
         doGet(request, response);
      }
}

L'esempio di test sopra è situato nel progetto TomcatTest, la configurazione corrispondente web.xml è la seguente:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
  <servlet>  
     <!-- Nome della classe -->  
    <servlet-name>Refresh</servlet-name>  
    <!-- Pacchetto in cui si trova -->  
    <servlet-class>com.w3codebox.test.Refresh</servlet-class>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>Refresh</servlet-name>  
    <!-- Indirizzo del sito visitato -->  
    <url-pattern>/TomcatTest/Refresh</url-pattern>  
    </servlet-mapping>  
</web-app>

Ora, chiamare il seguente Servlet, ogni 5 secondi verrà visualizzato l'ora sistema corrente. Basta eseguire il Servlet e aspettare un momento, per vedere i seguenti risultati: