国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

ssh(Spring+Struts2+hibernate)整合

tulayang / 1841人閱讀

摘要:需求整合框架做一個保存用戶的業務,業務比較簡單,重在框架整合。

需求:整合ssh框架做一個保存用戶的業務,業務比較簡單,重在ssh框架整合。
創建數據庫和表

CREATE DATABASE ssh01;
USE DATABASE;
表由Hibernate創建,可以看配置是否成功

一:導入jar包

Hibernate需要jar

   Hibernate基本jar
   mysql驅動  
   c3p0連接池
   日志包
   jpa

Struts需要jar
Struts2基本jar

Spring需要jar

   Ioc(6個):beans,context,expression,core+兩個日志
   Aop(4個):
       spring-aop-4.2.4.RELEASE
       spring整合aspect
       aspectj:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
       aop聯盟:com.springsource.org.aopalliance-1.0.0.jar
   spring聲明式事務:
       spring-jdbc-4.2.4.RELEASE.jar
       spring-tx-4.2.4.RELEASE.jar

Spring整合web

   spring-web-4.2.4.RELEASE.jar

Spring整合Hibernate

   spring-orm-4.2.4.RELEASE.jar

Spring整合Struts2

   struts2-spring-plugin-2.3.24.jar
   **注意**
       Spring整合Struts2包先不要導入,因為如果導入在項目啟動的時候,
       會在ServetContext中查找spring工廠,會報錯,拋出下面異常
   
You might need to add the following to web.xml: 
            
                org.springframework.web.context.ContextLoaderListener
            
        17:46:11,396 ERROR Dispatcher:42 - Dispatcher initialization failed
        java.lang.NullPointerException

在配置ContextLoaderListener監聽器在項目啟動的時候創建spring容器的時候導入

最后:去除重復的jar struts2基本Jar和Hibernate基本Jar中都有
javassist-3.18.1-GA.jar,刪除一個低版本的,否則在使用的時候會出現問題。

二:需要的配置文件

Hibernate需要的配置文件

   Hibernate.cfg.xml:src路徑下

    
        
        com.mysql.jdbc.Driver
        jdbc:mysql:///ssh01
        root
        root
        
        
        
        org.hibernate.dialect.MySQLDialect
        
        
        true
        
        true
        
        update
        
        
        org.hibernate.connection.C3P0ConnectionProvider
        
        
        
    

jdbc.properties:(對數據庫參數的封裝) src下

jdbc.driver=com.mysql.jdbc.Driver;
jdbc.url=jdbc:mysql://localhost:3306/ssh01
jdbc.username=root
jdbc.password=root

log4J.properties日志文件 src下

Customer.hbm.xml 需要保存客戶實體的映射文件


    
        
        
            
            
        
        
        
        
        
        
        
    

Struts需要的配置文件

   web.xml:配置Struts核心過濾器

      Struts2
      org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
  
      Struts2
      /*
  
  struts2.xml:配置action 位置src下

    
    
        
            /success.jsp
        
    

applicationContext.xml src下(待會配置)

三:創建service,dao,domain,action

創建Customer實體類,以及實體類對應的映射文件映射文件看上面)

 偽代碼(為屬性提供get/set方法)
public class Customer implements Serializable{
    private static final long serialVersionUID = 1L;
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_phone;
    private String cust_mobile;

CustomerService,CustomerServiceImpl

    將customerService對象交給spring容器管理
    service需要調用dao層的方法,進行屬性注入
public class CustomerServiceImpl implements CustomerService {
    //創建dao,并提供set方法,進行屬性注入
    private CustomerDao customerDao;
    public void setCustomerDao(CustomerDao customerDao) {
        this.customerDao = customerDao;
    }
    @Override
    public void save(Customer customer) {
        customerDao.save(customer);
    }
}

創建CustomerDao,CustomerDaoImpl
將CustomerDao對象交給spring容器管

public class CustomerDaoImpl implements CustomerDao {
    @Override
    public void save(Customer customer) {
        //獲取session對象,來操作數據庫
        Configuration config = new Configuration().configure();
        SessionFactory factory = config.buildSessionFactory();
        Session session = factory.openSession();
        Transaction tx = session.beginTransaction();
        session.save(customer);
        tx.commit();
        session.close();
    }
}

創建CustomerAction并在struts.xml中進行配置(struts.xml文件)

public class CustomerAction extends ActionSupport implements ModelDriven {
    private static final long serialVersionUID = 1L;
    //使用ModelDriven模型驅動進行數據封裝,必須手動來創建對象
    private Customer customer = new Customer();
    @Override
    public Customer getModel() {
        return customer;
    }
    /*
     * 創建CustomerService對象調用service層的方法
     * 因為action是由struts2創建service交給spring容器管理所以不可以直接注入
     */
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    CustomerService customerService = (CustomerService) context.getBean("customerService");
    //保存用戶的方法
    public String save(){
        customerService.save(customer);
        return SUCCESS;
    }
}

