English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Prima di tutto, guardiamo un diagramma di flusso:
Flusso di lavoro del server per gestire le richieste:
(1) Ogni volta che il server riceve una richiesta, aprirà una nuova thread per questa richiesta.
(2) Il server impacchetterà i dati di richiesta del client in un oggetto request, request è il vettore dei dati di richiesta!
(3) Il server creerà anche un oggetto response, questo oggetto è collegato al client e può essere utilizzato per inviare risposte al client.
Dal diagramma di flusso可以看出, nei richieste e risposte di JavaWeb, i due parametri più importanti sono request e response, questi parametri si trovano nel metodo service( ) del Servlet.
1、concezione di response:
response è un parametro di metodo Servlet.service, di tipo javax.servlet.http.HttpServletResponse. Ogni volta che il client invia una richiesta, il server crea un oggetto response e lo passinga al metodo Servlet.service(). L'oggetto response viene utilizzato per rispondere al client, il che significa che è possibile completare il lavoro di risposta al client utilizzando l'oggetto response nel metodo service().
Le funzioni dell'oggetto response sono suddivise in quattro tipi come segue:
(1) Impostazione delle informazioni di risposta dell'header
(2) Invio del codice di stato
(3) Impostazione del corpo di risposta
(4) Redirezione
2、corpo di risposta di response
response è l'oggetto di risposta, che emette il corpo della risposta (corpo di risposta) al client utilizzando lo stream di risposta di response, response fornisce complessivamente due oggetti di stream di risposta:
(1) PrintWriter out = response.getWriter(): Ottieni il flusso di carattere;
(2) ServletOutputStream out = response.getOutputStream(): Ottieni il flusso di byte;
Naturalmente, se il contenuto del corpo della risposta è un carattere, utilizzare response.getWriter(), se il contenuto della risposta è in byte, ad esempio durante il download, utilizzare response.getOutputStream().
AttenzioneIn una richiesta, non è possibile utilizzare entrambi questi flussi contemporaneamente! Questo significa che o si utilizza response.getWriter() o response.getOutputStream(), ma non entrambi i flussi. Altrimenti, viene lanciata un'eccezione IllegalStateException.
3、Imposta le informazioni dell'intestazione di risposta
È possibile utilizzare il metodo setHeader() dell'oggetto response per impostare l'intestazione di risposta! Le intestazioni di risposta impostate con questo metodo verranno inviate al browser del client!
(1) response.setHeader(“content-type”, “text/html;charset=utf-8”): Imposta l'intestazione di risposta content-type, che ha lo scopo di informare il browser che il contenuto della risposta è di tipo html, con codifica utf-8. Inoltre, imposta la codifica del flusso di risposta in utf-8, ossia response.setCharaceterEncoding(“utf-8”);
(2) response.setHeader("Refresh","5; URL=http://www.baidu.com"): Saltare automaticamente alla pagina principale di Baidu dopo 5 secondi.
4、Imposta il codice di stato e altri metodi
(1) response.setContentType("text/html;charset=utf-8"): È equivalente a chiamare response.setHeader(“content-type”, “text/html;charset=utf-8”);
(2) response.setCharacterEncoding(“utf-8”): Imposta la codifica del flusso di risposta in utf-8;
(3) response.setStatus(200): Imposta il codice di stato;
Quando si invia un codice di stato di errore, Tomcat si sposta verso una pagina di errore fisso, ma può visualizzare un messaggio di errore. (4) response.sendError(404, “La risorsa da cercare non esiste”):
5、Ridirezione (*****Punto chiave*****)}
5.1 Cos'è la ridirezione (due richieste)
Quando visiti http://www.sun.com, noterai che l'URL nella barra degli indirizzi del browser diventa http://www.oracle.com/us/sun/index.htm, questo è una ridirezione. La ridirezione è quando il server notifica al browser di visitare un altro indirizzo, ovvero di inviare un'altra richiesta.
5.2 Come completare la ridirezione?
Risposta: Lo stato di ridirezione è 302, utilizziamo prima l'oggetto response per inviare lo stato 302 al browser, quindi impostiamo un Location, ovvero forniamo un URL disponibile, che il browser accede per realizzare la ridirezione.
Esempio:
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); response.setHeader("Location", "http://www.baidu.com"); } }
L'azione del codice sopra è: dopo aver acceduto a AServlet, notifica al browser di ridirigere alla homepage di Baidu. Dopo che il browser client ha interpretato il codice di risposta 302, sa che il server lo sta ridirigendo, quindi ottiene immediatamente l'intestazione di risposta Location e invia una seconda richiesta.
Esiste anche un metodo di ridirezione rapido:Ad esempio, le due righe dell'esempio possono essere sostituite con response.sendRedirect("http://www.baidu.com").
request - impacchetta tutti i dati di richiesta del client
1、概述request
request è un parametro di metodo Servlet.service(), di tipo javax.servlet.http.HttpServletRequest. Ogni volta che il client invia una richiesta, il server crea un oggetto request e impacchetta i dati della richiesta all'interno di esso, quindi lo passinga al metodo service() quando viene chiamato Servlet.service(), il che significa che all'interno del metodo service() è possibile ottenere i dati della richiesta attraverso l'oggetto request.
Come mostrato nell'immagine:
request的功能可以分为以下几种:
(1)封装了请求头数据;
(2)封装了请求正文数据,如果是GET请求,则没有正文;
(3)request是一个域对象,可以将其视为Map来添加和获取数据;
(4)request提供了请求转发和请求包含功能。
2、request域方法
request是域对象!在JavaWeb中总共有四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request是其中一个,request可以在一个请求中共享数据。
一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。现在我们还不知道在一个请求中经历多少个Servlet。
以下是request的域方法:
(1)void setAttribute(String name, Object value):用于存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,则将覆盖上一次的值,这一特性与Map相同;
(2)Object getAttribute(String name):用于获取request中的数据,在获取之前需要先进行存储,例如:String value = (String)request.getAttribute(“xxx”); 获取名为xxx的域属性;
(3)void removeAttribute(String name):用于从request中移除域属性,如果参数name指定的域属性不存在,则本方法不执行任何操作;
(4)Enumeration getAttributeNames():获取所有域属性的名称;
3、request传递参数
最为常见的客户端传递参数方式有两种:
(1)浏览器地址栏直接输入:一定是GET请求;
(2)超链接:一定是GET请求;
(3)表单:可以是GET,也可以是POST,这取决与