posts - 120,  comments - 19,  trackbacks - 0
           
          ??關于VO、PO的理解


          O/R Mapping 是 Object Relational Mapping(對象關系映射)的縮寫。通俗點講,就是將對象與關系數據庫綁定,用對象來表示關系數據。在O/R Mapping的世界里,有兩個基本的也是重要的東東需要了解,即VO,PO。
            VO,值對象(Value Object),PO,持久對象(Persisent Object),它們是由一組屬性和屬性的get和set方法組成。從結構上看,它們并沒有什么不同的地方。但從其意義和本質上來看是完全不同的。

          1.VO是用new關鍵字創建,由GC回收的。
            PO則是向數據庫中添加新數據時創建,刪除數據庫中數據時削除的。并且它只能存活在一個數據庫連接中,斷開連接即被銷毀。

          2.VO是值對象,精確點講它是業務對象,是存活在業務層的,是業務邏輯使用的,它存活的目的就是為數據提供一個生存的地方。
            PO則是有狀態的,每個屬性代表其當前的狀態。它是物理數據的對象表示。使用它,可以使我們的程序與物理數據解耦,并且可以簡化對象數據與物理數據之間的轉換。

          3.VO的屬性是根據當前業務的不同而不同的,也就是說,它的每一個屬性都一一對應當前業務邏輯所需要的數據的名稱。
            PO的屬性是跟數據庫表的字段一一對應的。

          PO對象需要實現序列化接口。

          (轉載:http://www.matrix.org.cn/resource/article/43/43869.html
          --------------------------------------------
          在 struts+ hibernate 這種結構中,是不應該把Hibernate產生的PO直接傳遞給JSP的,不管他是

          Iterator,還是List,這是一個設計錯誤。

          我來談談在J2EE架構中各層的數據表示方法:

          Web層的數據表示是FormBean,數據來源于HTML Form POST
          業務層的數據表示是VO
          持久層的數據表示是PO,其數據來源于數據庫,持久層的數據表示例如CMP

          在一個規范的J2EE架構中,不同層的數據表示應該被限制在層內,而不應該擴散到其它層,這樣可以降

          低層間的耦合性,提高J2EE架構整體的可維護性和可擴展性。比如說Web層的邏輯進行了修改,那么只需

          要修改FormBean的結構,而不需要觸動業務層和持久層的代碼修改。同樣滴,當數據庫表進行了小的調

          整,那么也只需要修改持久層數據表示,而不需要觸動業務層代碼和Web層代碼。

          不過由于Hibernate的強大功能,例如動態生成PO,PO的狀態管理可以脫離Session,使得在應用了

          Hibernate的J2EE框架中,PO完全可以充當VO,因此我們下面把PO和VO合并,統稱為PO。

          先來談談ActionFormBean和持久層的PO之間的重大區別。

          在簡單的應用中,ActionFormBean和PO幾乎是沒有區別,所以很多人干脆就是用ActionFormBean來充當

          PO,于是ActionFormBean從JSP頁面到Servlet控制層再到業務層,然后穿過持久層,最后一直映射到數

          據庫表。真是一竿子捅到了底!

          但是在復雜的應用中,ActionFormBean和PO是分離的,他們也不可能一樣。ActionFormBean是和網頁里

          面的Form表單一一對應的,Form里面有什么元素,Bean里面就有什么屬性。而PO和數據庫表對應,因此

          如果數據庫表不修改,那么PO也不會修改,如果頁面的流程和數據庫表字段對應關系不一致,那么你又

          如何能夠使用ActionFormBean來取代PO呢?

          比如說吧,用戶注冊頁面要求注冊用戶的基本信息,因此HTML Form里面包含了基本信息屬性,于是你需

          要一個ActionFormBean來一一對應(注意:是一一對應),每個Bean屬性對應一個文本框或者選擇框什么

          的。

          而用戶這個持久對象呢?他的屬性和ActionFormBean有什么明顯不同呢?他會有一些ActionFormBean所

          沒有的集合屬性,比如說用戶的權限屬性,用戶的組屬性,用戶的帖子等等。另外還有可能的是在

          ActionFormBean里面有3個屬性,分別是用戶的First Name, Middle Name, Last Name,而在我的User這

          個持久對象中就是一個 Name 對象屬性。

          假設我的注冊頁面原來只要你提供First Name,那么ActionFormBean就這一個屬性,后來我要你提供全

          名,你要改ActionFormBean,加兩個屬性。但是這個時候PO是不應該修改滴,因為數據庫沒有改。

          那么在一個完整的J2EE系統中應該如何進行合理的設計呢?

          JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

          ActionFormBean是Web層的數據表示,它和HTML頁面Form對應,只要Web頁面的操作流程發生改變,它就

          要相應的進行修改,它不應該也不能被傳遞到業務層和持久層,否則一旦頁面修改,會一直牽連到業務

          層和持久層的大面積的代碼進行修改,對于軟件的可維護性和可擴展性而言,是一個災難,Actiont就是

          他的邊界,到此為止!

          Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

          而PO則是業務層和持久層的數據表示,它在業務層和持久層之間進行流動,他不應該也不能被傳遞到Web

          層的View中去,而ActionServlet就是他的邊界,到此為止!

          然后來看一看整個架構的流程:

          當用戶通過瀏覽器訪問網頁,提交了一個頁面。于是Action拿到了這個FormBean,他會把FormBean屬性

          讀出來,然后構造一個PO對象,再調用業務層的Bean類,完成了注冊操作,重定向到成功頁面。而業務

          層Bean收到這個PO對象之后,調用DAO接口方法,進行持久對象的持久化操作。

          當用戶查詢某個會員的信息的時候,他用全名進行查詢,于是Action得到一個UserNameFormBean包括了3

          個屬性,分別是first name, middle name, last name,然后Action把UserNameFormBean的3個屬性讀出

          來,構造Name對象,再調用業務Bean,把Name對象傳遞給業務Bean,進行查詢。

          業務Bean取得Name(注意: Name對象只是User的一個屬性)對象之后調用DAO接口,返回一個User的PO對象

          ,注意這個User不同于在Web層使用的UserFormBean,他有很多集合屬性滴。然后業務Bean把User對象返

          回給Action。

          Action拿到User之后,把User的基本屬性取出(集合屬性如果不需要就免了),構造UserFormBean,然后

          把UserFormBean request.setAttribute(...),然后重定向到查詢結果頁面。

          查詢頁面拿到request對象里面的ActionFormBean,自動調用tag顯示之。

          總結:

          FormBean是Web層的數據表示,他不能被傳遞到業務層;PO是持久層的數據表示,在特定情況下,例如

          Hibernate中,他可以取代VO出現在業務層,但是不管PO還是VO都必須限制在業務層內使用,最多到達

          Web層的Control,絕不能被擴散到View去。

          FormBean和PO之間的數據轉化是在Action中進行滴。

          BTW:

          JDO1.x還不能像Hibernate功能這樣強大,PO不能脫離持久層,所以必須在業務層使用VO,因此必須在業

          務層進行大量的VO和PO的轉化操作,相對于Hibernate來說,編程比較煩瑣。

          當然咯,理論是一回事,實際操作也不一定非要這樣干,你可以自行取舍,在實際項目中靈活一點,增

          加一點bad smell,提高開發效率。只不過在大型項目中最好還是嚴絲合縫,不然的話,改版的時候會痛

          苦的很滴。
          (轉載:http://forum.hibernate.org.cn/viewtopic.php?t=627

          posted @ 2006-08-16 13:51 阿成 閱讀(537) | 評論 (0)編輯 收藏
               摘要: 自己最近學習了JfreeChart的使用,覺得這個冬冬的功能非常強大,總結一下。一、簡單介紹一下??? WW 的發展使得基于因特網的應用程序不再局限于靜態或者簡單的動態內容提供。傳統的一些以軟件包形式發布應用程序例如報表系統等都在逐漸搬到因特網上。但是這兩者之間有著天壤之別,雖然對于數據獲取、業務處理等方面基本類似,但是最大的差別在于用戶界面。為了能在web瀏覽器上顯示要求用戶界面使用 ...  閱讀全文
          posted @ 2006-08-16 10:44 阿成 閱讀(977) | 評論 (0)編輯 收藏
          前面已經講過利用POI讀寫Excel,下面是一個用POI向Excel中插入圖片的例子。

          官方文檔:
          Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported:
          PNG
          JPG
          DIB
          It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet.

          // Create the drawing patriarch. This is the top level container for
          // all shapes. This will clear out any existing shapes for that sheet.


          通過HSSFPatriarch類createPicture方法的在指定的wb中的sheet創建圖片,它接受二個參數,第一個是HSSFClientAnchor,設定圖片的大小。

          package com.poi.hssf.test;

          import java.io.FileOutputStream;
          import java.io.File;
          import java.io.ByteArrayOutputStream;
          import java.io.IOException;

          import java.awt.image.BufferedImage;
          import javax.imageio.*;

          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import org.apache.poi.hssf.usermodel.HSSFSheet;
          import org.apache.poi.hssf.usermodel.HSSFPatriarch;
          import org.apache.poi.hssf.usermodel.HSSFClientAnchor;;

          public class TestPOI {

          ??? public static void main(String[] args) {
          ??????????? FileOutputStream fileOut = null;
          ??????????? BufferedImage bufferImg =null;
          ??????????? BufferedImage bufferImg1 = null;
          ??????????? try{
          ?????????? ??? ?
          ????????? //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray
          ????????? ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
          ????????? ByteArrayOutputStream byteArrayOut1 = new ByteArrayOutputStream();
          ????????? bufferImg = ImageIO.read(new File("d:/PieChart.jpg"));
          ????????? bufferImg1 = ImageIO.read(new File("d:/fruitBarChart.jpg"));
          ????????? ImageIO.write(bufferImg,"jpg",byteArrayOut);
          ????????? ImageIO.write(bufferImg1,"jpg",byteArrayOut1);
          ???????? ?
          ??????? //創建一個工作薄
          ?? ??? ?HSSFWorkbook wb = new HSSFWorkbook();
          ?? ??? ?HSSFSheet sheet1 = wb.createSheet("new sheet");
          ?? ??? ?//HSSFRow row = sheet1.createRow(2);
          ?? ??? ?HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
          ?? ??? ?HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,512,255,(short) 1,1,(short)10,20);
          ?? ??? ?HSSFClientAnchor anchor1 = new HSSFClientAnchor(0,0,512,255,(short) 2,30,(short)10,60);
          ?? ??? ?anchor1.setAnchorType(2);
          ?? ??? ?//插入圖片
          ?? ??? ?patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
          ?? ??? ?patriarch.createPicture(anchor1 , wb.addPicture(byteArrayOut1.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
          ?? ??? ?
          ?? ??? ??? ?fileOut = new FileOutputStream("d:/workbook.xls");
          ?? ??? ??? ?//寫入excel文件
          ?? ??? ??? ?wb.write(fileOut);
          ?? ??? ??? ?fileOut.close();
          ?? ??? ?
          ?? ??? ???? }catch(IOException io){
          ?? ??? ???????????? io.printStackTrace();
          ?? ??? ???????????? System.out.println("io erorr :? "+ io.getMessage());
          ?? ??? ???? } finally
          ?? ??? ???? {
          ?? ??? ??? ??? ?if (fileOut != null)
          ?? ??? ??? ??? ?{
          ?? ??? ?????????????????? ?
          ?? ??? ??? ??? ??? ?try {
          ?? ??? ?????????????????????? fileOut.close();
          ?? ??? ????????????????? }
          ?? ??? ??? ??? ??? ?catch (IOException e)
          ?? ??? ??? ??? ??? ?{
          ??????????????????????????? // TODO Auto-generated catch block
          ??????????????????????????? e.printStackTrace();
          ?? ??? ????????????? }
          ?? ??? ??? ??? ?}
          ?? ??? ???? }
          ??? }
          }

          posted @ 2006-08-16 09:09 阿成 閱讀(2995) | 評論 (4)編輯 收藏

          利用Java 操作Excel文檔(POI方法)

          一.POI簡介

          Jakarta POI apache的子項目,目標是處理ole2對象。它提供了一組操縱Windows文檔的Java API

          目前比較成熟的是HSSF接口,處理MS Excel97-2002)對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。

          二.HSSF概況

          HSSF Horrible SpreadSheet Format的縮寫,也即“討厭的電子表格格式”。 也許HSSF的名字有點滑稽,就本質而言它是一個非常嚴肅、正規的API。通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。

          HSSF 為讀取操作提供了兩類APIusermodeleventusermodel,即“用戶模型”和“事件-用戶模型”。前者很好理解,后者比較抽象,但操作效率要高得多。

          三.開始編碼

          1 準備工作

          要求:JDK 1.4+POI開發包

          可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包

          2 EXCEL 結構

          HSSFWorkbook excell 文檔對象介紹
          HSSFSheet excell
          的表單
          HSSFRow excell
          的行
          HSSFCell excell
          的格子單元
          HSSFFont excell
          字體
          HSSFName
          名稱
          HSSFDataFormat
          日期格式
          poi1.7中才有以下2項:
          HSSFHeader sheet

          HSSFFooter sheet

          和這個樣式
          HSSFCellStyle cell
          樣式
          輔助操作包括
          HSSFDateUtil
          日期
          HSSFPrintSetup
          打印
          HSSFErrorConstants
          錯誤信息表

          3 .具體用法實例 (采用 usermodel

          如何讀Excel

          讀取Excel文件時,首先生成一個POIFSFileSystem對象,由POIFSFileSystem對象構造一個HSSFWorkbook,該HSSFWorkbook對象就代表了Excel文檔。下面代碼讀取上面生成的Excel文件寫入的消息字串:
          POIFSFileSystemfs=newPOIFSFileSystem(new FileInputStream("d:\test.xls"));
          HSSFWorkbook
           wb = new HSSFWorkbook(fs);
            } catch (IOException e) {
            e.printStackTrace();
            }
            HSSFSheet sheet = wb.getSheetAt(0);
            HSSFRow row = sheet.getRow(0);
            HSSFCell cell = row.getCell((short) 0);
            String msg = cell.getStringCellValue();

          如何寫excel

          excel的第一個表單第一行的第一個單元格的值寫成“a test”。

          POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));

          ??? HSSFWorkbook wb = new HSSFWorkbook(fs);

          ??? HSSFSheet sheet = wb.getSheetAt(0);

          ??? HSSFRow row = sheet.getRow(0);

          ??? HSSFCell cell = row.getCell((short)0);

          ??? cell.setCellValue("a test");

          ??? // Write the output to a file

          ??? FileOutputStream fileOut = new FileOutputStream("workbook.xls");

          ??? wb.write(fileOut);

          fileOut.close();

          4 可參考文檔

          POI 主頁:http://jakarta.apache.org/poi/

          初學者如何快速上手使用POI HSSF

          http://jakarta.apache.org/poi/hssf/quick-guide.html

          代碼例子 http://blog.java-cn.com/user1/6749/archives/2005/18347.html

          里面有很多例子代碼,可以很方便上手。

          四.使用心得

          POI HSSF usermodel包把Excel文件映射成我們熟悉的結構,諸如WorkbookSheetRowCell等,它把整個結構以一組對象的形式保存在內存之中,便于理解,操作方便,基本上能夠滿足我們的要求,所以說這個一個不錯的選擇。

          ?

          posted @ 2006-08-16 09:00 阿成 閱讀(5411) | 評論 (0)編輯 收藏
          8月6號、7號到秦皇島旅游,玩的挺爽的。

          去了鴿子窩和野生動物原,還不錯。還有就是到海邊游泳,第一次看海。海水很咸。

          螃蟹、龍蝦吃的也非常過癮,個大得很,呵呵。

          不知明年還有沒機會去。
          posted @ 2006-08-15 20:10 阿成 閱讀(248) | 評論 (0)編輯 收藏
          html ,css ,js ,jsp, jdbc, sql ,會java,懂web框架, 數據庫 ,會用google
          posted @ 2006-06-20 17:25 阿成 閱讀(236) | 評論 (0)編輯 收藏

          javascript編程起步(第一課)
          不管你以前學沒有學過javascript,本教程都能帶您進入javascript的殿堂,領悟javascript的魅力。
          ? 大家來到這里,都是javascript的愛好者,對javascript都多多少少有一定的理解。關于javascript
          的歷史等就不做介紹了,我們直接來學習它,用它。
          ? 也許大部分人都認為javascript是在客戶端運行的,其實不然。javascript有兩種不同的運行環境,
          一個是在服務器端的javascript,另一個就是客戶端的javascript了。還有就是javascript也是面向對象
          的語言。
          ? 作為第一課,只是給大家一個簡單的認識,東西不是太多。主要有以下三個方面:
          ? 1、在頁面添加javascript
          ? 2、javascript的數據類型
          ? 3、javascript最基本的三個對話框

          ? 關于怎么添加javascript,我想大家都知道,就是
          ? <script language="javascript">?? //這行是javascript腳本標記,斜杠后面的就是注釋了
          ? document.write("在頁面顯示的javascript") //在頁面顯示一句話
          ? </script>
          ? /*這也是注釋,
          ??? 不過是多行的。
          ? */
          ? 我想這個今天就不細講了,留到下一課講,就當是這課的作業吧,就是關于適應各種環境的javascript
          的添加。如不支持javascript的瀏覽器,我們該加入些什么才能不讓瀏覽器顯示javascript的源代碼等等。

          ? 第二個也就是今天講的最重要的一個,就是javascript的數據類型,主要有以下幾個基本的類型。
          ? 字符串(string)
          ? 數字(number)
          ? 布爾值(boolean)
          ?
          ? 字符串就是由一連串的字符組成的序列。包括字母、數字以及標點符號。當然還可以是漢字等。簡單一點
          就是表示文本信息。

          ? 數字又分為兩類:整型數字和浮點型數字。
          ? 整數包括正整數,零和負整數。

          ? javascript中的數字可以使用十進制、八進制和十六進制來書寫。方法如下:
          ? 十進制:15(直接寫數字即可)
          ? 八進制:017(要以零做為引導數字)
          ? 十六進制:0xf(要以0x做為引導數字)

          ? 浮點型數字也叫實數,為了方便,也可以使用科學記數法來表示:
          ? 1.13e1、1.5e3(等價于1.5乘10的3次方)
          ? javascript的數字范圍大約為10的負308次方到10的308次方之間。
          ? javascript中還有一個特殊的數字值NaN(not a number),javascript 用nan表示這個無意義的結果。

          ? 布爾值:true和false,在計算機中一般用1表示true,用0表示false。

          ? 空值就是null,即不表示任何東西。
          ? 未定義值undefined,有時等于null,有時可能是出了問題。
          ? 特殊字符:也叫轉義字符。是一些以反斜杠開頭的不可顯示的特殊控制字符。
          ? \b:表示退格
          ? \n:表示換行
          ? 等等。

          ? alert()方法的使用:
          ? <script language="javascript">
          ? alert("在頁面上顯示警告對話框");
          ? </script>
          ? alert()是javascript產生一個帶確認按鈕的對話框,上面顯示括號內的信息。

          ? confirm()方法的使用:
          ? <script language="javascript">
          ? confirm("在頁面上顯示確認對話框");
          ? </script>
          ? confirm()和alert()差不多,不同的就是多了個取消按鈕。按確定返回true,按取消返回false。
          ? <script language="javascript">
          ? var con;
          ? con=confirm("你們喜歡這樣的教程嗎?");
          ? if (con==true) alert("喜歡");
          ? else alert("不喜歡");
          ? </script>

          ? prompt()方法的使用:
          ? <script language="javascript">
          ? var name,age;
          ? name=prompt("請問您的名字?");
          ? alert(name);
          ? age=prompt("多大?");
          ? alert(age);
          ? </script>
          ? 它不但可以顯示信息,而且可以輸入信息。
          ----------------------------------------------------------------------------------------
          javascript編程起步(第二課)

          關于上課的作業,大家都知道,代碼如下:
          ? <script language="javascript">
          ? <!--
          ? 代碼
          ? //-->
          ? </script>
          ? 這兒補充一點內容,還可以告訴讀者這兒是javascript代碼,該瀏覽器不支持。
          ? <noscript>
          ? 在瀏覽器不支持的時候顯示這句話
          ? </noscript>
          ? 今天我們主要學習的內容有以下幾塊:
          ? 1、javascript變量
          ? 2、javascript表達式和運算符

          ? 可以用var加上為變量指定的名稱來聲明變量,變量類型可以通過給變量賦值來確定。由于javascript采用的是弱類型的樣式,對數據類型要

          求不太嚴格,在程序執行的過程中,會根據需要自動轉換。
          ? 對于字符串變量,可以通過“變量名.length”來獲得該變量中字符串的長度,如
          ? var name;
          ? name="javascript";
          ? 那么name.length的值就是10。

          ? 若在一行中創建多個變量時,記住用逗號來隔開變量名。各語句用分號隔開。(使用分號是個好習慣, 大家在學習的時候盡量養成加分號的習

          慣)
          ?
          ? 類型轉換:javascript允許在程序中改變變量的類型,最常見的兩個類型轉換符Number和String。
          ? Number(x)是字符型值——〉數字值型。String與之相反。相對于javascript的自動類型轉換,可以將這種轉換成為強制類型轉換。(強制類

          型轉換需要在javascript1.2及以上版本才可以使用)

          ? 變量的命名:

          ? 1.必須以字母或下劃線開頭,中間可以有字母數字和或下劃線。不能使用空格、+、-等其他符號。
          ??? 作為連字符外,變量名稱不能有空格、(+)、(-)、(,)或其它符號。
          ? 2.不能使用JavaScript中的關鍵字作為變量。
          ? (javascript變量名是區分大小寫的,name和Name是不一樣的。)

          ? 對于變量還有一個重要性──那就是變量的作用域。在JavaScript中同樣有全局變量和局部變量。全局變量是定義在所有函數體之外,其作

          用范圍是整個函數;而局部變量是定義在函數體之內,只對其該函數是可見的,而對其它函數則是不可見的。

          ? 例子:
          <script>
          var myStr = "我是全局變量";
          function getStr1(){
          ???? var myStr = "我是局部變量";
          ???? alert (myStr);
          }
          function getStr2(){
          ???? alert (myStr);
          }
          getStr1();
          getStr2();
          // 測試會彈出兩個提示框,第一個提示“我是局部變量”,第二個提示“我是全局變量”
          </script>


          ? 表達式:在定義完變量后,就可以對它們進行賦值、改變、計算等一系列操作,這一過程通常由表達式來完成,可以說它是變量、常量、布

          爾及運算符的集合,因此表達式可以分為算術表述式、字串表達式、賦值表達式以及布爾表達式等。
          ?

          ? 運算符:

          ? 1.算術運算符:+(加) 、-(減)、 *(乘)、 /(除)、 %(取模) -(取反)、
          ??????????? ++(遞加1)、--(遞減1)。
          ??????????? 例:11%2=1 ; 如果x=2?? ++x+4=7???? x+++4=6
          ????????? (++x是先執行加1,x++是執行完語句之后x在自加1
          例子:

          <script>
          var i=0, j=0;
          alert(i++ + " " + ++j + " " + i);
          // 輸出 “0 1 1”,可見i++是先輸出了i,然后進行運算,而++j是先對j進行了自加運算,然后輸出j的值
          </script>

          ? 2.比較運算符:<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、!=(不等于)
          ????????? (基本操作過程是,首先對它的操作數進行比較,然后再返回一個true或False值。)
          ? 3.邏輯運算符:!(取反)、&=(與之后賦值)、 &(邏輯與)、 |=(或之后賦值)、 |(邏輯或)、
          ??????????? ^=(異或之后賦值)、 ^(邏輯異或)、 ?:(三目操作符)、||(或)、&& (與)
          ??????????? ==(等于)、|=(不等于)。
          ? 4.字符串運算符:只有+?? (”my“+”javascript“結果等于”my javascript“)
          ? 5.賦值運算符:即=,將右邊的值賦給左邊的變量。
          ? 6.條件運算符:(?:)
          ??????????? 例:status=(age>=18)?"adult":"child";如果大于18,則表達式的值為adult。
          ? 7.typeof()運算符:用來返回變量或數據的類型。

          ?

          作業:試試能不能做個最最最最簡單的計算器?
          ??? (就是我可以輸入兩個數和一個運算符號,就得出計算結果。結合上一課的prompt())
          答案:
          <script language="javascript">
          function yunshuan(a,op,c)
          {
          try{
          ? eval("result=a"+op+"c");
          ? return result;
          }
          catch(e){
          ? alert("Some error occur");
          }
          }
          function main(){
          var a,b,c;
          a=parseInt(prompt("請輸入第一個數"));
          op=prompt("請輸入運算符");
          c=parseInt(prompt("請輸入第二個數"));
          alert("the result is :" + yunshuan(a,op,c));
          }

          </script>
          -----------------------------------------------
          javascript編程起步(第三課)

          第三課終于和大家見面了, 大家要感謝 Actions 的辛勤勞動啊, 好好利用論壇給大家提供的資源和教程, 希望大家一起學習提高 :D
          大家有什么意見, 建議或者想法, 可以到本版的教程問答區 或 站務管理版的 建議或意見 去發表, 我們會及時給您反饋 :)

          下面是今天的學習重點:
          A.補充上課的變量內容
          B.if語句的基本語法
          C.window.com()基本用法

          A.變量
          1.變量的類型規則
          javascript是無類型的,他的變量可以放任何數據類型的值。
          2.變量的聲明
          在javascript程序中,在使用變量之前,必須先聲明它。變量是使用關鍵字var聲明的。而實際上,不一定要先聲明變量,在某些情況下,變量

          聲明是可選的。
          var i;
          var sum;
          也可以使用一個var關鍵字聲明多個變量;
          var i,sum;
          而且還可以將變量聲明和變量初始化綁定在一起:
          var message = 'hello';
          var i = 0,j=0,k=0;
          由var聲明的變量是永久的,因為各瀏覽器對是否可以刪除全局性的變量的態度是不同的,(都可以刪除局部變量)為了安全,最好假設全局變

          量不可刪除。
          可以使用var多次聲明同一個變量
          當你給一個沒有聲明的變量賦值時,js會自動用哪個變量為你創建一個全局變量。
          如果你想在函數內部創建一個局部變量。那就必須用var在函數內部聲明。
          3.變量的作用域
          如果局部變量和全局變量重名,則局部變量優先。js沒有塊級作用域。函數中聲明的所有的變量,作用域是相同的。
          var x;//聲明一個未賦值的變量,他的值是undefined。
          alert(u); //使用未聲明的變量將引發錯誤。
          u=3;//給一個未聲明的變量賦值將會創建該變量。
          4.原始類型和引用類型
          var a=3.14;//原始類型
          var b=a;//引用類型

          B.if語句

          if (條件)
          語句段1
          else
          語句段2

           功能:若表達式為true,則執行語句段1;否則執行語句段2。

           說明:
          if -else 語句是JavaScript中最基本的控制語句,通過它可以改變語句的執行順序。
          表達式中必須使用關系語句,來實現判斷,它是作為一個布爾值來估算的。
          它將零和非零的數分別轉化成false和true。
          若if后的語句有多行,則必須使用花括號將其括起來。

          例子
          if (age < 16 )
          ???? alert("小朋友");
          else
          ???? alert("成年人");
          end if

          if語句的嵌套
          if (布爾值) 語句1;
          else if (布爾值) 語句2;
          else if (布爾值) 語句3;
          else 語句4;
          在這種情況下,每一級的布爾表述式都會被計算,若為真,則執行其相應的語句,否則執行else后的語句。

          C.window.com()的用法
          ? 1、基本語法
          ? window.open(pageURL,name,parameters)
          ? 其中:
          ??? pageURL 為子窗口路徑
          ??? name 為子窗口句柄
          ??? parameters 為窗口參數(各參數用逗號分隔)
          ? 例:
          ????? <SCRIPT LANGUAGE="javascript">
          ????? <!--
          ????? window.open ('url') //url為一網址,如:http://www.numb1.com(絕對) 或 index.htm相對)
          ????? -->
          ????? </SCRIPT>
          ? 2. 窗口參數
          ? 其中yes/no也可使用1/0;value為具體的數值,單位象素。
          ? toolbar=yes,no 是否顯示工具條
          ? location=yes,no 是否顯示網址欄
          ? directories=yes,no 是否顯示導航條
          ? status=yes,no 是否顯示狀態條
          ? menubar=yes,no 是否顯示菜單
          ? scrollbars=yes,no 是否顯示滾動條
          ? resizable=yes,no 是否可以改變公告窗口大小
          ? copyhistory=yes,no 是否顯示歷史按鈕
          ? width=value 公告窗口的寬
          ? height=value 公告窗口的高
          ? left=value 公告窗口的左上頂點距屏幕左邊100像素
          ? top=value 公告窗口的左上頂點距屏幕頂端100像素
          ? 例:
          <script language="javascript">
          <!--
          window.open("http://www.sina.com.cn","newwindow",

          "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width=500,height=500,le

          ft=100,top=100")
          //-->
          </script>
          ----------------------------------------------------
          javascript編程起步(第四課)

          前一段有人給我說,第二課就看不明白了,我不知道是不是寫的太籠統了,不夠細致,還是其他的,有什么問題,大家給提出來,當然我也不

          是什么js高手,只不過想把愛好者領進門而已。希望大家多多參與。
          今天的主要任務就是for循環。另外就是數據類型。既for in(現在還沒有講數組和對象,先了解一下)。

          數據類型的轉換:
          如果運算的數據類型不是一樣的話,js腳本會盡力執行內部轉換來解決,但js不了解你的心思。所以得到的結果可能和你想要的不一樣。
          em:
          ? 3+3?? // result=6
          ? 3+"3"?? // result="33"

          將字符串轉換為數值:
          javascript語言提供兩個內置函數將表示數值的字符串轉換為真實的數值:parseInt()和parseFloat()。
          為了使用這些函數,需要將進行轉換的字符串作為參數傳入函數,例:
          parseInt("42")???? //result=42
          parseInt("42.33")?? //result=42
          不過是浮點數還是整數,函數返回的值都是整數。不存在四舍五入,小數點和它后面的數字將被舍棄。
          而parseFloat()則返回浮點數(如果是整數就返回整數),例:
          parseFloat("42")?? //result=42
          parseFloat("42.33") //result=42.33
          如果在某處需要進行字符串的轉換,只需將函數插入該初即可。如:
          3+3+parseInt("3")?? //result=9

          將數值轉換為字符串:
          雖然當遇到表達式中含有混合數據類型時,js會傾向于字符串。但為了防止潛在的問題發生,最好先轉換以下。在數值中加入空字符串就可以

          把數值轉換為字符串了:
          (""+2500)???????? //result="2500"
          (""+2500).length?? //result=4


          for:
          javascript中最常用的循環結構稱之為for循環,關鍵詞放在循環結構的開始位置。正式語法結構如下:
          for ([initial expression];[condition];[update expression]){
          ? statement[s] inside loop
          }
          例:
          for(var i=0;i<9;i++)
          {
          n+=i
          myfunc(n)
          }
          for...in:
          這個語句完全依照變量var所設定的值決定運行次數。你可以用for...in語句在一個對象或一個數組上建立循環
          for(var in [obj | array])
          {
          statements
          }
          例:
          <script language="javascript">
          document.writeln("The properties of the document object")
          for(var element in document){
          document.writein(element+"="+document[element])
          }
          </script>

          ----------------------------------------------------
          javascript編程起步(第五課)


          鼠標事件(上)

          ? 隨著課程的進行,能跟著下來的人是越來越少了,不知道是不是因為沒有太多的表現,只是死記的東西,大家都沒有興趣啊。其實網頁上

          的很多特效,動作大都是用javascript來實現的,沒有javascript的網頁,就象一個人沒有了肌肉一樣。但是所有的動作都是有函數來控制的

          ,而控制語句是基礎中的基礎。希望大家能耐心的學下去。今天的課程就輕松一下,學習點能見到效果的。
          主要內容就是基于鼠標的事件,有如下幾種:
          1.mouseover(鼠標移至)
          2.mouseout(鼠標移出)
          3.mousemove(鼠標移動)
          4.mousedown(鼠標按下)
          5.mouseup(鼠標彈起)
          6.click(單擊)
          7.dblclick(雙擊)

          ? 通常1和2組合起來使用,當用戶把鼠標移動到一個超鏈接或者其他元素時,mouseover事件就會發生,mouseout總會伴隨著它,因為當鼠標

          離開時,mouseout事件就會發生。
          ? 例子:
          <html>
          <head>
          <title>test</title>
          <script language="javascript">
          function text_onmouseover(){
          mytext.style.fontSize="30pt";
          mytext.style.color="red";
          mytext.style.fontStyle="italic";
          }
          function text_onmouseout(){
          mytext.style.fontSize="20pt";
          mytext.style.color="blue";
          mytext.style.fontStyle="normal";
          }
          </script>
          </head>
          <body>
          <p id=mytext onmouseover="text_onmouseover()" onmouseout="text_onmouseout()">http://www.javascript.com.cn</p>
          <p>看看字體樣式有什么變化</p>
          </body>
          </html>

          ? 這里定義了兩個函數,來使字體改變樣式。關于函數我們以后會詳細的講解。
          (注意:ie對頁面上的所有元素都支持mouseover和mouseout事件,但對于netscape navigator來說,只有超鏈接和層支持這兩個事件。)

          下面看鼠標移動的例子:
          <html>
          <body onMousemove="micro$oftMouseMove()">
          <SCRIPT LANGUAGE="JavaScript">
          if (navigator.appName == 'Netscape')
          {
          document.captureEvents(Event.MOUSEMOVE);
          document.onmousemove = netscapeMouseMove;
          }

          function netscapeMouseMove(e) {
          if (e.screenX != document.test.x.value || e.screenY != document.test.y.value)
          {
          document.test.x.value = e.screenX;
          document.test.y.value = e.screenY;
          }
          }

          function micro$oftMouseMove() {
          if (window.event.x != document.test.x.value || window.event.y != document.test.y.value)
          {
          document.test.x.value = window.event.x;
          document.test.y.value = window.event.y;
          }
          }
          </SCRIPT>
          <FORM NAME="test">
          X: <INPUT TYPE="TEXT" NAME="x" SIZE="4"> Y: <INPUT
          TYPUE="TEXT" NAME="y" SIZE="4">
          </FORM>
          </body>
          </html>
          鼠標移動的事件在鼠標跟隨效果的使用上比較多,大家可以看看鼠標跟隨特效。網上n多。
          (需要注意的是:啟動這個事件處理過程存在一個問題,就是它有可能會屏蔽其他事件。另外還增加了頁面的處理時間,應盡量少用。)

          先說到這兒吧,下節講鼠標的另外4個事件。


          今天的作業是:
          1.圖片鏈接的轉換(當鼠標放上去時是一個圖片,當鼠標離開時是另外一個圖片)
          2.圖片跟隨鼠標(當鼠標移動時,會有個圖片跟隨著鼠標一起移動)
          1題答案:
          <html>
          <body>
          <script language="javascript">
          ?? function change()
          ?? {
          ?????? //document.test.tupian.src="1.bmp";用test和form[0]都可以
          ??? document.form[0].tupian.src="1.bmp";
          ?? }
          ?? function changeback()
          ?? {
          ?????? //document.test.tupian.src="2.bmp";
          ??? document.form[0].tupian.src="1.bmp";
          ?? }
          </script>
          <form name="test">
          <a name="aa" href="http://www.xxx.com" onmouseover="change();" onmouseout="changeback();"><img name="tupian"

          src="3.jpg"/></a>
          </form>
          </body>
          </html>
          ---------------------------------------------------------------------------------------------------
          javascript編程起步(第六課)

          mouseDown事件和mouseUp事件
          ?

          大家知道,mouseDown事件和mouseUp事件的組合就是click事件,但是如果在鏈接上按下鼠標,并移到鏈接之外在放開鼠標,那么就只有mouseD

          own事件了。這兩個事件可以增加圖標按鈕的圖像效果,
          ? 至于mouseDown和mouseUp的屬性,它們是伴隨著Click事件發生的,這和keyPress事件是keyDown事件和keyUp事件組合而成的機制是一樣的

          ,這3個鼠標事件也有modifier屬性。
          ? (注意:如果在onClick事件處理中使用return語句,它可以接收任何數值。只要這個值不是False,瀏覽器就可以完成提交。但如果瀏覽

          器得到的是False值,表單提交操作就會被取消。)

          Click事件和dbClick事件
          ? onClick是單擊事件,onDblClick是雙擊事件,而實際上很難分清連續的單擊和雙擊。它們會互相干擾。而且在ie和其他瀏覽器的情況還有

          不同。有的瀏覽器是雙擊事件的每一次單擊都會觸發單擊事件,而在ie中,只有雙擊事件的第一次單擊會觸發單擊事件。不管怎么樣,單擊事

          件都不會自動的取消或被忽略。因此,如果想使用單擊和雙擊一個鏈接時觸發兩個完全不同的過程,則必須通過編程來延遲單擊的動作知道雙

          擊。

          例:
          <script>
          var timer=null;
          document.onclick=new Function("timer=setTimeout(click,500)")
          document.ondblclick=new Function("clearTimeout(timer);dblclick()")
          function click(){
          alert("click")
          }
          function dblclick(){
          alert("dblclick")
          }
          </script>

          解釋:
          new Function("timer=setTimeout(click,500)")
          新建一個函數,內容為
          timer=setTimeout(click,500)
          setTimeout(函數或語句,時間以毫秒為單位)
          用于設置某函數或語句在某時間后執行,……
          clearTimeout(timer);
          清除設置,

          ? 在高版本的瀏覽器中,鏈接的這兩種事件處理程序都監視那些使得腳本阻止鏈接的特殊行為。
          ? 例如:在想要的導航到另一個頁面之前進行某些數據項的確認,如果某些域填得不正確,可以提醒并終止鏈接。要實現這種確認,必須在

          事件處理程序得最后一條語句或者事件處理程序自身返回True或False。如果返回False就終止鏈接。
          ------------------------------------------------------
          javascript編程起步(第七課)

          過年到現在一直都比較忙,辜負大家了.
          今天就學習函數吧,雖然語句還沒有說完.

          函數是javascript語言的一個很重要的內容,但也很復雜.
          下面來看看javascript函數.
          函數是有function加函數名和一對帶有參數括號,以及大括號組成的,其中大括號里是
          主體javascript語句.
          例:
          function hanshuname(js) //hanshuname是函數名.
          {
          document.write(js,"<br>"); //是函數的主體語句.
          }
          函數可以嵌套,如下:
          function qiantao(a,b){
          function lqiantao(x){return x*x;}
          return Math.sqrt(lqiantao(a)+lqiantao(b));
          }
          函數還可以作為數據來應用,因此可以象處理其他數據那樣來處理函數,如:賦值,存儲,傳遞等.
          例:
          function zhi(x){return x*x;}
          實際上,函數名沒有什么意義,不過是保存函數的變量名而已.
          a=zhi(6);//a存放的是數字36;
          b=zhi;//現在b和zhi引用同一個函數.
          c=b(5);//c存放的是數字25.
          在一個函數體內,標識符arguments總是具有特殊含義,它是調用對象的一個特殊屬性,用來引用實際參數對象.這個實際參數對象具有大量有用的

          屬性.除此之外,它還兼有數組的角色.
          盡管定義javascript函數時都有固定的參數,但調用這個函數時,傳遞給它的參數數目卻可以是任意的,數組arguments[]允許完全存取那些實

          際參數值.另外,arguments有一個length屬性,看如下例子:
          function zhi(x,y,z)
          {
          if(arguments.length !=3){
          alert("function zhi called with"+arguments.length+"arguments,but it expects 3 arguments.");
          return null;
          }
          }
          數組arguments[]還為javascript函數開發了一項重要的可能性,既可以將函數編寫為能夠接受任意數目的實際參數.
          function zhi()
          {
          var m=Number.NEGATIVE_INFINITY;
          //遍歷所有參數
          //檢索并記憶最大的一個.
          for(var i=0;i<arguments.length;i++)
          if(arguments>m)m=arguments;
          //返回最大的參數值.
          return m;
          }
          var lazgest=zhi(1,10,100,2,3,1000,4,5,10000,6);
          也可以使用arguments[]數組來編寫一個函數.


          調用js函數
          <a href=”#” onClick=”functionName()”>Link text</a>
          <a href=”javascript:functionName()”>Link text</a>
          今天先說到這兒吧,下節繼續說函數.

          posted @ 2006-06-13 17:30 阿成 閱讀(532) | 評論 (0)編輯 收藏
          在讀spring in aciton 時,他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));
          可是現在的用的1.2.6版本的構造器(XmlBeanFactory)只能接收Resource接口了,所以調不出來是正常的事情,假設現在有一個文件hello.xml
          讀取方法

          1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的路徑去找文件
          2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//還會在classpath去找
          3:Resource fa = new FileSystemResource("hello.xml");
          ? ?BeanFactory factory=new XmlBeanFactory(fa);
          4:這個要設制classpath了,麻煩
           ?Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");
           ?BeanFactory factory=new XmlBeanFactory(res);
          好了,用了上面那種方法都可以調用getBean("your bean name")了,
          eg:?BeanFactory factory=new XmlBeanFactory(fa);
          ????? hello he=(hello)factory.getBean("hello");
          ????????????? he.getHello();
          posted @ 2006-06-08 09:12 阿成 閱讀(268) | 評論 (0)編輯 收藏
          5月中旬公司開運動會了,報了四百米,鉛球,接力。

          那天天氣很好,很熱鬧。投鉛球的現場很多人,都是懶得報別的項目,到那混的。

          我擠了半天,居然都沒扔上,沒人只扔兩次,只能繼續別的項目。

          下午跑四百時還挺熱鬧的,不過剛上班不到一年,身體大不如以前,都跑不動了。

          四個人跑第三

          后來,接力我們組的人沒找全,所以沒跑。不過,看到還是有很多很有實力的人。

          賽后還給了獎品。有的同事那個好幾個獎,好幾個項目都有名次。

          看來以后得經常堅持鍛煉。
          posted @ 2006-06-07 11:09 阿成 閱讀(271) | 評論 (1)編輯 收藏
          記住,一定要低調,剛會點東西就浮躁怎么行,要經常提醒自己低調,低調。

          明言:槍打出頭鳥,人怕出名豬怕壯。
          posted @ 2006-06-07 10:58 阿成 閱讀(218) | 評論 (0)編輯 收藏
          僅列出標題
          共10頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 东明县| 阳泉市| 榆树市| 威海市| 信丰县| 封开县| 沛县| 莆田市| 龙口市| 屏东市| 大田县| 庆安县| 密山市| 三门县| 南汇区| 张家川| 中阳县| 临漳县| 班玛县| 大埔区| 乐昌市| 象州县| 崇仁县| 麻阳| 仲巴县| 当涂县| 西充县| 诸暨市| 日喀则市| 潮安县| 南京市| 清新县| 呼图壁县| 衡东县| 镇坪县| 疏附县| 本溪市| 荥阳市| 婺源县| 江西省| 喀喇沁旗|