English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Regardons d'abord un diagramme de flux :
Le flux de traitement du serveur pour les demandes :
) (1Le serveur ouvre un nouveau thread à chaque fois qu'il reçoit une demande.
) (2Le serveur encapsulera les données de demande du client dans l'objet request, request est le porte-données des données de demande !
) (3Le serveur créera également un objet response, qui est connecté au client, et peut être utilisé pour envoyer des réponses au client.
Il est possible de voir sur le diagramme de flux que les deux paramètres les plus importants dans les demandes et réponses de JavaWeb sont request et response, ces deux paramètres sont dans la méthode service( ) de Servlet.
1、response概念:
response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。
response对象的功能分为以下四种:
) (1)设置响应头信息
) (2)发送状态码
) (3)设置响应正文
) (4)重定向
2、response响应正文
response是响应对象,向客户端输出响应正文(响应体)可以使用response的响应流,repsonse一共提供了两个响应流对象:
) (1)PrintWriter out = response.getWriter():获取字符流;
) (2)ServletOutputStream out = response.getOutputStream():获取字节流;
当然,如果响应正文内容为字符,那么使用response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用response.getOutputStream()。
注意,在一个请求中,不能同时使用这两个流!也就是说,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用这两个流。不然会抛出illegalStateException异常。
3、设置响应头信息
可以使用response对象的setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器!
) (1)response.setHeader(“content-type”, "text/html;charset=utf-8"):设置content-type响应头,该头的作用是告诉浏览器响应内容为html类型,编码为utf-8。而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8") ;
) (2)response.setHeader("Refresh","5; URL=http://www.baidu.com):5秒后自动跳转到百度主页。
4、设置状态码及其他方法
) (1")response.setContentType("text/html;charset=utf-8") : équivalent à appeler response.setHeader("content-type”, "text/html;charset=utf-8") ;
) (2)response.setCharacterEncoding("utf-8)response.setCharacterEncoding("utf-8;
) (3)response.setStatus(200) : définir le code d'état ;
) (4)response.sendError(404, "La ressource que vous cherchez n'existe pas") : Lorsque vous envoyez un code d'état d'erreur, Tomcat saute vers une page d'erreur fixe, mais peut afficher un message d'erreur.
5、redirection (*****重点*****)
5.1 Qu'est-ce que la redirection (deux requêtes) ?
Quand vous accédez à http://www.sun.com, vous会发现浏览器地址栏中的URL会变成http://www.oracle.com/us/sun/index.htm, c'est une redirection. La redirection est l'avis du serveur au navigateur pour accéder à une autre adresse, c'est-à-dire pour émettre une autre requête.
5.2 Comment effectuer une redirection ?
Réponse : le code de statut de redirection est302D'abord, nous utilisons l'objet response pour envoyer au navigateur302L'état de code, puis configurez un Location, c'est-à-dire fournissez une URL utilisable, que le navigateur accède à la nouvelle URL, réalisez la redirection.
Exemple :
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'effet de ce code est : après l'accès à AServlet, il notifie le navigateur de se rediriger vers la page d'accueil de Baidu. Le navigateur client analyse le code de réponse302Après cela, on sait que le serveur lui demande de se rediriger, donc il récupère immédiatement l'en-tête de réponse Location et envoie une deuxième requête.
Il existe également une méthode de redirection rapide,Par exemple, les deux phrases du exemple précédent peuvent utiliser response.sendRedirect("http://www.baidu.com") pour le remplacer.
request—encapsule toutes les données de requête du client
1、description de request
request est un paramètre de la méthode Servlet.service() de type javax.servlet.http.HttpServletRequest. Chaque fois que le client envoie une requête, le serveur crée un objet request, encapsule les données de la requête dans request, puis les transmet à la méthode service() lors de l'appel à la méthode service(), ce qui signifie que les données de la requête peuvent être obtenues via l'objet request dans la méthode service();
) Comme illustré ci-dessous :
)Les fonctionnalités de request peuvent être divisées en plusieurs types :
) (1)Il encapsule les données des en-têtes de la requête;
) (2)Il encapsule les données du corps de la requête, s'il s'agit d'une requête GET, il n'y a pas de corps;
) (3)request est un objet de domaine, il peut être traité comme une Map pour ajouter et obtenir des données;
) (4)request fournit les fonctionnalités de redirection de requête et d'inclusion de requête.
2、méthodes de domaine request
Request est un objet de domaine ! Dans JavaWeb, il y a quatre objets de domaine, dont ServletContext est un objet de domaine, qui ne crée qu'un seul objet ServletContext dans tout l'application. Request en est un, et request peut partager des données dans une même requête.
Une requête crée un objet request, si plusieurs Servlets sont traversés dans une même requête, plusieurs Servlets peuvent partager des données via request. Nous ne savons pas encore combien de Servlets peuvent être traversés dans une même requête.
Voici les méthodes de domaine de request :
) (1)void setAttribute(String name, Object value):Utilisé pour stocker un objet, ou aussi appelé stocker un attribut de domaine, par exemple : servletContext.setAttribute(“xxx”, “XXX”) stocke un attribut de domaine dans la requête, le nom de l'attribut de domaine est xxx, et la valeur de l'attribut de domaine est XXX. Veuillez noter que si cette méthode est appelée plusieurs fois avec le même name, la valeur précédente sera remplacée, ce qui est une caractéristique similaire à celle de Map;
) (2)Object getAttribute(String name):Utilisé pour obtenir des données dans la requête, avant de les obtenir, il faut d'abord les stocker, par exemple : String value = (String)request.getAttribute(“xxx”);, obtenir l'attribut de domaine nommé xxx;
) (3)void removeAttribute(String name):Utilisé pour supprimer les attributs de domaine dans la requête, si l'attribut de domaine spécifié par le paramètre name n'existe pas, cette méthode ne fait rien;
) (4)Enumeration getAttributeNames():获取所有域属性的名称;
3、request传递参数
最为常见的客户端传递参数方式有两种:
) (1)浏览器地址栏直接输入:一定是GET请求;
) (2)超链接:一定是GET请求;
) (3)表单:可以是GET,也可以是POST,这取决与