Описание тега javabeans

Javabean - это настраиваемый класс, который часто представляет реальные данные и инкапсулирует частные свойства с помощью общедоступных методов получения и установки. Например, Пользователь, Продукт, Заказ и т. Д.

Javabean - это настраиваемый класс, который часто представляет реальные данные и инкапсулирует частные свойства с помощью общедоступных методов получения и установки. Например,User, Product, Orderи т. д. В приложениях, использующих базу данных, они часто 1:1 отображаются в таблицу базы данных. Затем отдельная строка базы данных может быть представлена ​​одним экземпляром javabean.

Базовый пример

Вот пример javabean, представляющего User (некоторые символы новой строки опущены для краткости):

public class User implements java.io.Serializable {

    // Properties.
    private Long id;
    private String name;
    private Date birthdate;

    // Getters.
    public Long getId() { return id; }
    public String getName() { return name; }
    public Date getBirthdate() { return birthdate; }

    // Setters.
    public void setId(Long id) { this.id = id; }
    public void setName(String name) { this.name = name; }
    public void setBirthdate(Date birthdate) { this.birthdate = birthdate; }

    // Important java.lang.Object overrides.
    public boolean equals(Object other) {
        return (other instanceof User) && (id != null) ? id.equals(((User) other).id) : (other == this);
    }
    public int hashCode() {
        return (id != null) ? (getClass().hashCode() + id.hashCode()) : super.hashCode();
    }
    public String toString() {
        return String.format("User[id=%d,name=%s,birthdate=%d]", id, name, birthdate);
    }
}

Реализация Serializable является обязательным, чтобы иметь возможность сохранять или передавать javabeans за пределы памяти Java; Например, на диске, в базе данных или по сети. В случае веб-приложений некоторые серверы будут делать это с помощью HTTP-сеансов (например, сохранять на диск перед перезапуском или совместно использовать с другими серверами в кластере). Все внутренние переменные, у которых нет геттеров / сеттеров, должны быть отмеченыtransient чтобы предотвратить их сериализацию.

Реализация toString() не является обязательным, но очень полезно, если вы хотите иметь возможность регистрировать / распечатывать объект в логгере / stdout и видеть немного больше деталей, чем только com.example.User@1235678.

Реализация equals() а также hashCode() является обязательным, если вы хотите собрать их в Set или HashMap, иначе разные экземпляры javabeans, которые фактически содержат / представляют одни и те же данные, будут обрабатываться как разные представления.

Генерация кода

Немного разумная среда IDE, такая как Eclipse/IntelliJ/Netbeans, может автоматически генерировать все необходимые конструкторы и методы на основе всего лишь нескольких полей. Итак, вы можете начать с необходимых полей:

public class User implements java.io.Serializable {

    private Long id;
    private String name;
    private Date birthdate;

}

Затем щелкните правой кнопкой мыши где-нибудь в исходном коде и выберите " Источник", после чего вы получите список различных полезных параметров, связанных с Javabean, таких как создание геттеров / сеттеров,hashCode()/equals() а также toString().

введите описание изображения здесь


Пример использования - JDBC

Например, в классе объекта доступа к базе данных JDBC (DAO) вы можете использовать его для создания списка пользователей, в котором вы храните данныеUser таблица в базе данных:

public List<User> list() throws SQLException {
    List<User> users = new ArrayList<User>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, birthdate FROM User");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            User user = new User();
            user.setId(resultSet.getLong("id"));
            user.setName(resultSet.getString("name"));
            user.setBirthdate(resultSet.getDate("birthdate"));
            users.add(user);
        }
    }

    return users;
}

Пример использования - сервлет

Например, в классе сервлета вы можете использовать его для передачи данных из базы данных в пользовательский интерфейс:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    List<User> users = userDAO.list();
    request.setAttribute("users", users);
    request.getRequestDispatcher("/WEB-INF/users.jsp").forward(request, response);
}

Пример использования - JSP

Например, на странице JSP вы можете получить к ней доступ с помощью EL, который следует соглашениям javabean, для отображения данных:

<table>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Birthdate</th>
    </tr>
    <c:forEach items="${users}" var="user">
        <tr>
            <td>${user.id}</td>
            <td><c:out value="${user.name}" /></td>
            <td><fmt:formatDate value="${user.birthdate}" pattern="yyyy-MM-dd" /></td>
        </tr>
    </c:forEach>
</table>

(Обратите внимание <c:out>просто для предотвращения дыр XSS при повторном отображении управляемого пользователем ввода в виде строки)

Документация: