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

Come implementare richieste e risposte in javaweb

 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,这取决与

的method属性值;

GET请求和POST请求的区别:

(1)GET请求:

请求参数会在浏览器的地址栏中显示,所以不安全;

请求参数长度限制长度在1K之内;

GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

(2)POST请求:

请求参数不会显示浏览器的地址栏,相对安全;

请求参数长度没有限制;

4、请求转发和请求包含(*****重点*****)

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");  使用request获取RequestDispatcher对象,方法的参数是被转发或包含的Servlet的Servlet路径

请求转发:rd.forward(request,response);
请求包含:rd.include(request,response);

有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
    > 一个请求跨多个Servlet,需要使用转发和包含。
 > 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)            即当前Servlet设置的相应头有效,相应体无效。
    > 请求包含:由两个Servlet共同未完成响应体!(都留)                                                                     都有效。     
    Sia il reindirizzamento della richiesta che l'inclusione della richiesta si verificano all'interno di un intervallo di richiesta! Utilizzano lo stesso request e response!  

Confronto tra reindirizzamento della richiesta e inclusione della richiesta:

(1) Se si forwarda una richiesta da AServlet a BServlet, non è permesso produrre ulteriori corpi di risposta in AServlet, ovvero non è possibile utilizzare response.getWriter() e response.getOutputStream() per inviare risposte al client, questo lavoro dovrebbe essere completato da BServlet; se si utilizza l'inclusione di richiesta, non ci sono limitazioni di questo tipo;

(2) Anche se ilforwarding non può produrre un corpo di risposta, è ancora possibile impostare l'intestazione di risposta, ad esempio: response.setContentType(”text/html;charset=utf-8”);

(3) La richiesta include è spesso applicata nelle pagine JSP, per completare la fusione delle pagine multipli;

(4) Ilforwarding è spesso applicato nei Servlet, e ilforwarding è spesso una pagina JSP;

Come mostrato nell'immagine:


Confronto tra forwarding e reindirizzamento

(1) Ilforwarding è una richiesta, mentre il reindirizzamento sono due richieste;

(2) Dopo ilforwarding l'indirizzo della barra di ricerca del browser non cambia, mentre il reindirizzamento cambia, perché il reindirizzamento è due richieste;

(3) Ilforwarding può essere solo una risorsa dell'applicazione, mentre il reindirizzamento può essere un'altra applicazione;

(4) Il metodo di richiesta delforwarding per AServlet e BServlet è lo stesso, ovvero entrambi GET o entrambi POST, perché ilforwarding è una richiesta;

(5) La seconda richiesta di reindirizzamento deve essere GET;

 Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento, e ti preghiamo di supportare e gridare le guide.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, è di proprietà dei rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non possiede i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di copyright, ti preghiamo di inviare una email a notice#oldtoolbag.com (al momento dell'invio dell'email, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente i contenuti sospetti di copyright.

Ti potrebbe interessare