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

資訊專欄INFORMATION COLUMN

ssh(Spring+Struts2+hibernate)整合

tulayang / 1835人閱讀

摘要:需求整合框架做一個(gè)保存用戶的業(yè)務(wù),業(yè)務(wù)比較簡(jiǎn)單,重在框架整合。

需求:整合ssh框架做一個(gè)保存用戶的業(yè)務(wù),業(yè)務(wù)比較簡(jiǎn)單,重在ssh框架整合。
創(chuàng)建數(shù)據(jù)庫和表

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

一:導(dǎo)入jar包

Hibernate需要jar

   Hibernate基本jar
   mysql驅(qū)動(dòng)  
   c3p0連接池
   日志包
   jpa

Struts需要jar
Struts2基本jar

Spring需要jar

   Ioc(6個(gè)):beans,context,expression,core+兩個(gè)日志
   Aop(4個(gè)):
       spring-aop-4.2.4.RELEASE
       spring整合aspect
       aspectj:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
       aop聯(lián)盟:com.springsource.org.aopalliance-1.0.0.jar
   spring聲明式事務(wù):
       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包先不要導(dǎo)入,因?yàn)槿绻麑?dǎo)入在項(xiàng)目啟動(dòng)的時(shí)候,
       會(huì)在ServetContext中查找spring工廠,會(huì)報(bào)錯(cuò),拋出下面異常
   
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監(jiān)聽器在項(xiàng)目啟動(dòng)的時(shí)候創(chuàng)建spring容器的時(shí)候?qū)?/p>

最后:去除重復(fù)的jar struts2基本Jar和Hibernate基本Jar中都有
javassist-3.18.1-GA.jar,刪除一個(gè)低版本的,否則在使用的時(shí)候會(huì)出現(xiàn)問題。

二:需要的配置文件

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:(對(duì)數(shù)據(jù)庫參數(shù)的封裝) 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 需要保存客戶實(shí)體的映射文件


    
        
        
            
            
        
        
        
        
        
        
        
    

Struts需要的配置文件

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

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

    
    
        
            /success.jsp
        
    

applicationContext.xml src下(待會(huì)配置)

三:創(chuàng)建service,dao,domain,action

