В методы doGet и doPost сервлета, которые обрабатывают запрос, в качестве одного из параметров передается объект HttpServletRequest, с помощью которого можно получить отправленные сервлету данные, то есть параметры запроса. Для этого в классе HttpServletRequest определены два метода:
getParameter(String param)
: возвращает значение определенного параметра, название которого передается в метод. Если указанного параметра в запросе нет,
то возвращается значение null.
getParameterValues(String param)
: возвращает массив значений, который представляет определенный параметр. Если указанного параметра в запросе нет,
то возвращается значение null.
Передавать значения в сервлет можно различными способами. При отправке GET-запроса значения передаются через строку запроса.
Стандартный get-запрос принимает примерно следующую форму: название_ресурса?параметр1=значение1&параметр2=значение2.
Например, определим следующий сервлет:
import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); // получаем параметр id String id = request.getParameter("id"); try { writer.println("<h2>Id:" + id + "</h2>"); } finally { writer.close(); } } }
В данном случае мы предполагаем, что в сервлет в get-запросе передается значение/параметр по имени id. С помощью вызова request.getParameter("id")
мы получаем значение этого параметра и затем отправляем его в ответ пользователю. При этом стоит учитывать, что неважно, что мы будем передавать извне - целое или дробное число, отдельный символ, в любом случае
метод getParameter возвратить строку.
Запустим приложение и обратимся к сервлету:
В случае выше значение для параметра id не указано, мы просто вводим в адресной строке браузера название ресурса - в данном случае http://localhost:8081/helloapp/hello
,
где helloapp - название приложения, а hello - конечная точка, к которой примонтирован сервлет. Поэтому метод getParameter("id") возвращает значение null.
Теперь передадим значение для параметра id:
Параметры в строке запроса указываютя после названия ресурса после знака вопроса: http://localhost:8081/helloapp/hello?id=5
.
В данном случае параметр id равен 5.
Подобным образом можно передавать несколько параметров. Например, изменим сервлет следующим образом:
import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); String name = request.getParameter("name"); String age = request.getParameter("age"); try { writer.println("<h2>Name: " + name + "; Age: " + age + "</h2>"); } finally { writer.close(); } } }
В данном случае сервлет получает два параметра: name и age. Мы можем передать значения для них, набрав в адресной строке, например,
http://localhost:8081/helloapp/hello?name=Tom&age=34
. При передаче некольких параметров они отделяются друг от друга знаком амперсанда &.
Подобным образом мы можем передать и большее количество параметров.
В примерах выше передавались одиночные данные - отдельные строки. Но также мы можем передавать наборы значений. Например, изменим сервлет следующим образом:
import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); String[] nums = request.getParameterValues("nums"); try { writer.print("<h2>Numbers: "); for(String n: nums) writer.print(n + " "); writer.println("</h2>"); } finally { writer.close(); } } }
Если в сервлет передается массив значений, то для его получения у объекта HttpServletRequest применяется метод getParameterValues(), который получает название параметра и возвращает массив строк. В данном случае мы ожидаем, что параметр будет называться nums. Затем значения из этого параметра в цикле передаются в ответ клиенту.
Запустим сервлет и передадим ему значения
При передаче массива через строку запроса указываются несколько значений с одним и тем же именем: http://localhost:8081/helloapp/hello?nums=1&nums=2&nums=3
.
Еще одним распространенным способом отправки данных является отправка форм. Добавим в проект страницу index.html со следующим кодом:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>User Form</title> </head> <body> <form action="hello" method="POST"> Name: <input name="username" /> <br><br> Age: <input name="userage" /> <br><br> Gender: <input type="radio" name="gender" value="female" checked />Female <input type="radio" name="gender" value="male" />Male <br><br> Country: <select name="country"> <option>Canada</option> <option>Spain</option> <option>France</option> <option>Germany</option> </select> <br><br> Courses: <input type="checkbox" name="courses" value="JavaSE" checked />Java SE <input type="checkbox" name="courses" value="JavaFX" checked />Java FX <input type="checkbox" name="courses" value="JavaEE" checked />Java EE <br><br> <input type="submit" value="Submit" /> </form> </body> </html>
Как правило, формы отправлются с помощью запроса POST, поэтому у элемента формы определен
атрибут method="POST"
. Сама форма будет отправляться на ресурс "/hello", с которым будет
сопоставляться сервлет. На самой форме есть множество полей ввода, в том числе набор чекбоксов, из
которых можно выбрать сразу несколько значений.
Теперь определим сервлет, который будет обрабатывать эту форму:
import java.io.PrintWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); String name = request.getParameter("username"); String age = request.getParameter("userage"); String gender = request.getParameter("gender"); String country = request.getParameter("country"); String[] courses = request.getParameterValues("courses"); try { writer.println("<p>Name: " + name + "</p>"); writer.println("<p>Age: " + age + "</p>"); writer.println("<p>Gender: " + gender + "</p>"); writer.println("<p>Country: " + country + "</p>"); writer.println("<h4>Courses</h4>"); for(String course: courses) writer.println("<li>" + course + "</li>"); } finally { writer.close(); } } }
Данный сервлет будет обрабатывать запросы к по адресу "/hello", на который отпавляется форма. Поскольку отправка формы осущетвляется с помощью метода POST, то для обработки запроса определен метод doPost. Метод doPost принимает те же параметры, что и метод doGet.
С помощью методов getParameter()
и getParameterValues()
также получаем
значения параметров. В данном случае названия параметров представляют названия полей ввода отправленной формы.
Причем поскольку на форме несколько чекбоксов, которые имеют одно и то же имя, то соответственно сервлету передается набор значений,
который получаем с помощью метода getParameterValues()
. Все остальные поля представляют одиночные значения, поэтому для
получения их данных применяется метод getParameter()
.