<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 26,  comments - 14,  trackbacks - 0
      2011年3月4日


    1 getCurrentSession創(chuàng)建的session會(huì)和綁定到當(dāng)前線程,而openSession每次創(chuàng)建新的session。

    2 getCurrentSession創(chuàng)建的線程會(huì)在事務(wù)回滾或事物提交后自動(dòng)關(guān)閉,而openSession必須手動(dòng)關(guān)閉

    這里getCurrentSession本地事務(wù)(本地事務(wù):jdbc)時(shí) 要在配置文件里進(jìn)行如下設(shè)置

        * 如果使用的是本地事務(wù)(jdbc事務(wù))
     <property name="hibernate.current_session_context_class">thread</property>
     * 如果使用的是全局事務(wù)(jta事務(wù))
     <property name="hibernate.current_session_context_class">jta</property> 

     getCurrentSession () 在事務(wù)結(jié)束之前使用當(dāng)前的session
    openSession()         每次重新建立一個(gè)新的session

    在一個(gè)應(yīng)用程序中,如果DAO 層使用Spring 的hibernate 模板,通過Spring 來控制session 的生命周期,則首選getCurrentSession ()。

    使用Hibernate的大多數(shù)應(yīng)用程序需要某種形式的“上下文相關(guān)的” session,特定的session在整個(gè)特定的上下文范圍內(nèi)始終有效。然而,對(duì)不同類型的應(yīng)用程序而言,要為什么是組成這種“上下文”下一個(gè)定義通常 是困難的;不同的上下文對(duì)“當(dāng)前”這個(gè)概念定義了不同的范圍。在3.0版本之前,使用Hibernate的程序要么采用自行編寫的基于 ThreadLocal的上下文session,要么采用HibernateUtil這樣的輔助類,要么采用第三方框架(比如Spring或Pico), 它們提供了基于代理(proxy)或者基于攔截器(interception)的上下文相關(guān)session。

    從3.0.1版本開 始,Hibernate增加了SessionFactory.getCurrentSession()方法。一開始,它假定了采用JTA事務(wù),JTA事務(wù) 定義了當(dāng)前session的范圍和上下文(scope and context)。Hibernate開發(fā)團(tuán)隊(duì)堅(jiān)信,因?yàn)橛泻脦讉€(gè)獨(dú)立的JTA TransactionManager實(shí)現(xiàn)穩(wěn)定可用,不論是否被部署到一個(gè)J2EE容器中,大多數(shù)(假若不是所有的)應(yīng)用程序都應(yīng)該采用JTA事務(wù)管理。 基于這一點(diǎn),采用JTA的上下文相關(guān)session可以滿足你一切需要。

    更好的是,從3.1開 始,SessionFactory.getCurrentSession()的后臺(tái)實(shí)現(xiàn)是可拔插的。因此,我們引入了新的擴(kuò)展接口 (org.hibernate.context.CurrentSessionContext)和新的配置參數(shù) (hibernate.current_session_context_class),以便對(duì)什么是“當(dāng)前session”的范圍和上下文(scope and context)的定義進(jìn)行拔插。

    請(qǐng)參閱 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有關(guān)于它的契約的詳細(xì)討論。它定義 了單一的方法,currentSession(),特定的實(shí)現(xiàn)用它來負(fù)責(zé)跟蹤當(dāng)前的上下文session。Hibernate內(nèi)置了此接口的兩種實(shí)現(xiàn)。

    org.hibernate.context.JTASessionContext - 當(dāng)前session根據(jù)JTA來跟蹤和界定。這和以前的僅支持JTA的方法是完全一樣的。詳情請(qǐng)參閱Javadoc。

    org.hibernate.context.ThreadLocalSessionContext - 當(dāng)前session通過當(dāng)前執(zhí)行的線程來跟蹤和界定。詳情也請(qǐng)參閱Javadoc。

    這 兩種實(shí)現(xiàn)都提供了“每數(shù)據(jù)庫(kù)事務(wù)對(duì)應(yīng)一個(gè)session”的編程模型,也稱作每次請(qǐng)求一個(gè)session。Hibernate session的起始和終結(jié)由數(shù)據(jù)庫(kù)事務(wù)的生存來控制。假若你采用自行編寫代碼來管理事務(wù)(比如,在純粹的J2SE,或者 JTA/UserTransaction/BMT),建議你使用Hibernate Transaction API來把底層事務(wù)實(shí)現(xiàn)從你的代碼中隱藏掉。如果你在支持CMT的EJB容器中執(zhí)行,事務(wù)邊界是聲明式定義的,你不需要在代碼中進(jìn)行任何事務(wù)或 session管理操作。請(qǐng)參閱第 11 章 事務(wù)和并發(fā)一節(jié)來閱讀更多的內(nèi)容和示例代碼。

    hibernate.current_session_context_class 配置參數(shù)定義了應(yīng)該采用哪個(gè)org.hibernate.context.CurrentSessionContext實(shí)現(xiàn)。注意,為了向下兼容,如果未 配置此參數(shù),但是存在org.hibernate.transaction.TransactionManagerLookup的配 置,Hibernate會(huì)采用org.hibernate.context.JTASessionContext。一般而言,此參數(shù)的值指明了要使用的實(shí) 現(xiàn)類的全名,但那兩個(gè)內(nèi)置的實(shí)現(xiàn)可以使用簡(jiǎn)寫,即"jta"和"thread"。

    1、getCurrentSession()與openSession()的區(qū)別?

    * 采用getCurrentSession()創(chuàng)建的session會(huì)綁定到當(dāng)前線程中,而采用openSession()
    創(chuàng)建的session則不會(huì)
    * 采用getCurrentSession()創(chuàng)建的session在commit或rollback時(shí)會(huì)自動(dòng)關(guān)閉,而采用openSession()
    創(chuàng)建的session必須手動(dòng)關(guān)閉
    2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
    * 如果使用的是本地事務(wù)(jdbc事務(wù))
    <property name="hibernate.current_session_context_class">thread</property>
    * 如果使用的是全局事務(wù)(jta事務(wù))
    <property name="hibernate.current_session_context_class">jta</property>

    利于ThreadLocal模式管理Session
       早在Java1.2推出之時(shí),Java平臺(tái)中就引入了一個(gè)新的支持:java.lang.ThreadLocal,給我們?cè)诰帉懚嗑€程程序
       時(shí)提供了一種新的選擇。ThreadLocal是什么呢?其實(shí)ThreadLocal并非是一個(gè)線程的本地實(shí)現(xiàn)版本,它并不是一個(gè)Thread,
       而是thread local variable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)
       其實(shí)的功用非常簡(jiǎn)單,就是為每一個(gè)使用某變量的線程都提供一個(gè)該變量值的副本,是每一個(gè)線程都可以獨(dú)立地改變自己的副本,
       而不會(huì)和其它線程的副本沖突。從線程的角度看,就好像每一個(gè)線程都完全擁有一個(gè)該變量。
       ThreadLocal是如何做到為每一個(gè)線程維護(hù)變量的副本的呢?其實(shí)實(shí)現(xiàn)的思路很簡(jiǎn)單,在ThreadLocal類中有一個(gè)Map,
       用于存儲(chǔ)每一個(gè)線程的變量的副本。比如下面的示例實(shí)現(xiàn)(為了簡(jiǎn)單,沒有考慮集合的泛型):
    public class HibernateUtil {

    public static final ThreadLocal session =new ThreadLocal();

    public static final SessionFactory sessionFactory;
       static {
          try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
          } catch (Throwable ex) {
               throw new ExceptionInInitializerError(ex);
          }    
    }

         public static Session currentSession() throws HibernateException {
            Session s = session.get();
            if(s == null) {
              s = sessionFactory.openSession();
              session.set(s);
               }
             return s;
           }

        public static void closeSession() throws HibernateException {
               Session s = session.get();
            if(s != null) {
                s.close();
            }
            session.set(null);
        }
    }


    在這里比較了下getCurrentSession()是否是用的是同一個(gè)session...............

    package com.hibernate;

    import java.util.Date;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;

    public class HibernateIDTest {
     private static SessionFactory sessionFactory;
     
     @BeforeClass
     public static void beforeClass() {
      try{
       sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
      }catch (Exception e) {
       // TODO: handle exception
       e.printStackTrace();
      }
     }
     @AfterClass
     public static void afterClass() {
      sessionFactory.close();
     }
     
     
     @Test
     public void testTeacherSave() {
      System.out.println("------------");
      Teacher t = new Teacher();
      t.setId(1);
      t.setName("t1");
      t.setTitle("middle");
      t.setBirthDate(new Date());
      
      Session session = sessionFactory.getCurrentSession();
      session.beginTransaction();
      session.save(t);
      session.getTransaction().commit();
      Session session2 = sessionFactory.getCurrentSession();
      
      System.out.println("比較"+(session.hashCode()==session2.hashCode()));
      
      
     }
     
    }
    執(zhí)行之后不的到結(jié)果是  session.hashCode()==session2.hashCode()這兩個(gè)只是false的,也就是說,在事務(wù)結(jié)束之后getCuttentSession 也是創(chuàng)建了新的session。。。。。。


    openSession() 與 getCurrentSession() 有何不同和關(guān)聯(lián)呢?

     

    在 SessionFactory 啟動(dòng)的時(shí)候, Hibernate 會(huì)根據(jù)配置創(chuàng)建相應(yīng)的 CurrentSessionContext ,在 getCurrentSession() 被調(diào)用的時(shí)候,實(shí)際被執(zhí)行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 執(zhí)行時(shí),如果當(dāng)前 Session 為空, currentSession 會(huì)調(diào)用 SessionFactory 的 openSession 。所以 getCurrentSession() 對(duì)于 Java EE 來說是更好的獲取 Session 的方法。

    posted @ 2011-04-14 10:46 龍ぜ?xì)垊?閱讀(5688) | 評(píng)論 (1)編輯 收藏

    jfreechart主要是用來動(dòng)態(tài)產(chǎn)生各種數(shù)據(jù)圖形的,可最初使用的時(shí)候大都會(huì)碰到圖片中的中文亂碼或是一個(gè)小方塊的情況。
    仔細(xì)研究主要有以下2種原因:

    1:服務(wù)器缺少中文字體,這多發(fā)生在Hp等unix操作系統(tǒng)上,解決的方法就是下載可用字體庫(kù)到系統(tǒng)中,
    有人也提出在Windows上產(chǎn)生圖片在傳回到Unix主機(jī)上的方法。
    2:軟件版本問題,jfreechart-1.0.10有人說沒有問題,但jfreechart-1.0.11到13都有問題,我用的最新的jfreechart-1.0.13不做設(shè)置是有問題的。
    究其原因,是它代碼的內(nèi)部設(shè)置的字體有問題.


    其下是具體的解決辦法:


    public static void configFont(JFreeChart chart){  
             // 設(shè)置字體  
             Font xfont = new Font("宋體",Font.PLAIN,12) ;// X軸  
             Font yfont = new Font("宋體",Font.PLAIN,12) ;// Y軸  
             Font kfont = new Font("宋體",Font.PLAIN,12) ;// 底部  
             Font titleFont = new Font("隸書", Font.BOLD , 25) ; // 圖片標(biāo)題  
             CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪制結(jié)構(gòu)對(duì)象  
               
             // 圖片標(biāo)題  
             chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));  
               
             // 底部  
             chart.getLegend().setItemFont(kfont);  
               
             // X 軸  
             CategoryAxis domainAxis = plot.getDomainAxis();     
             domainAxis.setLabelFont(xfont);// 軸標(biāo)題  
             domainAxis.setTickLabelFont(xfont);// 軸數(shù)值    
             domainAxis.setTickLabelPaint(Color.BLUE) ; // 字體顏色  
             domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的label斜顯示   
               
             // Y 軸  
             ValueAxis rangeAxis = plot.getRangeAxis();     
             rangeAxis.setLabelFont(yfont);   
             rangeAxis.setLabelPaint(Color.BLUE) ; // 字體顏色  
             rangeAxis.setTickLabelFont(yfont);    
               
         } 
    posted @ 2011-03-06 22:47 龍ぜ?xì)垊?閱讀(553) | 評(píng)論 (0)編輯 收藏
    JFreeChart項(xiàng)目簡(jiǎn)介

    JFreeChart是開放源代碼站點(diǎn)SourceForge.net上的一個(gè)JAVA項(xiàng)目,它主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普 通柱狀圖以及堆棧柱狀圖)、線圖、區(qū)域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。這些不同式樣的圖表基本上可以滿足目前的要求。為了減少篇幅本文主 要介紹前面三種類型的圖表,讀者可以觸類旁通去開發(fā)其他樣式的圖表。




    這里有點(diǎn)筆者在開發(fā)中遇見的問題需要注意的是:在使用Eclipse開發(fā)的時(shí)候會(huì)報(bào)一個(gè)莫名其妙的錯(cuò)誤,錯(cuò)誤可能指向某個(gè)類文件的第一行。遇到這樣的問題一般是因?yàn)闆]有把Jcommon的jar包設(shè)置到項(xiàng)目的類路徑中的緣故。具體的原因不祥。

    1 餅圖

    對(duì)于餅圖而言,數(shù)據(jù)集的獲取用的不是同一個(gè)數(shù)據(jù)集類,另外餅圖不支持同一個(gè)類別的項(xiàng)目中還有子項(xiàng)目這樣的數(shù)據(jù)。我們只給出創(chuàng)建餅圖的代碼,至于寫圖表到一個(gè)文件則與柱狀圖一致,無需重復(fù)..

    實(shí)例代碼如下:

    package com.dr.demo;


    import java.awt.Color;
    import java.awt.Font;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.CategoryLabelPositions;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;


    /**
     *
     * @author 詹成榜
     * @date 2010-2-25
     * @ClassName PolyLine.java
     * @Email 289153044@qq.com
     * @param 餅圖
     * @param
     */

    public class SalesCountServlet  {

     protected static void doGet() {
      System.out.println("圖表已經(jīng)建立!");
      
      CategoryDataset dataset = getDataSet();
      String fileName = "SalesCount.jpg";//文件名稱
      JFreeChart chart = ChartFactory.createBarChart3D("產(chǎn)品銷量圖", // 圖表標(biāo)題
        "產(chǎn)品", // 目錄軸的顯示標(biāo)簽
        "銷量", // 數(shù)值軸的顯示標(biāo)簽
        dataset, // 數(shù)據(jù)集
        PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
        true, // 是否顯示圖例(對(duì)于簡(jiǎn)單的柱狀圖必須是false)
        false, // 是否生成工具
        false // 是否生成URL鏈接
        );
      
      configFont(chart);//設(shè)置中文格式

      FileOutputStream fos_jpg = null;
      try {
       String statImagePath = "d:";//存放文件的路徑
       try {
        fos_jpg = new FileOutputStream(statImagePath+ fileName);
       } catch (FileNotFoundException e) {
        e.printStackTrace();
       }
       try {
        ChartUtilities.writeChartAsJPEG(fos_jpg, 0.5f, chart, 400, 300,null);
       } catch (IOException e) {
        e.printStackTrace();
       }
      } finally {
       try {
        fos_jpg.close();
       } catch (Exception e) {
        e.printStackTrace();
       }
      }
        
     }
      public static void configFont(JFreeChart chart){  
             // 配置字體  
             Font xfont = new Font("宋體",Font.PLAIN,12) ;// X軸  
             Font yfont = new Font("宋體",Font.PLAIN,12) ;// Y軸  
             Font kfont = new Font("宋體",Font.PLAIN,12) ;// 底部  
             Font titleFont = new Font("隸書", Font.BOLD , 25) ; // 圖片標(biāo)題  
             CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪制結(jié)構(gòu)對(duì)象  
               
             // 圖片標(biāo)題  
             chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));  
               
             // 底部  
             chart.getLegend().setItemFont(kfont);  
               
             // X 軸  
             CategoryAxis domainAxis = plot.getDomainAxis();     
             domainAxis.setLabelFont(xfont);// 軸標(biāo)題  
             domainAxis.setTickLabelFont(xfont);// 軸數(shù)值    
             domainAxis.setTickLabelPaint(Color.BLUE) ; // 字體顏色  
             domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的label斜顯示   
               
             // Y 軸  
             ValueAxis rangeAxis = plot.getRangeAxis();     
             rangeAxis.setLabelFont(yfont);   
             rangeAxis.setLabelPaint(Color.BLUE) ; // 字體顏色  
             rangeAxis.setTickLabelFont(yfont);    
               
         } 


     private static CategoryDataset getDataSet() {
      DefaultCategoryDataset dataset = new DefaultCategoryDataset();
       dataset.addValue(20, "銷售圖表", "蘋果");
       dataset.addValue(20, "銷售圖表", "梨");
       dataset.addValue(30, "銷售圖表", "香蕉");
       dataset.addValue(40, "銷售圖表", "葡萄");
       dataset.addValue(50, "銷售圖表", "桔子");
      
      return dataset;
     }
     public static void main(String args[]){
      
      doGet();
     }
    }

     

    posted @ 2011-03-06 22:36 龍ぜ?xì)垊?閱讀(421) | 評(píng)論 (3)編輯 收藏
    hibernate工作原理
    原理:
    1.讀取并解析配置文件
    2.讀取并解析映射信息,創(chuàng)建SessionFactory
    3.打開Sesssion
    4.創(chuàng)建事務(wù)Transation
    5.持久化操作
    6.提交事務(wù)
    7.關(guān)閉Session
    8.關(guān)閉SesstionFactory

    為什么要用:
    1. 對(duì)JDBC訪問數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。

    2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作

    3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來實(shí)現(xiàn)透明性。

    4. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。

    2. Hibernate是如何延遲加載?
    1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象 b)集合(Collection)

    2. Hibernate3 提供了屬性的延遲加載功能

    當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開銷,從而提高了服務(wù)器的性能。

    3.Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)

    類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都市對(duì)對(duì)象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、

    4. 說下Hibernate的緩存機(jī)制

    1. 內(nèi)部緩存存在Hibernate中又叫一級(jí)緩存,屬于應(yīng)用事物級(jí)緩存

    2. 二級(jí)緩存:
    a) 應(yīng)用及緩存
    b) 分布式緩存
    條件:數(shù)據(jù)不會(huì)被第三方修改、數(shù)據(jù)大小在可接受范圍、數(shù)據(jù)更新頻率低、同一數(shù)據(jù)被系統(tǒng)頻繁使用、非 關(guān)鍵數(shù)據(jù)
    c) 第三方緩存的實(shí)現(xiàn)

    5. Hibernate的查詢方式
    Sql、Criteria,object comptosition
    Hql:
    1、 屬性查詢
    2、 參數(shù)查詢、命名參數(shù)查詢
    3、 關(guān)聯(lián)查詢
    4、 分頁(yè)查詢
    5、 統(tǒng)計(jì)函數(shù)

    6. 如何優(yōu)化Hibernate?
    1.使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多
    2.靈活使用單向一對(duì)多關(guān)聯(lián)
    3.不用一對(duì)一,用多對(duì)一取代
    4.配置對(duì)象緩存,不使用集合緩存
    5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set
    6. 繼承類使用顯式多態(tài)
    7. 表字段要少,表關(guān)聯(lián)不要怕多,有二級(jí)緩存撐



    spring工作原理
    1.spring mvc請(qǐng)所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。
    2.DispatcherServlet查詢一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller.
    3.DispatcherServlet請(qǐng)請(qǐng)求提交到目標(biāo)Controller
    4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView
    5.Dispathcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對(duì)象指定的視圖對(duì)象
    6.視圖對(duì)象負(fù)責(zé)渲染返回給客戶端。

    為什么用:
    {AOP 讓開發(fā)人員可以創(chuàng)建非行為性的關(guān)注點(diǎn),稱為橫切關(guān)注點(diǎn),并將它們插入到應(yīng)用程序代碼中。使用 AOP 后,公共服務(wù) (比如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊希瑫r(shí)不會(huì)增加域?qū)ο蟮膶?duì)象模型的復(fù)雜性。
    IOC 允許創(chuàng)建一個(gè)可以構(gòu)造對(duì)象的應(yīng)用環(huán)境,然后向這些對(duì)象傳遞它們的協(xié)作對(duì)象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton)和直接構(gòu)造(straight construction),每一個(gè)對(duì)象都是用其協(xié)作對(duì)象構(gòu)造的。因此是由容器管理協(xié)作對(duì)象(collaborator)。
    Spring即使一個(gè)AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對(duì)象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協(xié)作對(duì)象)。然后可以很容易地在需要時(shí)替換具有類似接口的協(xié)作對(duì)象。}




    Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式,如圖 1 所示。

    組成 Spring 框架的每個(gè)模塊(或組件)都可以單獨(dú)存在,或者與其他一個(gè)或多個(gè)模塊聯(lián)合實(shí)現(xiàn)。每個(gè)模塊的功能如下:

    ☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn) (IOC)模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。

    ☆ Spring 上下文:Spring 上下文是一個(gè)配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如 JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。

    ☆ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。

    ☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來管理異常處理和不同數(shù)據(jù)庫(kù)供應(yīng)商拋出的錯(cuò)誤消息。異常層次結(jié)構(gòu)簡(jiǎn)化了錯(cuò)誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關(guān)閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結(jié)構(gòu)。

    ☆ Spring ORM:Spring 框架插入了若干個(gè) ORM 框架,從而提供了 ORM 的對(duì)象關(guān)系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務(wù)和 DAO 異常層次結(jié)構(gòu)。

    ☆ Spring Web 模塊:Web 上下文模塊建立在應(yīng)用程序上下文模塊之上,為基于 Web 的應(yīng)用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡(jiǎn)化了處理多部分請(qǐng)求以及將請(qǐng)求參數(shù)綁定到域?qū)ο蟮墓ぷ鳌?br />
    ☆ Spring MVC 框架:MVC 框架是一個(gè)全功能的構(gòu)建 Web 應(yīng)用程序的 MVC 實(shí)現(xiàn)。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText 和 POI。

    Spring 框架的功能可以用在任何 J2EE 服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring 的核心要點(diǎn)是:支持不綁定到特定 J2EE 服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問對(duì)象。毫無疑問,這樣的對(duì)象可以在不同 J2EE 環(huán)境 (Web 或 EJB)、獨(dú)立應(yīng)用程序、測(cè)試環(huán)境之間重用。

    IOC 和 AOP

    控制反轉(zhuǎn)模式(也稱作依賴性介入)的基本概念是:不創(chuàng)建對(duì)象,但是描述創(chuàng)建它們的方式。在代碼中不直接與對(duì)象和服務(wù)連接,但在配置文件中描述哪一個(gè)組件需要哪一項(xiàng)服務(wù)。容器(在 Spring 框架中是 IOC 容器) 負(fù)責(zé)將這些聯(lián)系在一起。

    在典型的 IOC 場(chǎng)景中,容器創(chuàng)建了所有對(duì)象,并設(shè)置必要的屬性將它們連接在一起,決定什么時(shí)間調(diào)用方法。下表列出了 IOC 的一個(gè)實(shí)現(xiàn)模式。


    struts工作原理

    Struts工作機(jī)制?為什么要使用Struts?
    工作機(jī)制:
    Struts的工作流程:
    在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化ActionServlet,ActionServlet從
    struts-config.xml文件中讀取配置信息,把它們存放到各種配置對(duì)象
    當(dāng)ActionServlet接收到一個(gè)客戶請(qǐng)求時(shí),將執(zhí)行如下流程.
    -(1)檢索和用戶請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在,就返回請(qǐng)求路徑無效信息;
    -(2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionForm對(duì)象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對(duì)象中;
    -(3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法;
    -(4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActuibErrors對(duì)象, 就表示表單驗(yàn)證成功;
    -(5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的 Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法;
    -(6)Action的execute()方法返回一個(gè)ActionForward對(duì)象,ActionServlet在把客戶請(qǐng)求轉(zhuǎn)發(fā)給 ActionForward對(duì)象指向的JSP組件;
    -(7)ActionForward對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶;

    為什么要用:
    JSP、Servlet、JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強(qiáng)大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個(gè)規(guī)則、一個(gè)把這些技術(shù)組織起來的規(guī)則,這就是框架,Struts便應(yīng)運(yùn)而生。

    基于Struts開發(fā)的應(yīng)用由3類組件構(gòu)成:控制器組件、模型組件、視圖組件

    8. Struts的validate框架是如何驗(yàn)證的?
    在struts配置文件中配置具體的錯(cuò)誤提示,再在FormBean中的validate()方法具體調(diào)用。

    9. 說下Struts的設(shè)計(jì)模式
    MVC模式: web應(yīng)用程序啟動(dòng)時(shí)就會(huì)加載并初始化ActionServler。用戶提交表單時(shí),一個(gè)配置好的ActionForm對(duì)象被創(chuàng)建,并被填入表單相應(yīng)的數(shù)據(jù),ActionServler根據(jù)Struts-config.xml文件配置好的設(shè)置決定是否需要表單驗(yàn)證,如果需要就調(diào)用ActionForm的 Validate()驗(yàn)證后選擇將請(qǐng)求發(fā)送到哪個(gè)Action,如果Action不存在,ActionServlet會(huì)先創(chuàng)建這個(gè)對(duì)象,然后調(diào)用 Action的execute()方法。Execute()從ActionForm對(duì)象中獲取數(shù)據(jù),完成業(yè)務(wù)邏輯,返回一個(gè)ActionForward對(duì)象,ActionServlet再把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指定的jsp組件,ActionForward對(duì)象指定的jsp生成動(dòng)態(tài)的網(wǎng)頁(yè),返回給客戶。


    posted @ 2011-03-06 19:59 龍ぜ?xì)垊?閱讀(458) | 評(píng)論 (0)編輯 收藏
     Spring 是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的??蚣艿闹饕獌?yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。 

            ☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實(shí)現(xiàn)。BeanFactory 使用控制反轉(zhuǎn) (IOC) 模式將應(yīng)用程序的配置和依賴性規(guī)范與實(shí)際的應(yīng)用程序代碼分開。

      ☆ Spring 上下文:Spring 上下文是一個(gè)配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務(wù),例如 JNDI、EJB、電子郵件、國(guó)際化、校驗(yàn)和調(diào)度功能。

      ☆ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。

    在此 我做了個(gè)小demo 基于Spring的核心Ioc(inversion of control) 與面向切面編程AOP(Aspect Oriented Programming)。。。。。


    這個(gè)例子主要完成的義務(wù)邏輯是對(duì)信息的保存,主要代碼如下:

    package com.dr.service;

    import com.dr.DAO.ProductDAO;
    import com.dr.model.Product;

    public class ProductService {
     private ProductDAO productDAO;
     public void add(Product product){
      productDAO.save(product);
     }
     public ProductService(ProductDAO productDAO){
      super();
      System.out.println("ProductServic :ProductService");
      this.productDAO = productDAO;
     }
    }


    DAO層代碼如下:


    package com.dr.DAO;

    import com.dr.model.Product;

     

    public interface ProductDAO {
     public void save(Product product);

    }





    package com.dr.DAO.impl;

    import com.dr.DAO.ProductDAO;
    import com.dr.model.Product;

     

     

    public class ProductDAOImpl implements ProductDAO {
     private String name;
     private int id;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      System.out.println("ProductDAOImple :setName");
      this.name = name;
     }
     public int getId() {
      return id;
     }
     public void setId(int id) {
      System.out.println("ProductDAOImpl :setId");
      this.id = id;
     }
     public void save(Product product) {
      //Hibernate
      //JDBC
      //XML
      //NetWork
      System.out.println("ProductDAOImpl :save :product saved!");
      this.toString();
     }
     public String toString(){
      System.out.println("id:"+id+"|name:"+name);
      return null;
      
     }

    }



    beans.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

     <bean id="p" class="com.dr.DAO.impl.ProductDAOImpl">
         <!--采用 setter()方法依賴注入-->
       <property name="name" value="11"></property>
        <property name="id" value="22"></property>
     </bean>
     <bean id="productService" class="com.dr.service.ProductService">
      <constructor-arg>
       <ref bean="p"/>
      </constructor-arg>
     </bean>
     
    </beans>



    測(cè)試類的代碼如下所示:



    package com.dr.test;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import com.dr.model.Product;
    import com.dr.service.ProductService;

     


    //Dependency Injection  依賴注入
    //Inverse of Control    控制反轉(zhuǎn)
    public class ProductServiceTest {

     @Test
     public void testAdd() throws Exception {
       //實(shí)例化應(yīng)用上下文,Xml類路徑應(yīng)用上下文
      ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
      //getBean() 所得到得對(duì)象是Object類型的,所有在此必須強(qiáng)制轉(zhuǎn)換。。。
      ProductService service = (ProductService) ctx.getBean("productService");
      
      Product product = new Product();
      product.toString();
      product.setId(20);
      product.setName("蘋果");
      service.add(product);
      
     }

    }


    posted @ 2011-03-05 21:49 龍ぜ?xì)垊?閱讀(2722) | 評(píng)論 (0)編輯 收藏
    用Java程序   
         現(xiàn)在許多網(wǎng)站都必須統(tǒng)計(jì)瀏覽量,在此為了記錄當(dāng)前在線人數(shù),我設(shè)計(jì)了一個(gè)計(jì)數(shù)器。其功能是:計(jì)數(shù)器就將自動(dòng)加一,離開時(shí)就自動(dòng)減一。。
    這里就做了個(gè)很小的demo:
    Java 代碼如下:


    package com.dr.demo2.servlet;

    import java.io.IOException;
    import java.sql.Timestamp;
    import java.util.ArrayList;

    import javax.servlet.ServletException;
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    import org.apache.log4j.Logger;

    public class SessionCounter implements HttpSessionListener,
      ServletRequestListener {
     private static Logger log = Logger.getLogger(SessionCounter.class);
     private static final String CONTENT_TYPE = "text/html; charset=GBK";
     private static int activeSessions = 0;// 當(dāng)前活動(dòng)的人數(shù)
     private HttpServletRequest request;
     private static ArrayList list = new ArrayList();// 用來存放不同ip的地址

     public void init() throws ServletException {
      log.info("SessionCounter init!");

     }

     public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      log.info("SessionCounter doGet!");
      response.setContentType(CONTENT_TYPE);
      HttpSession session = request.getSession();
     }

     public void destroy() {
      log.info("SessionCounter destroy!");
     }

     public void requestDestroyed(ServletRequestEvent event) {
      // To change body of implemented methods use File | Settings | File
      // Templates.
      log.info("SessionCounter requestDestroyed!");
     }

     public void requestInitialized(ServletRequestEvent sre) {
      request = (HttpServletRequest) sre.getServletRequest();
      log.info("SessionCounter requestInitialized!");
     }

     public void sessionCreated(HttpSessionEvent httpSessionEvent) {
      log.info("SessionCounter sessionCreater!");
      String sessionId = httpSessionEvent.getSession().getId();
      Timestamp createTime = new Timestamp(System.currentTimeMillis());
      String loginIp = request.getRemoteAddr();
      boolean rs = true;
      if (list.size() > 0) {
       for (int i = 0; i < list.size(); i++) {
        if (loginIp.equals(list.get(i))) {
         rs = false;
        }
       }
      }
      if (rs) { // 如果隊(duì)列中存在相同的IP 則SESSION不增加
       list.add(loginIp);
       log.info("ipList隊(duì)列新增ip: " + loginIp);
       activeSessions++;
       log.info("新增SESSION,sessionId = " + sessionId + "; createTime = "
         + createTime + "; loginIp = " + loginIp + "; 當(dāng)前總SESSION值為 "
         + activeSessions);
      }
     }

     public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
      log.info("SessionCounter sessionDestroyed!");
      String sessionId = httpSessionEvent.getSession().getId();
      Timestamp overTime = new Timestamp(System.currentTimeMillis());
      String loginIp = request.getRemoteAddr();
      if (activeSessions > 0) {
       if (list.size() > 0) {
        for (int i = 0; i < list.size(); i++) {
         if (loginIp.equals(list.get(i))) {
          list.remove(i);
          log.info("ipList隊(duì)列移除ip: " + loginIp);
         }
        }
       }
       activeSessions--; // 在用戶銷毀的時(shí)候,從隊(duì)列中踢出這個(gè)IP
       log.info("銷毀SESSION,sessionId = " + sessionId + "; overTime = "
         + overTime + "; loginIp = " + loginIp + "; 當(dāng)前總SESSION值為 "
         + activeSessions);
      }
     }

     public static int getActiveSessions() {
      log.info("SessionCounter getActiveSessions!");
      return activeSessions;
     }

     public void setActiveSessions(int i) {
      log.info("SessionCounter setActiveSessions!");
      activeSessions = i;
     }

    }

    jsp  部分代碼


    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
       
        <title>My JSP 'online.jsp' starting page</title>
       
     <meta http-equiv="pragma" content="no-cache">
     <meta http-equiv="cache-control" content="no-cache">
     <meta http-equiv="expires" content="0">   
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     <meta http-equiv="description" content="This is my page">
     <!--
     <link rel="stylesheet" type="text/css" href="styles.css">
     -->

      </head>
     
      <body>
        <%@   page   import= "com.dr.demo2.servlet.SessionCounter"   %>  
     在線: <%=  SessionCounter.getActiveSessions()   %>人 
      </body>
    </html>

    啟動(dòng)tomcat ,在瀏覽器中輸入:http://127.0.0.1:8080/OnlineCount/online.jsp

    執(zhí)行效果如下:

     

    posted @ 2011-03-04 09:12 龍ぜ?xì)垊?閱讀(1130) | 評(píng)論 (0)編輯 收藏
    <2011年3月>
    272812345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 女人被男人桶得好爽免费视频 | 亚洲午夜精品在线| 成人免费看黄20分钟| 精品在线视频免费| 亚洲无线电影官网| 最新猫咪www免费人成| 一级一级毛片免费播放| 亚洲日本在线观看| 国产精品冒白浆免费视频 | 亚洲精品国产高清不卡在线| 四虎影视在线影院在线观看免费视频| 亚洲精品午夜国产va久久| 亚洲国产精品无码久久九九| 国产精品成人观看视频免费| 乱人伦中文视频在线观看免费| 亚洲成a人片7777| 亚洲男人在线无码视频| 成人免费午夜无码视频| 伊人免费在线观看| 亚洲人成色99999在线观看| 亚洲AV无码一区二区三区DV| 永久免费毛片手机版在线看| 色欲A∨无码蜜臀AV免费播| 亚洲狠狠色丁香婷婷综合| 亚洲成人在线电影| AV在线播放日韩亚洲欧| 在线A级毛片无码免费真人| 中国人xxxxx69免费视频| 在线免费视频你懂的| 国产成人高清亚洲一区91| 亚洲免费一级视频| 亚洲爆乳无码一区二区三区| 亚洲福利精品电影在线观看| 欧美男同gv免费网站观看| 91香蕉在线观看免费高清| 久久嫩草影院免费看夜色| 日韩精品无码免费视频| 亚洲日韩AV无码一区二区三区人| 亚洲精品人成在线观看| 亚洲人JIZZ日本人| 国产亚洲精品精品国产亚洲综合|