Описание тега javabeans
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 при повторном отображении управляемого пользователем ввода в виде строки)