English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Vamos olhar primeiro para um diagrama de fluxo:
O fluxo de processamento da solicitação do servidor:
)1Cada vez que o servidor receber uma solicitação, ele abrirá uma nova thread para essa solicitação.
)2O servidor encapsulará os dados da requisição do cliente no objeto request, o request é o veículo dos dados da requisição!
)3O servidor também criará um objeto response, esse objeto está conectado ao cliente, e pode ser usado para enviar respostas ao cliente.
A partir do diagrama de fluxo, podemos ver que os dois parâmetros mais importantes nas requisições e respostas do JavaWeb são request e response, esses parâmetros estão no método service( ) do 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"): Equivalent to calling response.setHeader(“content-type”, "text/html;charset=utf-8");
)2) response.setCharacterEncoding("utf-8) Set character encoding of the character response stream to utf-8;
)3) response.setStatus(200): Set status code;
)4) response.sendError(404, "The resource you are looking for does not exist"): When sending an error status code, Tomcat will jump to a fixed error page, but can display error information.
5, redirection (*****重点*****)
5.1 What is redirection (two requests)?
When you visit http://www.sun.com, you will find that the URL in the browser address bar will change to http://www.oracle.com/us/sun/index.htm, which is a redirection. Redirection is when the server notifies the browser to visit another address, that is, to make another request.
5.2 How to complete redirection?
Answer: The status code for redirection is302Firstly, we use the response object to send302status code, and then set a Location, that is, provide a usable URL, so that the browser can access the new URL and achieve redirection.
For example:
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"); } }
The purpose of the above code is: after accessing AServlet, it will notify the browser to redirect to Baidu's homepage. The client browser parses the response code to302After that, knowing that the server wants to redirect, it will immediately retrieve the response header Location and make a second request.
There is also a quick redirection method,Even using the response.sendRedirect() method. For example, the two sentences in the above example can be replaced with response.sendRedirect("http://www.baidu.com") instead.
request—encapsulates all the client's request data
1、resumo do request
request é um parâmetro do método Servlet.service(), do tipo javax.servlet.http.HttpServletRequest. A cada vez que o cliente emitir uma solicitação, o servidor criará um objeto request, encapsulará os dados da solicitação no request e passará para o método service() quando chamar o método service(), o que significa que podemos obter dados da solicitação através do objeto request no método service();
) Como mostrado na figura:
As funções do request podem ser divididas em os seguintes tipos:
)1)Encapsula os dados de cabeçalho da solicitação;
)2)Encapsula os dados do corpo da solicitação, se for uma solicitação GET, não há corpo;
)3)request é um objeto de domínio, pode ser tratado como Map para adicionar e obter dados;
)4)request oferece funções de encaminhamento de solicitação e inclusão de solicitação.
2Métodos de domínio request
request é um objeto de domínio! No JavaWeb, há quatro objetos de domínio, onde o ServletContext é um objeto de domínio, que cria apenas um objeto ServletContext em todo o aplicativo. request é um deles, request pode compartilhar dados em uma solicitação.
Uma solicitação cria um objeto request, se vários Servlets forem passados em uma solicitação, vários Servlets podem usar o request para compartilhar dados. Ainda não sabemos quantos Servlets podem ser passados em uma solicitação.
A seguir estão os métodos de domínio do request:
)1)void setAttribute(String name, Object value):Usado para armazenar um objeto, também pode ser chamado de armazenar um atributo de domínio, por exemplo: servletContext.setAttribute(“xxx”, “XXX”), armazenou um atributo de domínio no request, o nome do atributo de domínio é xxx, e o valor do atributo de domínio é XXX. Note que, se o método for chamado várias vezes e usar o mesmo name, o valor da última chamada substituirá o valor da chamada anterior, esta característica é semelhante ao Map;
)2)Object getAttribute(String name):Usado para obter dados do request, antes de obter, é necessário armazenar primeiro, por exemplo: String value = (String)request.getAttribute(“xxx”);, obter o atributo de domínio chamado xxx;
)3)void removeAttribute(String name):Usado para remover o atributo de domínio do request, se o atributo de domínio especificado pelo parâmetro name não existir, então este método não faz nada;
)4)Enumeration getAttributeNames():获取所有域属性的名称;
3、request传递参数
最为常见的客户端传递参数方式有两种:
)1)浏览器地址栏直接输入:一定是GET请求;
)2)超链接:一定是GET请求;
)3)表单:可以是GET,也可以是POST,这取决与