English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Сначала посмотрим на блок-схему:
Процесс обработки запроса сервером:
(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,这取决与