在spring容器中管理CustomerService,CustomerDao


    
    
    
        
    

創建save.jsp

客戶名稱:
客戶等級:
客戶來源:
客戶行業:
客戶電話:
          

三:測試

在瀏覽器輸入http://localhost/ssh01/save.jsp輸入數據,點擊提交,
數據庫表創建成功,數據成功保存

這樣,最簡單最原始的ssh框架整合完成。

問題一:在CustomerAction中的獲取service

解決方案:

使用監聽器,當項目啟動的時候監聽ServletContext對象的創建,
當ServletContext對象創建的時候加載applicationContext.xml文件,
創建spring工廠初始化bean將spring容器放置在ServletContext域對象中

spring為我們提供了ContextLoaderListener,在web.xml文件中配置該監聽器,
它會加載applicationContext.xml,創建spring工廠,
并存放在ServletContext域對象中
    

代碼實現

在web.xml中進行配置

      contextConfigLocation
      classpath:applicationContext.xml
  
  
      org.springframework.web.context.ContextLoaderListener
  
在CustomerService中獲取service
ServletContext servletContext = ServletActionContext.getServletContext();
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
CustomerService customerService = (CustomerService) context.getBean("customerService");

問題二:Action由struts2容器管理,service是交給spring容器管理,不能直接注入
    如何在action中注入service

解決方案:spring整合struts
前提:導入struts-spring-plugin.jar,在項目啟動的時候創建spring工廠,
    放置到context域中
    
方式一:Action還是struts創建,Spring負責為Struts中的Action注入匹配的屬性
//由spring容器為action進行屬性注入
    private CustomerService customerService;
    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }
原因:為什么直接導入struts2-spring-plugin.jar包就可以直接注入?
在default.properties配置有中struts.objectFactory.spring.autoWire = name
Spring負責為Struts中的Action注入匹配的屬性,根據屬性的名稱注入(默認,可以修改)

方式二:將action交給spring容器來管理,
    action是多例的,所以需要配置scope="prototype"屬性
    修改applicationContext.xml和struts.xml文件

    
        
    
    修改struts文件:
    
        
            /success.jsp
        
    

問題三

在dao層,使用Hibernate操作數據庫,需要加載Hibernate.cfg.xml配置文件
獲取SessionFactory(類似于DataSource數據源)然后獲取到session對象
(類似于Connection連接對象,SessionFactory:是重量級并且線程安全的,
所以在項目中只存在一份即

解決方案
    將SessionFactory交給spring容器管理:單例
sessionFactory是一個接口,在這里我們使用它的實現類LocalSessionFactoryBean
選擇Hibernate5的,因為我們使用的Hibernate是5.0.7版本的



在applicationContext.xml中配置

        
        
使用spring提供的HibernateTemplate在dao層操作數據庫,將HibernateTemplate交給
spring容器來管理,并注入到dao層

在applicationContext.xml中進行配置
配置Hibernate模板需要注入SessionFactory,因為模板是對Hibernate的包裝,底層還是
使用session來操作數據庫,所以需要獲取到session對象,通過SessionFactory對象
    
        
            
            
        
        
    
    
        
        
    
修改之后dao層的代碼如下
public class CustomerDaoImpl implements CustomerDao {
    //注入HibernateTemplate來操作數據庫
    private HibernateTemplate hibernateTemplate;
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }
    @Override
    public void save(Customer customer) {
        hibernateTemplate.save(customer);
    }
}
這樣直接運行程序,會拋出異常,異常信息為:
Write operations are not allowed in read-only mode (FlushMode.MANUAL):
    Turn your Session into FlushMode.COMMIT/AUTO or remove "readOnly" 
    marker from transaction definition.
問題:只讀模式下(FlushMode.NEVER/MANUAL)寫操作不被允許:
把你的Session改成FlushMode.COMMIT/AUTO或者清除事務定義中的readOnly標記

spring會將獲取到的session綁定到當前線程中,
為了確保在一個請求中service層和dao層使用的是一個session對象
只有受spring聲明式事務的方法才具有寫權限。否則在操作的會拋出上面異常

所以還需要在applicationContext.xml中配置spring的聲明式事務

    
    
        
         
    
    
    
        
            
            
            
            
        
    
    
    
        
        
        
    
這樣一個純xml配置整合ssh框架就完成了!!!

在實際的開發中都是注解+xml來完成的。現在我們來對代碼進行優化。
在實際的開發中:
    我們自定義bean的創建和注入通過注解來完成(CustomerService等)
    非自定義的bean交給xml文件配置(例如數據源dataSource和SessionFactory)
    
    
