程序手記

          程序是我畢生的追求......
          隨筆 - 19, 文章 - 0, 評(píng)論 - 9, 引用 - 0
          數(shù)據(jù)加載中……

          2008年8月2日

          JSP基礎(chǔ) (文件上傳) 第二十二天

              把一個(gè)指定的文件上傳到服務(wù)器,通常依靠JSP技術(shù)完成,需要使用到兩個(gè)JSP頁(yè)面。第一個(gè)JSP頁(yè)面是選擇要上傳的文件,第二個(gè)JSP頁(yè)面是從客戶端獲取該文件里面的信息,并把這些信息以客戶端相同的格式保存在服務(wù)器端,該頁(yè)面主要為功能處理頁(yè)面。
              第一個(gè)頁(yè)面的實(shí)現(xiàn)必須含有FILE類型的表單,并且表單的enctype的屬性必須為"muldtipart/form-data"。
              第二個(gè)頁(yè)面要使用內(nèi)置對(duì)象request調(diào)用方法getInputStream()獲得一個(gè)輸入流,通過這個(gè)輸入流讀取客戶上傳的全部信息,如上傳文件的 名字,文件的大小,文件的類型。根據(jù)request所獲得的信息創(chuàng)建一個(gè)數(shù)據(jù)輸出流對(duì)象,把信息寫到一個(gè)指定的文件內(nèi)

              第一個(gè)文件內(nèi)容如下:
                  <body>
                      <form method="post" action="file_14.jsp" enctype="multipart/form-data">
                          <input type="file" name="file1" size="50" /><br>
                          <input type="submit" value="上傳" />
                      </form>

              第二個(gè)文件內(nèi)容如下:
                  <%@ page contentType="text/html; charset='utf-8'" %>
                  <%@ page import="java.io.*" %>
                  <%@ page import ="java.util.*"%>
                  <%@ page import="javax.servlet.*"%>
                  <%@ page import = "javax.servlet.http.*" %>
                  <body>
                  <%
                      int MAX_SIZE = 102400 * 102400;    //定義上傳文件的最大字節(jié)
                      String rootPath;    //創(chuàng)建跟路徑的保存變量
                      DataInputStream in = null;    //聲明文件讀入類
                      FileOutpubStream fileOut = null;    //
                      String remoteAddr = request.getRemoteAddr();    //取得客戶端的網(wǎng)絡(luò)地址
                      String servName = request.getServerName();    //獲得服務(wù)器的名字
                      out.print("serverName=" + serverName + "<br>");
                      out.print("request.getServletPath() = " + request.getServletPath() + "<br>")

          posted @ 2008-08-22 00:29 程序手記 閱讀(245) | 評(píng)論 (0)編輯 收藏

          JavaBean基礎(chǔ) (javabean簡(jiǎn)介) 第二十一天

              JavaBean是一個(gè)可重復(fù)使用、且跨平臺(tái)的軟件組件(SoftWare Component),它可以在軟件開發(fā)工具如:Borland JBuilder \ Oracle JDeveloper 或是 Sun ONE Studio 等等里,以可視化的開發(fā)方式來(lái)開發(fā)。
              首先,你可以將JAVABEAN視為一個(gè)黑盒子(Black Box),雖然知道這個(gè)軟件組件所具備的功能,卻不知其內(nèi)部是如何運(yùn)作的。筆者提供給讀者一個(gè)假象的情況:有一個(gè)黑盒子,只知道它上面有一個(gè)按鈕,你只要按下去經(jīng)過十分鐘,就會(huì)掉下一張一千元的鈔票,不過你看不見其內(nèi)部任何的構(gòu)造,而這就是JAVABEAN最重要的特性,它將許多的信息都封裝了起來(lái),用戶無(wú)需知道黑盒子如何產(chǎn)生出鈔票,只需知道按下那個(gè)按鈕,然后等十分鐘,超片就會(huì)自動(dòng)產(chǎn)生出來(lái)。
              一般而言,JAVABEAN可分為:有用戶接口(user interface)的javabean和沒有用戶接口的javabean,通常JSP是搭配沒有UI的JAVABEAN,因此后面所提到的JAVABEAN都知識(shí)單純處理一些食物,如:數(shù)據(jù)運(yùn)算,連接數(shù)據(jù)庫(kù)和數(shù)據(jù)處理,等等,至于有用戶接口的JAVABEAN部分,請(qǐng)讀者自己參考JAVABEAN的相關(guān)書籍。
              通常一個(gè)標(biāo)準(zhǔn)的JAVABEAN有如下幾項(xiàng)特性:
              (1)javabean是一個(gè)公開的(public)類;
              (2)javabean類必須有一個(gè)無(wú)傳入?yún)?shù)(zero-argument)的構(gòu)造函數(shù)(constructor);
              (3)取得或設(shè)置屬性時(shí),必須使用getXXX方法或setXXX方法。

          例子:
              package tw.com.javaworld.CH8;
              
              import java.io.*;
              
              public class SimpleBean{
                  public SimpleBean(){
                  }
                  private String name;
                  private String number;
                  
                  public void setNumber(String number){
                      this.number = number;
                  }
                  public String getName(){
                      return name;
                  }
              }

          posted @ 2008-08-21 23:09 程序手記 閱讀(508) | 評(píng)論 (0)編輯 收藏

          JSP基礎(chǔ) (JSP動(dòng)作元素) 第二十一天

              與JSP指令元素不同的是,JSP動(dòng)作元素在請(qǐng)求處理階段起作用。JSP動(dòng)作元素是試用XML語(yǔ)法寫成的,它可以采用以下兩種格式:
              <prefix:tag attribute = value attribute-list.../>
          或者
              <prefix:tag attribute = value attribute-list.../>
              ...
              </prefix.tag>
          SERVLET容器在處理JSP時(shí),每當(dāng)遇到這種動(dòng)作元素,都根據(jù)它的標(biāo)記進(jìn)行特殊處理。
          JSP規(guī)范定義了一系列的標(biāo)準(zhǔn)動(dòng)作,它用JSP作為前綴。這些標(biāo)準(zhǔn)的動(dòng)作不去慣容器是如何實(shí)現(xiàn)的,但是每個(gè)WEB容器都必須提供這些操作類型。標(biāo)準(zhǔn)動(dòng)作為網(wǎng)頁(yè)設(shè)計(jì)者提供了基本的功能,其他的廠商可以自由提供其他的非標(biāo)準(zhǔn)動(dòng)作以增強(qiáng)功能。
              標(biāo)準(zhǔn)動(dòng)作有:
          <jsp:useBean>
          <jsp:setProperty>
          <jsp:getProperty>
          <jsp:param>
          <jsp:include>
          <jsp:forward>
          <jsp:plugin>
          <jsp:fallback>
          <jsp:attribute>
          <jsp:body>
          <jsp:invoke>
          <jsp:doBody>
          <jsp:element>
          <jsp:output>
          <jsp:scriptelet>
          <jsp:declaration>等
          在標(biāo)準(zhǔn)動(dòng)作中,有許多是XML語(yǔ)法的動(dòng)作元素,比如<jsp:scriptelet> <jsp:declaration>但他們的使用并不廣泛,下面介紹JSP中主要的動(dòng)作元素。

          文件導(dǎo)入標(biāo)記<jsp:include>
          include用于允許在請(qǐng)求時(shí)間內(nèi)在縣城的JSP頁(yè)面里包含靜態(tài)或者動(dòng)態(tài)資源。被包含的對(duì)象只有對(duì)JSPWRITER對(duì)象的訪問權(quán),并且它不能設(shè)置頭或者COOKIE,如果頁(yè)面輸出是緩沖的,那么緩沖區(qū)的刷新要有限于包含的刷新。此指令在運(yùn)行的效率上比<%@ page include %>指令的效率低,但是可以動(dòng)態(tài)增加內(nèi)容。用戶可以通過一下的格式來(lái)使用文件導(dǎo)入標(biāo)記
              <jsp:include page="{relativeURL | <%=expression%>}" flush="true" />
              <jsp:include page="{relativeURL | <%=expression%>}" flush = "true" >
                  <jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"
              </jsp:include>

              例如:
              <jsp:include page="admin/login.jsp" />
              <jsp:include page="copyright.html" />
              <jsp:include page="admin/login.jsp">
                  <jsp:parame name = "username" value="JackLong" />
              </jsp:include>

          頁(yè)面轉(zhuǎn)向標(biāo)記<jsp:forward />
          實(shí)例:
              <jsp:forword page="showinfo.jsp" >
                  <jsp:param name = "username" value = "<%=request.getParameter("username")%>"/>
                  <jsp:param name = "telephone" value = "<%=request.getParameter("telephone")%>"/>
              </jsp:forword>

          posted @ 2008-08-21 05:20 程序手記 閱讀(484) | 評(píng)論 (0)編輯 收藏

          JSP基礎(chǔ) (獲取當(dāng)前時(shí)間) 第二十一天

              下面的代碼用于顯示當(dāng)前時(shí)間,并根據(jù)當(dāng)前是幾點(diǎn)輸出相應(yīng)的提示信息,其中,使用java.util.Date thisday=new java.util.Date();語(yǔ)句來(lái)取得當(dāng)前時(shí)間,然后通過相應(yīng)的方法取得年,月,日,時(shí)和分的信息并輸出:

          <% page contentType="text/html; charset=utf-8" import="java.util.*" %>
          <body>
          <%
          //獲取當(dāng)前的時(shí)間
          java.util.Date thisday = new java.util.Date();
          %>
          當(dāng)前時(shí)間:
          <%=thisday.getYear()+1900%>年
          <%=thisday.getMonth()+1%>月
          <%=thisday.getDate()%>日
          <%=thisday.getHours()%>時(shí)
          <%=thisday.getMinutes()%>分
          <%
          String str = "歡迎訪問:"
          int num = this.getHours();
          switch(num){
              case 8:
              case 9:
              case 10:
              case 11:
              {
                  out.print("歡迎你的訪問,上午好!");
                  break;
              }
              case 12:
              {
                  out.print("中午好!");
                  break;
              }
              case 13:
              case 14:
              case 15:
              case 16:
              case 17:
              case 18:
              {
                  out.print("下午好!");
                  break;
              }
          </body>

          posted @ 2008-08-21 04:23 程序手記 閱讀(1262) | 評(píng)論 (0)編輯 收藏

          JSP基礎(chǔ) (高級(jí)計(jì)數(shù)器實(shí)例) 第二十天

                                                                                     countFile.java
          public class countFile{
              public static void writeFile(String filename,long count){
                  PrintWriter out = new PrintWriter(new FileWriter(filename));
                  out.println(count);
                  out.close();
              }
              public static void readFile(String filename){
                  File f = new File(filename);
                  if(!f.exists()){
                      writeFile(filename,0);
                  }
                  BufferedReader in = new BufferedReader(new FileReader(f));
                  long count = Long.parseLong(in.readline());
                  return count;
              }
              public static String tranform(long count){
                  String countNumber = ""+count;
                  String newstring = "";
                  for(int i=0;i<countNumber.length;i++){
                      newstring+="<img src='images/"+countNumber.charAT(i)+".gif' >";
                  }
                  return newstring;
              }
          }

          posted @ 2008-08-20 05:19 程序手記 閱讀(181) | 評(píng)論 (0)編輯 收藏

          TOMCAT基礎(chǔ) (設(shè)定站點(diǎn)) 第十三天

              在Tomcat 上建立一個(gè) JSPBook站點(diǎn)時(shí),我們需要修改Tomcat的server.xml文件,server.xml位于{Tomcat_Install}\conf\server.xml(例如:e:\apache software foundation\tomcat 5.0\conf\server.xml)。

              server.xml
              
              ......
              <!--Tomcat Root Context-->

              <!--
                  <Context path="" docBase="ROOT" debug="0">
              -->
              <Context path="/JSPBook" docBase="JSPBook" debug="0" crosscontext = "true" reloadable="true" >
              </Context>
              </Host>
              </Engine>
              </Service>
              </server>

              這部分主要是設(shè)定JSPBOOK站點(diǎn),其中 path="/jspbook"代表網(wǎng)站名稱,即 http://ip_domainName/jspbook;
          docBase = "jspbook" 代表站點(diǎn)的目錄位置,debug則是設(shè)定debug lerel,0表示提供最少的信息,9表示提供最多的信息; reloadable則表示tomcat在執(zhí)行時(shí),當(dāng)class ,web.xml被更新過時(shí),都會(huì)自動(dòng)重新加載,不需要重新啟動(dòng)tomcat。

          posted @ 2008-08-13 17:36 程序手記 閱讀(164) | 評(píng)論 (0)編輯 收藏

          JAVA基礎(chǔ) (JAVA中的STATIC塊) 第十三天(對(duì)浪費(fèi)的前10天表示悔恨)

          Java 程序中時(shí)常用些 static{}這樣的結(jié)構(gòu)。
          這樣的結(jié)構(gòu)叫 static塊,一般是一個(gè)類初始化時(shí)運(yùn)行的代碼。注意,是類的初始化,不是對(duì)象的初始化。
          也就是你在定義對(duì)象時(shí),他運(yùn)行的初始化代碼,并且只有第一次定義時(shí)才運(yùn)行。之后就不再運(yùn)行初始化了。
          一個(gè)類中可以有很多static塊。static塊按順序執(zhí)行。

          看以下代碼:
          public class TestStatic{
              static{
                  System.out.println(1);
              }
              static {
                  System.out.println(2);
              }
              static {
                  Stystem.out.println(3);
              }
              public static void main(String args[]){
                  System.out.println(5);
              }
              static {
                  System.out.println(4);
              }
          }
          執(zhí)行結(jié)果是:
          1
          2
          3
          4
          5
          一目了然,首先調(diào)用的是static靜態(tài)塊的代碼,然后調(diào)用啟動(dòng)方法,而STATIC塊的執(zhí)行順序是由代碼的編寫順序執(zhí)行的過程,STATIC塊大家用的比較少,其實(shí)就是在對(duì)象生成之際產(chǎn)生的一系列的STATIC變量。

          posted @ 2008-08-13 16:22 程序手記 閱讀(346) | 評(píng)論 (0)編輯 收藏

          JAVA WEB開發(fā) (First Servlet Samlet Code) 第四天

          HelloServlet.java

          package tw.com.javaworld.CH2;

          import javax.servlet.*;
          import javax.servlet.http.*;
          import java.io.*;

          public class HelloServlet extends HttpServlet{
              //Initialize global variables
              public void init(ServletConfig config) throws ServletException{
                  super.init(config);
              }
              
              //Process the HTTP Get request
              public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
                  response.setContentType("text/html;charset=GB2312");
                  PrintWrite out = response.getWrite();
                  out.println("<html>");
                  out.println("<body>");
                  out.println("Hello World<br>");
                  out.println("大家好");
                  out.println("</body>");
                  out.println("</html>");
                  out.close();
              }

              //Get Servlet information
              public String getServletInfo(){
                  return "tw.com.javaworld.CH2.HelloServlet Information";
              }
          }

          posted @ 2008-08-04 18:15 程序手記 閱讀(240) | 評(píng)論 (0)編輯 收藏

          Java WEB開發(fā) (TomCat配置) 第四天

          Tomacat是一個(gè)WEB容器,所有的J2EE WEB程序可以在此處運(yùn)行。常見的WEB容器還有WebLogic、WebSphere。

          Tomcat的默認(rèn)端口號(hào)是8080,這個(gè)數(shù)值可以在安裝過程中修改也可以在conf/server.xml中修改。

          Tomcat是根據(jù)系統(tǒng)的%JAVA_HOME%變量值選擇系統(tǒng)中的JDK。

          Tomcat目錄主要文件夾作用

          • bin目錄:存放啟動(dòng)和關(guān)閉Tomcat的腳本
          • conf目錄:存放不同配置文件,其中比較重要的是server.xml(Tomcat的主要配置文件)和web.xml
          • work目錄:存放JSP編譯后的.class文件
          • webapps目錄:存放WEB應(yīng)用程序
          • lib目錄:存放所有需要的各種jar包

          配置Tomcat方式有兩種:手工配置--修改conf/server.xml文件、管理控制臺(tái)配置

          • 注意:修改server.xml之后要重新啟動(dòng)Tomcat服務(wù)器才能使配置生效

          配置虛擬目錄的要求

           

           

          • 修改server.xml文件
          • 虛擬目錄的結(jié)構(gòu)要符合要求
            • WebRoot
              • WEB-INF
                • web.xml
            • 其中web.xml的內(nèi)容一般為:

               


              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
              version="2.4">

              Welcome to Tomcat

              Welcome to Tomcat

          • 創(chuàng)建好虛擬目錄之后要在server.xml中之前添加一句 (大小寫敏感,修改完之后應(yīng)該重新啟動(dòng)Tomcat服務(wù)器使配置生效)

          若設(shè)置虛擬目錄后訪問目錄提示404錯(cuò)誤而可以運(yùn)行目錄下的jsp文件則說(shuō)明是目錄權(quán)限被禁用,可以修改conf/web.xml文件找到 將下面一行中的false改成true

          jsp文件的運(yùn)行過程: *.jsp  -->  *.java  -->  *.class  -->  運(yùn)行顯示 

          • *.class是第一次運(yùn)行生成后存放在work目錄下的,所以jsp文件第一次或者修改后首次運(yùn)行比較慢而后來(lái)再運(yùn)行的速度很快

          posted @ 2008-08-04 16:39 程序手記 閱讀(318) | 評(píng)論 (0)編輯 收藏

          JAVA基礎(chǔ) (嵌套類) 第四天

              Java允許將類的定義方在其他類的內(nèi)部,形成嵌套類。嵌套類使邏輯關(guān)系緊密的類組成一個(gè)整體,嵌套類可以用于訪問其所在的類的作用域。

          嵌套類可以訪問外部類似有成員。
              // OuterNested1.java
          public class OuterNested1{
              private int size;
              public class Nested{
                  public int doStuff(){
                      //嵌套類可以訪問OuterNested1類的似有成員 size 變量
                      return(size++);
                  }
              }
              public int testTheNested(){
                  Nested i = new Nested();
                  return(i.doStuff());
              }
          }

          //TestOuterNested1.java
          public class TestOuterNested1 {
              public static void main(String[] args){
                  outerNested1 outer = new OuterNested1();
                  System.out.println(outer.testTheNested());
              }
          }

          posted @ 2008-08-04 15:21 程序手記 閱讀(178) | 評(píng)論 (0)編輯 收藏

          JAVA基礎(chǔ) (包 與 Java API) 第二天 第四天

              建立Java包,布局源文件和設(shè)置classpath參數(shù)之間相互影響。也相互關(guān)聯(lián)。正確建立和導(dǎo)入JAVA包,合理布局源文件,準(zhǔn)確設(shè)置CLASSPATH參數(shù),才能保證應(yīng)用程序順利執(zhí)行,并有效管理應(yīng)用程序。

          包的建立方法
              Java包通過package語(yǔ)句建立,基本語(yǔ)法是:
                  package cn.edu.jmu.graphis;
              在定義類或接口的源文件開始處,通過package語(yǔ)句,可以將相應(yīng)的類或接口放入package所聲明的包里。包是相關(guān)類和接口的集合,提供了訪問級(jí)別控制和命名控件管理。

          包的使用方法
              每個(gè)源文件只能有一個(gè)包聲明,并且一定要求放在源文件的開始位置。如果一個(gè)源文件沒有包語(yǔ)句,則源文件所定義的類或接口唄系統(tǒng)放入默認(rèn)包中。包有層次,層次間由點(diǎn)分隔。
              例如有一組與圖形相關(guān)的類,包括Circles,Rectangles,Lines和points類等,描述了畫圖所用到的各種圖形組件,另有抽象類Graphic標(biāo)識(shí)圖形組件的共性,接口Draggable表示用戶可以通過鼠標(biāo)拖拽成圖的圖形組件。在這種情況下,我們不僅需要,而且也應(yīng)該將這些相關(guān)類和接口組成包,可命名為graphics如:

          //Graphics.java
          package graphics;
          public abstract class Graphic{
              ...
          }

          //Circle.java
          package graphics;
          public class Circle extends Graphic implements Draggable {
              ...
          }

          //Rectangle.java
          package graphics;
          public class Rectangle extends Graphic implements Draggable {
              ...
          }

          //Draggable.java
          package graphics;
          public interface Draggable{
              ...
          }
              通過創(chuàng)建和使用包,程序員不僅可以很容易地確定哪些類和接口是相關(guān)的,也可以很容易地找到提供特定功能的類和接口,例如,與畫圖有關(guān)的類和接口在graphics包中。

          包的訪問權(quán)限
              通過聲明類的訪問級(jí)別,可以控制對(duì)類的訪問權(quán)限。
              類的訪問級(jí)別分為默認(rèn)級(jí)和public級(jí)。定義類的默認(rèn)訪問級(jí)別不需要任何關(guān)鍵字,唄聲明為默認(rèn)級(jí)的類只對(duì)同一個(gè)包中的類是可視的。也就是說(shuō)只有同一個(gè)包內(nèi)的類實(shí)例可以訪問這個(gè)類,外界不能訪問它。如果用關(guān)鍵字public定義類,不但同一個(gè)包里的其他類可以訪問這個(gè)類,其他包中的類也可以訪問它。換句話說(shuō),同一個(gè)包中的類,相互之間有不受限制的訪問權(quán)限。而在不同包中,只有public類可以被訪問。
              public修飾符不知用于定義類的訪問控制級(jí)別,也可以應(yīng)用于接口,方法或變量。public 接口同public類一樣,可以由應(yīng)用程序中的任何類訪問。而public方法或public屬性對(duì)任何可以訪問他的類或接口都是可視的。
              除public修飾符之外,用于訪問控制的修飾符還有protected 和 private。
          protected 或 private 僅用來(lái)定義方法或變量的訪問控制級(jí)別。protected 方法或protected變量?jī)H對(duì)同一個(gè)包內(nèi)的類或不同包中的子類來(lái)說(shuō)是可視的。
          private方法和pvivate變量對(duì)外部定義的類均不可視。

          包的命名方式
              包提供了心的命名控件,即使所定義的類使用與其他包中的類相同的名字,只要包類所屬的包不同名,就不會(huì)引起沖突。原因是這些類的全程限定名稱不同。類的全程限定包含了類的各層包名。這實(shí)質(zhì)上是應(yīng)用了面向?qū)ο蟮母拍睿瑢㈩惙庋b入包中。

          包的訪問權(quán)限
              通過聲明類的訪問級(jí)別,可以控制對(duì)類的訪問權(quán)限。
              類的訪問級(jí)別分為默認(rèn)級(jí)和public級(jí)。定義類的默認(rèn)訪問級(jí)別不需要任何關(guān)鍵字,貝聲明為默認(rèn)級(jí)的類只對(duì)同一個(gè)包中的類是可視的。也就是說(shuō),只有同一個(gè)包內(nèi)的類實(shí)例可以訪問這個(gè)類,外界不能訪問它。如果用關(guān)鍵字public 定義類,不但同一個(gè)包里的其他類可以訪問這個(gè)類,其他包中的類也可以訪問它。換句話說(shuō),同一個(gè)包中的類,相互之間有不受限制的訪問權(quán)限。而在不同的包中,只有public類可以被訪問。
              public 修飾符不只用于定義類的訪問控制級(jí)別,也可以應(yīng)用于接口,方法和變量。public接口同public類一樣,可以由應(yīng)用程序中的任何類訪問。而public方法或public變量對(duì)任何可以訪問他的類或接口都是可視的。
              除public 修飾符之外,用于訪問控制的修飾符還有 protected 和private 。 protected或private僅用來(lái)定義方法或變量的訪問控制級(jí)別。protected方法或protected變量?jī)H對(duì)同一個(gè)包內(nèi)的類或不同包中的子類來(lái)說(shuō)是可視的。private方法和private變量對(duì)外部定義的類均不可視。需要說(shuō)明的是,通常不建議用默認(rèn)方式定義方法或成員變量的訪問級(jí)別。

                                
              對(duì)于沒有指定包名的java源文件,系統(tǒng)認(rèn)為他們都屬于同一個(gè)默認(rèn)的包。如果沒有把自己的Java類放入某個(gè)包中,那么任何默認(rèn)包里的對(duì)象都可以訪問它,并且不局限于同一個(gè)子目錄下,因此通常應(yīng)該在每個(gè)Java源文件的項(xiàng)目頂部使用 package語(yǔ)句,指明它所屬的包。

          訪問包成員
              對(duì)于包來(lái)說(shuō),只有它的public成員可貝外界訪問。若外界想要訪問包的public類,有3種方式可以實(shí)現(xiàn)。
              (1)通過類的全程限定名訪問該類。
              (2)通過import語(yǔ)句導(dǎo)入該類。
              (3)通過import語(yǔ)句導(dǎo)入整個(gè)包。
              如果某個(gè)類只貝訪問一次,那么可以直接使用類的全名。例如訪問cn.edu.jmu.graphics.Graphic類可以用一下方式:
              cn.edu.jmu.graphics.Graphic aGraph = new cn.edu.jmu.graphics.Graphic();
              這條語(yǔ)句創(chuàng)建了 cn.edu.jmu.graphics.Graphic類型的對(duì)象 aGraph。
              可以看到,即是指創(chuàng)建一個(gè)對(duì)象,在變量定義和初始化時(shí)也用到兩次全名。當(dāng)使用Java約定的包命名方式時(shí),包名可能過長(zhǎng),此時(shí)用起來(lái)就更顯得繁瑣,容易出錯(cuò),也影響可讀性。
              通常都應(yīng)該使用import語(yǔ)句直接導(dǎo)入所需類,或者導(dǎo)入該類所在的包。導(dǎo)入之后,程序中設(shè)計(jì)的這個(gè)類的地方就可以直接用類名訪問。
              import 的基本語(yǔ)法形式為:
              import <包名>[.<子包名>].<類名>;    //導(dǎo)入指定類
          或者:
              import <包名>[.<子包名>].*;    //導(dǎo)入整個(gè)包
          例如:
              import cn.edu.jmu.javaprogs.Timel;
              import cn.edu.jmu.javaprogs.*;
              import java.awt.*;
              import java.awt.event.*;

              import語(yǔ)句在package 語(yǔ)句之后,所有的類聲明之前。由于集中在程序首部,宜于直觀地了解程序所需的包,有助于維護(hù)程序的可移植性。
              import 語(yǔ)句中的 * 用來(lái)匹配包中的所有類,但并不能用來(lái)匹配包中的所有類的某個(gè)子集。如語(yǔ)句
              import java.awt.*;
              導(dǎo)入java.awt包中的所有類。如果這樣的語(yǔ)句
              import java.awt.A*;
              它無(wú)法導(dǎo)入java.awt句中首字母為A的所有子類,相反還會(huì)出現(xiàn)編譯錯(cuò)誤,也就是說(shuō),使用import語(yǔ)句一次只能導(dǎo)入包的單一成員,或者導(dǎo)入整個(gè)包。
              還有語(yǔ)句
              import java.awt.*;
              所導(dǎo)入的是java.awt包中的所有類,它包括接口。但不包括java.awt包中的子包。如果需要訪問java.awt.event子包中的類,仍需要用 import語(yǔ)句導(dǎo)入 java.awt.event子包。所以常常使用如下形式:
              import java.awt.*;
              import java.awt.event.*;

            

          包的布局
              類的全程受名稱與類所在目錄一一對(duì)應(yīng),例如:
              import graphics.Rectangle    等同于文件路徑名:
              Graphics\Rectangle.java


          classpath參數(shù)
              classpath參數(shù)用于設(shè)置Java包所在的頂級(jí)目錄。也就是說(shuō),通過classpath可以為Java包建立所依存的目錄列表。編譯和運(yùn)行Java 程序時(shí),系統(tǒng)會(huì)自動(dòng)從classpath環(huán)境變量中讀取包所在的目錄,文件所在目錄由系統(tǒng)通過classpath中的目錄和package語(yǔ)句中定義的目錄合成。
              下面通過一個(gè)完整的實(shí)例程序,說(shuō)明classpath參數(shù)的作用,同時(shí)展示源文件和字節(jié)碼文件的一種建議布局模式。
              程序包含兩個(gè)類 Time 和 TestTime,TestTime為主類。程序?qū)τ脩糨斎氲谋硎拘r(shí)、分鐘和秒鐘的3個(gè)整型數(shù),經(jīng)過數(shù)據(jù)正確性驗(yàn)證,分別轉(zhuǎn)換為通用時(shí)間表示格式和標(biāo)準(zhǔn)時(shí)間表示格式,通過對(duì)話框顯示給用戶,運(yùn)行后如圖:
                                                                                

              文件布局方式如下:創(chuàng)建 d:\javaSample 目錄存放java程序,創(chuàng)建 d:\javaSample\src 子目錄存放源文件,創(chuàng)建d:\javaSample\class 子目錄存放編譯后的字節(jié)碼文件。 具體實(shí)現(xiàn)方式是將文件 TestTime.java 存放在 D:\javaSample\src 子目錄下,為使 src 子目錄的結(jié)構(gòu)與 class 子目錄結(jié)構(gòu)相對(duì)應(yīng),創(chuàng)建 D:\javaSample\src\cn\edu\jmu\timer 子目錄存放 Time.java文件。類Time和類TestTime的布局如圖:
                                        
              Time.java中的語(yǔ)句
              package cn.edu.jmu.timer;
              將Time類放入包c(diǎn)n.edu.jmu.timer中,源文件Time.java存放在與包相對(duì)應(yīng)的目錄結(jié)構(gòu)下。在類TestTime.java中通過語(yǔ)句   import cn.edu.jmu.timer.Time;   導(dǎo)入Time類。
              需要設(shè)置classpath參數(shù),規(guī)定程序中的包    cn.edu.jmu.timer 編譯所依存的頂級(jí)目錄為 d:\javaSample\class,如:
                          set classpath = d:\javaSample\class;
              編譯:
                  javac -d d:\javaSample\class
                  d:\javaSample\src\cn\edu\jmu\timer\Time.java 
                  javac -d d:\javaSample\class d:\javaSample\src\TestTime.java
              運(yùn)行:
                  java TestTime

          posted @ 2008-08-03 00:40 程序手記 閱讀(358) | 評(píng)論 (0)編輯 收藏

          JAVA面向?qū)ο缶幊?(接口) 第二天

              接口是JAVA語(yǔ)言中非常重要的概念,回調(diào)是軟件設(shè)計(jì)中常用的模式。JAVA的接口不僅可以用來(lái)實(shí)現(xiàn)多繼承關(guān)系,也用來(lái)實(shí)現(xiàn)回調(diào)機(jī)制。 java.lang.Comparable 接口和 java.util.Comparator 接口是進(jìn)行數(shù)據(jù)對(duì)象比較和排序中需要實(shí)現(xiàn)的接口,他們?cè)诠δ芎褪褂梅椒ㄉ隙加兴煌?br />
              當(dāng)類只從一個(gè)類繼承時(shí)稱為單繼承,JAVA語(yǔ)言只允許單繼承。如果需要多繼承關(guān)系,可以通過JAVA語(yǔ)言中的接口實(shí)現(xiàn)。
              抽象方法只有方法定義,沒有方法體,如果一個(gè)類包含任何抽象方法,包括直接的和繼承所得,則這個(gè)類必須是抽象的。如果一個(gè)類是抽象的,則不能創(chuàng)建此類的對(duì)象。抽象類強(qiáng)制要求他的所有子類重寫自己的方法以覆蓋抽象方法。
              如果存在超類 Animal,顯然cat同時(shí)具有 Animal和pet的特性,就是說(shuō),cat不只是一個(gè)animal還是一個(gè)pet,除需要繼承animal類,還期望能實(shí)現(xiàn)pet類。因?yàn)镴AVA只允許單繼承,CAT不能繼承animal又繼承pat,解決這個(gè)問題的方法是定義接口,并通過接口實(shí)現(xiàn)多繼承。

          定義接口
              我們把只有抽象方法和常量的抽象類稱為接口,接口形式化定義了一組相互有關(guān)系的未實(shí)現(xiàn)的方法。接口的定義包括接口聲明和接口體。
          接口聲明的語(yǔ)法為:[public] interface 接口名 [extends 父接口名] {。。。。。。}
              EXTENDS子句與類聲明的extends子句基本相同,不同的是:一個(gè)接口可以有多個(gè)父接口,用逗號(hào)隔開,而一個(gè)類只能有一個(gè)父類。
              接口體包括常量和抽象方法。
             
          接口Pet示例:

              interface Pet{
                  public abstract void speak();
              }
              public class Dog implements Pet{
                  public void speak(){
                      System.out.println("Woof");
                  }
              }
              public class Cat implements Pet{
                  public void speak(){
                      System.out.println("Meow");
                  }
              }
              public class Bird implements Pet{
                  public void speak(){
                      System.out.println("Tweedle");
                  }
              }
              public class TestAnimals{
                  public static void main(String args[]){
                      Pet myPets = new Pet[4];
                      myPets[0] = new Bird();
                      myPets[1] = new Cat();
                      myPets[2] = new Bird();
                      myPets[3] = new Dog();
                      
                      for(int index = 0; index<4; index++){
                          myPets[index].speak();
                      }
                  }
              }


              類Bird ,Cat 和 Dog 與 Pet 不再具有父子關(guān)系,而分別是實(shí)現(xiàn)了接口Pet的類。
              一個(gè)接口的定義由關(guān)鍵字 interface 開始,包括一套 public ,abstract 方法,接口也可以包含 public ,final,static數(shù)據(jù)。一個(gè)期望使用接口的類必須將自己聲明為 implements 接口,并重寫接口定義的每個(gè)方法,保證參數(shù)列表及返回類型與接口中所定義的相一致。簡(jiǎn)單說(shuō),強(qiáng)制要求實(shí)現(xiàn)接口的類覆蓋接口的方法。
              如果一個(gè)類沒有覆蓋接口定義中的全部方法,那么這個(gè)類就稱為抽象類,必須貝聲明為 abstract。

          用Cat類繼承Animal 類 和 定義Pet接口的示例:
          public class Cat extends Animal implements Pet{
              public void speak(){//實(shí)現(xiàn)
          }
          }

          posted @ 2008-08-02 18:01 程序手記 閱讀(249) | 評(píng)論 (0)編輯 收藏

          JAVA (繼承,封裝,多態(tài),接口) 第二天

              面向?qū)ο蟮姆治雠c設(shè)計(jì)(OOA&D)方法是一種非常成熟的技術(shù)。也是當(dāng)前商業(yè)公司經(jīng)常使用的一種技術(shù),因?yàn)镴AVA語(yǔ)言本身就是一種面向?qū)ο蟮恼Z(yǔ)言,所以掌握面向?qū)ο筮@種技術(shù)對(duì)于JAVA語(yǔ)言的應(yīng)用具有重要意義。

          繼承(inheritance)
              繼承是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。這種技術(shù)使得復(fù)用以前的代碼非常容易,能夠大大縮短開發(fā)周期,降低開發(fā)費(fèi)用。比如可以先定義一個(gè)類叫車,車有以下屬性:車體大小,顏色,方向盤,論壇,而又由車這個(gè)類派生出教程和卡車兩個(gè)類,為轎車添加一個(gè)小后備箱,而為卡車添加一個(gè)大貨箱。

          封裝(encapsulation)
              類使得數(shù)據(jù)和對(duì)數(shù)據(jù)的操作集成在一起,從而對(duì)使用該類的其他人來(lái)說(shuō),可以不管它的實(shí)現(xiàn)方法,而只管用它的功能,從而實(shí)現(xiàn)所謂的信息隱藏。

          多態(tài)(polymorphism)
              多態(tài)又分為設(shè)計(jì)時(shí)多態(tài)和運(yùn)行時(shí)多態(tài),例如重載又被稱為設(shè)計(jì)時(shí)多態(tài),而對(duì)于覆蓋或繼承的方法,JAVA運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例的類型來(lái)決定選擇調(diào)用哪個(gè)方法則被稱為運(yùn)行時(shí)多態(tài)。總而言之,面向?qū)ο蟮脑O(shè)計(jì)的典型特點(diǎn)就是繼承,封裝和多態(tài),這些特點(diǎn)也是面向?qū)ο笾阅苋绱耸⑿械年P(guān)鍵所在。

          單繼承與多繼承
              JAVA不支持多重繼承,單繼承使JAVA的繼承關(guān)系很簡(jiǎn)單,一個(gè)類只能有一個(gè)父類,易于管理程序,同時(shí)一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,從而克服單繼承的缺點(diǎn)。

              接口的定義和類的定義很相似,只是關(guān)鍵字不同,關(guān)鍵字為interface。生命格式如下:
          interface 接口名
          {
          }
              上面的大括號(hào)中為接口體。接口體中包含成員變量定義和方法定義兩部分。
              接口體中只進(jìn)行方法的聲明,不允許提供方法的實(shí)現(xiàn)。所以在格式上只存在方法聲明,實(shí)際上沒有方法體,而方法體要在實(shí)現(xiàn)的類中再去具體定義。
              還有一點(diǎn)需要說(shuō)明的是:如果一個(gè)類使用了某個(gè)接口,就必須要實(shí)現(xiàn)這個(gè)接口的所有方法,即使實(shí)在沒有內(nèi)容只是一個(gè)空的方法體也不許要寫。而且每個(gè)方法都默認(rèn)是public的,所以實(shí)現(xiàn)時(shí)代碼一定要用public做修飾,參數(shù)個(gè)數(shù),類型以及返回值的類型都必須與接口中的聲明相一致。
          例如:
              interface Runable
              {
              }
              當(dāng)某個(gè)類要實(shí)現(xiàn)這個(gè)接口時(shí),就用 imlements 來(lái)聲明。
              例如,我們相做一個(gè)多線程的例子,那么就可有兩種實(shí)現(xiàn)方式,一種是通過定義一個(gè)Thread類的子類來(lái)實(shí)現(xiàn),另一種是通過實(shí)現(xiàn)Runable接口來(lái)實(shí)現(xiàn)。代碼如下(這里的PrintHello類就是通過實(shí)現(xiàn)Runable接口來(lái)實(shí)現(xiàn)的,而不是擴(kuò)展Thread稱為他的子類):

          import java.lang.*;

          class TestThread
          {
              public static void main(String args[])
              {
                  try{
                      printHello ph = new PrintHello();
                      Thread Tph = new Thread(ph);
                      for(;;){
                          System.out.println("I'm main");
                          Thread.sleep(100);
                      }
                  }
                  catch(Exception e){
                      e.printStackTrace();
                  }
              }
          }

          class PrintHello implements Runnable
          {
              public void run(){
                  try{
                      for(;;){
                          System.out.println("I'm hello");
                      }
                  }
                  catch(Exception e){
                      e.printStackTrace();
                  }
              }
          }

          posted @ 2008-08-02 16:34 程序手記 閱讀(7210) | 評(píng)論 (0)編輯 收藏

          JAVA基礎(chǔ) (數(shù)據(jù)類型轉(zhuǎn)換) 第二天

              很多場(chǎng)合都要用到類型轉(zhuǎn)換,JAVA的類型轉(zhuǎn)換有下列兩種。

          自動(dòng)類型轉(zhuǎn)換

              整型,實(shí)型,字符型數(shù)據(jù)可以混合運(yùn)算。在運(yùn)算過程中,不同類型的數(shù)據(jù)會(huì)自動(dòng)轉(zhuǎn)換為同一類型,然后進(jìn)行運(yùn)算。自動(dòng)轉(zhuǎn)換按低級(jí)類型數(shù)據(jù)轉(zhuǎn)換成高級(jí)類型數(shù)據(jù)的規(guī)則進(jìn)行,
          轉(zhuǎn)換規(guī)則為:
          (1)(byte 或 short)op int -> int
          (2)(byte 或 short 或 int) op long -> long
          (3)(byte 或 short 或 int 或 long) op float -> float
          (4)(byte 或 short 或 int 或 long 或 float)op double ->double
          (5)char op int ->int

          其中,箭頭左邊表示參與運(yùn)算的數(shù)據(jù)類型,op為運(yùn)算符如加減乘除等,右邊表示運(yùn)算結(jié)果的數(shù)據(jù)類型。
          如: 3+4.5 是 double型,所以3貝轉(zhuǎn)換為double型,然后再與4.5相加,其結(jié)果也為double型。

          強(qiáng)制類型轉(zhuǎn)換

              高級(jí)數(shù)據(jù)類型你個(gè)要轉(zhuǎn)換成低級(jí)數(shù)據(jù)類型,需要用到強(qiáng)制類型轉(zhuǎn)換。其一般形式為:
          (類型名)表達(dá)式
          例如:
              int i;
              byte b;
              i = 356;
              b=(byte)i; //強(qiáng)制轉(zhuǎn)換吼丟失一部分?jǐn)?shù)據(jù),使得b的值為100
              一般使用強(qiáng)制類型轉(zhuǎn)換可能會(huì)導(dǎo)致數(shù)值溢出或精度下降,應(yīng)盡量避免。

          posted @ 2008-08-02 15:18 程序手記 閱讀(161) | 評(píng)論 (0)編輯 收藏

          JAVA類型 (String類 和 StringBuffer類) 第二天

          String 類

              String 類提供了幾種字符串創(chuàng)建方法。

              String s = "abcd" 使用字符串常量自動(dòng)創(chuàng)建String實(shí)例。
              String s = new String(String s)通過String 對(duì)象或字符串常量傳遞給構(gòu)造方法。
              public String (char value[],int offset, int count)將字符數(shù)組一部分賦給String 構(gòu)造方法,offset 為起始下表, count 為數(shù)組長(zhǎng)度。



              String 類提供了豐富的字符串操作方法,其中重要的例舉如下。

              public int lenght() 返回字符串的長(zhǎng)度。
              public char charAt(int index) 返回字符串位置index處的字符。
              public boolean equals(Object o) 比較兩個(gè)字符串對(duì)象,相等則返回true;反之返回false。
              public int compareTo(String s) 比較兩個(gè)字符串字典順序,相等返回0,s大于當(dāng)前字符串返回一個(gè)負(fù)值,s小于當(dāng)前串返回一個(gè)正值。
              public boolean regionMatches(int toffset,String other,int ooffset,int len)從當(dāng)前字符串位置toffset開始尋找字符串other中起始位置為ooffset 長(zhǎng)度為len 的子串。如發(fā)現(xiàn)匹配,返回true; 否則,返回false。
              public boolean startsWith(String prefix) 從當(dāng)前字符串的起始位置開始尋找字符串 prefix。如發(fā)現(xiàn)匹配,返回true;否則,返回false。
              public boolean endsWith(String suffix) 如當(dāng)前字符串的結(jié)尾子串與 suffix 匹配,返回true;否則,返回false。
              public int indexOf(String str) 在當(dāng)前字符串中尋找與str匹配的子串,返回首次匹配的起始下表值;無(wú)匹配返回-1。
              public String substring(int beginIndex,int endIndex) 在當(dāng)前字符串中,求從起始位置 beginIndex 到結(jié)束位置 endIndex 的子串。
              public String concat(String str) 將當(dāng)前字符串與str連接,返回連接后的字符串。
              public String toLowerCase() 將當(dāng)前字符串全轉(zhuǎn)換為小寫形式。
              public String toUpperCase() 將當(dāng)前字符串轉(zhuǎn)換為大寫形式。
              public char toCharArray() 將當(dāng)前字符串轉(zhuǎn)換為字符數(shù)組。
              public Static String valueOf(type variable) 把variable 轉(zhuǎn)換為字符串,其中 type 表示 variable 的數(shù)據(jù)類型。






          StringBuffer類

              String類實(shí)現(xiàn)一種不能改變的靜態(tài)字符串,StringBuffer類實(shí)現(xiàn)一種動(dòng)態(tài)可以改變的字符串。StringBuffer類可以用于創(chuàng)建String類,StringBuffer一旦建立,可以用toString()方法將其轉(zhuǎn)換為String類,以后,就可以使用String 類方法來(lái)操作。 
              
              StringBuffer 類提供了三種創(chuàng)建方法。

              public StringBuffer()    創(chuàng)建一個(gè)空的StringBuffer類。
              public StringBuffer(int length)    創(chuàng)建一個(gè)大小為length的StringBuffer類。
              public StringBuffer(String str)    按str創(chuàng)建一個(gè)動(dòng)態(tài)可變的StringBuffer類。


              StringBuffer    類提供的方法主要用于把輸入的數(shù)據(jù)轉(zhuǎn)換為String類。輸入數(shù)據(jù)可來(lái)自鍵盤或其他數(shù)據(jù)源。類型可以是字符,字符數(shù)組,證書,浮點(diǎn)數(shù)和Object類型等。

              public int length()    返回緩沖區(qū)的字符數(shù)
              public int capacity()    返回緩沖區(qū)的容量大小,其值為:字符串長(zhǎng)度+16。
              public synchronized StringBuffer append(type variable)    把variable轉(zhuǎn)換為字符串,然后與當(dāng)前字符串連接。
              public synchronized StringBuffer append(Char(char ch))    把字符ch連接到當(dāng)前串尾。
              public synchronized StringBuffer insert(int offset,type variable)    把variable轉(zhuǎn)換為字符串,然后插入到當(dāng)前串中由offset指定的位置。
              public synchronized StringBuffer insert(int offset,char ch)    把字符 ch 插入到當(dāng)前串由ofset指定的位置。
              public synchronized String toString()    把StringBuffer轉(zhuǎn)換為字符串String。各個(gè)方法的使用,具體請(qǐng)參閱 JAVA API文檔。

          posted @ 2008-08-02 11:57 程序手記 閱讀(708) | 評(píng)論 (0)編輯 收藏

          JAVA程序的執(zhí)行 (OBJECT類) 第二天

              Object類是JAV類庫(kù)中的一個(gè)特殊的類,它是類庫(kù)中所有類的父類,也是用戶自定義的所有類的直接或間接父類。也就是說(shuō),用戶定義的所有類在默認(rèn)情況下都是Object類的子類,無(wú)論用戶是否顯示生命Object類作為自己定義的類的父類。這是系統(tǒng)自動(dòng)完成的,由此,通過把Object類稱為通用超類。
              Object類中的成員方法恰好都是方法,其中有7個(gè)public類型的,2個(gè)protected類型的。用戶自定義的所有類都將繼承這些方法。Object類中的7個(gè)public類型的方法分別是tostring(0方法,equals()方法,getclass()方法,含水層哦的()方法,notify()方法,notifyall()方法,和wait()方法,2個(gè)protected類型的方法是clone()方法和finalize()方法。
              其中toString()方法和equals()方法較為常用
          toString()方法 較為簡(jiǎn)單,略過。
          equals()方法
              Object類的equals()方法用戶比較以參數(shù)傳過來(lái)的對(duì)象和當(dāng)前對(duì)象,如果他們是相同的對(duì)象(不僅是相等,而且必須是同一個(gè)對(duì)象),則返回true;如果他們是不同的對(duì)象,即使兩者的數(shù)據(jù)成員相等,也將返回false。

          equals()方法的格式
          test t = new test();
          test t2 = new test();

          if(t.equals(t2)){
              true;
          }else{
              false;
          }

          posted @ 2008-08-02 11:18 程序手記 閱讀(161) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 阿瓦提县| 兴隆县| 惠安县| 富蕴县| 聊城市| 翼城县| 玛多县| 汪清县| 金湖县| 瑞昌市| 泰宁县| 盘山县| 文安县| 凤翔县| 泰安市| 翁牛特旗| 和硕县| 蕲春县| 新巴尔虎右旗| 政和县| 建水县| 敦化市| 裕民县| 乌拉特中旗| 昌都县| 东光县| 伊川县| 西林县| 阿克苏市| 吉水县| 常德市| 靖州| 科技| 大名县| 沙湾县| 定日县| 思茅市| 鹤壁市| 海盐县| 临汾市| 左贡县|