創(chuàng)建Customer實(shí)體類,以及實(shí)體類對(duì)應(yīng)的映射文件映射文件看上面)

 偽代碼(為屬性提供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對(duì)象交給spring容器管理
    service需要調(diào)用dao層的方法,進(jìn)行屬性注入
public class CustomerServiceImpl implements CustomerService {
    //創(chuàng)建dao,并提供set方法,進(jìn)行屬性注入
    private CustomerDao customerDao;
    public void setCustomerDao(CustomerDao customerDao) {
        this.customerDao = customerDao;
    }
    @Override
    public void save(Customer customer) {
        customerDao.save(customer);
    }
}

創(chuàng)建CustomerDao,CustomerDaoImpl
將CustomerDao對(duì)象交給spring容器管

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

創(chuàng)建CustomerAction并在struts.xml中進(jìn)行配置(struts.xml文件)

public class CustomerAction extends ActionSupport implements ModelDriven {
    private static final long serialVersionUID = 1L;
    //使用ModelDriven模型驅(qū)動(dòng)進(jìn)行數(shù)據(jù)封裝,必須手動(dòng)來創(chuàng)建對(duì)象
    private Customer customer = new Customer();
    @Override
    public Customer getModel() {
        return customer;
    }
    /*
     * 創(chuàng)建CustomerService對(duì)象調(diào)用service層的方法
     * 因?yàn)閍ction是由struts2創(chuàng)建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


    
    
    
        
    

創(chuàng)建save.jsp

客戶名稱:
客戶等級(jí):
客戶來源:
客戶行業(yè):
客戶電話:
          

三:測(cè)試

在瀏覽器輸入http://localhost/ssh01/save.jsp輸入數(shù)據(jù),點(diǎn)擊提交,
數(shù)據(jù)庫表創(chuàng)建成功,數(shù)據(jù)成功保存

這樣,最簡(jiǎn)單最原始的ssh框架整合完成。

問題一:在CustomerAction中的獲取service

解決方案:

使用監(jiān)聽器,當(dāng)項(xiàng)目啟動(dòng)的時(shí)候監(jiān)聽ServletContext對(duì)象的創(chuàng)建,
當(dāng)ServletContext對(duì)象創(chuàng)建的時(shí)候加載applicationContext.xml文件,
創(chuàng)建spring工廠初始化bean將spring容器放置在ServletContext域?qū)ο笾?
spring為我們提供了ContextLoaderListener,在web.xml文件中配置該監(jiān)聽器,
它會(huì)加載applicationContext.xml,創(chuàng)建spring工廠,
并存放在ServletContext域?qū)ο笾?    

代碼實(shí)現(xiàn)

在web.xml中進(jìn)行配置

      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
前提:導(dǎo)入struts-spring-plugin.jar,在項(xiàng)目啟動(dòng)的時(shí)候創(chuàng)建spring工廠,
    放置到context域中
    
方式一:Action還是struts創(chuàng)建,Spring負(fù)責(zé)為Struts中的Action注入匹配的屬性
//由spring容器為action進(jìn)行屬性注入
    private CustomerService customerService;
    public void setCustomerService(CustomerService customerService) {
        this.customerService = customerService;
    }
原因:為什么直接導(dǎo)入struts2-spring-plugin.jar包就可以直接注入?
在default.properties配置有中struts.objectFactory.spring.autoWire = name
Spring負(fù)責(zé)為Struts中的Action注入匹配的屬性,根據(jù)屬性的名稱注入(默認(rèn),可以修改)

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

    
        
    
    修改struts文件:
    
        
            /success.jsp
        
    

問題三

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

解決方案
    將SessionFactory交給spring容器管理:?jiǎn)卫?sessionFactory是一個(gè)接口,在這里我們使用它的實(shí)現(xiàn)類LocalSessionFactoryBean
選擇Hibernate5的,因?yàn)槲覀兪褂玫腍ibernate是5.0.7版本的



在applicationContext.xml中配置

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

在applicationContext.xml中進(jìn)行配置
配置Hibernate模板需要注入SessionFactory,因?yàn)槟0迨菍?duì)Hibernate的包裝,底層還是
使用session來操作數(shù)據(jù)庫,所以需要獲取到session對(duì)象,通過SessionFactory對(duì)象
    
        
            
            
        
        
    
    
        
        
    
修改之后dao層的代碼如下
public class CustomerDaoImpl implements CustomerDao {
    //注入HibernateTemplate來操作數(shù)據(jù)庫
    private HibernateTemplate hibernateTemplate;
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }
    @Override
    public void save(Customer customer) {
        hibernateTemplate.save(customer);
    }
}
這樣直接運(yùn)行程序,會(huì)拋出異常,異常信息為:
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或者清除事務(wù)定義中的readOnly標(biāo)記

spring會(huì)將獲取到的session綁定到當(dāng)前線程中,
為了確保在一個(gè)請(qǐng)求中service層和dao層使用的是一個(gè)session對(duì)象
只有受spring聲明式事務(wù)的方法才具有寫權(quán)限。否則在操作的會(huì)拋出上面異常

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

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

在實(shí)際的開發(fā)中都是注解+xml來完成的。現(xiàn)在我們來對(duì)代碼進(jìn)行優(yōu)化。
在實(shí)際的開發(fā)中:
    我們自定義bean的創(chuàng)建和注入通過注解來完成(CustomerService等)
    非自定義的bean交給xml文件配置(例如數(shù)據(jù)源dataSource和SessionFactory)
    
    
優(yōu)化一:去除struts.xml文件(action的配置使用注解來完成)
使用注解的方式配置action必須導(dǎo)入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模型驅(qū)動(dòng)進(jìn)行數(shù)據(jù)封裝,必須手動(dòng)來創(chuàng)建對(duì)象
    private Customer customer = new Customer();
    @Override
    public Customer getModel() {
        return customer;
    }
    //由spring容器為action進(jìn)行屬性注入
    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;
    }
}

優(yōu)化二:所有的自定義bean都使用注解的方式進(jìn)行配置,
去除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來操作數(shù)據(jù)庫
   @Autowired
   private HibernateTemplate hibernateTemplate;

優(yōu)化三:spring的聲明式事務(wù)使用xml+注解的方式進(jìn)行配置
減少applicationContext.xml文件中的配置代碼

要在applicationContext中開啟事務(wù)注解支持

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

優(yōu)化四:去除持久化類的映射配置文件,使用注解進(jìn)行代替

其它字段和屬性名相同,可以省略@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文件已經(jīng)去除,修改為

優(yōu)化五:去除Hibernate.cfg.xml

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

    
    

指定了核心配置文件,現(xiàn)在需要手動(dòng)的配置數(shù)據(jù)庫參數(shù)以及Hibernate的一些基本配置
如是否顯示sql語句,是否格式化sql語句,mysql方言配置等

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



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

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67535.html

相關(guān)文章

  • 慕課網(wǎng)_《基于SSH實(shí)現(xiàn)員工管理系統(tǒng)之框架整合篇》學(xué)習(xí)總結(jié)

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

    icattlecoder 評(píng)論0 收藏0
  • 納稅服務(wù)系統(tǒng)【總結(jié)】

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

    ispring 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫連接池...

    KevinYan 評(píng)論0 收藏0
  • 學(xué)Java編程需要注意的地方

    摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會(huì)編程,在學(xué)習(xí)和解決問題上總會(huì)碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。   學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會(huì)Java編程,在學(xué)習(xí)和解決問題上總會(huì)碰到障礙。工作的時(shí)間越久就越能明白這個(gè)道理。不過這倒是一個(gè)讓人進(jìn)步的機(jī)會(huì),因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...

    leanxi 評(píng)論0 收藏0
  • SSH(Struts2+Hibernate+Spring)開發(fā)策略

    摘要:首先是應(yīng)該了解框架技術(shù)的運(yùn)行流程在此我給大家介紹一種常見的開發(fā)模式,這對(duì)于初學(xué)者來說應(yīng)該也是比較好理解的。 很多小伙伴可能一聽到框架兩個(gè)字就會(huì)馬上搖頭,腦子里立刻閃現(xiàn)一個(gè)詞---拒絕,其實(shí)我也不例外,但我想告訴大家的是,當(dāng)你真正掌握它時(shí),你會(huì)發(fā)現(xiàn)**SSH**用起來是那么順手,因?yàn)樗鼘?duì)于開發(fā)web應(yīng)用真的很方便,下面就我個(gè)人經(jīng)驗(yàn)和大伙兒談?wù)勅绾卫?*SSH框架技術(shù)**來進(jìn)行*w...

    reclay 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<