posts - 26,  comments - 14,  trackbacks - 0
            2010年12月11日


          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 模板,通過(guò)Spring 來(lái)控制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)用它來(lái)負(fù)責(zé)跟蹤當(dāng)前的上下文session。Hibernate內(nèi)置了此接口的兩種實(shí)現(xiàn)。

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

          org.hibernate.context.ThreadLocalSessionContext - 當(dāng)前session通過(guò)當(dāng)前執(zhí)行的線程來(lái)跟蹤和界定。詳情也請(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ù)的生存來(lái)控制。假若你采用自行編寫代碼來(lái)管理事務(wù)(比如,在純粹的J2SE,或者 JTA/UserTransaction/BMT),建議你使用Hibernate Transaction API來(lái)把底層事務(wù)實(shí)現(xiàn)從你的代碼中隱藏掉。如果你在支持CMT的EJB容器中執(zhí)行,事務(wù)邊界是聲明式定義的,你不需要在代碼中進(jìn)行任何事務(wù)或 session管理操作。請(qǐng)參閱第 11 章 事務(wù)和并發(fā)一節(jié)來(lái)閱讀更多的內(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)單,沒(méi)有考慮集合的泛型):
          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的,也就是說(shuō),在事務(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 來(lái)說(shuō)是更好的獲取 Session 的方法。

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

          jfreechart主要是用來(lái)動(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:軟件版本問(wèn)題,jfreechart-1.0.10有人說(shuō)沒(méi)有問(wèn)題,但jfreechart-1.0.11到13都有問(wèn)題,我用的最新的jfreechart-1.0.13不做設(shè)置是有問(wèn)題的。
          究其原因,是它代碼的內(nèi)部設(shè)置的字體有問(wèn)題.


          其下是具體的解決辦法:


          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ì)垊?閱讀(556) | 評(píng)論 (0)編輯 收藏
          JFreeChart項(xiàng)目簡(jiǎn)介

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




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

          1 餅圖

          對(duì)于餅圖而言,數(shù)據(jù)集的獲取用的不是同一個(gè)數(shù)據(jù)集類,另外餅圖不支持同一個(gè)類別的項(xiàng)目中還有子項(xiàng)目這樣的數(shù)據(jù)。我們只給出創(chuàng)建餅圖的代碼,至于寫圖表到一個(gè)文件則與柱狀圖一致,無(wú)需重復(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ì)垊?閱讀(423) | 評(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訪問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層繁瑣的重復(fù)性代碼。

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

          3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(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ù)并沒(méi)有存在與內(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)行操作,我們程序中把所有的表與類都映射在一起,它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-many、

          4. 說(shuō)下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 就像反 過(guò)來(lái)的 JNDI。沒(méi)有使用一堆抽象工廠、服務(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:通過(guò)配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務(wù)管理集成到應(yīng)用程序中。

          ☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結(jié)構(gòu),可用該結(jié)構(gòu)來(lái)管理異常處理和不同數(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)。通過(guò)策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術(shù),其中包括 JSP、Velocity、Tiles、iText 和 POI。

          Spring 框架的功能可以用在任何 J2EE 服務(wù)器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring 的核心要點(diǎn)是:支持不綁定到特定 J2EE 服務(wù)的可重用業(yè)務(wù)和數(shù)據(jù)訪問(wèn)對(duì)象。毫無(wú)疑問(wèn),這樣的對(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)求路徑無(wú)效信息;
          -(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ù)組織起來(lái)的規(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. 說(shuō)下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:通過(guò)配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對(duì)象支持 AOP。Spring AOP 模塊為基于 Spring 的應(yīng)用程序中的對(duì)象提供了事務(wù)管理服務(wù)。通過(guò)使用 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ì)垊?閱讀(2724) | 評(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();// 用來(lái)存放不同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ì)垊?閱讀(1131) | 評(píng)論 (0)編輯 收藏
                      首先我 用一種比較簡(jiǎn)單的方法,做了個(gè)小小的demo,但是這種方法用的的是Spring 框架來(lái)完成的,因?yàn)槭褂眠@種方法是一種比較實(shí)用的方法,由于很多的代碼被Spring 封裝在最底層。。具體的源代碼如下:
          Java 代碼:


           import org.springframework.context.ApplicationContext;  
              import org.springframework.context.support.ClassPathXmlApplicationContext;  
              import org.springframework.mail.SimpleMailMessage;  
              import org.springframework.mail.javamail.JavaMailSender;  
              
              public class Main {  
               
                  /** 
                  * @param args 
                 */ 
                  public static void main(String[] args) {  
                   // TODO Auto-generated method stub   
                     ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");  
                    JavaMailSender mailSender= (JavaMailSender) context.getBean("mailSender");  
                      SimpleMailMessage mail = new SimpleMailMessage();  
                    mail.setFrom("avasd@126.com");  
                      mail.setTo("abcd@gmail.com");  
                    mail.setSubject(" 測(cè)試Mail 程序");  
                    mail.setText("這里是發(fā)送的內(nèi)容");  
                     mailSender.send(mail);   
                  }  
               
              } 


          配置文件中的主要代碼如下:
          Spring-Mail.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
          <beans>
             
               <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
                  <property name="host" value="smtp.126.com" /> 
                  <property name="port" value="25" /> 
                  <property name="username" value="avasd@126.com" /> 
                  <property name="password" value="你的密碼" /> 
                  <property name="javaMailProperties"> 
                      <props> 
                          <prop key="mail.smtp.auth">true</prop> 
                      </props> 
                  </property> 
              </bean>
           

           
          </beans>

          在此用純Java代碼做了個(gè)小demo來(lái)發(fā)送電子郵件:

          package com.cmcc.mail;
          /**  
          * 發(fā)送郵件需要使用的基本信息  
          */   
          import java.util.Properties;   
          public class MailSenderInfo {   
              // 發(fā)送郵件的服務(wù)器的IP和端口   
              private String mailServerHost;   
              private String mailServerPort = "25";   
              // 郵件發(fā)送者的地址   
              private String fromAddress;   
              // 郵件接收者的地址   
              private String toAddress;   
              // 登陸郵件發(fā)送服務(wù)器的用戶名和密碼   
              private String userName;   
              private String password;   
              // 是否需要身份驗(yàn)證   
              private boolean validate = false;   
              // 郵件主題   
              private String subject;   
              // 郵件的文本內(nèi)容   
              private String content;   
              // 郵件附件的文件名   
              private String[] attachFileNames;     
              /**  
                * 獲得郵件會(huì)話屬性  
                */   
              public Properties getProperties(){   
                Properties p = new Properties();   
                p.put("mail.smtp.host", this.mailServerHost);   
                p.put("mail.smtp.port", this.mailServerPort);   
                p.put("mail.smtp.auth", validate ? "true" : "false");   
                return p;   
              }   
              public String getMailServerHost() {   
                return mailServerHost;   
              }   
              public void setMailServerHost(String mailServerHost) {   
                this.mailServerHost = mailServerHost;   
              }  
              public String getMailServerPort() {   
                return mailServerPort;   
              }  
              public void setMailServerPort(String mailServerPort) {   
                this.mailServerPort = mailServerPort;   
              }  
              public boolean isValidate() {   
                return validate;   
              }  
              public void setValidate(boolean validate) {   
                this.validate = validate;   
              }  
              public String[] getAttachFileNames() {   
                return attachFileNames;   
              }  
              public void setAttachFileNames(String[] fileNames) {   
                this.attachFileNames = fileNames;   
              }  
              public String getFromAddress() {   
                return fromAddress;   
              }   
              public void setFromAddress(String fromAddress) {   
                this.fromAddress = fromAddress;   
              }  
              public String getPassword() {   
                return password;   
              }  
              public void setPassword(String password) {   
                this.password = password;   
              }  
              public String getToAddress() {   
                return toAddress;   
              }   
              public void setToAddress(String toAddress) {   
                this.toAddress = toAddress;   
              }   
              public String getUserName() {   
                return userName;   
              }  
              public void setUserName(String userName) {   
                this.userName = userName;   
              }  
              public String getSubject() {   
                return subject;   
              }  
              public void setSubject(String subject) {   
                this.subject = subject;   
              }  
              public String getContent() {   
                return content;   
              }  
              public void setContent(String textContent) {   
                this.content = textContent;   
              }   
          }  

           

          package com.cmcc.mail;
          import java.util.Date;   
          import java.util.Properties;  
          import javax.mail.Address;   
          import javax.mail.BodyPart;   
          import javax.mail.Message;   
          import javax.mail.MessagingException;   
          import javax.mail.Multipart;   
          import javax.mail.Session;   
          import javax.mail.Transport;   
          import javax.mail.internet.InternetAddress;   
          import javax.mail.internet.MimeBodyPart;   
          import javax.mail.internet.MimeMessage;   
          import javax.mail.internet.MimeMultipart;   
           
          /**  
          * 簡(jiǎn)單郵件(不帶附件的郵件)發(fā)送器  
          */   
          public class SimpleMailSender  {   
          /**  
            * 以文本格式發(fā)送郵件  
            * @param mailInfo 待發(fā)送的郵件的信息  
            */   
              public boolean sendTextMail(MailSenderInfo mailInfo) {   
                // 判斷是否需要身份認(rèn)證   
                MyAuthenticator authenticator = null;   
                Properties pro = mailInfo.getProperties();  
                if (mailInfo.isValidate()) {   
                // 如果需要身份認(rèn)證,則創(chuàng)建一個(gè)密碼驗(yàn)證器   
                  authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());   
                }  
                // 根據(jù)郵件會(huì)話屬性和密碼驗(yàn)證器構(gòu)造一個(gè)發(fā)送郵件的session   
                Session sendMailSession = Session.getDefaultInstance(pro,authenticator);   
                try {   
                // 根據(jù)session創(chuàng)建一個(gè)郵件消息   
                Message mailMessage = new MimeMessage(sendMailSession);   
                // 創(chuàng)建郵件發(fā)送者地址   
                Address from = new InternetAddress(mailInfo.getFromAddress());   
                // 設(shè)置郵件消息的發(fā)送者   
                mailMessage.setFrom(from);   
                // 創(chuàng)建郵件的接收者地址,并設(shè)置到郵件消息中   
                Address to = new InternetAddress(mailInfo.getToAddress());   
                mailMessage.setRecipient(Message.RecipientType.TO,to);   
                // 設(shè)置郵件消息的主題   
                mailMessage.setSubject(mailInfo.getSubject());   
                // 設(shè)置郵件消息發(fā)送的時(shí)間   
                mailMessage.setSentDate(new Date());   
                // 設(shè)置郵件消息的主要內(nèi)容   
                String mailContent = mailInfo.getContent();   
                mailMessage.setText(mailContent);   
                // 發(fā)送郵件   
                Transport.send(mailMessage);  
                return true;   
                } catch (MessagingException ex) {   
                    ex.printStackTrace();   
                }   
                return false;   
              }   
                
              /**  
                * 以HTML格式發(fā)送郵件  
                * @param mailInfo 待發(fā)送的郵件信息  
                */   
              public static boolean sendHtmlMail(MailSenderInfo mailInfo){   
                // 判斷是否需要身份認(rèn)證   
                MyAuthenticator authenticator = null;  
                Properties pro = mailInfo.getProperties();  
                //如果需要身份認(rèn)證,則創(chuàng)建一個(gè)密碼驗(yàn)證器    
                if (mailInfo.isValidate()) {   
                  authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
                }   
                // 根據(jù)郵件會(huì)話屬性和密碼驗(yàn)證器構(gòu)造一個(gè)發(fā)送郵件的session   
                Session sendMailSession = Session.getDefaultInstance(pro,authenticator);   
                try {   
                // 根據(jù)session創(chuàng)建一個(gè)郵件消息   
                Message mailMessage = new MimeMessage(sendMailSession);   
                // 創(chuàng)建郵件發(fā)送者地址   
                Address from = new InternetAddress(mailInfo.getFromAddress());   
                // 設(shè)置郵件消息的發(fā)送者   
                mailMessage.setFrom(from);   
                // 創(chuàng)建郵件的接收者地址,并設(shè)置到郵件消息中   
                Address to = new InternetAddress(mailInfo.getToAddress());   
                // Message.RecipientType.TO屬性表示接收者的類型為TO   
                mailMessage.setRecipient(Message.RecipientType.TO,to);   
                // 設(shè)置郵件消息的主題   
                mailMessage.setSubject(mailInfo.getSubject());   
                // 設(shè)置郵件消息發(fā)送的時(shí)間   
                mailMessage.setSentDate(new Date());   
                // MiniMultipart類是一個(gè)容器類,包含MimeBodyPart類型的對(duì)象   
                Multipart mainPart = new MimeMultipart();   
                // 創(chuàng)建一個(gè)包含HTML內(nèi)容的MimeBodyPart   
                BodyPart html = new MimeBodyPart();   
                // 設(shè)置HTML內(nèi)容   
                html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");   
                mainPart.addBodyPart(html);   
                // 將MiniMultipart對(duì)象設(shè)置為郵件內(nèi)容   
                mailMessage.setContent(mainPart);   
                // 發(fā)送郵件   
                Transport.send(mailMessage);   
                return true;   
                } catch (MessagingException ex) {   
                    ex.printStackTrace();   
                }   
                return false;   
              }   
          }  

           


          測(cè)試程序如下:

          package com.cmcc.mail;
          /*****************************************************
           *
           * @author 詹成榜 *
           * @since 2011-3-3 *
           *****************************************************/
          public class TestMail {

           public static void main(String[] args){  
                  //這個(gè)類主要是設(shè)置郵件  
                 MailSenderInfo mailInfo = new MailSenderInfo();   
                 mailInfo.setMailServerHost("smtp.126.com");   
                 mailInfo.setMailServerPort("25");   
                 mailInfo.setValidate(true);   
                 mailInfo.setUserName("郵箱號(hào)@126.com");   
                 mailInfo.setPassword("郵箱密碼");//您的郵箱密碼   
                 mailInfo.setFromAddress("good_hans@126.com");   
                 mailInfo.setToAddress("656426515@qq.com");  
                 mailInfo.setSubject("計(jì)算中心北調(diào)課通知單");
                  
                 String content = "";
                 String header = "尊敬的"+"aa 老師:\n"+
                   "您好!\n"+
                   "這是一封計(jì)算中心(北)智能排課平臺(tái)自動(dòng)給您發(fā)送的機(jī)房課程通知單,請(qǐng)您按照下表的相應(yīng)的時(shí)間通知學(xué)生到相應(yīng)的機(jī)房上課\n"+
                   "謝謝您的支持,您的滿意是我們計(jì)算中心最大的快樂(lè)!\n"+
                   "如果您對(duì)課表有任何疑問(wèn),請(qǐng)您撥打0315-2792027\n";
                  
                  
                   content += "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"+
                   
                           "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
                     "<head>\n" +
                     "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n" +
          //           "<!--[if IE]><link href='/css/fkie.css' rel='stylesheet' type='text/css' media='all' /><![endif]-->\n" +
                     "<style type=\"text/css\">\n" +
                     "<!--\n"+  
                     "html{border:0;height:100%;border:0;}\n" +
                     "body{margin:0;padding:0;height:100%;font:12px/120% Arial, Helvetica, sans-serif; text-align:left;}\n" +
                     "#main{ padding:15px 25px 15px 10px;}\n" +
                     ".tables{ background:#b2bac5; width:100%; margin:1px 0;}\n"+     
                     ".tables caption{background:#e5e8ed; padding:1px 0 0 0; _border-bottom:solid 3px #fff; height:26px;}\n"+
                     ".tables th{text-align:center;background:#eef7e2; color:#016bb7; font-weight: normal; line-height:22px;}\n"+
                     ".tables tr{ background:#fff;}\n"+
                     ".tables tr td{line-height:22px;}\n"+
                     ".area-contrl{background:#e5e8ed; padding:1px 0 0 0; _border-bottom:solid 3px #fff; height:26px;}\n" +
                     "-->\n"+ 
                     "</style>\n" +
                     "</head>\n" +
                     "<body>\n" +
                     "<div id=\"main\">\n" +
                     "<div class=\"area-contrl\">\n" +
                     "<table class='tables' border='0' cellpadding='3' cellspacing='1'><tr><th width='35'>周次</th><th width='35'>星期</th><th width='35'>講次</th><th width='180'>機(jī)房</th><th width='50'>人數(shù)</th><th width='100'>任課教師</th><th width='200'>班級(jí)</th><th width='300'>課程名稱</th></tr>\n"
                                
                              +"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>\n"
                   +"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>\n"
                   +"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>\n"
                   +"<tr><td align='center'>aaa</td><td align='center'>bbb</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>ccc</td><td align='center'>ddd</td><td align='center'>eee</td><td align='center'>fff</td></tr>";
                  
                   content += "</table></div></div></body></html>";
                   System.out.println(content);

                  
                   mailInfo.setContent(content);
                   //這個(gè)類主要來(lái)發(fā)送郵件  
                   SimpleMailSender sms = new SimpleMailSender();  
          //         sms.sendTextMail(mailInfo);//發(fā)送文體格式   
                   sms.sendHtmlMail(mailInfo);//發(fā)送html格式  
             } 
          }


           

          posted @ 2011-03-03 13:47 龍ぜ?xì)垊?閱讀(1659) | 評(píng)論 (0)編輯 收藏

          jQuery確實(shí)是一個(gè)挺好的輕量級(jí)的JS框架,能幫助我們快速的開發(fā)JS應(yīng)用,并在一定程度上改變了我們寫JavaScript代碼的習(xí)慣。

          廢話少說(shuō),直接進(jìn)入正題,我們先來(lái)看一些簡(jiǎn)單的方法,這些方法都是對(duì)jQuery.ajax()進(jìn)行封裝以方便我們使用的方法,當(dāng)然,如果要處理復(fù)雜的邏輯,還是需要用到j(luò)Query.ajax()的(這個(gè)后面會(huì)說(shuō)到).

          1. load( url, [data], [callback] ) :載入遠(yuǎn)程 HTML 文件代碼并插入至 DOM 中。

          url (String) : 請(qǐng)求的HTML頁(yè)的URL地址。

          data (Map) : (可選參數(shù)) 發(fā)送至服務(wù)器的 key/value 數(shù)據(jù)。

          callback (Callback) : (可選參數(shù)) 請(qǐng)求完成時(shí)(不需要是success的)的回調(diào)函數(shù)。

          這個(gè)方法默認(rèn)使用 GET 方式來(lái)傳遞的,如果[data]參數(shù)有傳遞數(shù)據(jù)進(jìn)去,就會(huì)自動(dòng)轉(zhuǎn)換為POST方式的。jQuery 1.2 中,可以指定選擇符,來(lái)篩選載入的 HTML 文檔,DOM 中將僅插入篩選出的 HTML 代碼。語(yǔ)法形如 "url #some > selector"。

          這個(gè)方法可以很方便的動(dòng)態(tài)加載一些HTML文件,例如表單。


          2. jQuery.get( url, [data], [callback] ):使用GET方式來(lái)進(jìn)行異步請(qǐng)求

          參數(shù):

          url (String) :  發(fā)送請(qǐng)求的URL地址.

          data (Map) : (可選) 要發(fā)送給服務(wù)器的數(shù)據(jù),以 Key/value 的鍵值對(duì)形式表示,會(huì)做為QueryString附加到請(qǐng)求URL中。

          callback (Function) : (可選) 載入成功時(shí)回調(diào)函數(shù)(只有當(dāng)Response的返回狀態(tài)是success才是調(diào)用該方法)。

           

           

           

          這是一個(gè)簡(jiǎn)單的 GET 請(qǐng)求功能以取代復(fù)雜 $.ajax 。請(qǐng)求成功時(shí)可調(diào)用回調(diào)函數(shù)。如果需要在出錯(cuò)時(shí)執(zhí)行函數(shù),請(qǐng)使用 $.ajax。示例代碼:

          		$.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){
          //返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等.
          this; // 在這里this指向的是Ajax請(qǐng)求的選項(xiàng)配置信息,請(qǐng)參考下圖
          alert(data);
          //alert(textStatus);//請(qǐng)求狀態(tài):success,error等等。
          當(dāng)然這里捕捉不到error,因?yàn)閑rror的時(shí)候根本不會(huì)運(yùn)行該回調(diào)函數(shù)
          //alert(this); });
          示例代碼:

          $.getJSON("servlet/TableServlet?flag=query", "", function(response){
                  $.each(response,function(i){
                   sel.src.add({id: response[i].id, name: response[i].name, address: response[i].address});
                  })
                 sel.render();
                });
              });

          下面我做了一個(gè) 利用jQuery Ajax 做了以小小的Demo;

          其中java 部分主要代碼:

          package com.bx.web.action;

           

          import java.io.IOException;
          import java.io.PrintWriter;
          import java.util.List;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import net.sf.json.JSONArray;

          import com.bx.dao.impl.HibernateUserDAO;
          import com.bx.hibernate.User;

          public class TableServlet extends HttpServlet {

           
           /**
            *
            */
           private static final long serialVersionUID = 5469871499359894890L;

           User user=new User();
           
           public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            
            this.doPost(request, response);
           }

           public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {

            String flag=request.getParameter("flag");
            if(flag!=null&&"flag".equals("flag")){
             query(request,response);
            }
           }

           public void query(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
            HibernateUserDAO test=new HibernateUserDAO();
            List<User> list = test.getUserList();
            
            for(User userlist:list){
             System.out.println("Table UserName+++"+userlist.getName()+
             "......Hibernate Dbconfig....User.Address"+userlist.getAddress());
            }
            
            JSONArray jr=JSONArray.fromObject(list);
            String jsonUser=jr.toString();
            PrintWriter out = response.getWriter();
            out.print(jsonUser);
            out.flush();
            out.close();
           }
          }

          jsp中的代碼如下:

          <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
           

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            <head>
              <title>tabledemo</title>
              <link href="css/style.css" type="text/css" rel="stylesheet"/>
              <script src="scripts/jquery.js" type="text/javascript"></script>
              <script src="scripts/PagerView.js" type="text/javascript"></script>
              <script src="scripts/SelectorView.js" type="text/javascript"></script>
              <script src="scripts/SortView.js" type="text/javascript"></script>
              <script src="scripts/TableView.js" type="text/javascript"></script>
           
            <script type="text/javascript">
            $ (document).ready (function() {
             var sel = new SelectorView('sel_div');
              sel.src.header = {
               id   : '編號(hào)',
               name  : '姓名',
               address: '地址'
               
              };
              sel.dst.header = {
               id : '編號(hào)',
               name: '姓名',
               address: '地址'
              };
              sel.src.dataKey = 'id';
              sel.src.title = '可選';
              
              sel.dst.dataKey = 'id';
              sel.dst.title = '已選';
              sel.render();
              $.getJSON("servlet/TableServlet?flag=query", "", function(response){
                  $.each(response,function(i){
                   sel.src.add({id: response[i].id, name: response[i].name, address: response[i].address});
                  })
                 sel.render();
                });
              });
            </script>
            </head>
           
             
            <body>
             
           <div id="sel_div"></div>

           


            </body>
          </html>



          最后在瀏覽器URL中輸入:http://localhost:8080/TableWebProject/pagerList.jsp運(yùn)行結(jié)果

             

          一些資源

          一個(gè)jQuery的Ajax Form表單插件:http://www.malsup.com/jquery/form/

          一個(gè)專門生成Loading圖片的站點(diǎn):http://ajaxload.info/   大家覺(jué)得那些Loading比較炫的可以在這里跟帖曬一下,方便大家取用,嘎嘎



           

          posted @ 2011-03-02 15:11 龍ぜ?xì)垊?閱讀(357) | 評(píng)論 (0)編輯 收藏

          AJAX全稱為“Asynchronous JavaScript and XML”(異步JavaScript和XML),是指一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開發(fā)技術(shù)。

          傳統(tǒng)的web應(yīng)用允許用戶填寫表單(form),當(dāng)提交表單時(shí)就向web服務(wù)器發(fā)送一個(gè)請(qǐng)求。服務(wù)器接收并處理傳來(lái)的表單,然后返回一個(gè)新的網(wǎng)頁(yè)。這個(gè)做法浪費(fèi)了許多帶寬,因?yàn)樵谇昂髢蓚€(gè)頁(yè)面中的大部分HTML代碼往往是相同的。由于每次應(yīng)用的交互都需要向服務(wù)器發(fā)送請(qǐng)求,應(yīng)用的響應(yīng)時(shí)間就依賴于服務(wù)器的響應(yīng)時(shí)間。這導(dǎo)致了用戶界面的響應(yīng)比本地應(yīng)用慢得多。

          與此不同,AJAX應(yīng)用可以僅向服務(wù)器發(fā)送并取回必需的數(shù)據(jù),它使用SOAP或其它一些基于XML的web service接口,并在客戶端采用JavaScript處理來(lái)自服務(wù)器的響應(yīng)。因?yàn)樵诜?wù)器和瀏覽器之間交換的數(shù)據(jù)大量減少,結(jié)果我們就能看到響應(yīng)更快的應(yīng)用。同時(shí)很多的處理工作可以在發(fā)出請(qǐng)求的客戶端機(jī)器上完成,所以Web服務(wù)器的處理時(shí)間也減少了。

          Ajax應(yīng)用程序的優(yōu)勢(shì)在于:

          1. 通過(guò)異步模式,提升了用戶體驗(yàn)

          2. 優(yōu)化了瀏覽器和服務(wù)器之間的傳輸,減少不必要的數(shù)據(jù)往返,減少了帶寬占用

          3. Ajax引擎在客戶端運(yùn)行,承擔(dān)了一部分本來(lái)由服務(wù)器承擔(dān)的工作,從而減少了大用戶量下的服務(wù)器負(fù)載。
           

          XMLHttpRequest 對(duì)象

          通過(guò)使用 XMLHttpRequest 對(duì)象,web 開發(fā)者可以做到在頁(yè)面已加載后從服務(wù)器更新頁(yè)面!



          Ajax屬性:

          1. onreadystatechange 屬性

          onreadystatechange 屬性存有處理服務(wù)器響應(yīng)的函數(shù)。下面的代碼定義一個(gè)空的函數(shù),可同時(shí)對(duì) onreadystatechange 屬性進(jìn)行設(shè)置:


          例如:
           function getResult(username,password){
                
                   createXmlHttp();                                //創(chuàng)建XMLHttpRequest對(duì)象
                   xmlHttp.open("POST", "UserServlet?flag=add&username="+username+"&password="+password);

          2. readyState 屬性

          readyState 屬性存有服務(wù)器響應(yīng)的狀態(tài)信息。每當(dāng) readyState 改變時(shí),onreadystatechange 函數(shù)就會(huì)被執(zhí)行。


          狀態(tài)
          描述
           0
          請(qǐng)求未初始化(在調(diào)用 open() 之前)
            1 請(qǐng)求已提出(調(diào)用 send() 之前)
           2 請(qǐng)求已發(fā)送(這里通常可以從響應(yīng)得到內(nèi)容頭部)
            3
          請(qǐng)求處理中(響應(yīng)中通常有部分?jǐn)?shù)據(jù)可用,但是服務(wù)器還沒(méi)有完成響應(yīng))
            4 請(qǐng)求已完成(可以訪問(wèn)服務(wù)器響應(yīng)并使用它)
                 
          其中send()方法需要包含有三個(gè)參數(shù),第一個(gè)是發(fā)送請(qǐng)求所使用的(Get()和Post()方法),第二個(gè)參數(shù)是規(guī)定服務(wù)器端腳本的Url,三個(gè)參數(shù)規(guī)定是設(shè)置對(duì)請(qǐng)求進(jìn)行異步處理。

          咱們不再這里費(fèi)口舌了,來(lái)個(gè)Servlet Ajax的小例子吧:
           首先 我們來(lái)配置Web.xml。在里面配置一個(gè)servlet,跟往常一樣:

          <servlet>
                <servlet-name>selectcity</servlet-name>
                <servlet-class>com.bx.servlet.SelectCityServlet</servlet-class>
             </servlet>
             <servlet-mapping>
                <servlet-name>selectcity</servlet-name>
                <url-pattern>/selectCityServlet</url-pattern>
             </servlet-mapping>

          現(xiàn)在看我們的.jsp 文件:

          <html>
          <head>
          <title>select city</title>

          </head>
          <script type="text/javascript">

          function getResult(stateVal) {
              alert(stateVal);
             var url = "selectCityServlet?state="+stateVal;
             if (window.XMLHttpRequest) {
                   req = new XMLHttpRequest();
             }else if (window.ActiveXObject) {
                   req = new ActiveXObject("Microsoft.XMLHTTP");
             }
             if(req){
              req.open("GET",url, true);
              req.onreadystatechange = complete;
              req.send(null);
                }
          }

          function complete(){
             if (req.readyState == 4) {
                if (req.status == 200) {
              var city = req.responseXML.getElementsByTagName("city");
              var str=new Array();
              for(var i=0;i<city.length;i++){
                 str[i]=city[i].firstChild.data;
                       }
            
                   buildSelect(str,document.getElementById("city"));
               }
             }
          }
          function buildSelect(str,sel) {
                
             for(var i=0;i<str.length;i++) {
                 sel.options[sel.options.length]=new Option(str[i],str[i]);
             }
          }
          </script>
          <body>
          <select name="state" onChange="getResult(this.value)">
             <option value="">Select</option>
              <option value="zj">浙江</option>
              <option value="zs">江蘇</option>
          </select>

          <select id="city">
             <option value="">CITY</option>
          </select>
          </body>
          </html>


          最后我們來(lái)看看servlet文件吧:

          public class SelectCityServlet extends HttpServlet {

           
            public SelectCityServlet() {
              super();
            }

            public void destroy() {
              super.destroy();
            }

            public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
             
            
               try {
             Thread.sleep(1000*3);
            } catch (InterruptedException e) {
             e.printStackTrace();
            }
            System.out.println("Hello | " + request.getParameter("state"));
            response.setContentType("text/xml");
            response.setCharacterEncoding("utf-8");
               response.setHeader("Cache-Control", "no-cache");
               String state = request.getParameter("state");
            StringBuffer sb=new StringBuffer("<state>");
               if ("zj".equals(state)){
              sb.append("<city>hangzhou</city><city>huzhou</city>");
            } else if("zs".equals(state)){
              sb.append("<city>nanjing</city><city>yangzhou</city><city>suzhou</city>");
               } else if("hb".equals(state)){
                 sb.append("<city>tangshan</city><city>handan</city>");
                
               }
            sb.append("</state>");
            System.out.println(sb);
            PrintWriter out=response.getWriter();
            out.write(sb.toString());
            out.close();
            
             }
             }


          這里是不是挺簡(jiǎn)單的呢,首先是通過(guò)request取得state參數(shù),然后通過(guò)state參數(shù)生成相應(yīng)的xml文件,最后在講xml中的數(shù)據(jù)從printWriter輸出。。目前為止,這個(gè)例子已經(jīng)結(jié)束了,是不是挺簡(jiǎn)單的呢??

          運(yùn)行結(jié)果如下:
           


          posted @ 2011-01-01 12:36 龍ぜ?xì)垊?閱讀(2513) | 評(píng)論 (0)編輯 收藏
          MVC
           

          MVC (Model View Controler) 本來(lái)是存在于Desktop程序中的,M是指的是數(shù)據(jù)模型,V是指的是用戶界面,C則是控制器。使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。比如說(shuō)一批統(tǒng)計(jì)數(shù)據(jù)你可以分別用柱狀圖,餅狀圖來(lái)表示。C存在的目的是確保M和V的同步,一旦M改變了,V應(yīng)該同步更新。


          MVC構(gòu)架為:
                

            
          說(shuō)明:
           




          模型——視圖——控制器(MVC)是Xerox PARC在很在代為編程的語(yǔ)言Smalltalk--80發(fā)明的一種軟件設(shè)計(jì)模式,至今運(yùn)用仍為廣泛。最近幾年被推薦為Sun公司J2EE平臺(tái)設(shè)計(jì)模式,并且受到越來(lái)越多的使用 ColdFusion 和 PHP 的開發(fā)者的歡迎。模型-視圖-控制器模式是一個(gè)有用的工具箱,它有很多好處,但也有一些缺點(diǎn)。

           MVC如何工作

            MVC是一個(gè)設(shè)計(jì)模式,他是強(qiáng)制的使用程序的輸入,處理和輸出分開。使用MVC應(yīng)用程序分成了三個(gè)核心部件:模型,視圖,控制器。他們各自處理自己的任務(wù)。



          模型

          模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個(gè)部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對(duì)象來(lái)處理數(shù)據(jù)庫(kù)。被模型返回的數(shù)據(jù)是中立的,就是說(shuō)模型與數(shù)據(jù)格式無(wú)關(guān),這樣一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù)。由于應(yīng)用于模型的代碼只需寫一次就可以被多個(gè)視圖重用,所以減少了代碼的重復(fù)性。


          視圖

              視圖是用戶看到并與之交互的界面。如何處理應(yīng)用程序界面變得越來(lái)越有挑戰(zhàn)性。MVC一個(gè)大的好處是他能為你的應(yīng)用程序處理很多不同的視圖。在視圖中其實(shí)沒(méi)有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲(chǔ)的還是一個(gè)雇員列表,作為視圖來(lái)講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。

           
          控制器

          控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當(dāng)單擊Web頁(yè)面中的超鏈接和發(fā)送HTML表單時(shí),控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后用確定用哪個(gè)視圖來(lái)顯示模型處理返回的數(shù)據(jù)。


          MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費(fèi)大量時(shí)間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會(huì)得不償失。但是MVC設(shè)計(jì)模式是一個(gè)很好創(chuàng)建軟件的途徑,它所提倡的一些原則,像內(nèi)容和顯示互相分離可能比較好理解。但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來(lái)的額外的工作和復(fù)雜性,MVC將會(huì)使你的軟件在健壯性,代碼重用和結(jié)構(gòu)方面上一個(gè)新的臺(tái)階。


          這里我做了個(gè)比較簡(jiǎn)單的程序其中使用了MVC思想:
          在這里創(chuàng)建了一個(gè)實(shí)體的類,也就是M(model),即User類:

          package com.bx.jstl;

          public class User {
           private int id;  //聲明了兩給屬性;
           private String name;
           
           public int getId() {
            return id;
           }
           public void setId(int id) {
            this.id = id;
           }
           public String getName() {
            return name;
           }
           public void setName(String name) {
            this.name = name;
           }
           

          }


          然后在此編寫了一個(gè)類JSTLServlet 是繼承了類HttpServlet類的:

          package com.bx.JSServlet;

          import java.io.IOException;
          import java.util.ArrayList;
          import java.util.List;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import com.bx.jstl.User;

          public class JSTLServlet extends HttpServlet{
           public void doGet(HttpServletRequest request , HttpServletResponse response)
            throws IOException , ServletException
           {
            List<User> list = new ArrayList<User>();
               for(int i = 0 ; i < 8 ; i++)
               {
                User u = new User();
              u.setId(i);
              u.setName("name"+i);
              list.add(u);
               }
               request.setAttribute("UserList", list);
               request.getRequestDispatcher("/c_forEach.jsp").forward(request, response);
           }
          }
          現(xiàn)在我們應(yīng)該來(lái)配置WEB.xml了,這是每個(gè)Web項(xiàng)目都做的一步,如下所示:

          <servlet>
           <servlet-name>JSTLServlet</servlet-name>
           <servlet-class>com.bx.JSServlet.JSTLServlet</servlet-class>
          </servlet>

          <servlet-mapping>
           <servlet-name>JSTLServlet</servlet-name>
           <url-pattern>/jstl</url-pattern>
          </servlet-mapping>

          下面我們建立一個(gè)c_forEach.jsp,在其body中的編寫代碼如下:

          <table>
               <tr><th>ID</th><th>index</th><th>count</th><th>isFirst?</th><th>isLast</th></tr>
               
               <c:forEach var="user" items="${UserList}" varStatus="status">
                 <tr>
              <td>
               ${user.id}
              </td>
              <td>
               ${user.name}
              </td>
              <td>
               ${status.index}
              </td>
              <td>
               ${status.count}
              </td>
              <td>
               ${status.first}
              </td>
              <td>
               ${status.last}
              </td>
                  </tr>
               </c:forEach>
              </table>

          現(xiàn)在我們開啟comcat 運(yùn)行此項(xiàng)目,在瀏覽器中輸入:

          http://localhost:8080/JSP_JSTL_Project/jstl

          得到網(wǎng)頁(yè)為:
           









          posted @ 2010-12-11 17:45 龍ぜ?xì)垊?閱讀(1374) | 評(píng)論 (2)編輯 收藏

                 java對(duì)cookie的操作其實(shí)不是很難的,主要就是對(duì)cookie 的建立和cookie的讀取操作吧,還有對(duì)cookie的生命周期的設(shè)置,和cookie的路徑的設(shè)置。。。。
           
          一:首先我們建立一個(gè)有生命周期的cookie吧,代碼如下:

                       int seconds=saveTime*24*60*60;//這里是一天為單位設(shè)置其周期
                       Cookie cookie=new Cookie("cookiename","cookievalue");
                       cookie.setMaxAge(sendons);
                      //設(shè)置路徑,這個(gè)路徑即為該工程下都可以訪問(wèn)該cookie如果不設(shè)置路徑,那么設(shè)置該路徑cookie路徑及其路徑可以訪問(wèn)
                        cookie.setPath("/");
                       response.addCookie(cookie);

          二:建立一個(gè)沒(méi)有生命周期的cookie,即隨著瀏覽器的關(guān)閉就消失的cookie,代碼如下: 

                     HttpServletRequeset  request;
                     HttpServletResponse response;
                     Cookie  cookie=new Cookie("cookiename","cookievalue");// 相當(dāng)于一個(gè)Map
                     response.addCookie(cookie);

          :下面我介紹如何讀取cookie吧,代碼如下:

                       Cookie[] cookies=request.getCookies();
                        String[]    cooks=null;
                        String username=null; 
                         String password=null;
                        if(cookie!=null){
                           
                            for(Cookie coo:cookies){
                                String aa=coo.getValue();
                                 cookie=aa.split("==");
                               if(cooks.length==2){
                                  
                                     username=cooks[0];//get  the cookie name
                                    password=cooks[1];//get the cookie  value

                                 }
                              }
                          }
          posted @ 2010-12-11 16:05 龍ぜ?xì)垊?閱讀(1738) | 評(píng)論 (2)編輯 收藏
          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 成安县| 鹤峰县| 息烽县| 大姚县| 北宁市| 乳山市| 苍南县| 华坪县| 东方市| 江山市| 山东省| 富锦市| 沅陵县| 丹巴县| 黑河市| 汤原县| 赣榆县| 新河县| 泸州市| 萨嘎县| 马尔康县| 资源县| 漳州市| 阿勒泰市| 莎车县| 浦城县| 冕宁县| 尚志市| 子洲县| 离岛区| 郯城县| 四川省| 自贡市| 湟中县| 杂多县| 库车县| 吴旗县| 昭通市| 安阳县| 金川县| 花垣县|