Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          Spring+JPA+Struts2整合

          Posted on 2009-02-27 15:48 啥都寫點 閱讀(1193) 評論(0)  編輯  收藏 所屬分類: J2EE


          Person類代碼
          package quickstart.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;
          @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;    
           }
          }
          創建一個接口,命名為"PersonService",包名為"quickstart.service" PersonService.java
          package quickstart.service; import java.util.List; import quickstart.model.Person; public interface PersonService {     
              
          public List<Person> findAll();
              
              
          public void save(Person person);     
              
              
          public void remove(int id);     
              
              
          public Person find(int id); }
          創建一個類,命名為"PersonServiceImpl",包名為"quickstart.service"PersonServiceImpl.java
          package quickstart.service;
          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會讓Spring在實例化的時候給服務注入一個EntityManager。@PersistenceContext注解可以放在實例變量,或者setter方法前面。如果一個類被注解為@Transactional,Spring將會確保類的方法在運行在一個事務中。
          JPA配置
          persistence.xml中就不用配置了,因為會教給spring保管

          web.xml的配置
          <?xml version="1.0" encoding="UTF-8"?>
          <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>
          applicationContext.xml配置如下:
          <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:aop="http://www.springframework.org/schema/aop"     xmlns:tx="http://www.springframework.org/schema/tx"     xsi:schemaLocation="     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">    
             
          <
          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"屬性被設為Action類的名字,并且"personService"bean會作為參數傳遞到action的構造器中。改變"dataSource"Bean"url", "username""passwrod"屬性為你數據庫的值。更多beans設置的細節,請參看Spring的文檔。"scope"Spring2新增的屬性,它意味著Spring會在該類型的對象被請求時創建一個新的PersonAction對象。在Struts2里,一個新的action對象被創建,用來為每個請求服務,這就是我們為什么需要scope="prototype"。



          現在我們需要創建一個簡單的Struts action,它封裝了PersonServices的方法。并且我們配置Struts使用Spring作為對象工廠。
          打開新建類對話框,輸入
          "PersonAction"作為類名,包名為"quickstart.action",內容如下:
          package quickstart.action;
          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;    
           }
          }
          struts.xml中的配置
          <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"     "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>    
          <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>

          設置"struts.objectFactory""spring"會強制Struts使用Spring來實例化action,并注入所有定義在applicationContext.xml中的依賴關系。每個action別名的"class"屬性被設置為"personAction",這也就是我們在applicationContext.xml中定義的PersonAction bean。要讓StrutsSpring一起工作,我們僅僅需要做上面這點事情。






                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 旬阳县| 庐江县| 建昌县| 景德镇市| 郎溪县| 五大连池市| 四川省| 建德市| 榆社县| 武平县| 汝州市| 峡江县| 民和| 凤台县| 称多县| 翼城县| 阳西县| 高雄县| 黄山市| 福建省| 海伦市| 烟台市| 尉氏县| 南岸区| 富顺县| 新化县| 广灵县| 银川市| 日喀则市| 观塘区| 湄潭县| 光泽县| 永宁县| 花垣县| 镇赉县| 沅陵县| 依兰县| 仁寿县| 汤原县| 浙江省| SHOW|