«1. Введение

В этом кратком руководстве мы создадим небольшое веб-приложение и изучим, как вернуть ответ JSON от сервлета.

2. Maven

Для нашего веб-приложения мы включим зависимости javax.servlet-api и Gson в наш pom.xml:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>${javax.servlet.version}</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>${gson.version}</version>
</dependency>

Последние версии зависимостей можно найти здесь: javax .servlet-api и gson.

Нам также нужно настроить контейнер сервлетов для развертывания нашего приложения. Эта статья — хорошее место для начала развертывания WAR на Tomcat.

3. Создание сущности

Давайте создадим сущность Employee, которая позже будет возвращена сервлетом в виде JSON:

public class Employee {
	
    private int id;
    
    private String name;
    
    private String department;
   
    private long salary;

    // constructors
    // standard getters and setters.
}

4. Сущность в JSON

Чтобы отправить ответ JSON от сервлета, мы сначала необходимо преобразовать объект Employee в его представление JSON.

Существует множество библиотек Java для преобразования объекта в JSON-представление и наоборот. Наиболее известными из них будут библиотеки Гсона и Джексона. Чтобы узнать о различиях между GSON и Jackson, ознакомьтесь с этой статьей.

Быстрый пример преобразования объекта в представление JSON с помощью Gson:

String employeeJsonString = new Gson().toJson(employee);

5. Ответ и тип содержимого

Для сервлетов HTTP правильная процедура заполнения ответа:

  1. Retrieve an output stream from the response
  2. Fill in the response headers
  3. Write content to the output stream
  4. Commit the response

В ответ, заголовок Content-Type сообщает клиенту, каков на самом деле тип возвращаемого контента.

Для создания ответа JSON тип содержимого должен быть application/json:

PrintWriter out = response.getWriter();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
out.print(employeeJsonString);
out.flush();

Заголовки ответа всегда должны быть установлены до фиксации ответа. Веб-контейнер будет игнорировать любые попытки установить или добавить заголовки после фиксации ответа.

Вызов flush() в PrintWriter фиксирует ответ.

6. Пример сервлета

Теперь давайте рассмотрим пример сервлета, который возвращает ответ JSON:

@WebServlet(name = "EmployeeServlet", urlPatterns = "/employeeServlet")
public class EmployeeServlet extends HttpServlet {

    private Gson gson = new Gson();

    @Override
    protected void doGet(
      HttpServletRequest request, 
      HttpServletResponse response) throws IOException {
        
        Employee employee = new Employee(1, "Karan", "IT", 5000);
        String employeeJsonString = this.gson.toJson(employee);

        PrintWriter out = response.getWriter();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        out.print(employeeJsonString);
        out.flush();   
    }
}

7. Заключение

В этой статье показано, как вернуть ответ JSON от сервлета. Это полезно в веб-приложениях, использующих сервлеты для реализации служб REST.

Все показанные здесь примеры кода можно найти на GitHub.