3.1 Classe HttpServletResponse
Dopo aver chiamato service()
il tuo metodo servlet, il contenitore web genererà una risposta al client in base al file HttpServletResponse
. Quindi, se vuoi influenzare in qualche modo la risposta al cliente, allora dovresti modificare questo oggetto.
La risposta del server si compone di tre parti:
- Riga di stato (ad esempio: 200 OK)
- Intestazioni
- Corpo di risposta
E HttpServletResponse
anche i metodi di classe sono divisi in 3 gruppi? Quasi:
Metodi | Descrizione | |
---|---|---|
1 | void setStatus(int sc) |
Imposta il codice di stato della risposta. |
2 | void sendError(int sc) |
Invia un errore al client con il codice specificato. |
3 | void sendError(int sc, String msg) |
Invia un errore con il codice specificato e un messaggio al client. |
4 | void addHeader(String name, String value) |
Aggiunge un'intestazione all'elenco delle intestazioni di risposta. |
5 | void setHeader(String name, String value) |
Modifica l'intestazione nell'elenco delle intestazioni di risposta. |
6 | boolean containsHeader(String name) |
Verifica se l'intestazione esiste già. |
7 | void addCookie(Cookie cookie) |
Aggiunge un cookie alla risposta. |
8 | void sendRedirect(String location) |
Reindirizza il client a un URL diverso. |
9 | String encodeRedirectURL(String url) |
Codifica l'URL specificato per l'utilizzo nel metodo sendRedirect. |
10 | String encodeURL(String url) |
Codifica l'URL specificato, incluso l'ID sessione. |
undici | void setContentType(String type) |
Imposta il MimeType del risultato. |
12 | void setContentLength(int len) |
Imposta la lunghezza del corpo della risposta. |
13 | void setCharacterEncoding(String charset) |
Imposta il set di codifica della risposta. |
14 | void setBufferSize(int size) |
Imposta la dimensione del buffer per il corpo della risposta. |
15 | boolean isCommitted() |
Controlla se il buffer è già stato scritto nella risposta. |
16 | void flushBuffer() |
Scrive il contenuto del buffer nella risposta. |
17 | void reset() |
Reimposta tutti i dati memorizzati nel buffer, nelle intestazioni e nei codici di risposta. |
18 | void resetBuffer() |
Cancella il buffer di risposta. |
I metodi qui sono piuttosto banali. Ma ti darò alcuni punti salienti di seguito.
Tampone . La risposta del tuo servlet viene scritta in un buffer, non inviata immediatamente all'utente. Pertanto, a un certo punto (se, ad esempio, si verifica un errore), è possibile ripristinare (cancellare) tutto ciò che è scritto nel buffer. Puoi persino chiamare il metodo reset() e cancellare non solo il contenuto del buffer, ma anche le intestazioni con il codice di risposta.
3.2 reindirizzamento()
Il secondo punto importante è il reindirizzamento. Se il tuo servlet decide di reindirizzare il client a un altro URL, devi in qualche modo inviare questo URL al client. Questo può essere fatto usando il sendRedirect
.
Ma c'è una sfumatura importante. L'URI può contenere una gamma di caratteri più ampia di quella consentita nel corpo della risposta. Pertanto, l'URL deve prima essere codificato in un set di caratteri valido prima di chiamare il metodo sendRedirect()
. C'è un metodo speciale per questo encodeRedirectURL(String url)
. Usalo.
Esempio di reindirizzamento:
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String newUrl = "http://google.com?q=Learn to google!";
String redirectUrl = response.encodeRedirectURL(newUrl);
response.sendRedirect(redirectUrl);
}
}
3.3 Metodo getWriter()
E ora impareremo come scrivere il nostro testo come corpo di risposta. Per fare ciò, la classe HttpServletResponse
ha un metodo speciale getWriter()
che restituisce un oggetto PrintStream
. Se qualcuno l'ha dimenticato, questo è il tipo di campo con il nome System.out
.
Per scrivere del testo come risposta servlet, è necessario:
- Ottenere l'oggetto PrintStream chiamando il metodo
response.getWriter()
. - Scrivi tutto ciò che ritieni necessario nell'oggetto PrintStream (tutti i dati verranno scritti nel buffer).
- Invia il buffer all'utente chiamando il metodo
close()
su PrintStream.
Scriviamo una servlet che somma due numeri a
e b
restituisce il risultato all'utente:
public class CalculatorServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
// Getting the parameter “a” and “b” from request
String a = request.getParameter("a");
String b = request.getParameter("b");
try {
// Convert strings to numbers and calculate sum
int sum = Integer.parseInt(a) + Integer.parseInt(b);
// Print HTML as a response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head> <title> CalculatorServlet </title> </head>");
out.println("<body>");
out.println("<h1> Sum == " + sum + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}