User Form

PrintWriter Vs ServletOutputStream

Earlier we have seen the ways of receiving data from client. Now let us do with response. The response object functionality is to send data to client of what client is interested. For this, response uses IO Streams. There are two streams involved depending on the nature of data like text data or binary data. For text data, the response uses PrintWriter and for binary data it uses ServletOutputStream. Two methods exist in ServletResponse interface (inherited by HttpServletResponse) to return the objects of PrintWriter and ServletOutputStreamgetWriter() and getOuptputStream(). That is, there are two styles exist.

First let us see what Servlet API says about these methods defined in javax.servlet.ServletResponse interface.

  • PrintWriter getWriter()throws IOException: Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding(). If the response’s character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.
  • ServletOutputStream getOutputStream() throws java.io.IOException: Returns a ServletOutputStream suitable for writing binary data in the response. The servlet container does not encode the binary data.
PrintWriter Vs ServletOutputStream

PrintWriter object to send textual data to client:

getWriter() method of ServletResponse (inherited by HttpServletResponse) returns an object of PrintWriter. This is the general way of sending data to client as most response represents text or HTML only.

PrintWriter out = response.getWriter(); out.println("VALID"); // sending text data out.println("INVALID"); // sending HTML data

This is shown in the first Servlet program Login Screen Validation.

Читайте также:  Php files gets downloaded

ServletOutputStream object to send binary data to client:

Sometimes, the Servlet may need to send images and JAR files etc. to the client. They do not include text data. To send them to client, the Programmer should convert this data into binary format and to send this binary data to client, the ServletOutputStream is used.

It is an abstract class (the abstract methods are overridden by Servlet container). Methods available in this class are overloaded print() and println().

Following is the hierarchy

java.lang.Object –> java.io.OutputStream –> javax.servlet.ServletOutputStream

ServletOutputStream object is obtained with getOutputStream() method of ServletResponse (inherited by HttpServlerResponse) as follows.

ServletOutputStream sos = resonse.getOutputStream(); sos.write(barray);

barray is a byte array into which binary data is read. This style is used in four examples – Sending Image to Client, Read HTML File Contents, response.getOutputStream() and Multiple Submit Buttons in a single HTML Form.

Small Table showing the big difference of PrintWriter Vs ServletOutputStream.
Property PrintWriter ServletOutputStream
class nature Concrete class Abstract class
Method that returns getWriter() getOutputStream()
Nature of data To send character-based information like textual/HTML data Mostly used to send binary data and less times to send primitive values and character-based information
Character encoding Does character encoding for ASCII/Unicode characters (as per the getCharacterEncoding() method) Does not perform any character conversion as it is meant for binary data (container does not encode binary data).
Performance Very expensive for character conversion Faster as no character conversion exists and particularly the entire data is sent as a byte array at a time
Type of stream Character stream Byte stream
Usage Mostly used Limited usage

Pass your comments and suggestions on this tutorial «PrintWriter Vs ServletOutputStream».

Источник

Printwriter in java servlet

В методы 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 try < writer.println("

Id:" + id + "

"); > finally < writer.close(); >> >

В данном случае мы предполагаем, что в сервлет в get-запросе передается значение/параметр по имени id. С помощью вызова request.getParameter(«id») мы получаем значение этого параметра и затем отправляем его в ответ пользователю. При этом стоит учитывать, что неважно, что мы будем передавать извне — целое или дробное число, отдельный символ, в любом случае метод getParameter возвратить строку.

Запустим приложение и обратимся к сервлету:

Запрос GET к сервлету

В случае выше значение для параметра 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("

Name: " + name + "; Age: " + age + "

"); > finally < writer.close(); >> >

В данном случае сервлет получает два параметра: name и age. Мы можем передать значения для них, набрав в адресной строке, например, http://localhost:8081/helloapp/hello?name=Tom&age=34 . При передаче некольких параметров они отделяются друг от друга знаком амперсанда &. Подобным образом мы можем передать и большее количество параметров.

Параметры сервлета Java

Передача массивов

В примерах выше передавались одиночные данные — отдельные строки. Но также мы можем передавать наборы значений. Например, изменим сервлет следующим образом:

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("

Numbers: "); for(String n: nums) writer.print(n + " "); writer.println("

"); > finally < writer.close(); >> >

Если в сервлет передается массив значений, то для его получения у объекта HttpServletRequest применяется метод getParameterValues() , который получает название параметра и возвращает массив строк. В данном случае мы ожидаем, что параметр будет называться nums. Затем значения из этого параметра в цикле передаются в ответ клиенту.

Запустим сервлет и передадим ему значения

Передача в сервлет Java массив значений

При передаче массива через строку запроса указываются несколько значений с одним и тем же именем: http://localhost:8081/helloapp/hello?nums=1&nums=2&nums=3 .

Получение данных из форм

Еще одним распространенным способом отправки данных является отправка форм. Добавим в проект страницу index.html со следующим кодом:

       
Name:

Age:

Gender: Female Male

Country:

Courses: Java SE Java FX Java EE

Как правило, формы отправлются с помощью запроса POST, поэтому у элемента формы определен атрибут method=»POST» . Сама форма будет отправляться на ресурс «/hello», с которым будет сопоставляться сервлет. На самой форме есть множество полей ввода, в том числе набор чекбоксов, из которых можно выбрать сразу несколько значений.

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

Теперь определим сервлет, который будет обрабатывать эту форму:

Данный сервлет будет обрабатывать запросы к по адресу «/hello», на который отпавляется форма. Поскольку отправка формы осущетвляется с помощью метода POST, то для обработки запроса определен метод doPost . Метод doPost принимает те же параметры, что и метод doGet.

С помощью методов getParameter() и getParameterValues() также получаем значения параметров. В данном случае названия параметров представляют названия полей ввода отправленной формы.

Причем поскольку на форме несколько чекбоксов, которые имеют одно и то же имя, то соответственно сервлету передается набор значений, который получаем с помощью метода getParameterValues() . Все остальные поля представляют одиночные значения, поэтому для получения их данных применяется метод getParameter() .

Источник

Оцените статью