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

Как реализовать запросы и ответы в javaweb

 Сначала посмотрим на блок-схему:

 Процесс обработки запроса сервером:

  (1) Каждый раз, когда сервер получает запрос, он开辟一个新的 поток для этого запроса.
  (2) Сервер будет упаковывать данные запроса клиента в объект request, request - это носитель данных запроса!
  (3) Сервер также создает объект response, который связан с подключением клиента и может использоваться для отправки ответа клиенту.
 

 Из блок-схемы可以看出, в запросах и ответах JavaWeb наиболее важными параметрами являются request и response, эти два параметра находятся в методе service( ) Servlet.

1. Концепция response

         response является параметром метода Servlet.service, тип javax.servlet.http.HttpServletResponse. При каждом отправлении запроса клиентом сервер создает объект response и передает его методу Servlet.service(). Объект response используется для ответа клиенту, что означает, что использование объекта response в методе service() позволяет выполнить ответ клиенту.

Функции объекта response разделены на следующие четыре типа:

(1) Настройка заголовков ответа

(2) Отправка кода состояния

(3) Настройка текста ответа

(4) Перенаправление 

2. Текст ответа response

response - это объект ответа, который используется для вывода текста ответа (тела ответа) клиенту. Для вывода текста ответа можно использовать поток ответа response, response предоставляет два объекта потоков ответа:

PrintWriter out = response.getWriter(): Получение потока символов;

ServletOutputStream out = response.getOutputStream(): Получение потока байт; 

Конечно, если контент ответа является символом, то используется response.getWriter(), если контент ответа является байтом, например при загрузке, то можно использовать response.getOutputStream().

ВниманиеВ одном запросе не можно использовать эти два потока одновременно! То есть, либо вы используете response.getWriter(), либо response.getOutputStream(), но не оба потока одновременно. В противном случае будет выведена исключительная ситуация IllegalStateException.

3. Установка информации заголовков ответа

Можете использовать метод setHeader() объекта response для установки заголовков ответа! Заголовки, установленные этим методом, в конечном итоге будут отправлены клиентскому браузеру!

response.setHeader(“content-type”, “text/html;charset=utf-8”): Устанавливает заголовок content-type, который информирует браузер о том, что содержимое ответа является типа html, кодировка utf-8. И в то же время устанавливается кодировка потока ответа в utf-8, то есть response.setCharaceterEncoding(“utf-8”);

response.setHeader("Refresh","5; URL=http://www.baidu.com"): Через 5 секунд автоматически перебрасывается на главную страницу Baidu.

4. Установка кода состояния и других методов

response.setContentType("text/html;charset=utf-8"): Эквивалентно вызову response.setHeader(“content-type”, “text/html;charset=utf-8”);

response.setCharacterEncoding("utf-8"): Устанавливает кодировку потока ответа в utf-8;

response.setStatus(200): Устанавливает код состояния;

Когда отправляется код ошибки, Tomcat перебрасывается на фиксированную страницу ошибки, но можно отображать информацию об ошибке.

5、Перенаправление (*****важно*****)}

5.1 Что такое перенаправление (два запроса)?

Когда вы посещаете http://www.sun.com, вы заметите, что URL в адресной строке браузера изменяется на http://www.oracle.com/us/sun/index.htm, что является перенаправлением. Перенаправление — это уведомление сервера браузером о необходимости перейти к другому адресу, то есть отправить другой запрос.

 5.2 Как выполнить перенаправление?

Ответ: Статус код перенаправления составляет 302. Сначала мы используем объект response для отправки состояния кода 302 браузеру, а затем устанавливаем Location, то есть предоставляем доступный URL, который браузер будет использовать для доступа к новому URL, чтобы выполнить перенаправление.

Пример:

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");  
   
 

Цель этого кода: после доступа к AServlet сервер уведомляет браузер о перенаправлении на главную страницу Baidu. После того как клиентский браузер интерпретирует ответовый код 302, он понимает, что сервер требует перенаправления, поэтому он немедленно запрашивает заголовок Location и отправляет второй запрос.

Существует также быстрый метод перенаправления:Например, вместо двух предложений в приведенном выше примере можно использовать response.sendRedirect("http://www.baidu.com").

request — содержит все данные запроса клиента 

1、request��述

request является параметром метода Servlet.service(), тип javax.servlet.http.HttpServletRequest. При каждом отправлении запроса клиентом сервер создает объект request и封装请求数анные в этом объекте, а затем передает его методу service() при вызове Servlet.service(), что означает, что в методе service() можно получить данные запроса через объект request.

Как показано на рисунке:


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共同未完成响应体!(都留)                                                                     都有效。     
    Будь то перенаправление запроса или включение запроса, они都属于 одному запросу! Используются одинаковые request и response!  

Сравнение перенаправления запроса и включения запроса:

(1) Если в AServlet выполняется redirection к BServlet, то в AServlet больше не разрешается выводить тело ответа, то есть больше не можно использовать response.getWriter() и response.getOutputStream() для вывода в клиент, эту работу должен выполнить BServlet; если используется inclusion запроса, то нет этого ограничения;

(2)尽管 redirection не может выводить тело ответа, но все же можно установить заголовки ответа, например: response.setContentType(»text/html;charset=utf-8»);

(3) Запрос часто используется в странице JSP, для объединения многопользовательских страниц;

(4) Redirection часто используется в Servlet, а цель redirection часто является страницей JSP;

Как показано на рисунке:


Сравнение redirection и redirection

(1) Redirection - это один запрос, а redirection - два запроса;

(2) После redirection адресная строка браузера не изменяется, а redirection изменяется, потому что redirection - это два запроса;

(3) Цель redirection может быть только ресурсами в этом приложении, а цель redirection может быть в других приложениях;

(4) Метод запроса redirection для AServlet и BServlet одинаковый, то есть либо оба GET, либо оба POST, потому что redirection - это один запрос;

(5) Второй запрос redirection всегда является GET;

 Вот и все, что есть в этой статье, я надеюсь, что это поможет вам в изучении, и希望大家多多支持呐喊教程。

Заявление: контент статьи был взят из Интернета, авторские права принадлежат соответствующему автору, контент был предложен пользователями Интернета и загружен самостоятельно, сайт не имеет права собственности, не underwent редактирование, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите подозрительный контент, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении, и предоставьте соответствующие доказательства, после проверки, сайт немедленно удалят подозрительный контент.

Вам может понравиться