Базовое изучение Java: запрос и ответ JavaWeb

Java

Другие основные статьи по Java:Базовое изучение Java (справочник)

Узнайте о http-запросах, прежде чем изучать запросы и ответы


HTTP-запрос

Когда браузер запрашивает веб-ресурс с сервера, он называется браузером, отправляющим http-запрос на сервер. Полный http-запрос должен состоять из трех частей:

  • строка запроса[Опишите метод запроса клиента, имя запрошенного ресурса и номер используемой версии протокола HTTP]
  • несколько заголовков[Опишите, какой хост запрашивает клиент, некоторую информацию об окружающей среде клиента и т. д.]
  • пустая строка

строка запроса

строка запроса: ПОЛУЧИТЬ /java.html HTTP/1.1 GET в строке запроса называется методом запроса,
метод запросаЕсть: POST, GET, HEAD, OPTIONS, DELETE, TRACE, PUT.
Обычно используются: POST, GET
Вообще говоря, когда мы нажимаем на гиперссылку, доступ через адресную строку — это метод запроса get. Данные, представленные через форму, обычно находятся в почтовом методе.
Легко понять, что метод GET используется для запроса данных, метод POST используется для отправки данных, а скорость отправки get выше, чем у post.
Метод GET: параметры, прикрепленные к URL-адресу, ограничены, а объем данных обычно не может превышать 1 КБ.
Метод POST: вы можете отправлять данные на сервер в запрошенном содержимом объекта, а объем передаваемых данных неограничен.

