В этом примере вы увидите, как интегрировать Struts 2 и Hibernate с помощью « Full Hibernate Plugin 1.4 GA » ( Full Hibernate Plugin 1.4 GA ).
Вы увидите, как добавить пользователя, используя форму регистрации пользователя, показанную ниже, и перечислить всех существующих пользователей.
Чтобы использовать Full Hibernate Plugin 1.4 GA, вам нужно добавить следующие файлы lib в каталог lib .
antlr-2.7.6.jar commons-collections-3.1.jar commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-lang-2.3.jar commons-logging-1.1.jar dom4j-1.6.1.jar ejb3-persistence.jar freemarker-2.3.13.jar hibernate3.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate-validator.jar hsqldb.jar javassist-3.9.0.GA.jar jta-1.1.jar junit-3.8.1.jar log4j-1.2.15.jar ognl-2.6.11.jar slf4j-api-1.5.8.jar slf4j-log4j12-1.5.8.jar struts2-convention-plugin-2.1.6.jar struts2-core-2.1.6.jar struts2-fullhibernatecore-plugin-1.4-GA.jar xwork-2.1.2.jar
Структура каталогов примера показана ниже.
Объект сеанса и объект транзакции будут введены с использованием аннотаций @SessionTarget и @TransactionTarget соответственно.
package com.vaannila.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
import com.vaannila.domain.User;
public class UserDAOImpl implements UserDAO {
@SessionTarget
Session session;
@TransactionTarget
Transaction transaction;
@SuppressWarnings("unchecked")
@Override
public List<User> listUser() {
List<User> courses = null;
try {
courses = session.createQuery("from User").list();
} catch (Exception e) {
e.printStackTrace();
}
return courses;
}
@Override
public void saveUser(User user) {
try {
session.save(user);
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
}
}
}
Для внедрения сеанса и транзакции через плагин org.hibernate. Объекты Session и org.hibernate.Transaction должны быть объявлены как переменные класса, а не на уровне метода. Вы можете хранить эти переменные в общем классе DAO и расширять все остальные DAO из него. При использовании этого плагина нет необходимости явно фиксировать транзакцию и закрывать сеанс , оба будут выполнены автоматически.
« Action.rollback () »следует использовать только в методах, которые обновляют базу данных.
В файле конфигурации hibernate мы настраиваем его для работы с базой данных hsqldb.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> org.hsqldb.jdbcDriver </property> <property name="hibernate.connection.url"> jdbc:hsqldb:hsql://localhost </property> <property name="hibernate.connection.username">sa</property> <property name="connection.password"></property> <property name="connection.pool_size">1</property> <property name="hibernate.dialect"> org.hibernate.dialect.HSQLDialect </property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping class="com.vaannila.domain.User" /> </session-factory> </hibernate-configuration>
Доменный объект User class показан ниже.
package com.vaannila.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="USER")
public class User {
private Long id;
private String name;
private String password;
private String gender;
private String country;
private String aboutYou;
private Boolean mailingList;
@Id
@GeneratedValue
@Column(name="USER_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="USER_NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="USER_PASSWORD")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name="USER_GENDER")
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Column(name="USER_COUNTRY")
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Column(name="USER_ABOUT_YOU")
public String getAboutYou() {
return aboutYou;
}
public void setAboutYou(String aboutYou) {
this.aboutYou = aboutYou;
}
@Column(name="USER_MAILING_LIST")
public Boolean getMailingList() {
return mailingList;
}
public void setMailingList(Boolean mailingList) {
this.mailingList = mailingList;
}
}
В классе UserAction у нас есть два метода add () и list () для добавления и вывода списка всех пользователей соответственно.
package com.vaannila.web;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.vaannila.dao.UserDAO;
import com.vaannila.dao.UserDAOImpl;
import com.vaannila.domain.User;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = -6659925652584240539L;
private User user = new User();
private List<User> userList = new ArrayList<User>();
private UserDAO userDAO = new UserDAOImpl();
@Override
public User getModel() {
return user;
}
public String add()
{
userDAO.saveUser(user);
return SUCCESS;
}
public String list()
{
userList = userDAO.listUser();
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
Чтобы внедрение сеанса и транзакции происходило через плагин, UserDAO должен быть объявлением уровня класса и не должен объявляться на уровне метода.
Чтобы использовать этот плагин, вам нужно расширить пакет из пакета hibernate-default . Чтобы настроить это, вы можете использовать XML или аннотации, я использую XML.
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="hibernate-default"> <action name="addUser" method="add" class="com.vaannila.web.UserAction"> <result name="success" type="redirect">listUser</result> </action> <action name="listUser" method="list" class="com.vaannila.web.UserAction"> <result name="success">/register.jsp</result> </action> </package> </struts>
Страница register.jsp показана ниже.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Registration Page</title>
<s:head />
<style type="text/css">
@import url(style.css);
</style>
</head>
<body>
<s:form action="addUser">
<s:textfield name="name" label="User Name" />
<s:password name="password" label="Password" />
<s:radio name="gender" label="Gender" list="{'Male','Female'}" />
<s:select name="country" list="{'India','USA','UK'}" headerKey=""
headerValue="Country" label="Select a country" />
<s:textarea name="aboutYou" label="About You" />
<s:checkbox name="mailingList"
label="Would you like to join our mailing list?" />
<s:submit />
</s:form>
<s:if test="userList.size() > 0">
<div class="content">
<table class="userTable" cellpadding="5px">
<tr class="even">
<th>Name</th>
<th>Gender</th>
<th>Country</th>
<th>About You</th>
<th>Mailing List</th>
</tr>
<s:iterator value="userList" status="userStatus">
<tr
class="<s:if test="#userStatus.odd == true ">odd</s:if><s:else>even</s:else>">
<td><s:property value="name" /></td>
<td><s:property value="gender" /></td>
<td><s:property value="country" /></td>
<td><s:property value="aboutYou" /></td>
<td><s:property value="mailingList" /></td>
</tr>
</s:iterator>
</table>
</div>
</s:if>
</body>
</html>
Вы можете скачать и попробовать пример интеграции с Struts 2 Hibernate здесь.