優化一:去除struts.xml文件(action的配置使用注解來完成)
使用注解的方式配置action必須導入jar包struts2-convention-plugin-2.3.24.jar
在CustomerAction上面添加注解:
@Namespace("/")
@ParentPackage("struts-default")
public class CustomerAction extends ActionSupport implements ModelDriven {
    private static final long serialVersionUID = 1L;
    //使用ModelDriven模型驅動進行數據封裝,必須手動來創建對象
    private Customer customer = new Customer();
    @Override
    public Customer getModel() {
        return customer;
    }
    //由spring容器為action進行屬性注入
    private CustomerService customerService;
    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }
    //保存用戶的方法
    @Action(value="customer_save",results={@Result(name="success",location="/success.jsp")})
    public String save(){
        customerService.save(customer);
        return SUCCESS;
    }
}

優化二:所有的自定義bean都使用注解的方式進行配置,
去除applicationContext中的自定義bean
必須在applicationContext中開啟組件掃描

   在applicationContext中開啟組件掃描
   
   

   CustomerAction中的代碼
   @Namespace("/")
   @ParentPackage("struts-default")
   @Controller("customerAction")
   public class CustomerAction extends ActionSupport implements ModelDriven{
       @Autowired
       private CustomerService customerService;
   }

   CustomerServiceImpl中配置注解的代碼
   @Service("customerService")
   public class CustomerServiceImpl implements CustomerService {
   @Autowired
   private CustomerDao customerDao;

   CustomerDaoImpl中注解的代碼
   @Repository("customerDao")
   public class CustomerDaoImpl implements CustomerDao {
   //注入HibernateTemplate來操作數據庫
   @Autowired
   private HibernateTemplate hibernateTemplate;

優化三:spring的聲明式事務使用xml+注解的方式進行配置
減少applicationContext.xml文件中的配置代碼

要在applicationContext中開啟事務注解支持

事務是在service層進行控制的,在service層上加上事務注解
可以去除applicationContext中配置增強和aop配置的代碼
@Service("customerService")
@Transactional
public class CustomerServiceImpl implements CustomerService

優化四:去除持久化類的映射配置文件,使用注解進行代替

其它字段和屬性名相同,可以省略@Column
@Entity
@Table(name="cst_customer")
public class Customer implements Serializable{
    private static final long serialVersionUID = 1L;
    //oid
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
去除持久化類的映射配置文件之后,在Hibernate.cfg.xml文件中
引入持久化類映射文件的代碼需要修改:


Customer.hbm.xml文件已經去除,修改為

優化五:去除Hibernate.cfg.xml

在前面applicationContext.xml中將SessionFactory交給spring容器管理的時候

    
    

指定了核心配置文件,現在需要手動的配置數據庫參數以及Hibernate的一些基本配置
如是否顯示sql語句,是否格式化sql語句,mysql方言配置等

最終:只留下了applicationContext.xml配置文件



    
    
    
    
    
    
    
        
        
        
        
        
    
    
    
        
        
        
        
            
                org.hibernate.dialect.MySQLDialect
                true
                true
                update
            
        
        
        
            
                com.itheima.domain
            
        
    
    
    
        
        
    
    
    
    
        
         
    

這樣,以xml+注解結合方式整合ssh框架就完成了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67535.html

相關文章

  • 慕課網_《基于SSH實現員工管理系統之框架整合篇》學習總結

    時間:2017年08月16日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 課程目錄 1.ssh知識點回顧 2.搭建ssm開發環境 3.struts2整合spring 4.spring整合hibernate 5.案例:使用ssh框架開發...

    icattlecoder 評論0 收藏0
  • 納稅服務系統【總結】

    摘要:要是使用到日歷的話,我們想到使用這個日歷類上面僅僅是我個人總結的要點,如果有錯誤的地方還請大家給我指正。 納稅服務系統總結 納稅服務系統是我第一個做得比較大的項目(不同于javaWeb小項目),該項目系統來源于傳智Java32期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 我跟著練習一步一步完成需求,才發覺原來Java是這樣用來做網站的,Java有那么多的類庫,頁面...

    ispring 評論0 收藏0
  • Java3y文章目錄導航

    摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...

    KevinYan 評論0 收藏0
  • 學Java編程需要注意的地方

    摘要:學編程真的不是一件容易的事不管你多喜歡或是多會編程,在學習和解決問題上總會碰到障礙。熟練掌握核心內容,特別是和多線程初步具備面向對象設計和編程的能力掌握基本的優化策略。   學Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學習和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進步的機會,因為你要一直不斷的學習才能很好的解決你面前的難題...

    leanxi 評論0 收藏0
  • SSH(Struts2+Hibernate+Spring)開發策略

    摘要:首先是應該了解框架技術的運行流程在此我給大家介紹一種常見的開發模式,這對于初學者來說應該也是比較好理解的。 很多小伙伴可能一聽到框架兩個字就會馬上搖頭,腦子里立刻閃現一個詞---拒絕,其實我也不例外,但我想告訴大家的是,當你真正掌握它時,你會發現**SSH**用起來是那么順手,因為它對于開發web應用真的很方便,下面就我個人經驗和大伙兒談談如何利用**SSH框架技術**來進行*w...

    reclay 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<