Обработка запроса сервелетом

Распределенное приложение может быть эффективным только в случае, если оно способно принимать информацию от физически удаленных клиентов. В следующем примере сервлет извлекает данные пользовательской формы, переданные вместе с запросом по методу GET.

Приведенная на рисунке 18.1 форма является результатом отображения JSP-страницы index.jsp, находящейся в папке /webapps/FirstProject3.

В форме имеется текстовое поле с именем name и значением по умолчанию «Название проекта». Значение поля можно изменить непосредственно на странице.

clip_image002

Рис. 18.1. JSP-форма

В форме заданы две группы по два элемента ввода типа radio, каждая из которых имеет свое имя. При наличии на странице нескольких полей, имеющих одно имя, можно выбрать только один из них. Им задаются соответствующие значения, и при выборе одной из кнопок значение, заданное соответствующей кнопке, заносится в значение своего элемента. По умолчанию для радиогрупп принято задавать одно из значений при помощи свойства checked.

В итоге пользователь может изменить значения текстового поля и радиогрупп. При нажатии кнопки типа происходит подтверждение формы и вызывается сервлет.

В форме задан метод POST, при помощи которого происходит передача данных формы в виде отдельных заголовков. Если не задавать этот метод, то по умолчанию будет использоваться метод GET, и данные формы будут передаваться через универсальный запрос (URL), в который к адресу будут добавлены значения соответствующих элементов.

<!– пример # 3 : стартовая страница : index.jsp–>

<%@ page language="java" contentType=

"text/html; charset=utf-8" pageEncoding="utf-8"%>

<html><body>

<FORM action="testform" method=POST>

<H3>Название проекта:

<INPUT type="text" name="Имя проекта" value="-задать!-">

Технологии:

<TABLE BORDER=5> <tr>

<td>JSPX</td><td><INPUT type="radio"

name="Технология"

value="JSP в формате XML"></td>

<td>JSTL</td><td><INPUT type="radio"

name="Технология"

value="Библиотека тегов JSTL"></td>

</tr></TABLE>

Язык программирования:

<TABLE BORDER=5> <tr>

<td>Java 6<INPUT type="radio"

name="Язык"

value="Java SE 6"></td>

<td>Java 5<INPUT type="radio"

name="Язык"

value="Java 1.5.0" checked></td>

</tr></TABLE></H3>

<INPUT type="submit" value="Принять"> <BR>

</FORM>

</body></html>

При подтверждении из формы вызывается сервлет FormRequest. Сервлет получает и извлекает значения всех переменных формы и отображает их вместе
с именами переменных. Для обработки данных, полученных из полей формы, используется приведенный ниже сервлет.

/* пример # 4 : обработка запроса клиента : FormRequest.java :

ParameterOutput.java */

package chapt18;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class FormRequest extends HttpServlet {

protected void doPost(HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

private void performTask(HttpServletRequest req,

HttpServletResponse resp) {

RequestOutput.generate(resp, req);

}

}

В методе performTask() происходит обращение к другому классу-обработчику запроса пользователя с передачей ему объектов HttpServletRequest req и HttpServletResponse resp.

/* пример # 5 : извлечение информации из запроса клиента : RequestOutput.java */

package chapt18;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class RequestOutput {

public static void generate(HttpServletResponse resp,

HttpServletRequest req) {

try {

String name, value;

resp.setContentType("text/html; charset=utf-8");

PrintWriter out = resp.getWriter();

out.print("<HTML><HEAD>");

out.print("<TITLE>Результат</TITLE>");

out.print("</HEAD><BODY>");

out.print("<TABLE BORDER=3>");

Enumeration names = req.getParameterNames();

while (names.hasMoreElements()) {

name = (String) names.nextElement();

value = req.getParameterValues(name)[0]; /*

name = new String(name.getBytes("ISO-8859-1"), "utf-8");

value = new String(value.getBytes("ISO-8859-1"), "utf-8");

*/

out.print("<TR>");

out.print("<TD>" + name + "</TD>");

out.print("<TD>" + value + "</TD>");

out.print("</TR>");

}

out.print("</TABLE></BODY></HTML>");

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

В классе в объекте resp задается тип содержимого text/html и кодировка UTF-8, если нужно отобразить кириллицу. После этого объект out устанавливается в выходной поток resp.getWriter(), в который будут помещаться данные. Из запроса HttpServletRequest req извлекается объект типа Enumeration с текстовыми значениями имен переменных формы. Далее, итерируя по элементам этого объекта, последовательно извлекаются все параметры. Для каждого имени переменной можно при необходимости (если не указана кодовая страница) произвести перекодировку: вначале извлекается объект итерации
в кодировке, в которой он передается, а именно ISO-8859-1, после создается новая строка с необходимой кодировкой, в данном случае UTF-8. Для каждой из переменных извлекаются из запроса соответствующие им значения при помощи метода getParameterValues(name). Тем же способом их кодировка может быть изменена и добавлена в выходной поток.

Класс сервлета относится к пакету chapt18, поэтому файл
FormRequest.class должен быть размещен в папке

/webapps/FirstProject3/WEB-INF/classes/chapt18

и обращение к этому классу, например из документа HTML, должно производиться как chapt18.FormRequest. В файле web.xml должны находиться строки:

<servlet>

<servlet-name>MyForm</servlet-name>

<servlet-class>chapt18.FormRequest</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>MyForm</servlet-name>

<url-pattern>/testform</url-pattern>

</servlet-mapping>

Обращение к сервлету производится по его URL-имени testform. Результат выполнения:

clip_image004

Рис. 18.2. Результат выполнения запроса

Метод getParameterValues() возвращает значения любой переменной формы по имени этой переменной. Массив возвращается потому, что некоторые переменные формы могут иметь несколько значений, например группа флажков или радиокнопок. Другой метод доступа не предполагает предварительного знания их имен. Метод getParameterNames() возвращает объект Enumeration, в котором содержатся все имена переменных, извлеченных из формы.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100