

Person類代碼
@Entity
public class Person {
@Id
@GeneratedValue
private Integer id;
private String lastName;
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
} public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
}
}
public List<Person> findAll();
public void save(Person person);
public void remove(int id);
public Person find(int id);}
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Transactional;
import quickstart.model.Person;
@Transactional
public class PersonServiceImpl implements PersonService {
private EntityManager em;
@PersistenceContext
public void setEntityManager(EntityManager em) {
this.em = em;
}
@SuppressWarnings("unchecked")
public List<Person> findAll() {
Query query = getEntityManager().createQuery("select p FROM Person p");
return query.getResultList();
}
public void save(Person person) {
if (person.getId() == null) {
// new em.persist(person);
} else {
// update em.merge(person); }
}
public void remove(int id) {
Person person = find(id);
if (person != null) {
em.remove(person);
}
}
private EntityManager getEntityManager() {
return em;
}
public Person find(int id) {
return em.find(Person.class, id);
}
}
@PersistenceContext會(huì)讓Spring在實(shí)例化的時(shí)候給服務(wù)注入一個(gè)EntityManager。@PersistenceContext注解可以放在實(shí)例變量,或者setter方法前面。如果一個(gè)類被注解為@Transactional,Spring將會(huì)確保類的方法在運(yùn)行在一個(gè)事務(wù)中。
persistence.xml中就不用配置了,因?yàn)闀?huì)教給spring保管
web.xml的配置
<web-app id="person" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>person</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="personService" class="quickstart.service.PersonServiceImpl" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="personAction" scope="prototype" class="quickstart.action.PersonAction">
<constructor-arg ref="personService" />
</bean>
</beans>
注意"personAction"bean的"class"屬性被設(shè)為Action類的名字,并且"personService"bean會(huì)作為參數(shù)傳遞到action的構(gòu)造器中。改變"dataSource"Bean的"url", "username"和"passwrod"屬性為你數(shù)據(jù)庫的值。更多beans設(shè)置的細(xì)節(jié),請參看Spring的文檔。"scope"是Spring2新增的屬性,它意味著Spring會(huì)在該類型的對象被請求時(shí)創(chuàng)建一個(gè)新的PersonAction對象。在Struts2里,一個(gè)新的action對象被創(chuàng)建,用來為每個(gè)請求服務(wù),這就是我們?yōu)槭裁葱枰?/span>scope="prototype"。
現(xiàn)在我們需要?jiǎng)?chuàng)建一個(gè)簡單的Struts action,它封裝了PersonServices的方法。并且我們配置Struts使用Spring作為對象工廠。
打開新建類對話框,輸入"PersonAction"作為類名,包名為"quickstart.action",內(nèi)容如下:
import java.util.List;
import quickstart.model.Person;
import quickstart.service.PersonService;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.Preparable;
public class PersonAction implements Preparable {
private PersonService service;
private List<Person> persons;
private Person person;
private Integer id;
public PersonAction(PersonService service) {
this.service = service;
}
public String execute() {
this.persons = service.findAll();
return Action.SUCCESS;
}
public String save() {
this.service.save(person);
this.person = new Person();
return execute();
}
public String remove() {
service.remove(id);
return execute();
}
public List<Person> getPersons() {
return persons;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public void prepare() throws Exception {
if (id != null)
person = service.find(id);
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.devMode" value="true" />
<package name="person" extends="struts-default">
<action name="list" method="execute" class="personAction">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="remove" class="personAction" method="remove">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
<action name="save" class="personAction" method="save">
<result>pages/list.jsp</result>
<result name="input">pages/list.jsp</result>
</action>
</package>
</struts>
設(shè)置"struts.objectFactory"為"spring"會(huì)強(qiáng)制Struts使用Spring來實(shí)例化action,并注入所有定義在applicationContext.xml中的依賴關(guān)系。每個(gè)action別名的"class"屬性被設(shè)置為"personAction",這也就是我們在applicationContext.xml中定義的PersonAction bean。要讓Struts與Spring一起工作,我們僅僅需要做上面這點(diǎn)事情。
-- 學(xué)海無涯