заголовок запроса

  • Accept: text/html,image/* [Браузер сообщает серверу, какие типы данных он поддерживает]
  • Accept-Charset: ISO-8859-1 [Браузер сообщает серверу, какойнабор символов
  • Accept-Encoding: gzip,compress [Браузер сообщает серверу, что он поддерживаетФормат сжатия
  • Accept-Language: en-us,zh-cn [Браузер сообщает серверу свою локаль]
  • Host: www.it315.org:80[Браузер сообщает серверу, к какому хосту он хочет получить доступ]
  • If-Modified-Since: Вт, 11 июля 2000 г., 18:23:51 по Гринвичу [Браузер сообщает серверу, когда кэшировать данные]
  • Referer: www.it315.org/index.jsp[Браузер говорит серверу, что клиент идет с этой страницы ----Анти-хотлинк
  • 8. User-Agent: Mozilla/4.0 (совместимый; MSIE 5.5; Windows NT 5.0) [Браузер сообщает серверу, что такое ядро ​​браузера]
  • Cookie [Браузер сообщает серверу,Какое печенье принесли
  • Подключение: BLACK / HOTE-ALIGHT [Браузер говорит серверу, следует ли отключить или держать ссылку после завершения запроса]
  • Дата: Вт, 11 июля 2000 г., 18:23:51 по Гринвичу [браузер сообщает серверу время запроса]

HTTP-ответ

Ответ HTTP представляетСервер отправляет данные обратно в браузер, полный ответ HTTP должен состоять из четырех частей:

  1. Строка состояния [используется для описанияРезультат сервера обработки запроса.
  2. Несколько заголовков сообщения [используется для описанияОсновная информация о сервере,а такжеОписание данных,Благодаря описанию этих данных сервер может сообщить клиенту, как обработать данные, которые он отправляет обратно через некоторое время
  3. пустая строка
  4. Содержание объекта [Данные, отправленные сервером клиенту

строка состояния

Формат: номер версии HTTP, код состояния, описание причины. Строка состояния: HTTP/1.1 200 ОК Код состояния используется для обозначенияРезультат обработки сервера к запросу,этотрехзначное десятичное число. Код состояния ответа на пять категорий

image.png

заголовок ответа

  • Location: www.it315.org/index.jsp[Сервер сообщает браузеруна какую страницу перейти
  • Сервер: apache tomcat [Сервер сообщает браузеру модель сервера]
  • Content-Encoding: gzip [Сервер сообщает браузеруформат сжатия данных
  • Content-Length: 80 [Сервер говорит браузеру отправить обратно длину данных]
  • Содержание-язык: ZH-CN [Сервер говорит о браузере локали сервера]
  • Content-Type: text/html; charset=GB2312 [Сервер сообщает браузеру,Тип данных, отправляемых обратно
  • Последнее изменение: Вт, 11 июля 2000 г., 18:23:51 по Гринвичу [Сервер сообщает браузеру, когда ресурс последний раз обновлялся]
  • Refresh: 1;url=www.it315.org[Сервер сообщает браузеруОбновление по времени
  • Content-Portion: Attachment; filename = aaa.zip [Сервер говорит о браузереОткрытые данные как загрузка
  • Transfer-Encoding: chunked [Сервер говорит браузеру отправлять данные порциями]
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search[Сервер указывает браузерусохранить куки
  • Истекает: -1 [Сервер говорит о браузерене ставить кеш
  • Cache-Control: no-cache [Сервер сообщает браузеруне ставить кеш
  • Прагма: без кеша [Сервер сообщает браузеруне ставить кеш
  • Соединение: close/Keep-Alive [Сервер сообщает браузеру, как подключиться]
  • Дата: Вт, 11 июля 2000 г., 18:23:51 по Гринвичу [Сервер сообщает браузеру, когда отправлять данные обратно]

HttpServletRequest

Обзор

Объект HttpServletRequest представляет запрос клиента.Когда клиент обращается к серверу по протоколу HTTP, вся информация в заголовке HTTP-запроса инкапсулируется в этот объект, и разработчик может получить информацию о клиенте через методы этого объекта. запрос - это объект, который инкапсулирует текст запроса, поэтому через запрос вы можете получить все содержимое в тексте запроса, заголовке запроса, теле запроса, строке запроса

image.png

Общий метод

1. Запросить заголовок

Мы можем просмотреть любую веб-страницу, которая является заголовком запроса.

  

image

Связанные методы:
String getHeader(String name)Получить значение информации заголовка на основе имени заголовка
long getDateHeader(java.lang.String name)Голова для указанного контента дата
int getIntHeader(java.lang.String name)Голова к указанному содержимому int
Enumeration getHeaderNames()Получить все имя информации заголовка
Enumeration getHeaders(String name)Получить то же значение информации заголовка имени в соответствии с именем заголовка

Enumeration<String> headerNames = req.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String key = (String)headerNames.nextElement();
            String value = req.getHeader(key);
            System.out.println(key+"="+value);
        } 
2. Тело запроса

1) Методы, связанные с приобретением формы:
Строка getParameter(имя): По имени атрибута имени в форме получить метод значения атрибута значения
Строка [] getParameterValues ​​(имя строки): метод для получения флажка
getParameterNames(): метод получения всех имен, отправленных формой
Карта getParameterMap(): метод получения всех значений, представленных формой //Используется в качестве основы, очень практичен
getInputStream: получить все данные формы в виде потока байтов

2) Методы, связанные с манипулированием данных без формы (запрос также является объектом домена):
void setAttribute(String name, Object value);
Object getAttribute(String name);
Void removeAttribute(String name);

3) Методы, связанные с переадресами по запросу:
RequestDispatcher getRequestDispatcher(String path)//Получить вспомогательный объект, который запрос пересылает или содержит запрос
forward(ServletRequest request, ServletResponse response)// метод переадресации
include(ServletRequest request, ServletResponse response)// запрос содержит

4) Методы кодирования:
// Решаем кодировку метода post
request.setCharacterEncoding("UTF-8"): сообщить серверному клиенту, какая кодировка может обрабатывать только метод запроса POST.
// Решаем кодировку метода get
Имя строки = новая строка (имя.getBytes («iso-8859-1»), «UTF-8»);

#####3. Другие распространенные методы запроса
getMethod();
getRequestURL();
getRequestURI();
getServerName();
getServerPort();
getContextPath();
getServletPath();
getQueryString();
getRemoteAddr();
getProtocol();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.统一资源标记符   /Web_Servlet/ServletTest3
        String uri = req.getRequestURI();
        System.out.println(uri);
        //2.统一资源定位符    http://localhost:6060/Web_Servlet/ServletTest3 
        StringBuffer url = req.getRequestURL();
        System.out.println(url);
        //3.协议和版本    HTTP/1.1
        String potocol = req.getProtocol();
        System.out.println(potocol);
        //4.协议    http
        String scheme = req.getScheme();
        System.out.println(scheme);
        //5.主机(域名)  localhost,如果你使用的是ip地址,就显示ip地址
        String serverName = req.getServerName();
        System.out.println(serverName);
        //6.端口  6060(这是我自己修改了的端口,默认是8080)
        int port = req.    getServerPort();
        System.out.println(port);
        //7.发布到tomcat下的项目名称  /Web_Servlet
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        //8.servlet路径    /ServletTest3 
        String servletPath = req.getServletPath();
        System.out.println(servletPath);
        //9.获取所有请求参数,即?之后所有东西。    username=faker&password=mid
        String queryString = req.getQueryString();
        System.out.println(queryString);
        //10.远程主机的ip地址    0:0:0:0:0:0:0:1
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);   
    }

HttpServletResponse

Обзор

Когда веб-сервер получает HTTP-запрос от клиента, он создает объект запроса, представляющий запрос, и объект ответа, представляющий ответ на каждый запрос. Поскольку объекты запроса и ответа представляют собой запросы и ответы, нам нужно только найти объект запроса, чтобы получить данные, отправленные клиентом. Чтобы вывести данные в контейнер, достаточно найти объект ответа.
Объект HttpServletResponse представляет ответ сервера. Этот объект инкапсулирует методы отправки данных клиенту, отправки заголовков ответа и отправки кодов состояния ответа.

  

image

Общий метод

строка ответа\заголовки ответа\текст ответа

setStatus(int sc)Установите код состояния ответа
setHeader(String name, String value)Установить информацию заголовка ответа
getWrite();поток вывода символов
getOutputStream();байтовый выходной поток
setCharacterEncoding(String charset)Скажите серверу, какое кодирование для использования
setContentType(String type)Сообщает тип содержимого ответа (текст/html, приложение/json и т. д.)

перенаправить

response.sendRedirect(path);
Примечание: Перенаправление не имеет никаких ограничений. Вы можете перенаправить любой путь в веб-проекте или пути доступа в других веб-проектах и ​​использовать «/», чтобы различать их здесь. Если путь начинается с «/», то это означает, что Я должен снова начать позиционирование. Вместо того, чтобы обращаться к веб-проекту прямо сейчас, я сам пишу имя проекта. Если путь не начинается с "/", то я знаю, что я обращаюсь к сервлету под веб-проектом только сейчас , а название проекта можно не указывать. Вот как отличить.

детали обоих

Два setCharacterEncoding

  1. После указания request.setCharacterEncoding() правильную строку можно получить напрямую через getParameter(), если не указано, по умолчанию используется кодировка iso8859-1. Стоит отметить, что вы не можете выполнить какой-либо getParameter() до выполнения setCharacterEncoding(). Более того, эта спецификация действительна только для метода POST, а не для метода GET.
    Проанализируйте причину, она должна быть при первом выполнении getParameter(),JavaОн будет в соответствии с анализом кодирования всех представлений, и последующий анализ GetParameter () больше не анализует, поэтому SetCharacterenCoding () недействителен. Для получения способа отправки формы представлен контент в URL, начало было представлено в соответствии с анализом кода содержимого, SetCharacterenCoding () естественным образом недействительным.

  2. response.setCharacterEncoding устанавливает кодировку HTTP-ответа. Если формат кодировки ранее был установлен с помощью response.setContentType, формат кодировки, указанный в response.setCharacterEncoding, используется для перезаписи предыдущей настройки. Как и в случае с response.setContentType, вызов этого метода должен быть выполняется в getWriter до или до отправки ответа

Учебные материалы:блог woo woo woo.cn на.com/fan-hawker…

Вперед и перенаправление

Фактическое местоположение другое, адресная строка другая

Форвард находится на сервере:
Пересылка перескакивает сервером.Внимательные друзья обнаружат, что при переадресации адресная строка браузера не изменилась.Когда я обращаюсь к Servlet111, даже если я перехожу на страницу Servlet222, адрес браузера или Servlet111. То есть браузер не знает действия перехода, и переадресация прозрачна для браузера. Из приведенной выше диаграммы последовательности пересылки мы также можем обнаружить, что реализация пересылки — это только один HTTP-запрос, а объекты запроса и ответа при пересылке одинаковы. Это также объясняет, почему запрос можно использовать в качестве объекта домена для связи между сервлетами.

Перенаправление происходит в браузере:
Перенаправление выполняется браузером, при выполнении перенаправления адрес браузера изменится. Введено, что принцип реализации перенаправления реализуется комбинацией кода состояния ответа и заголовка Location. Это переход на страницу, выполняемый браузером. При перенаправлении будут выданы два HTTP-запроса. Объект домена запроса недействителен, так как это не один и тот же объект запроса.

различное использование

Многие люди не понимают, как писать адреса ресурсов при переадресации и перенаправлении. Иногда необходимо написать имя приложения, а иногда нет необходимости писать имя приложения. Людей легко запутать. Запомните принцип: для сервера пишите имя ресурса напрямую, а для браузера пишите имя приложения.

request.getRequestDispatcher("/URI имени ресурса").forward(запрос,ответ)
При пересылке "/" представляет собой корневой каталог приложения.

response.send("/URI веб-приложения/имени ресурса");
При перенаправлении "/" представляет каталог веб-приложений.

Диапазон URL-адресов, на которые можно перейти, отличается

Переадресация — это ресурс, который переходы сервера могут перейти только к текущему веб-приложению.
Редирект — это прыжок сервера, который может перейти на любой ресурс

Различные типы данных

Объект переадресованного запроса может передавать различные типы данных, в том числе объекты
Перенаправление может передавать только строки

время прыжка разное

При переадресации: когда оператор перехода выполняется, он немедленно переходит
Перенаправление: переход выполняется после выполнения всей страницы.

Разница между разрешением искаженного кода и переадресацией и перенаправлением в сервлете

getWriter и getOutputStream

1. Основные моменты выбора методов getOutputStream и getWriter

Когда объект PrintWriter выводит текстовое содержимое символов, он внутренне преобразует строку в массив байтов, закодированный определенным набором символов, а затем выводит его.Преимущество использования объекта PrintWriter заключается в том, что программисту не нужно завершать строку в массив байтов. сам.
Использование объекта ServletOutputStream также может выводить веб-документы, содержимое которых состоит только из текстовых символов.Однако, если содержимое веб-документа динамически разбивается и создается с использованием текстовых строк внутри программы сервлета, необходимо преобразовать символьный текст в массив байтов. перед выводом.

2. Разница между двумя методами

Метод getOutputStream используется для возврата объекта потока вывода байтов, созданного механизмом сервлета, и программа сервлета может выводить тело ответа в виде байтов.
Метод getWriter используется для возврата объекта потока вывода символов, созданного механизмом сервлета, и программа сервлета может выводить тело ответа в символьной форме.
Эти два метода, getOutputStream и getWriter, являются взаимоисключающими. После вызова любого метода другой метод не может быть вызван.
Метод GetputStream, возвращаемый объектом потока вывода байтов, представляет собой servletoutputstream, который может напрямую выводить двоичные данные в массив байтов.
Метод getWriter упаковывает буфер данных механизма сервлета в объект потока вывода символов типа PrintWriter и возвращает результат, а объект PrintWriter может напрямую выводить текстовое содержимое символов.
Данные, записанные программой сервлета в объект ServletOutputStream или PrintWriter, будут получены механизмом сервлета, и механизм сервлета примет данные в качестве тела ответного сообщения, а затем объединит их со строкой состояния ответа и заголовками ответа и вывести его на клиент.
После того, как служебный метод Serlvet завершится, механизм сервлета проверит, вызывал ли объект выходного потока, возвращенный методом getWriter или getOutputStream, метод close.Если нет, механизм сервлета вызовет метод close, чтобы закрыть объект выходного потока.

3. Измените тип кодировки

Решение getOutputStream:

  1. Путем изменения метода кодировки браузера: IE/"Вид"/"Кодировка"/"UTF-8" (недоступно)
  2. Сообщите клиенту, как кодировать, установив заголовок ответа:response.setHeader("Тип контента", "текст/html;charset=UTF-8");// Сообщаем браузеру тип данных и кодировку
  3. Имитация заголовков запроса через метатеги: out.write("".getBytes());
  4. следующими методами:response.setContentType("text/html;charset=UTF-8");

Решение rgetWriter:
, Ответ SetContentType («Текст / HTML; Charset = UTF-8»);

Применение обоих

1. Загрузка файла
        //通过路径得到一个输入流
        String path = this.getServletContext().getRealPath(filepath);
        FileInputStream fis = new FileInputStream(path);
        //创建字节输出流
        ServletOutputStream sos = response.getOutputStream();
        
        //得到要下载的文件名
        String filename = path.substring(path.lastIndexOf("\\")+1);
        
        //设置文件名的编码
        filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式
        
        //告知客户端要下载文件
        response.setHeader("content-disposition", "attachment;filename="+filename);
        response.setHeader("content-type", "image/jpeg");
        
        //执行输出操作
        int len = 1;
        byte[] b = new byte[1024];
        while((len=fis.read(b))!=-1){
            sos.write(b,0,len);
        }
        
        sos.close();
        fis.close();

2. Код подтверждения
3. Регулярное обновление
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write("3秒后跳转页面.....");
        //三秒后跳转到index.jsp页面去
        response.setHeader("Refresh", "3;url='/index.jsp'");
4. Установите кеш
        //浏览器有三消息头设置缓存,为了兼容性!将三个消息头都设置了
        response.setDateHeader("Expires", -1);
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma", "no-cache");
5. Сжатие данных
       //创建GZIPOutputStream对象,给予它ByteArrayOutputStream
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);

        //GZIP对数据压缩,GZIP写入的数据是保存在byteArrayOutputStream上的
        gzipOutputStream.write("asdfzxcvasdfzxvasdfzxcv".getBytes());
        //gzipOutputStream有缓冲,把缓冲清了,并顺便关闭流
        gzipOutputStream.close();

        byte[] bytes = byteArrayOutputStream.toByteArray();
        //告诉浏览器这是gzip压缩的数据
        response.setHeader("Content-Encoding","gzip");
        //将压缩的数据写给浏览器
        response.getOutputStream().write(bytes);
6. Противоугонная цепь
        //获取到网页是从哪里来的
        String referer = request.getHeader("Referer");