posts - 26,  comments - 14,  trackbacks - 0
            2010年10月31日


          1 getCurrentSession創建的session會和綁定到當前線程,而openSession每次創建新的session。

          2 getCurrentSession創建的線程會在事務回滾或事物提交后自動關閉,而openSession必須手動關閉

          這里getCurrentSession本地事務(本地事務:jdbc)時 要在配置文件里進行如下設置

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

           getCurrentSession () 在事務結束之前使用當前的session
          openSession()         每次重新建立一個新的session

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

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

          從3.0.1版本開 始,Hibernate增加了SessionFactory.getCurrentSession()方法。一開始,它假定了采用JTA事務,JTA事務 定義了當前session的范圍和上下文(scope and context)。Hibernate開發團隊堅信,因為有好幾個獨立的JTA TransactionManager實現穩定可用,不論是否被部署到一個J2EE容器中,大多數(假若不是所有的)應用程序都應該采用JTA事務管理。 基于這一點,采用JTA的上下文相關session可以滿足你一切需要。

          更好的是,從3.1開 始,SessionFactory.getCurrentSession()的后臺實現是可拔插的。因此,我們引入了新的擴展接口 (org.hibernate.context.CurrentSessionContext)和新的配置參數 (hibernate.current_session_context_class),以便對什么是“當前session”的范圍和上下文(scope and context)的定義進行拔插。

          請參閱 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有關于它的契約的詳細討論。它定義 了單一的方法,currentSession(),特定的實現用它來負責跟蹤當前的上下文session。Hibernate內置了此接口的兩種實現。

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

          org.hibernate.context.ThreadLocalSessionContext - 當前session通過當前執行的線程來跟蹤和界定。詳情也請參閱Javadoc。

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

          hibernate.current_session_context_class 配置參數定義了應該采用哪個org.hibernate.context.CurrentSessionContext實現。注意,為了向下兼容,如果未 配置此參數,但是存在org.hibernate.transaction.TransactionManagerLookup的配 置,Hibernate會采用org.hibernate.context.JTASessionContext。一般而言,此參數的值指明了要使用的實 現類的全名,但那兩個內置的實現可以使用簡寫,即"jta"和"thread"。

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

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

          利于ThreadLocal模式管理Session
             早在Java1.2推出之時,Java平臺中就引入了一個新的支持:java.lang.ThreadLocal,給我們在編寫多線程程序
             時提供了一種新的選擇。ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現版本,它并不是一個Thread,
             而是thread local variable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)
             其實的功用非常簡單,就是為每一個使用某變量的線程都提供一個該變量值的副本,是每一個線程都可以獨立地改變自己的副本,
             而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有一個該變量。
             ThreadLocal是如何做到為每一個線程維護變量的副本的呢?其實實現的思路很簡單,在ThreadLocal類中有一個Map,
             用于存儲每一個線程的變量的副本。比如下面的示例實現(為了簡單,沒有考慮集合的泛型):
          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()是否是用的是同一個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()));
            
            
           }
           
          }
          執行之后不的到結果是  session.hashCode()==session2.hashCode()這兩個只是false的,也就是說,在事務結束之后getCuttentSession 也是創建了新的session。。。。。。


          openSession() 與 getCurrentSession() 有何不同和關聯呢?

           

          在 SessionFactory 啟動的時候, Hibernate 會根據配置創建相應的 CurrentSessionContext ,在 getCurrentSession() 被調用的時候,實際被執行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 執行時,如果當前 Session 為空, currentSession 會調用 SessionFactory 的 openSession 。所以 getCurrentSession() 對于 Java EE 來說是更好的獲取 Session 的方法。

          posted @ 2011-04-14 10:46 龍ぜ殘劍 閱讀(5689) | 評論 (1)編輯 收藏

          jfreechart主要是用來動態產生各種數據圖形的,可最初使用的時候大都會碰到圖片中的中文亂碼或是一個小方塊的情況。
          仔細研究主要有以下2種原因:

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


          其下是具體的解決辦法:


          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) ; // 圖片標題  
                   CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪制結構對象  
                     
                   // 圖片標題  
                   chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));  
                     
                   // 底部  
                   chart.getLegend().setItemFont(kfont);  
                     
                   // X 軸  
                   CategoryAxis domainAxis = plot.getDomainAxis();     
                   domainAxis.setLabelFont(xfont);// 軸標題  
                   domainAxis.setTickLabelFont(xfont);// 軸數值    
                   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 龍ぜ殘劍 閱讀(556) | 評論 (0)編輯 收藏
          JFreeChart項目簡介

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




          這里有點筆者在開發中遇見的問題需要注意的是:在使用Eclipse開發的時候會報一個莫名其妙的錯誤,錯誤可能指向某個類文件的第一行。遇到這樣的問題一般是因為沒有把Jcommon的jar包設置到項目的類路徑中的緣故。具體的原因不祥。

          1 餅圖

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

          實例代碼如下:

          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("圖表已經建立!");
            
            CategoryDataset dataset = getDataSet();
            String fileName = "SalesCount.jpg";//文件名稱
            JFreeChart chart = ChartFactory.createBarChart3D("產品銷量圖", // 圖表標題
              "產品", // 目錄軸的顯示標簽
              "銷量", // 數值軸的顯示標簽
              dataset, // 數據集
              PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
              true, // 是否顯示圖例(對于簡單的柱狀圖必須是false)
              false, // 是否生成工具
              false // 是否生成URL鏈接
              );
            
            configFont(chart);//設置中文格式

            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) ; // 圖片標題  
                   CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪制結構對象  
                     
                   // 圖片標題  
                   chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));  
                     
                   // 底部  
                   chart.getLegend().setItemFont(kfont);  
                     
                   // X 軸  
                   CategoryAxis domainAxis = plot.getDomainAxis();     
                   domainAxis.setLabelFont(xfont);// 軸標題  
                   domainAxis.setTickLabelFont(xfont);// 軸數值    
                   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 龍ぜ殘劍 閱讀(423) | 評論 (3)編輯 收藏
          hibernate工作原理
          原理:
          1.讀取并解析配置文件
          2.讀取并解析映射信息,創建SessionFactory
          3.打開Sesssion
          4.創建事務Transation
          5.持久化操作
          6.提交事務
          7.關閉Session
          8.關閉SesstionFactory

          為什么要用:
          1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

          2. Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

          3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。

          4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

          2. Hibernate是如何延遲加載?
          1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)

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

          當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。

          3.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)

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

          4. 說下Hibernate的緩存機制

          1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存

          2. 二級緩存:
          a) 應用及緩存
          b) 分布式緩存
          條件:數據不會被第三方修改、數據大小在可接受范圍、數據更新頻率低、同一數據被系統頻繁使用、非 關鍵數據
          c) 第三方緩存的實現

          5. Hibernate的查詢方式
          Sql、Criteria,object comptosition
          Hql:
          1、 屬性查詢
          2、 參數查詢、命名參數查詢
          3、 關聯查詢
          4、 分頁查詢
          5、 統計函數

          6. 如何優化Hibernate?
          1.使用雙向一對多關聯,不使用單向一對多
          2.靈活使用單向一對多關聯
          3.不用一對一,用多對一取代
          4.配置對象緩存,不使用集合緩存
          5.一對多集合使用Bag,多對多集合使用Set
          6. 繼承類使用顯式多態
          7. 表字段要少,表關聯不要怕多,有二級緩存撐



          spring工作原理
          1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。
          2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
          3.DispatcherServlet請請求提交到目標Controller
          4.Controller進行業務邏輯處理后,會返回一個ModelAndView
          5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
          6.視圖對象負責渲染返回給客戶端。

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




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

          組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:

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

          ☆ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。

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

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

          ☆ Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。

          ☆ Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。

          ☆ Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

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

          IOC 和 AOP

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

          在典型的 IOC 場景中,容器創建了所有對象,并設置必要的屬性將它們連接在一起,決定什么時間調用方法。下表列出了 IOC 的一個實現模式。


          struts工作原理

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

          為什么要用:
          JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。

          基于Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件

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

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


          posted @ 2011-03-06 19:59 龍ぜ殘劍 閱讀(458) | 評論 (0)編輯 收藏
           Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。 

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

            ☆ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。

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

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


          這個例子主要完成的義務邏輯是對信息的保存,主要代碼如下:

          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>



          測試類的代碼如下所示:



          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    控制反轉
          public class ProductServiceTest {

           @Test
           public void testAdd() throws Exception {
             //實例化應用上下文,Xml類路徑應用上下文
            ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
            //getBean() 所得到得對象是Object類型的,所有在此必須強制轉換。。。
            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 龍ぜ殘劍 閱讀(2724) | 評論 (0)編輯 收藏
          用Java程序   
               現在許多網站都必須統計瀏覽量,在此為了記錄當前在線人數,我設計了一個計數器。其功能是:計數器就將自動加一,離開時就自動減一。。
          這里就做了個很小的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;// 當前活動的人數
           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) { // 如果隊列中存在相同的IP 則SESSION不增加
             list.add(loginIp);
             log.info("ipList隊列新增ip: " + loginIp);
             activeSessions++;
             log.info("新增SESSION,sessionId = " + sessionId + "; createTime = "
               + createTime + "; loginIp = " + loginIp + "; 當前總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隊列移除ip: " + loginIp);
               }
              }
             }
             activeSessions--; // 在用戶銷毀的時候,從隊列中踢出這個IP
             log.info("銷毀SESSION,sessionId = " + sessionId + "; overTime = "
               + overTime + "; loginIp = " + loginIp + "; 當前總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>

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

          執行效果如下:

           

          posted @ 2011-03-04 09:12 龍ぜ殘劍 閱讀(1131) | 評論 (0)編輯 收藏
                      首先我 用一種比較簡單的方法,做了個小小的demo,但是這種方法用的的是Spring 框架來完成的,因為使用這種方法是一種比較實用的方法,由于很多的代碼被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(" 測試Mail 程序");  
                    mail.setText("這里是發送的內容");  
                     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代碼做了個小demo來發送電子郵件:

          package com.cmcc.mail;
          /**  
          * 發送郵件需要使用的基本信息  
          */   
          import java.util.Properties;   
          public class MailSenderInfo {   
              // 發送郵件的服務器的IP和端口   
              private String mailServerHost;   
              private String mailServerPort = "25";   
              // 郵件發送者的地址   
              private String fromAddress;   
              // 郵件接收者的地址   
              private String toAddress;   
              // 登陸郵件發送服務器的用戶名和密碼   
              private String userName;   
              private String password;   
              // 是否需要身份驗證   
              private boolean validate = false;   
              // 郵件主題   
              private String subject;   
              // 郵件的文本內容   
              private String content;   
              // 郵件附件的文件名   
              private String[] attachFileNames;     
              /**  
                * 獲得郵件會話屬性  
                */   
              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;   
           
          /**  
          * 簡單郵件(不帶附件的郵件)發送器  
          */   
          public class SimpleMailSender  {   
          /**  
            * 以文本格式發送郵件  
            * @param mailInfo 待發送的郵件的信息  
            */   
              public boolean sendTextMail(MailSenderInfo mailInfo) {   
                // 判斷是否需要身份認證   
                MyAuthenticator authenticator = null;   
                Properties pro = mailInfo.getProperties();  
                if (mailInfo.isValidate()) {   
                // 如果需要身份認證,則創建一個密碼驗證器   
                  authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());   
                }  
                // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session   
                Session sendMailSession = Session.getDefaultInstance(pro,authenticator);   
                try {   
                // 根據session創建一個郵件消息   
                Message mailMessage = new MimeMessage(sendMailSession);   
                // 創建郵件發送者地址   
                Address from = new InternetAddress(mailInfo.getFromAddress());   
                // 設置郵件消息的發送者   
                mailMessage.setFrom(from);   
                // 創建郵件的接收者地址,并設置到郵件消息中   
                Address to = new InternetAddress(mailInfo.getToAddress());   
                mailMessage.setRecipient(Message.RecipientType.TO,to);   
                // 設置郵件消息的主題   
                mailMessage.setSubject(mailInfo.getSubject());   
                // 設置郵件消息發送的時間   
                mailMessage.setSentDate(new Date());   
                // 設置郵件消息的主要內容   
                String mailContent = mailInfo.getContent();   
                mailMessage.setText(mailContent);   
                // 發送郵件   
                Transport.send(mailMessage);  
                return true;   
                } catch (MessagingException ex) {   
                    ex.printStackTrace();   
                }   
                return false;   
              }   
                
              /**  
                * 以HTML格式發送郵件  
                * @param mailInfo 待發送的郵件信息  
                */   
              public static boolean sendHtmlMail(MailSenderInfo mailInfo){   
                // 判斷是否需要身份認證   
                MyAuthenticator authenticator = null;  
                Properties pro = mailInfo.getProperties();  
                //如果需要身份認證,則創建一個密碼驗證器    
                if (mailInfo.isValidate()) {   
                  authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
                }   
                // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session   
                Session sendMailSession = Session.getDefaultInstance(pro,authenticator);   
                try {   
                // 根據session創建一個郵件消息   
                Message mailMessage = new MimeMessage(sendMailSession);   
                // 創建郵件發送者地址   
                Address from = new InternetAddress(mailInfo.getFromAddress());   
                // 設置郵件消息的發送者   
                mailMessage.setFrom(from);   
                // 創建郵件的接收者地址,并設置到郵件消息中   
                Address to = new InternetAddress(mailInfo.getToAddress());   
                // Message.RecipientType.TO屬性表示接收者的類型為TO   
                mailMessage.setRecipient(Message.RecipientType.TO,to);   
                // 設置郵件消息的主題   
                mailMessage.setSubject(mailInfo.getSubject());   
                // 設置郵件消息發送的時間   
                mailMessage.setSentDate(new Date());   
                // MiniMultipart類是一個容器類,包含MimeBodyPart類型的對象   
                Multipart mainPart = new MimeMultipart();   
                // 創建一個包含HTML內容的MimeBodyPart   
                BodyPart html = new MimeBodyPart();   
                // 設置HTML內容   
                html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");   
                mainPart.addBodyPart(html);   
                // 將MiniMultipart對象設置為郵件內容   
                mailMessage.setContent(mainPart);   
                // 發送郵件   
                Transport.send(mailMessage);   
                return true;   
                } catch (MessagingException ex) {   
                    ex.printStackTrace();   
                }   
                return false;   
              }   
          }  

           


          測試程序如下:

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

           public static void main(String[] args){  
                  //這個類主要是設置郵件  
                 MailSenderInfo mailInfo = new MailSenderInfo();   
                 mailInfo.setMailServerHost("smtp.126.com");   
                 mailInfo.setMailServerPort("25");   
                 mailInfo.setValidate(true);   
                 mailInfo.setUserName("郵箱號@126.com");   
                 mailInfo.setPassword("郵箱密碼");//您的郵箱密碼   
                 mailInfo.setFromAddress("good_hans@126.com");   
                 mailInfo.setToAddress("656426515@qq.com");  
                 mailInfo.setSubject("計算中心北調課通知單");
                  
                 String content = "";
                 String header = "尊敬的"+"aa 老師:\n"+
                   "您好!\n"+
                   "這是一封計算中心(北)智能排課平臺自動給您發送的機房課程通知單,請您按照下表的相應的時間通知學生到相應的機房上課\n"+
                   "謝謝您的支持,您的滿意是我們計算中心最大的快樂!\n"+
                   "如果您對課表有任何疑問,請您撥打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'>機房</th><th width='50'>人數</th><th width='100'>任課教師</th><th width='200'>班級</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);
                   //這個類主要來發送郵件  
                   SimpleMailSender sms = new SimpleMailSender();  
          //         sms.sendTextMail(mailInfo);//發送文體格式   
                   sms.sendHtmlMail(mailInfo);//發送html格式  
             } 
          }


           

          posted @ 2011-03-03 13:47 龍ぜ殘劍 閱讀(1659) | 評論 (0)編輯 收藏

          jQuery確實是一個挺好的輕量級的JS框架,能幫助我們快速的開發JS應用,并在一定程度上改變了我們寫JavaScript代碼的習慣。

          廢話少說,直接進入正題,我們先來看一些簡單的方法,這些方法都是對jQuery.ajax()進行封裝以方便我們使用的方法,當然,如果要處理復雜的邏輯,還是需要用到jQuery.ajax()的(這個后面會說到).

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

          url (String) : 請求的HTML頁的URL地址。

          data (Map) : (可選參數) 發送至服務器的 key/value 數據。

          callback (Callback) : (可選參數) 請求完成時(不需要是success的)的回調函數。

          這個方法默認使用 GET 方式來傳遞的,如果[data]參數有傳遞數據進去,就會自動轉換為POST方式的。jQuery 1.2 中,可以指定選擇符,來篩選載入的 HTML 文檔,DOM 中將僅插入篩選出的 HTML 代碼。語法形如 "url #some > selector"。

          這個方法可以很方便的動態加載一些HTML文件,例如表單。


          2. jQuery.get( url, [data], [callback] ):使用GET方式來進行異步請求

          參數:

          url (String) :  發送請求的URL地址.

          data (Map) : (可選) 要發送給服務器的數據,以 Key/value 的鍵值對形式表示,會做為QueryString附加到請求URL中。

          callback (Function) : (可選) 載入成功時回調函數(只有當Response的返回狀態是success才是調用該方法)。

           

           

           

          這是一個簡單的 GET 請求功能以取代復雜 $.ajax 。請求成功時可調用回調函數。如果需要在出錯時執行函數,請使用 $.ajax。示例代碼:

          		$.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){
          //返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等.
          this; // 在這里this指向的是Ajax請求的選項配置信息,請參考下圖
          alert(data);
          //alert(textStatus);//請求狀態:success,error等等。
          當然這里捕捉不到error,因為error的時候根本不會運行該回調函數
          //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();
                });
              });

          下面我做了一個 利用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   : '編號',
               name  : '姓名',
               address: '地址'
               
              };
              sel.dst.header = {
               id : '編號',
               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運行結果

             

          一些資源

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

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



           

          posted @ 2011-03-02 15:11 龍ぜ殘劍 閱讀(357) | 評論 (0)編輯 收藏

          AJAX全稱為“Asynchronous JavaScript and XML”(異步JavaScript和XML),是指一種創建交互式網頁應用的網頁開發技術。

          傳統的web應用允許用戶填寫表單(form),當提交表單時就向web服務器發送一個請求。服務器接收并處理傳來的表單,然后返回一個新的網頁。這個做法浪費了許多帶寬,因為在前后兩個頁面中的大部分HTML代碼往往是相同的。由于每次應用的交互都需要向服務器發送請求,應用的響應時間就依賴于服務器的響應時間。這導致了用戶界面的響應比本地應用慢得多。

          與此不同,AJAX應用可以僅向服務器發送并取回必需的數據,它使用SOAP或其它一些基于XML的web service接口,并在客戶端采用JavaScript處理來自服務器的響應。因為在服務器和瀏覽器之間交換的數據大量減少,結果我們就能看到響應更快的應用。同時很多的處理工作可以在發出請求的客戶端機器上完成,所以Web服務器的處理時間也減少了。

          Ajax應用程序的優勢在于:

          1. 通過異步模式,提升了用戶體驗

          2. 優化了瀏覽器和服務器之間的傳輸,減少不必要的數據往返,減少了帶寬占用

          3. Ajax引擎在客戶端運行,承擔了一部分本來由服務器承擔的工作,從而減少了大用戶量下的服務器負載。
           

          XMLHttpRequest 對象

          通過使用 XMLHttpRequest 對象,web 開發者可以做到在頁面已加載后從服務器更新頁面!



          Ajax屬性:

          1. onreadystatechange 屬性

          onreadystatechange 屬性存有處理服務器響應的函數。下面的代碼定義一個空的函數,可同時對 onreadystatechange 屬性進行設置:


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

          2. readyState 屬性

          readyState 屬性存有服務器響應的狀態信息。每當 readyState 改變時,onreadystatechange 函數就會被執行。


          狀態
          描述
           0
          請求未初始化(在調用 open() 之前)
            1 請求已提出(調用 send() 之前)
           2 請求已發送(這里通常可以從響應得到內容頭部)
            3
          請求處理中(響應中通常有部分數據可用,但是服務器還沒有完成響應)
            4 請求已完成(可以訪問服務器響應并使用它)
                 
          其中send()方法需要包含有三個參數,第一個是發送請求所使用的(Get()和Post()方法),第二個參數是規定服務器端腳本的Url,三個參數規定是設置對請求進行異步處理。

          咱們不再這里費口舌了,來個Servlet Ajax的小例子吧:
           首先 我們來配置Web.xml。在里面配置一個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>

          現在看我們的.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>


          最后我們來看看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();
            
             }
             }


          這里是不是挺簡單的呢,首先是通過request取得state參數,然后通過state參數生成相應的xml文件,最后在講xml中的數據從printWriter輸出。。目前為止,這個例子已經結束了,是不是挺簡單的呢??

          運行結果如下:
           


          posted @ 2011-01-01 12:36 龍ぜ殘劍 閱讀(2513) | 評論 (0)編輯 收藏
          MVC
           

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


          MVC構架為:
                

            
          說明:
           




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

           MVC如何工作

            MVC是一個設計模式,他是強制的使用程序的輸入,處理和輸出分開。使用MVC應用程序分成了三個核心部件:模型,視圖,控制器。他們各自處理自己的任務。



          模型

          模型表示企業數據和業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用象EJBs和ColdFusion Components這樣的構件對象來處理數據庫。被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據。由于應用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。


          視圖

              視圖是用戶看到并與之交互的界面。如何處理應用程序界面變得越來越有挑戰性。MVC一個大的好處是他能為你的應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理發生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據并允許用戶操縱的方式。

           
          控制器

          控制器接受用戶的輸入并調用模型和視圖去完成用戶的需求。所以當單擊Web頁面中的超鏈接和發送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調用哪個模型構件去處理請求,然后用確定用哪個視圖來顯示模型處理返回的數據。


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


          這里我做了個比較簡單的程序其中使用了MVC思想:
          在這里創建了一個實體的類,也就是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;
           }
           

          }


          然后在此編寫了一個類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);
           }
          }
          現在我們應該來配置WEB.xml了,這是每個Web項目都做的一步,如下所示:

          <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>

          下面我們建立一個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>

          現在我們開啟comcat 運行此項目,在瀏覽器中輸入:

          http://localhost:8080/JSP_JSTL_Project/jstl

          得到網頁為:
           









          posted @ 2010-12-11 17:45 龍ぜ殘劍 閱讀(1374) | 評論 (2)編輯 收藏

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

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

          二:建立一個沒有生命周期的cookie,即隨著瀏覽器的關閉就消失的cookie,代碼如下: 

                     HttpServletRequeset  request;
                     HttpServletResponse response;
                     Cookie  cookie=new Cookie("cookiename","cookievalue");// 相當于一個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 龍ぜ殘劍 閱讀(1739) | 評論 (2)編輯 收藏

              基于數據庫的Java Web

          現今所有的 Web都是基于數據庫的,可見數據庫在Web中的開發時如此的重要。然而基本上所有的網站都是要求客戶登陸的時候都必須事先注冊賬號,這樣才能進入網頁,訪問其中的頁面,資源。。開發基于數據庫的Web程序時,涉及到多個用戶同時請求與數據庫建立"連接"的問題,但多用戶并發處理目前還是一個難點。該文在對傳統數據連接模式的分析基礎上,采用了一種基于對象的數據連接池的設計方案。通過連接對象放置預先建立的若干"連接",根據一定的策略管理這些"連接",防止"連接"過多內存開銷過大,及連接排隊過長問題。并用JAVA實現了該方案,在實際應用中提供了一個高效的連接管理策略,提高了Web數據庫應用系統的性能。

            一:在此我通過一個實際的例子談談我最近最Web得心得,首先我們建立一個javaWeb項目在Myeclipse下。首先建立好數據庫連接,即建立一個Vo對象User類,如下:
          package vo;
          /*
           
          用戶名稱:<input type="text" name="username"><br>
          用戶密碼:<input type="password" name="password"><br>
          用戶愛好:<input type="checkbox" name="hobby" value="1">游泳
            <input type="checkbox" name="hobby" value="2">足球<br>
          用戶性別:<input type="radio" name="gender" value="male">男
            <input type="radio" name="gender" value="female">女
            <input type="radio" name="gender" value="secret">保密<br>
          用戶職位:<select name="position">
            <option value="CEO">CEO</option>
            <option value="CFO">CFO</option>
            <option value="CTO">CTO</option>
            </select><br>
          用戶簡歷:<textarea rows="5" cols="20" name="resume"></textarea>
                 <input type="submit" value="注冊">
                 */
          public class User {
           
           private int id;
           private String userName;
           private String passWord;
           private String hobby;
           private String gender;
           private String position;
           private String resume;
           public int getId() {
            return id;
           }
           public void setId(int id) {
            this.id = id;
           }
           public String getUserName() {
            return userName;
           }
           public void setUserName(String userName) {
            this.userName = userName;
           }
           public String getPassWord() {
            return passWord;
           }
           public void setPassWord(String passWord) {
            this.passWord = passWord;
           }
           public String getHobby() {
            return hobby;
           }
           public void setHobby(String hobby) {
            this.hobby = hobby;
           }
           public String getGender() {
            return gender;
           }
           public void setGender(String gender) {
            this.gender = gender;
           }
           public String getPosition() {
            return position;
           }
           public void setPosition(String position) {
            this.position = position;
           }
           public String getResume() {
            return resume;
           }
           public void setResume(String resume) {
            this.resume = resume;
           }
           

          }


          二:這樣我們建立好了實體對象之后,現在我們來建立UserDAO接口和DAOFactory兩個類如下:

          package dao;

          import vo.User;

          public interface UserDAO {
           
           //建立一個接口
           
           void save(User user);

          }


           

          package factory;

          import impl.UserDaoImpl;
          import dao.UserDAO;

          public class DAOFactory {
           public static UserDAO getUserDAOInstance(){
            
            
            return new UserDaoImpl();
           }

          }


          三:現在我們來建立ConnectionUtil類,這里我才用我們最常用的一種方法來連接數據庫Database即:

          package db;

          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.util.Properties;

          public class ConnectionUtil {

            public Connection openConnection() {
            
            String driver = "";
            String url = "";
            String user = "";
            String password = "";
            Properties prop = new Properties();   //實例化一個配置文件的對象
            Connection conn = null;
            try {
             // 加載屬性文件
             prop.load(this.getClass().getClassLoader().getResourceAsStream(
               "DBConfig.properties"));
             driver = prop.getProperty("driver");
             url = prop.getProperty("url");
             user = prop.getProperty("user");
             password = prop.getProperty("password");
             // Class.forName加載驅動
             Class.forName(driver);
             // DriverManager獲得連接
             conn = DriverManager.getConnection(url,
               user, password);
             return conn;
            } catch (Exception e) {
             e.printStackTrace();
            }
            return null;
           }
          }

          四:是實現Java程序與數據庫的鏈接層建立一個UserDaoImpl類:


          package impl;

          import java.sql.Connection;
          import java.sql.PreparedStatement;
          import java.sql.SQLException;

           

          import vo.User;
          import dao.UserDAO;
          import db.ConnectionUtil;

          public class UserDaoImpl implements UserDAO{
           //實現接口UerDAO

           public void save(User user) {
            
            
            //實現接口類中的方法
            ConnectionUtil cu=new ConnectionUtil();//初始化連接的數據庫
            Connection conn=cu.openConnection();
            String sql = "insert into User(username,password,hobby,gender,position,resume) values(?,?,?,?,?,?)";
            try {
             PreparedStatement pstmt = conn.prepareStatement(sql);
             
             pstmt.setString(1, user.getUserName());
             pstmt.setString(2, user.getPassWord());
             pstmt.setString(3, user.getHobby());
             pstmt.setString(4, user.getGender());
             pstmt.setString(5, user.getPosition());
             pstmt.setString(6, user.getResume());
             
             pstmt.executeUpdate();
            } catch (SQLException e) {
             e.printStackTrace();
            }finally{
             try {
              conn.close();//關閉連接數據庫
             } catch (SQLException e) {
              e.printStackTrace();
             }
            }
           }
           }



          五:是通過網站往數據庫中加載數據,如下:


           

          package com.bx.Servletform;

          import java.io.IOException;
          import java.io.PrintWriter;

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

          import dao.UserDAO;

          import factory.DAOFactory;

          import vo.User;

          public class RegisterServlet extends HttpServlet {
           
            
           public void doPost(HttpServletRequest request,HttpServletResponse response)
           throws ServletException,IOException{
            String username=request.getParameter("username");
            String password=request.getParameter("password");
            String[] hobby=request.getParameterValues("hobby");
            String gender=request.getParameter("gender");
            String resume=request.getParameter("resume");
            String position=request.getParameter("position");
            User user=new User();
            user.setUserName(username);
            user.setGender(gender);
            user.setPassWord(password);
            user.setPosition(position);
            user.setResume(resume);
            String hobbyStr="";
            if(hobby!=null&&hobby.length>0){
             for(int i=0;i<hobby.length;i++){
              hobbyStr=hobby[i]+":";
             }
            }
            user.setHobby(hobbyStr);
            UserDAO udao=DAOFactory.getUserDAOInstance();
            udao.save(user);
            PrintWriter out=response.getWriter();
            out.println("Hello World Servlet james");
            System.out.println("username |"+username);
            System.out.println("password |"+password);
            System.out.println("gender |"+gender);
            System.out.println("resume |"+resume);
            System.out.println("position |"+position);
            if(hobby!=null&& hobby.length>0){
             for(int i=0;i<hobby.length;i++){
              System.out.println(hobby[i]);
             }
            }
            //實現頁面的跳轉
            if(username!=null && username.equals("james")){
             
             request.getRequestDispatcher("/success.html").forward(request, response);
            
               }else{
            request.getRequestDispatcher("/failure.jsp").forward(request, response);
            
           }
           }


          現在我們來配置一下register,jsp吧,如下:

          <form action="/Servlet_Form_Project/form" method="post">
          <!--form 中有兩個最為重要的屬性-->
              用戶名稱:<input type="text" name="username"><br>
              用戶密碼:<input type="password" name="password"><br>
              用戶愛好:<input type="checkbox" name="hobby" value="1">游泳
                <input type="checkbox" name="hobby" value="2">足球<br>
              用戶性別:<input type="radio" name="gender" value="male">男
                <input type="radio" name="gender" value="female">女
                <input type="radio" name="gender" value="secret">保密<br>
              用戶職位:<select name="position">
                <option value="CEO">CEO</option>
                <option value="CFO">CFO</option>
                <option value="CTO">CTO</option>
                </select><br>
              用戶簡歷:<textarea rows="5" cols="20" name="resume"></textarea><br/>
                     <input type="submit" value="注冊">
             </form>


          試圖效果如下:
           


          現在我們來配置一下WEB.xml如下所示:
           <servlet>
                   <servlet-name>RegisterServlet</servlet-name>
                  <servlet-class>com.bx.Servletform.RegisterServlet</servlet-class>
           <!-- this is servlet -->
           </servlet>
           <servlet-mapping>
                  <servlet-name>RegisterServlet</servlet-name>
                  <url-pattern>/form</url-pattern>
              </servlet-mapping>


          在此我們已經完成了Java Web與數據庫的連接:至此我們可以開始comcat,在瀏覽器中輸入連接的地址即:http://localhost:8080/Servlet_Form_Project/register.jsp
          得到頁面為:
             
          這時候我們可以查看數據庫中是否在如了我們輸入的數據即:

           

          posted @ 2010-12-09 20:55 龍ぜ殘劍 閱讀(4396) | 評論 (2)編輯 收藏
           
          一:軟件下載
             1.Java

            這里我使用的是jdk1.6.0...
            
            2.tomcat

             我使用的是tomcat的版本是6.0.29的,安裝版或者是解壓版的都可以使用,只是有一點不同而已。
            
            3.數據庫

             推薦使用 MySQL,    因為MySQL使用更加的解潔,明了。。

          二:軟件安裝

           1.雙擊安裝jdk。
              裝完后在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量:
            
            (假設你的JDK安裝在c:/jdk)
            JDK_HOME=C:\jdk
            classpath=.;%JDK_HOME%\lib\dt.jar;%JDK_HOME%\lib\tools.jar
            在PATH(原來就已存在)中添加:%JDK_HOME%\bin
            這樣jdk環境配置成功。
            
            2.雙擊安裝你的Tomcat。(建議安裝在一個盤的根目錄下入D:/tomcat)
            
            注:apache-tomcat-6.0.29這是免安裝版的。。嘿嘿
            這樣已經完整安裝完Tomcat了。
            建議:在PATH中再添加:%JDK_HOME%\bin;%TOMCAT_HOME%\bin
            這樣做的目的是在虛擬dos中可以使用tomcat的工具
            最后順便把第一步下載回來的三個jar文件放到tomcat目錄下的common/lib目錄中
            
            3.測試:
            
            打開開始菜單中的tomcat(小貓圖案)的monitor工具,點擊start server,顯示綠色三角形即為啟動,打開瀏覽器在地址欄輸入:http://localhost:8080/可以看到小貓圖案說明已經配置成功。
            
            4.安裝數據庫(sqlserver)
            
            windows xp下必須安裝個人版或開發版(個人推薦個人版)。
            
            一直next就可以(微軟的東西就是方便),這里注意到域帳戶那里選擇本機帳戶,到驗證那里選擇混合驗證(這點很重要,若選擇系統認證以后在程序中就連接不上數據庫),為你的sa用戶輸入一個密碼(如果練習用就不用考慮安全性啦,選擇“空密碼”就可以)

          一切都準備好,我們具體的做一個小程序吧:
                     1.建立一個繼承于HttpServlet的類TestServlet,在里面寫HttpServlet中的方法,一般常用的方法有doGet(),doPost(),doPut(),doDelete()其中最常用的有doGet(),doPost()兩個方法。。
                代碼如下:
                      

          package com.dr.servlet;

          import java.io.IOException;

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

          public class TestServlet extends HttpServlet{
           public void init(){
            System.out.println("hello");
           }
           
           public void doGet(HttpServletRequest request,HttpServletResponse response)
           {
            System.out.println("how are you");
           }
           public void doPost(HttpServletRequest request,HttpServletResponse response)
           throws ServletException,IOException{
            String username=request.getParameter("username");
            String pws=request.getParameter("password");
            System.out.println(username);
            System.out.println(pws);
            //實現頁面的跳轉
            if(username!=null && username.equals("james")){
             
              request.getRequestDispatcher("/successfull.html").forward(request, response);
             
            }else{
             request.getRequestDispatcher("/failure.html").forward(request, response);
             
            }
            
            
            
            System.out.println("doPost method");
           }
          }


            2.我們應該配置web.xml文件:
             代碼如下:

           <servlet>
                   <servlet-name>TestServlet</servlet-name>
                  <servlet-class>com.dr.servlet.TestServlet</servlet-class>
           <!-- this is servlet -->
           </servlet>
           <servlet-mapping>
                  <servlet-name>TestServlet</servlet-name>
                  <url-pattern>/test</url-pattern>
              </servlet-mapping> 


             3.下面我們配置demo.html 

                body中的代碼如下:


          <form name="f1" id="f1" action="/Servlet_Basic/test" method="post">
          <!--其中的method="post"與"get"的區別別需要清楚,這是非常重要的-->
          <table >
              
               <tr><td>賬號</td> <td><input type="text" name="username" id="username"/></td></tr>
               <tr><td>密碼</td> <td><input type="password" name="password" id="password"/></td></tr>
                <tr> <td colspan="3" align="center"><input type="submit" value="歡迎光臨" /></td></tr>
           
           
            </table>
            
              </form>

          即為:
            
            這時候你可以在啟動tomcat,然后在internet中輸入http://localhost:8080/Servlet_Basic/demo.html,就啟動了剛才得網頁,如下:
           


          posted @ 2010-12-08 12:43 龍ぜ殘劍 閱讀(1150) | 評論 (0)編輯 收藏
           淺談用JDBC連接MySQL
                   在學習數據庫開發的實例,這里淺談一下用JDBC連接數據庫MySQL(當然也可以連接 SQL Server或者Oracle了,只是我更喜歡開源軟件,同時也簡單些。。。)

          首先正確安裝好MySQL,建立好數據庫,下面我們來建立一個數據庫吧。

                     JDBC連接MySQL
                          加載節注冊JDBC驅動程序,
                                   Class.forName("com.mysql.jdbc.Driver");
                                  Class.forName("com.mysql.jdbc.Driver").newInstance();
                      JDBC URL定義驅動程序與數據庫之間的鏈接
                                  標準語法:

                                       <protocol(主要通信協議)>:<subprotocol(次要通訊協議,驅動程序名稱)>:<data source identifier(數據源)>

                                  MySQL JDBC URL的格式:

                                        jdbc:mysql://[hostname][:port]/[dbname][?param1=value1][&param2=value2]….

                                  例如:

                                         jdbc:mysql://localhost:3306/jdbc_db","root","1234"
                                  

          常見參數:

          user                       用戶名

          password                  密碼

          autoReconnect                  聯機失敗,是否重新聯機(true/false

          maxReconnect              嘗試重新聯機次數

          initialTimeout               嘗試重新聯機間隔

          maxRows                   傳回最大行數

          useUnicode                 是否使用Unicode字體編碼(true/false

          characterEncoding          何種編碼(GB2312/UTF-8/…

          relaxAutocommit            是否自動提交(true/false

          capitalizeTypeNames        數據定義的名稱以大寫表示
           

                                JDBC訪問數據庫的步驟:

                                     1.加載數據庫驅動

                                     2.獲得數據庫連接

                                     3.創建SQL語句

                                     4.執行查詢

                                     5.遍歷結果集

                                     6.關閉數據庫連接
            數據庫的鏈接一般有三種方法,這里簡單說一種,有小例子如下:
                     

              ckage com.bx.jdbc;

              port java.sql.Connection;
              port java.sql.DriverManager;
              port java.util.Properties;

          public class ConnectionUtil {

           public Connection openConnection() {
            
            String driver = "";
            String url = "";
            String user = "";
            String password = "";
            Properties prop = new Properties();
            Connection conn = null;
            try {
             // 加載屬性文件
             prop.load(this.getClass().getClassLoader().getResourceAsStream(
               "DBConfig.properties"));
             driver = prop.getProperty("driver");
             url = prop.getProperty("url");
             user = prop.getProperty("user");
             password = prop.getProperty("password");

             // Class.forName加載驅動
             Class.forName(driver);

             // DriverManager獲得連接
             conn = DriverManager.getConnection(url,user, password);
             return conn;
            } catch (Exception e) {
             e.printStackTrace();
            }
            return null;
           }
          }
          執行的主函數如下:

          package com.bx.jdbc;

          public class Main {
           /**
            * @param args
            */
           public static void main(String[] args) {
            ConnectionUtil cu = new ConnectionUtil();

            // 第三種方法
            System.out.println("這是最常用的一種方法:" + cu.openConnection());
           }
          }

          執行結果:
           

          謝謝大家分享,但愿能對您帶來一點幫助,希望能幫提出寶貴的意見。。。
          posted @ 2010-12-08 09:03 龍ぜ殘劍 閱讀(2474) | 評論 (2)編輯 收藏
          posted @ 2010-12-07 16:49 龍ぜ殘劍 閱讀(123) | 評論 (0)編輯 收藏
          殺毒軟件:
          殺毒軟件是每一臺電腦不可少的應用軟件之一,現在我來研究 一下殺毒軟件的整個工作流程吧。。。首先要明確殺毒軟件的目的是什么,怎么樣才能實現這一目的。。。
          殺毒軟件是客戶在通過掃描自己的電腦里的每一個文件,然后與殺毒軟件服務器病毒庫里的病毒相比較,如果你電腦里有和服務器中文件相同的,殺毒軟件就視為是病毒,然后有用戶選擇是否要把掃描出來的文件刪除。。。。下面是我用Java語言來實現這個功能的。。。希望對大家有所感悟。現在說說我的具體實現的步驟吧。



          服務器代碼:

          package server;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.PrintStream;
          import java.net.ServerSocket;
          import java.net.Socket;
          import java.util.ArrayList;
          import java.util.List;

          import com.dr.bean.Virus;

           


          public class Server {
           


           public static List<Virus> virusList = new ArrayList<Virus>();
           public static void main(String[] args) throws IOException {
            ServerSocket server = null;
            //輸出肯定使用打印流
            PrintStream out = null;
            //服務器肯定也要接收數據
            BufferedReader buf = null;
            //實例化一個服務器的監聽端
            server = new ServerSocket(8888);
            //可以用一種死循環的方式接收內容
            System.out.println("---------服務器已經啟動----------");
            Socket client = null;
            //初始化暗殺名單
            //List<Virus> virusList = getVirusList();
            while(true){
             //不斷接收內容
             client = server.accept();
             //準備好向客戶端輸入內容
             out = new PrintStream(client.getOutputStream());
             //而且客戶端要有輸入給服務器端
             buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
             
             
             //接收客戶端發送過來的內容
             String str = buf.readLine();
             System.out.println("server receive data is:"+str);
             String virus = "";
             if("getVirusList".equals(str)){//組成暗殺協議,返回客戶端
              for(Virus v :virusList){
               virus += v.getName()+":";
              }
              out.println(virus);
             }
             
             //進行收尾工作
             out.flush();
             out.close();
             buf.close();
             client.close();
            }
            
            
           }
           
           public static List<Virus> getVirusList(){
            
            Virus virus = null;
            
            virus = new Virus();
            virus.setName("QQ.exe");
            virusList.add(virus);
            
            virus = new Virus();
            virus.setName("Niu.exe");
            virusList.add(virus);
            
            virus = new Virus();
            virus.setName("Baidu.exe");
            virusList.add(virus);
            
            virus = new Virus();
            virus.setName("Jinshan.exe");
            virusList.add(virus);
            
            return virusList;
           }

           

          }

          執行結果:
           
          客戶端代碼

          package com.dr.client;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.PrintStream;
          import java.net.Socket;
          import java.net.UnknownHostException;
          import java.util.ArrayList;
          import java.util.List;

          import com.dr.bean.Virus;


          public class Client {

           private String str;
           private List<Virus> virusList = null;
              public Client(String str){
               this.str = str;
               virusList = new ArrayList<Virus>();
              }
           
           public List<Virus> send() throws UnknownHostException, IOException{
            Socket client = null;
            //接收服務器信息的輸入流
            BufferedReader buf = null;
            //向服務器發送信息的輸出流
            PrintStream out = null;
            //實例化一個套接字
            client = new Socket("localhost",8888);
            //從服務器接收信息
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            //向服務器打印信息
            out = new PrintStream(client.getOutputStream());
            
            
            //打印出去
            out.println(this.str);
            //接收進來QQ.exe:baidu.exe:niu.exe
            String msg = buf.readLine();
            System.out.println(msg);
            String[] msgArray = msg.split(":");
            for(int i=0;i<msgArray.length;i++){
             Virus v = new Virus();
             v.setName(msgArray[i]);
             virusList.add(v);
             System.out.println(msgArray[i]);
            }
            

            buf.close();
            out.flush();
            out.close();
            client.close();
            
            return virusList;
           }
          }

           

          文件掃描過程代碼類:::

          package com.dr.client;

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.PrintStream;
          import java.net.Socket;
          import java.net.UnknownHostException;
          import java.util.ArrayList;
          import java.util.List;

          import com.dr.bean.Virus;


          public class Client {

           private String str;
           private List<Virus> virusList = null;
              public Client(String str){
               this.str = str;
               virusList = new ArrayList<Virus>();
              }
           
           public List<Virus> send() throws UnknownHostException, IOException{
            Socket client = null;
            //接收服務器信息的輸入流
            BufferedReader buf = null;
            //向服務器發送信息的輸出流
            PrintStream out = null;
            //實例化一個套接字
            client = new Socket("localhost",8888);
            //從服務器接收信息
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            //向服務器打印信息
            out = new PrintStream(client.getOutputStream());
            
            
            //打印出去
            out.println(this.str);
            //接收進來QQ.exe:baidu.exe:niu.exe
            String msg = buf.readLine();
            System.out.println(msg);
            String[] msgArray = msg.split(":");
            for(int i=0;i<msgArray.length;i++){
             Virus v = new Virus();
             v.setName(msgArray[i]);
             virusList.add(v);
             System.out.println(msgArray[i]);
            }
            

            buf.close();
            out.flush();
            out.close();
            client.close();
            
            return virusList;
           }
          }





          KillVirusUI代碼:


          package com.dr.ui;

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

          import org.eclipse.swt.SWT;
          import org.eclipse.swt.events.SelectionAdapter;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.graphics.Color;
          import org.eclipse.swt.graphics.Font;
          import org.eclipse.swt.layout.GridData;
          import org.eclipse.swt.widgets.Button;
          import org.eclipse.swt.widgets.DirectoryDialog;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Label;
          import org.eclipse.swt.widgets.ProgressBar;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Text;

          import com.dr.file.FileList;

          public class KillVirusUI {

           public static String filePath = "";
           public static List<String> virusFilePath = new ArrayList<String>();
           public static void main(String args[]) {
            Display display = new Display();
            final Shell shell = new Shell(display, SWT.SHELL_TRIM);
            shell.setBounds(2, 2, 1200, 600);
            //shell.setMaximized(true);// 全屏顯示
            shell.setText("殺毒軟件簡單版");
            /**
             * 設置執行按鈕
             */
            final Button btnOk = new Button(shell, SWT.PUSH);
            btnOk.setBounds(20, 25, 70, 25);
            btnOk.setText("掃描殺毒");
            final Button btnOk1 = new Button(shell, SWT.PUSH);
            btnOk1.setBounds(120, 25, 70, 25);
            btnOk1.setText("刪除病毒");

             Color color = new Color(Display.getCurrent(), 100, 180, 10);// 聲明顏色對象
             Color color1 = new Color(Display.getCurrent(), 100, 220, 240);// 聲明顏色對象
            final Text text = new Text(shell, SWT.MULTI | SWT.BORDER);
            text.setBounds(10, 270, 1200, 400);
            text.setBackground(color1);
            final Text text1 = new Text(shell, SWT.MULTI | SWT.BORDER);
            text1.setBounds(10, 150, 1200, 50);
            text1.setBackground(color1);
            
            final ProgressBar progressBar = new ProgressBar(shell, SWT.HORIZONTAL);
            GridData data = new GridData();
            data.horizontalSpan = 2;
            data.grabExcessHorizontalSpace = true;
            progressBar.setLayoutData(data);
            progressBar.setMaximum(100);// 設置最大值
            progressBar.setMinimum(0);// 設置最小值
            /**
             * 注冊點擊事件,循環顯示數據
             */
            
            Label labe=new Label(shell,SWT.NULL);
               labe.setBounds(800,25, 120,75); // 設置按鈕位置
               labe.setFont(new Font(display,"宋體",20,SWT.BOLD));
             
             
               labe.setBackground( color);
            labe.setText("    "+"360"+"\n"+"網絡保鏢");
            ;
            btnOk.addSelectionListener(new SelectionAdapter() {//Button監聽事件
             public void widgetSelected(SelectionEvent e) {
              FileList f = new FileList();
              DirectoryDialog dlg = new DirectoryDialog(shell);
              dlg.setText("目錄"); // 設置窗口標題
              dlg.setMessage("請選擇一個目錄:"); // 設置提示文字
              dlg.setFilterPath("/root"); // 設置初始目錄
              String dir = dlg.open(); // 打開對話框并返回一個包含所選目錄路徑的字符串
              
              //File f=new File(dlg.open());
                 f.setStr(dir);
              
              if (f != null)
               System.out.println(f); // 比如選擇“我的文檔”,則會打印“D:\My Documents”
              
              
              Thread t = new Thread(f);
              t.setDaemon(true);
              t.start();
              t.yield();
              
              for(int i=0;i<100;i++){
               text.append(filePath+"\n"); 
               progressBar.setBounds(10, 80, 1200, 20);
               progressBar.setSelection(progressBar.getSelection()+1);//顯示一條數據,滾動條進度加1
               try {
                Thread.sleep(1000);
               } catch (InterruptedException e1) {
                e1.printStackTrace();
               }
              }
              
              if(virusFilePath.size()!=0){
               text.setText("");
               for(String str : virusFilePath){
                text1.append("很悲劇:你的電腦里發現病毒:"+str+"\n");
               }
              }
              else{
               text1.setText("恭喜你,沒有發現病毒!");
              }
              t.interrupt();
              
             }
            
            });
            
            
            btnOk1.addSelectionListener(new SelectionAdapter() {//Button監聽事件
             public void widgetSelected(SelectionEvent e) {
              FileList q = new FileList();
              Thread t = new Thread(q);
              t.setDaemon(true);
              t.start();
              for(int i=0;i<100;i++){
               text.append(filePath+"\n");
               progressBar.setBounds(10, 105, 1200, 20);
               progressBar.setSelection(progressBar.getSelection()+1);//顯示一條數據,滾動條進度加1
               try {
                Thread.sleep(100);
               } catch (InterruptedException e1) {
                e1.printStackTrace();
               }
              }
              
              if(virusFilePath.size()!=0){
               text.setText("");
               for(String str : virusFilePath){
                //text1.append("發現病毒:"+str+"\n");
                
                   File f1=new File("f.filePath");
                f1.delete();
                text1.append("恭喜你已經成功清理了電腦里的病毒:"+str+"\n");
               }
              }
              else{
               text1.setText("祝賀你不用為電腦安危考慮了!");
              }
             }
             });
            
            
            shell.open();
            while (!shell.isDisposed()) {
             if (!display.readAndDispatch())
              display.sleep();
            }
            display.dispose();
           }
          }

          執行結果:

           
          首先要啟動服務器,殺毒軟件才能夠正常的工作。。。。。。。


          病毒類:

          package com.dr.bean;


          public class Virus{

           private String name;
           public String getName() {
            return name;
           }
           public void setName(String name) {
            this.name = name;
           }
          }


          posted @ 2010-11-23 13:43 龍ぜ殘劍 閱讀(2109) | 評論 (2)編輯 收藏
            圖形用戶界面:
          在Java 中,頂層窗口成為框架。對應于SWT庫中,其框架主要是Frame,而在Swing庫中,則對應的類是JFrame,JFrame類是Frame的子類,但是他們大多數情況下是等價的,只是在表示形式下多了個"J"而已。。。。Component類是所有GUI對象的祖先,Window類是Frame類的父類,JFrame類直接從Frame繼承而來,下面是他們的關系圖。
            
           


          import javax.swing.*;
          import java.awt.*;
          //////////////////////////////////////////////////
          public class HelloWorld
          {
           public static void main(String[] args)
           { 
            TextFrame frame = new TextFrame("MyJava");          //新建圖形建面MyJava
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);                      //設置為可視化的。。。
           }
          }
          /////////////////////////////////////////////////
          class TextFrame extends JFrame
          {
           public static final int WIDTH = 300;
           public static final int HEIGHT = 200; 
           
           public TextFrame()
           {
            setTitle("HelloWorld");
            setSize(WIDTH, HEIGHT);
            
            //將panel加入到frame
            TextPanel panel = new TextPanel();
            Container contentPane = getContentPane();
            contentPane.add(panel); //要在內容窗格中加入圖形元素(容器)
           }
           
           
          }
          //////////////////////////////////////////////////////////////////
          class TextPanel extends JPanel         //組件容器

           public int x = 100;
           public int y = 100;
           
           public void paintComponent(Graphics g)
           { 
            super.paintComponent(g);
            
            //顯示文本
            g.drawString(" Hello, World!", x, y);
           }
           

          }
          事件處理:
          如果用戶在用戶界面執行了一個動作,這將導致一個事件發生。事件的描述發生了什么的對象,在Java中,定義了各種不同的事件類,來描述各種類型的用戶操作。事件是由事件源產生的,事件的產生者成為事件源。。。
          事件處理邏輯(事件。事件源。和處理方法之間的關系)可以用一下四個步驟表示:
           

           

          posted @ 2010-11-11 19:53 龍ぜ殘劍 閱讀(135) | 評論 (0)編輯 收藏

           

          面向對象=對象+繼承+類+通信。面向對象是以對象(Object)的概念為核心,專注于對象的操縱。。面向對象最為突出的特點是繼承...封裝....多態。
          對象:是一個抽象的是體,eg:蘋果是一個類,有不同口味的,不同種類的蘋果。然而說這里有個蘋果,則是一個實例對象。書:是一個類,說這里有一本《計算機網絡》,則是一個實例對象。。
          繼承:所表達的是對象之間的相交關系,是使一個對象可以繼承其他對象類的特征和能力。。。
          一組客觀對象的抽象,具有相同的數據結構和相同的操作對象集合。。

           
          Eg:

          class Demo {
           {
            // 構造塊
            System.out.println("Demo類中的構造塊~~~");
           }

           Demo() {
            System.out.println("Demo類中的構造方法~~~");
           }

           // 靜態塊
           static {
            System.out.println("Demo類中的靜態塊~~~");
           }
          }

          public class Demo24 {
           // 在主類中寫的靜態塊要優先于main方法執行
           static {
            System.out.println("##################");
           }

           public static void main(String args[]) {
            new Demo();
            new Demo();
            new Demo();
           new Demo();
            new Demo();
           }
          }
          談談Java下的集合吧:

          向量(Vecter):用capacity()方法控制其容量,空間是成倍的增長,可加入大量元素的組件。。
          線性表(List):有限元素組成的有序序列,表長(length),表頭(head),表尾(tail)....
          堆棧(stack):實際上就是只能在一端進行插入和刪除 的線性表。。只能插入和刪除的一端是棧頂(top),另一端是棧底(bottom)...Last-in.First-out。。。。
           
          隊列(Queue):也是只能在一端進行插入和刪除操作,對頭(front)只能進行刪除操作,隊尾(back)只能插入操作。。First In First Out...........


          posted @ 2010-11-11 11:06 龍ぜ殘劍 閱讀(132) | 評論 (0)編輯 收藏
          首先 我們說說 網絡 吧,網絡互聯設備協議(OIS)參考模型分成了七層,即應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層。。。但是在Java中只注重與應用層..網絡層..與傳輸層,在其他方面不能夠更好的服務與程序的操作和控制。然而在java中式有服務器(Server)和客服(Cliect)組成的,這兩者之間一般情況 是成對出現的。。。對服務器而言如果客服對服務器發送請求,,則服務器是InputStream數據,二客服則是OutputStream數據。。。兩者之間也是相對的。。。。
          我做了個小例子如下:

          import java.io.DataOutputStream;
          import java.io.IOException;
          import java.net.ServerSocket;
          import java.net.Socket;


          public class Server03 {
           public static void main(String args[])throws IOException{
            ServerSocket ss=new ServerSocket(9999);
            while(true){
             System.out.println("----server端");
                   Socket s=ss.accept();
             
                   DataOutputStream dos=new DataOutputStream(s.getOutputStream());
            
                   dos.writeUTF("客服端"+s.getInetAddress().getHostAddress()+""+s.getPort()+"已連接"+
                     s.getInetAddress().getHostAddress()+s.getLocalPort());
             
            dos.flush();
            dos.close();
            s.close();
            }
            
           }

          }

           

          執行結果:
           
          客服端的程序:

           

          import java.io.DataInputStream;
          import java.io.IOException;
          import java.net.Socket;


          public class Cliecnt02 {
           public static void main(String args[])throws IOException{
            for(int i=0;i<20000;i++){
             Socket s=new Socket("127.0.0.1",9999);
             DataInputStream dis=new DataInputStream(s.getInputStream());
             System.out.println("客服端連接的數據"+dis.readUTF());
             dis.close();
             s.close();
            }
            
           }

          }

          執行結果:
           

          小結:一般情況下一臺服務器上可以為很多的電腦提供服務。。。。只要改變端口號就可以 了

          posted @ 2010-11-10 22:28 龍ぜ殘劍 閱讀(879) | 評論 (0)編輯 收藏
          多線程使用的方法有兩種,即使用繼承和接口。繼承使用的是關鍵字 Thread,接口使用的是Runnable。。這兩種方法都最終都要使用Thread類中的方法start()啟動多線程。。。。每一個線程都是通過start()方法開始啟動的,在未啟動之前程序一定是死的。。說說線程的狀態有三種吧,即就緒,運行,阻塞。。。這三者之間的關系如下
           
          下面才用一種最實用的方法實現多線程,即Runnable接口,它用兩個好處可以實現多繼承和資源共享,這正是Java語言的優點之所在。。

          package com.bx.course.Demo05;
          class MyThread implements Runnable{
           private int ticket=300;
           public void run(){
            for(int i=0;i<300;i++)
            {
             if(this.ticket>0)
             {
              //表示還有票可以賣
              System.out.println(Thread.currentThread().getName()+"-->賣票:"+(ticket--));
             }
            }
           
           }
          }
          public class ThreadDemo05 {

           public static void main(String[] args) {
            MyThread mt=new MyThread();
            Thread t1=new Thread(mt);
            Thread t2=new Thread(mt);
            Thread t3=new Thread(mt);
            t1.start();//每個線程只啟動一次
           // t1.start();
            t2.start();
            t3.start();

           }

          }

          posted @ 2010-11-07 18:15 龍ぜ殘劍 閱讀(161) | 評論 (0)編輯 收藏

          其實 很簡單:
          ==比較兩個數是否是同一對象即同一地址,而equals則比較兩個是否是同一個字符,或者是同一數值。。。。

          如果你還不明白,請看以下代碼:

          package Duixiang;

          public class First {
           
           
           public static void main(String args[]){
            
            
            String str1="abc";
            
            String str2=new String("abc");
            
               String str3=str2;
            System.out.println(str1==str2);//"=="比較兩個數是否是同一個對象,同一對象
            System.out.println(str2==str3);
            System.out.println(str1.equals(str2));//equals比較兩數是否是相同
            System.out.println(str2.equals(str3));
            System.out.println(str1.equals(str3));
            
            
           }

          }
          執行結果:
           

          posted @ 2010-11-06 22:51 龍ぜ殘劍 閱讀(127) | 評論 (0)編輯 收藏
          當今每一個小公司,還是大型企業都有一個人力資源管理部,然而他們的前臺的工作建面是基本都是基本是一樣。。。。就是人員的添加,修改,刪除而已。。。。。如下:
            
          再次選擇一個要操作的,比如在這里輸入:1  然后按照步驟執行結果為
           
            
          就此我就通過思考做了一下這個小程序,首先我分成了幾個類(1)平臺入口處(是一個main函數);(2)在執行main函數之后進入操作平臺,即menu菜單,(3)然后選擇你當前是要對員工是增加,更新,還是刪除工作(PersonOperate)來操作。。。。
          代碼如下:
          入口處代碼:

          package com.dr.demo.main;   

          import com.dr.demo.menu.Menu;

          public class Main {   
                  public static void main(String[] args) {   
                          new Menu();   
                  }   
          }
          進入平臺的程序:

          package com.dr.demo.menu;   

          import com.dr.demo.op.PersonOperate;
          import com.dr.demo.util.InputData;

          public class Menu {   
                  InputData input = null;   
                  public Menu(){   
                          this.input = new InputData();   
                          //循環出現菜單   
                          while(true){   
                               this.show();    //死循環
                        }   
                  }   
                  //需要定義的菜單內容   
                  public void show(){   
                          System.out.println("\t\t\t1、增加人員信息");   
                          System.out.println("\t\t\t2、瀏覽人員信息");   
                          System.out.println("\t\t\t3、修改人員信息");   
                          System.out.println("\t\t\t4、退出人力資源系統。");   
                          System.out.print("\n\n請選擇要使用的操作:");   
                          int temp = input.getInt();   
                          switch(temp){   
                          case 1:{  // 增加人員信息
                                  new PersonOperate().add(); //業務處理層  
                                  break;   
                          }   
                          case 2:{ // 瀏覽人員信息 
                                  new PersonOperate().show();   
                                  break;   
                          }   
                          case 3:{ // 修改人員信息
                                  new PersonOperate().update();   
                                  break;   
                          }   
                          case 4:{ //退出系統
                                  System.out.println("選擇的是退出系統");   
                                  System.out.println("系統退出!");   
                                  System.exit(1);   
                          }   
                          default:{   
                                  System.out.println("輸入的內容不正確");   
                                  break;   
                          }   
                          }   
                  }   
          }
          然后是PersonOperate類對的每個對象的增刪改操作:

          package com.dr.demo.op;   

          import com.dr.demo.util.FileOperate;
          import com.dr.demo.util.InputData;
          import com.dr.demo.vo.Person;

          public class PersonOperate {   
                  private InputData input = null;   
                  public PersonOperate(){   
                          this.input = new InputData();   
                  }   
                  //完成具體的Person對象操作   
                  public void add(){   
                          //要使用輸入數據的類   
                          String name = null;   
                          int age = 0;   
                          float score = 0.0f;   
                          System.out.print("輸入姓名:");   
                          name = this.input.getString();   
                          System.out.print("輸入年齡:");   
                          age = this.input.getInt();   
                          System.out.print("輸入成績:");   
                          score = this.input.getFloat();   
                          //生成Person對象,把對象保存在文件中   
                          Person p = new Person(name,age,score);   
                                    
                          try{   
                                  new FileOperate().save(p);    //io操作層
                                  System.out.println("數據保存成功!");   
                          }catch(Exception e){   
                                  System.out.println("數據保存失敗!");   
                          }   
                  }   
                  public void show(){   
                          //從文件中把內容讀進來   
                          Person p = null;   
                          try{   
                                  p = (Person) new FileOperate().read();   
                          }catch(Exception e){   
                                  System.out.println("內容顯示失敗,請確定數據是否存在!");   
                          }   
                          if(p != null){   
                                  System.out.println(p);   
                          }   
                  }   
                  public void update(){   
                          //先將之前的信息查出來   
                          Person p = null;   
                          try{   
                                  p = (Person) new FileOperate().read();   
                          }catch(Exception e){   
                                  System.out.println("內容顯示失敗,請確定數據是否存在!");   
                          }   
                          if(p != null){   
                                  String name = null;   
                                  int age = 0;   
                                  float score =0.0f;   
                                  System.out.print("請輸入新的姓名(原姓名:"+p.getName()+")");   
                                  name = this.input.getString();   
                                  System.out.print("請輸入新的年齡(原年齡:"+p.getAge()+")");   
                                  age = this.input.getInt();   
                                  System.out.print("請輸入新的成績(原成績:"+p.getScore()+")");   
                                  score = this.input.getFloat();   
                                  //信息重新設置   
                                  p.setName(name);   
                                  p.setAge(age);   
                                  p.setScore(score);   
                                  try{   
                                          new FileOperate().save(p);   
                                          System.out.println("數據更新成功!");   
                                  }catch(Exception e){   
                                          System.out.println("數據更新失敗!");   
                                  }   
                          }   
                  }   
          }

           

          posted @ 2010-11-06 21:55 龍ぜ殘劍 閱讀(151) | 評論 (0)編輯 收藏

          現在很多醫院都在實行掛號制度,有利于維持醫院的次序。起初感覺是很難開發的一個系統,其實不然,仔細想起來不是 一件什么難事。。。嘿嘿,我是這樣來實現著個項目的。。。。分析如下,把醫院系統簡單地分成幾種類,病人,醫生,掛號等等。。

          第一:掛號選擇醫生
          代碼如下:

          package Waiter;

          import java.util.Queue;

          import org.eclipse.swt.SWT;
          import org.eclipse.swt.events.SelectionAdapter;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.graphics.Font;
          import org.eclipse.swt.widgets.Button;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Text;

           

          public class HospitalWorkerUi {
           public static void main(String args[]){
              
           final Display display= Display.getDefault();
           final Shell shell = new Shell();
           shell.setMaximized(true);
           shell.setText("醫院工作人員");
           
           QueueServer qs = new QueueServer();
           final Queue<Waiter> waiterList = qs.init();
           final Queue<SoWaiter> soWaiterList = qs.init1();
           final Queue<FastWaiter> FastWaiterList = qs.init2();
           
           final Text txt = new Text(shell,SWT.MULTI);
              txt.setBounds(500, 50, 550, 450);
           // 事件代碼里要訪問button
           final Button button = new Button(shell, SWT.Activate);
           button.addSelectionListener(new SelectionAdapter() { // 加一個??擇監聽器
              public void widgetSelected(SelectionEvent e) {
               //System.out.println("############### " + waiterList.size());
               Waiter waiter= waiterList.poll();
               if(waiter!= null){
                 txt.setText(waiter.getNum()+"號顧客請到1號窗口檢查");
               }else{
                txt.setText("現在沒有人,您可以休息會了\n 喝杯咖啡吧,哈哈!");
               }
              }
             });//數據庫存取,網絡連接,邏輯處理
           button.setBounds(450, 530, 200,75); // 設置按鈕位置
           button.setFont(new Font(display,"宋體",12,SWT.BOLD));
           button.setText("專家 張醫生");// 設置按鈕上的文字
           
           final Button button1 = new Button(shell, SWT.Activate);
           button1.addSelectionListener(new SelectionAdapter() { // 加一個??擇監聽器
              public void widgetSelected(SelectionEvent e) {
               //System.out.println("############### " + waiterList.size());
               SoWaiter waiter= soWaiterList.poll();
               if(waiter!= null){
                 txt.setText(waiter.getNum()+"號顧客請到2號窗口檢查");
               }else{
                txt.setText("現在沒有人,您可以休息會了\n 喝杯咖啡吧,哈哈!");
               }
              }
             });//數據庫存取,網絡連接,邏輯處理
           button1.setBounds(750, 530, 200,75); // 設置按鈕位置
           button1.setFont(new Font(display,"宋體",12,SWT.BOLD));
           button1.setText("專家  王醫生");// 設置按鈕上的文字
           
           final Button button2 = new Button(shell, SWT.Activate);
           button2.addSelectionListener(new SelectionAdapter() { // 加一個??擇監聽器
              public void widgetSelected(SelectionEvent e) {
               //System.out.println("############### " + waiterList.size());
               FastWaiter waiter= FastWaiterList.poll();
               if(waiter!= null){
                 txt.setText(waiter.getNum()+"號顧客請到3號窗口檢查");
               }else{
                txt.setText("現在沒有人,您可以休息會了\n 喝杯咖啡吧,哈哈!");
               }
              }
             });//數據庫存取,網絡連接,邏輯處理
           button2.setBounds(1050, 530, 200,75); // 設置按鈕位置
           button2.setFont(new Font(display,"宋體",12,SWT.BOLD));
           button2.setText("專家  李醫生");// 設置按鈕上的文字

           
           shell.layout();
           shell.open();
           while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
             display.sleep();
          }
          }
          }
          運行結果:
           
          第二:醫生按次序為病人治病
          實現代碼如下:

          package Waiter;

          import java.util.Queue;

          import org.eclipse.swt.SWT;
          import org.eclipse.swt.events.SelectionAdapter;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.graphics.Font;
          import org.eclipse.swt.widgets.Button;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Label;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Text;

           

          public class WaiterQueueUi {
           public static void main(String args[]){
            final Display display=Display.getDefault();
            final Shell shell=new Shell();
            shell.setMaximized(true);
            shell.setText("醫院病人掛號口");
            
            QueueServer qs = new QueueServer();//實例化類
            QueueServer q= new QueueServer();
            QueueServer p = new QueueServer();
            
               final Queue<Waiter> waiterList = qs.init();//初始化隊列服務器
               final Text txt = new Text(shell,SWT.MULTI);
               txt.setBounds(65, 30, 180, 70);
               final Queue<SoWaiter> soWaiterList = q.init1();
               final Text txt1 = new Text(shell,SWT.MULTI);
               txt1.setBounds(400, 30, 180, 70);
               final Queue<FastWaiter> fastWaiterList = p.init2();
               final Text txt2 = new Text(shell,SWT.MULTI);
               txt2.setBounds(800, 30, 180, 70);
              
              
               Label label=new Label(shell,SWT.NULL);
               label.setBounds(400, 250, 500, 205); // 設置按鈕位置
               label.setFont(new Font(display,"宋體",16,SWT.BOLD));
            label.setText("醫院會為您們最優質的服務!!!");// 設置按鈕上的文字
              
            // 事件代碼里要訪問button
            final Button button = new Button(shell, SWT.Activate);
            button.addSelectionListener(new SelectionAdapter() { // 加一個??擇監聽器
               public void widgetSelected(SelectionEvent e) {
                //System.out.println("############### " + waiterList.size());
                Waiter waiter= waiterList.poll();
                if(waiter!= null){
                  txt.setText(waiter.getNum()+"號顧客請到1號窗口辦理業務");
                }else{
                 txt.setText("現在沒有人辦理業務了,您可以休息會了\n 喝杯咖啡吧,哈哈!");
                }
               }
              });//數據庫存取,網絡連接,邏輯處理
            button.setBounds(90, 141, 100, 25); // 設置按鈕位置
            button.setText("專家 張醫生");// 設置按鈕上的文字
            
            
            
            
            
              
            // 事件代碼里要訪問button
            final Button button1 = new Button(shell, SWT.Activate);
            button1.addSelectionListener(new SelectionAdapter() { // 加一個??擇監聽器
               public void widgetSelected(SelectionEvent e) {
                //System.out.println("############### " + waiterList.size());
                SoWaiter sowaiter= soWaiterList.poll();
                if(sowaiter!= null){
                  txt1.setText(sowaiter.getNum()+"病人到2號門診辦理業務"+"\n"+"二號門診專家會認真給你檢查病情的");
                }else{
                 txt1.setText("現在沒有人辦理業務了,您可以休息會了\n 喝杯咖啡吧,哈哈!");
                }
               }
              });//數據庫存取,網絡連接,邏輯處理
            button1.setBounds(450, 141, 100, 25); // 設置按鈕位置
            button1.setText("專家  王醫生");// 設置按鈕上的文字
            
            
            
              
            // 事件代碼里要訪問button
            final Button button2 = new Button(shell, SWT.Activate);
            button2.addSelectionListener(new SelectionAdapter() { // 加一個??擇監聽器
               public void widgetSelected(SelectionEvent e) {
                //System.out.println("############### " + waiterList.size());
                FastWaiter fastWaiter= fastWaiterList.poll();
                if(fastWaiter!= null){
                  txt2.setText(fastWaiter.getNum()+"號顧客請到1號窗口辦理業務");
                }else{
                 txt2.setText("現在沒有人辦理業務了,您可以休息會了\n 喝杯咖啡吧,哈哈!");
                }
               }
              });//數據庫存取,網絡連接,邏輯處理
            button2.setBounds(800, 141, 100, 25); // 設置按鈕位置
            button2.setText("專家  李醫生");// 設置按鈕上的文字
            
            
            
            
            shell.layout();
            shell.open();
            while (!shell.isDisposed()) {
             if (!display.readAndDispatch())
              display.sleep();
            
           }

          }
          }

          執行結果如下:
           

          posted @ 2010-11-04 11:00 龍ぜ殘劍 閱讀(1313) | 評論 (0)編輯 收藏

          開始想做的時候感覺很簡單,動手做起來其實不是那么的簡單呢。這里以文件 f:\\Dato.txt為例
          首先使用File查找是否存在文件f:\\Dato.txt,文件存在就把里面的內容修改掉。。。。

          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.OutputStream;

          public class IO {

            public static void main(String[] args) {
            // TODO Auto-generated method stub
                  File f=null;
                        f=new File("f:\\Dato.txt");//使用File找到文件,并且在之內寫入文件。。。。。
                 if(f.exists()){
                     //如果為真則表示文件存在
                     //如果存在則刪除文件
                     f.delete();
                  }else{
                 try{
                  System.out.println(f.createNewFile());
                 }catch(Exception e){}
               //在文件中寫入文件則要用------outputStream 
                
                 OutputStream out=null;
                 //需要用子類進行實例化
                 try{
                  out= new FileOutputStream(f);
                 }catch(Exception e){}
                 //現在向其中寫入 數據
                 String str="歡迎來到JAVA世界!!!........";
                 byte b[]=str.getBytes();
                 //向文件中寫入內容
                 try{
                  out.write(b);
                 }catch(Exception e){}
                 //關閉文件
                 try{
                  out.close();
                 }catch(Exception e){}
                 
               }
            }

          }

          posted @ 2010-11-02 12:37 龍ぜ殘劍 閱讀(155) | 評論 (0)編輯 收藏



          IO 流的作用:是能夠從發送字節序列的數據源獲取數據,以及如何將數據發送到能夠接收字節流的任何目的地,也就是輸入和輸出。。字節序列的源和目的地可以是文件,網絡連接,內存塊等,不管在文件中的信息還是網絡連接的信息他們的接收在本質上是一樣的。

            
          這里有一個小程序:

          import java.io.*;


          public class IO{
          public static void main(String args[]){
          File a = null; //  判斷是否存在文件 a;
          File a=new File("f:\\James\\wto.txt"); //新建文件a
          try{
          System.out.println(f.createNewFile());//打印是否創建成功
          }catch(Exception e){}
          }

          如果打印的是ture,文件創建成功。打印false表明抽象地址中已經存該在文件,不用再創建。。
          posted @ 2010-11-02 09:39 龍ぜ殘劍 閱讀(120) | 評論 (0)編輯 收藏


          class People1{
            public String sex;
            public int age;
            public void say(){
             System.out.println("小黑:"+sex+"  年齡:"+age);
            }
           }


          public class People {
           public static void main(String[] args) throws InterruptedException {
              People1 p1 =new People1();        //里面先new了兩個對象,分別問p1和p2
              People1 p2 =new People1();
              p1=p2;               //p1.p2指向同一地址p2.
              p1.sex="雄性";
              p1.age=6;
              p1.say();
              p2.sex="雌性";
              p2.age=12;
              p2.say();

           }

          }

          運行結果:
            

          例子先new了兩個對象,分別問p1和p2,然后將p2的值附給了p1,這時,p1的指向就發生了變化:p1就不再指向原來的地址了,此時p1就指向了p2所指向的地址了,也就是說:p1和p2指向了同一塊堆內存。這時先給p1的屬性賦值,并且調用了p1的say方法,這個時候控制臺就打印出來p1所指向的堆地址(實際此時p2指向的也是這個堆地址);然后又給p2的屬性賦值,并且調用了p2的say方法,這個時候控制臺就會打印出來p2所指向的堆地址(實際此時p1指向的也是這個堆地址),兩次打印出來的字符串是不一樣的,因為數值發生了改變。
          posted @ 2010-10-31 22:48 龍ぜ殘劍 閱讀(119) | 評論 (0)編輯 收藏
          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 淳安县| 开阳县| 宁河县| 宝兴县| 巴里| 石棉县| 乐都县| 肇庆市| 察哈| 凉山| 会同县| 荆门市| 澎湖县| 民丰县| 全椒县| 当雄县| 沅江市| 清苑县| 西林县| 玛纳斯县| 蓬安县| 大同县| 鹤壁市| 鲁甸县| 云林县| 库伦旗| 井冈山市| 陆丰市| 富川| 东丽区| 故城县| 巴林左旗| 商水县| 上高县| 秭归县| 杨浦区| 赞皇县| 阿瓦提县| 额敏县| 天长市| 左权县|