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

Como implementar solicitações e respostas no javaweb

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

的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共同未完成响应体!(都留)                                                                     都有效。     
    > Seja para redirecionamento de solicitação ou inclusão de solicitação, tudo está dentro de um intervalo de solicitação! Utilize o mesmo request e response!  

Comparação entre encaminhamento de solicitação e inclusão de solicitação:

)1) Se o encaminhamento de solicitação de AServlet para BServlet, não é permitido mais output do corpo da resposta em AServlet, ou seja, não pode mais usar response.getWriter() e response.getOutputStream() para output para o cliente, essa tarefa deve ser feita pelo BServlet; Se usar o encaminhamento de solicitação, não há essa restrição;

)2) Embora o encaminhamento de solicitação não possa output o corpo da resposta, ainda é possível configurar o cabeçalho da resposta, por exemplo: response.setContentType(”text/html;charset=utf-8)

)3) O encaminhamento de solicitação é aplicado principalmente em páginas JSP, para completar a combinação de várias páginas;

)4) O encaminhamento de solicitação é aplicado principalmente em Servlet, e o destino do encaminhamento é principalmente páginas JSP;

) Como mostrado na figura:


Comparação de encaminhamento de solicitação e redirecionamento

)1) O encaminhamento de solicitação é uma solicitação, enquanto o redirecionamento é duas solicitações;

)2) Após o encaminhamento de solicitação, o endereço da barra de endereços do navegador não mudará, enquanto o redirecionamento mudará, porque o redirecionamento é duas solicitações;

)3) O destino do encaminhamento de solicitação pode ser apenas recursos deste aplicativo, enquanto o destino do redirecionamento pode ser outro aplicativo;

)4) O método de solicitação de encaminhamento para AServlet e BServlet é o mesmo, ou seja, ambos são GET ou POST, porque o encaminhamento de solicitação é uma solicitação;

)5) A segunda solicitação de redirecionamento sempre é GET;

 Isso é tudo o que há no artigo. Espero que ajude na sua aprendizagem e que você apoie o tutorial Yell.

Declaração: O conteúdo deste artigo é extraído da Internet, pertence ao respectivo proprietário. O conteúdo é contribuído e carregado voluntariamente pelos usuários da Internet. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Atingido, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar