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

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

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

    JDOM是一個開源項目,它基于樹型結構,利用純JAVA的技術對XML文檔實現解析、生成、序列化以及多種操作。

    一、JDOM 簡介

    JDOM是一個開源項目,它基于樹型結構,利用純JAVA的技術對XML文檔實現解析、生成、序列化以及多種操作。

    JDOM 直接為JAVA編程服務。它利用更為強有力的JAVA語言的諸多特性(方法重載、集合概念以及映射),把SAX和DOM的功能有效地結合起來。

    在使用設計上盡可能地隱藏原來使用XML過程中的復雜性。利用JDOM處理XML文檔將是一件輕松、簡單的事。

    JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter開發出來,以彌補DOM及SAX在實際應用當中的不足之處。

    這些不足之處主要在于SAX沒有文檔修改、隨機訪問以及輸出的功能,而對于DOM來說,JAVA程序員在使用時來用起來總覺得不太方便。

    DOM的缺點主要是來自于由于Dom是一個接口定義語言(IDL),它的任務是在不同語言實現中的一 個最低的通用標準,并不是為JAVA特別設計的。JDOM的最新版本為JDOM Beta 9。最近JDOM被收錄到JSR-102內,這標志著JDOM成為了JAVA平臺組成的一部分。

    二、JDOM 包概覽

    JDOM是由以下幾個包組成的
    org.jdom                包含了所有的xml文檔要素的java類

     

    org.jdom.adapters         包含了與dom適配的java類

     

    org.jdom.filter            包含了xml文檔的過濾器類

     

    org.jdom.input            包含了讀取xml文檔的類

     

    org.jdom.output           包含了寫入xml文檔的類

     

    org.jdom.transform        包含了將jdom xml文檔接口轉換為其他xml文檔接口

     

    org.jdom.xpath            包含了對xml文檔xpath操作的類三、JDOM 類說明

    1、org.JDOM這個包里的類是你J解析xml文件后所要用到的所有數據類型。

    Attribute

    CDATA

    Coment

    DocType

    Document

    Element

    EntityRef

    Namespace

    ProscessingInstruction

    Text

    2、org.JDOM.transform在涉及xslt格式轉換時應使用下面的2個類

    JDOMSource

    JDOMResult

    org.JDOM.input

    3、輸入類,一般用于文檔的創建工作

    SAXBuilder

    DOMBuilder

    ResultSetBuilder

    org.JDOM.output

    4、輸出類,用于文檔轉換輸出

    XMLOutputter

    SAXOutputter

    DomOutputter

    JTreeOutputter

    使用前注意事項:

    1.JDOM對于JAXP 以及 TRax 的支持

    JDOM 支持JAXP1.1:你可以在程序中使用任何的parser工具類,默認情況下是JAXP的parser。

    制定特別的parser可用如下形式

    SAXBuilder parser

      = new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");

     Document doc = parser.build("http://www.cafeconleche.org/");

     // work with the document...

    JDOM也支持TRaX:XSLT可通過JDOMSource以及JDOMResult類來轉換(參見以后章節)

    2.注意在JDOM里文檔(Document)類由org.JDOM.Document 來表示。這要與org.w3c.dom中的Document區別開,這2種格式如何轉換在后面會說明。

    以下如無特指均指JDOM里的Document。

    四、JDOM主要使用方法

    1.Ducument類

    (1)Document的操作方法:

    Element root = new Element("GREETING");

    Document doc = new Document(root);

    root.setText("Hello JDOM!");

    或者簡單的使用Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));

    這點和DOM不同。Dom則需要更為復雜的代碼,如下:

    DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

    DocumentBuilder builder =factory.newDocumentBuilder();

    Document doc = builder.newDocument();

    Element root =doc.createElement("root");

    Text text = doc.createText("This is the root");

    root.appendChild(text);

    doc.appendChild(root);

    注意事項:JDOM不允許同一個節點同時被2個或多個文檔相關聯,要在第2個文檔中使用原來老文檔中的節點的話。首先需要使用detach()把這個節點分開來。

    (2)從文件、流、系統ID、URL得到Document對象:

    DOMBuilder builder = new DOMBuilder();

    Document doc = builder.build(new File("jdom_test.xml"));

    SAXBuilder builder = new SAXBuilder();

    Document doc = builder.build(url);

    在新版本中DOMBuilder 已經Deprecated掉 DOMBuilder.builder(url),用SAX效率會比較快。

    這里舉一個小例子,為了簡單起見,使用String對象直接作為xml數據源:

     public jdomTest() {

        String textXml = null;

        textXml = "<note>";

        textXml = textXml +

            "<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";

        textXml = textXml + "</note>";

        SAXBuilder builder = new SAXBuilder();

        Document doc = null;

        Reader in= new StringReader(textXml);

        try {

          doc = builder.build(in);

          Element root = doc.getRootElement();

          List ls = root.getChildren();//注意此處取出的是root節點下面的一層的Element集合

          for (Iterator iter = ls.iterator(); iter.hasNext(); ) {

            Element el = (Element) iter.next();

            if(el.getName().equals("to")){

             System.out.println(el.getText());

            }

          }

        }

        catch (IOException ex) {

          ex.printStackTrace();

        }

        catch (JDOMException ex) {

          ex.printStackTrace();

        }

      }

    (3)DOM的document和JDOM的Document之間的相互轉換使用方法,簡單!

    DOMBuilder builder = new DOMBuilder();

    org.jdom.Document jdomDocument = builder.build(domDocument);

    DOMOutputter converter = new DOMOutputter();// work with the JDOM document…

    org.w3c.dom.Document domDocument = converter.output(jdomDocument);

    // work with the DOM document…

    2.XML文檔輸出

    XMLOutPutter類:

    JDOM的輸出非常靈活,支持很多種io格式以及風格的輸出

    Document doc = new Document(...);

    XMLOutputter outp = new XMLOutputter();

    outp.output(doc, fileOutputStream); // Raw output

    outp.setTextTrim(true); // Compressed output

    outp.output(doc, socket.getOutputStream());

    outp.setIndent(" ");// Pretty output

    outp.setNewlines(true);

    outp.output(doc, System.out);

    詳細請參閱最新的JDOM API手冊

    3.Element 類:

    (1)瀏覽Element樹

    Element root = doc.getRootElement();//獲得根元素element

    List allChildren = root.getChildren();// 獲得所有子元素的一個list

    List namedChildren = root.getChildren("name");// 獲得指定名稱子元素的list

    Element child = root.getChild("name");//獲得指定名稱的第一個子元素

    JDOM給了我們很多很靈活的使用方法來管理子元素(這里的List是java.util.List)

    List allChildren = root.getChildren();

    allChildren.remove(3); // 刪除第四個子元素

    allChildren.removeAll(root.getChildren("jack"));// 刪除叫“jack”的子元素

    root.removeChildren("jack"); // 便捷寫法

    allChildren.add(new Element("jane"));// 加入

    root.addContent(new Element("jane")); // 便捷寫法

    allChildren.add(0, new Element("first"));

    (2)移動Elements:

    在JDOM里很簡單

    Element movable = new Element("movable");

    parent1.addContent(movable); // place

    parent1.removeContent(movable); // remove

    parent2.addContent(movable); // add

    在Dom里

    Element movable = doc1.createElement("movable");

    parent1.appendChild(movable); // place

    parent1.removeChild(movable); // remove

    parent2.appendChild(movable); // 出錯!

    補充:糾錯性

    JDOM的Element構造函數(以及它的其他函數)會檢查element是否合法。

    而它的add/remove方法會檢查樹結構,檢查內容如下:

    1.在任何樹中是否有回環節點

    2.是否只有一個根節點

    3.是否有一致的命名空間(Namespaces)

    (3)Element的text內容讀取

    <description>

    A cool demo

    </description>

    // The text is directly available

    // Returns "\n A cool demo\n"

    String desc = element.getText();

    // There's a convenient shortcut

    // Returns "A cool demo"

    String desc = element.getTextTrim();

    (4)Elment內容修改

    element.setText("A new description");

    3.可正確解釋特殊字符

    element.setText("<xml> content");

    4.CDATA的數據寫入、讀出

    element.addContent(new CDATA("<xml> content"));

    String noDifference = element.getText();

    混合內容

    element可能包含很多種內容,比如說

    <table>

    <!-- Some comment -->

    Some text

    <tr>Some child element</tr>

    </table>

    取table的子元素tr

    String text = table.getTextTrim();

    Element tr = table.getChild("tr");

    也可使用另外一個比較簡單的方法

    List mixedCo = table.getContent();

    Iterator itr = mixedCo.iterator();

    while (itr.hasNext()) {

    Object o = i.next();

    if (o instanceof Comment) {...}

    // 這里可以寫成Comment, Element, Text, CDATA,ProcessingInstruction, 或者是EntityRef的類型

    }

    // 現在移除Comment,注意這里游標應為1。這是由于回車鍵也被解析成Text類的緣故,所以Comment項應為1。

    mixedCo.remove(1);

    4.Attribute類

    <table width="100%" border="0"> </table>

    String width = table.getAttributeValue("width");//獲得attribute

    int border = table.getAttribute("width").getIntValue();

    table.setAttribute("vspace", "0");//設置attribute

    table.removeAttribute("vspace");// 刪除一個或全部attribute

    table.getAttributes().clear();

    5.處理指令(Processing Instructions)操作

    一個Pls的例子

    <?br?>

    <?cocoon-process type="xslt"?>

              |        |

              |        |

            目標     數據

    處理目標名稱(Target)

    String target = pi.getTarget();

    獲得所有數據(data),在目標(target)以后的所有數據都會被返回。

    String data = pi.getData();

    String type = pi.getValue("type");獲得指定屬性的數據

    List ls = pi.getNames();獲得所有屬性的名稱

    6.命名空間操作

    <xhtml:html

     xmlns:xhtml="http://www.w3.org/1999/xhtml">

    <xhtml:title>Home Page</xhtml:title>

    </xhtml:html>

    Namespace xhtml = Namespace.getNamespace("xhtml", "http://www.w3.org/1999/xhtml");

    List kids = html.getChildren("title", xhtml);

    Element kid = html.getChild("title", xhtml);

    kid.addContent(new Element("table", xhtml));

    7.XSLT格式轉換

    使用以下函數可對XSLT轉換

    最后如果你需要使用w3c的Document則需要轉換一下。

    public static Document transform(String stylesheet,Document in)

                                            throws JDOMException {

         try {

           Transformer transformer = TransformerFactory.newInstance()

                                 .newTransformer(new StreamSource(stylesheet));

           JDOMResult out = new JDOMResult();

           transformer.transform(new JDOMSource(in), out);

           return out.getDeocument();

         }

         catch (TransformerException e) {

           throw new JDOMException("XSLT Trandformation failed", e);

         }

       }

    五、用例:

    1、生成xml文檔:

     

     

    public class WriteXML{

        public void BuildXML() throws Exception {

            Element root,student,number,name,age;        

            root = new Element("student-info"); //生成根元素:student-info

            student = new Element("student"); //生成元素:student(number,name,age)                            

            number = new Element("number");

            name = new Element("name");

            age = new Element("age");

            Document doc = new Document(root); //將根元素植入文檔doc中

            number.setText("001");

            name.setText("lnman");

            age.setText("24");

            student.addContent(number);

            student.addContent(name);

            student.addContent(age);

            root.addContent(student);

            Format format = Format.getCompactFormat();

            format.setEncoding("gb2312"); //設置xml文件的字符為gb2312

            format.setIndent("    "); //設置xml文件的縮進為4個空格

            XMLOutputter XMLOut = new XMLOutputter(format);//元素后換行一層元素縮四格

            XMLOut.output(doc, new FileOutputStream("studentinfo.xml")); 

    }

        public static void main(String[] args) throws Exception {

            WriteXML w = new WriteXML();

            System.out.println("Now we build an XML document .....");

            w.BuildXML();

            System.out.println("finished!");

    }

    }

    生成的xml文檔為:

    <?xml version="1.0" encoding="gb2312"?>

    <student-info>

        <student>

            <number>001</number>

            <name>lnman</name>

            <age>24</age>

        </student>

    </student-info>

     

     

    創建XML文檔2:

     public class CreateXML {

      public void Create() {

       try {

        Document doc = new Document();  

        ProcessingInstruction pi=new ProcessingInstruction("xml-stylesheet","type="text/xsl" href="test.xsl"");

        doc.addContent(pi);   

        Namespace ns = Namespace.getNamespace("http://www.bromon.org" );

        Namespace ns2 = Namespace.getNamespace("other", "http://www.w3c.org" );

        Element root = new Element("根元素", ns);

        root.addNamespaceDeclaration(ns2);

        doc.setRootElement(root);

        Element el1 = new Element("元素一");

        el1.setAttribute("屬性", "屬性一");   

        Text text1=new Text("元素值");

                 Element em = new Element("元素二").addContent("第二個元素");

        el1.addContent(text1);

                 el1.addContent(em);            

                 Element el2 = new Element("元素三").addContent("第三個元素");

                 root.addContent(el1);

                 root.addContent(el2);            

                 //縮進四個空格,自動換行,gb2312編碼

                 XMLOutputter outputter = new XMLOutputter("  ", true,"GB2312");

                 outputter.output(doc, new FileWriter("test.xml"));

             }catch(Exception e)  {

              System.out.println(e);

             }

         }    

         public static void main(String args[]) {

          new CreateXML().Create();

         }    

     }

    2、讀取xml文檔的例子:

    import org.jdom.output.*;

    import org.jdom.input.*;

    import org.jdom.*;

    import java.io.*;

    import java.util.*;

    public class ReadXML{

        public static void main(String[] args) throws Exception {

            SAXBuilder builder = new SAXBuilder();

            Document read_doc = builder.build("studentinfo.xml");

            Element stu = read_doc.getRootElement();

            List list = stu.getChildren("student");

            for(int i = 0;i < list.size();i++) {

                Element e = (Element)list.get(i);

                String str_number = e.getChildText("number");

                String str_name = e.getChildText("name");

                String str_age = e.getChildText("age");

                System.out.println("---------STUDENT--------------");

                System.out.println("NUMBER:" + str_number);

                System.out.println("NAME:" + str_name);

                System.out.println("AGE:" + str_age);

                System.out.println("------------------------------");

                System.out.println();

            } 

           }

    }

    3、DTD驗證的:

     public class XMLWithDTD {

      public void validate()  {

       try {

        SAXBuilder builder = new SAXBuilder(true);

        builder.setFeature("http://xml.org/sax/features/validation";,true);

        Document doc = builder.build(new FileReader("author.xml"));   

        System.out.println("搞掂");

        XMLOutputter outputter = new XMLOutputter();

        outputter.output(doc, System.out);

       }catch(Exception e) {

        System.out.println(e);

       }  

      }

      public static void main(String args[]) {

       new XMLWithDTD().validate();

      } 

     }

       需要說明的是,這個程序沒有指明使用哪個DTD文件。DTD文件的位置是在XML中指定的,而 且DTD不支持命名空間,一個XML只能引用一個DTD,所以程序直接讀取XML中指定的DTD,程序本身不用指定。不過這樣一來,好象就只能使用外部式 的DTD引用方式了?高人指點。

     

     

    4、XML Schema驗證的:

     public class XMLWithSchema {

      String xml="test.xml";

      String schema="test-schema.xml";

      public void validate() {

       try {

        SAXBuilder builder = new SAXBuilder(true);

        //指定約束方式為XML schema

        builder.setFeature("http://apache.org/xml/features/validation/schema";,  true);

        //導入schema文件

    builder.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation";,schema);

        Document doc = builder.build(new FileReader(xml));   

        System.out.println("搞掂");

        XMLOutputter outputter = new XMLOutputter();

        outputter.output(doc, System.out);

       }catch(Exception e) {

        System.out.println("驗證失敗:"+e);

       } 

      }

     }

     上面的程序就指出了要引入的XML Schema文件的位置。

     

     

     系統默認輸出是UTF-8,這有可能導致出現亂碼。

    5、Xpath例子:

    JDOM的關于XPATH的api在org.jdom.xpath這個包里。這個包下,有一個抽象類 XPath.java和實現類JaxenXPath.java, 使用時先用XPath類的靜態方法newInstance(String xpath)得到XPath對象,然后調用它的selectNodes(Object context)方法或selectSingleNode(Object context)方法,前者根據xpath語句返回一組節點(List對象);后者根據一個xpath語句返回符合條件的第一個節點(Object類 型)。請看jdom-1.0自帶的范例程序:

         它分析在web.xml文件中的注冊的servlet的個數及參數個數,并輸出角色名。

    web.xml文件:

    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!--

    <!DOCTYPE web-app

        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

        "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

    -->

    <web-app>

        <servlet>

            <servlet-name>snoop</servlet-name>

            <servlet-class>SnoopServlet</servlet-class>

        </servlet>

        <servlet>

            <servlet-name>file </servlet-name>

            <servlet-class>ViewFile</servlet-class>

            <init-param>

                <param-name>initial</param-name>

                <param-value>1000</param-value>

                <description>The initial value for the counter  <!-- optional --></description>

            </init-param>

        </servlet>

        <servlet-mapping>

            <servlet-name>mv</servlet-name>

            <url-pattern>*.wm</url-pattern>

        </servlet-mapping>

        <distributed/>

        <security-role>

          <role-name>manager</role-name>

          <role-name>director</role-name>

          <role-name>president</role-name>

        </security-role>

    </web-app>

    處理程序:

    import java.io.*;

    import java.util.*; 

    public class XPathReader {     

        public static void main(String[] args) throws IOException, JDOMException {

            if (args.length != 1) {

                System.err.println("Usage: java XPathReader web.xml");

                return;

            }

            String filename = args[0];//從命令行輸入web.xml

            PrintStream out = System.out;

            SAXBuilder builder = new SAXBuilder();

            Document doc = builder.build(new File(filename));//得到Document對象

     

     

            // Print servlet information

            XPath servletPath = XPath.newInstance("http://servlet");//,選擇任意路徑下servlet元素

            List servlets = servletPath.selectNodes(doc);//返回所有的servlet元素。

            out.println("This WAR has "+ servlets.size() +" registered servlets:");

            Iterator i = servlets.iterator();

            while (i.hasNext()) {//輸出servlet信息

                Element servlet = (Element) i.next();

                out.print("\t" + servlet.getChild("servlet-name")

                                        .getTextTrim() +

                          " for " + servlet.getChild("servlet-class")

                                           .getTextTrim());

                List initParams = servlet.getChildren("init-param");

                out.println(" (it has " + initParams.size() + " init params)"); 

            }             

            // Print security role information

            XPath rolePath = XPath.newInstance("http://security-role/role-name/text()");

            List roleNames = rolePath.selectNodes(doc);//得到所有的角色名

            if (roleNames.size() == 0) {

                out.println("This WAR contains no roles");

            } else {

                out.println("This WAR contains " + roleNames.size() + " roles:");

                i = roleNames.iterator();

                while (i.hasNext()) {//輸出角色名

                    out.println("\t" + ((Text)i.next()).getTextTrim());

                }

            }

        }    

    }

     

     

    輸出結果:

    C:\java>java   XPathReader web.xml

    This WAR has 2 registered servlets:

            snoop for SnoopServlet (it has 0 init params)

            file for ViewFile (it has 1 init params)

    This WAR contains 3 roles:

            manager

            director

            president

     

     

    6、數據輸入要用到XML文檔要通過org.jdom.input包,反過來需要org.jdom.output。如前面所說,關是看API文檔就能夠使用。

    我們的例子讀入XML文件exampleA.xml,加入一條處理指令,修改第一本書的價格和作者,并添加一條屬性,然后寫入文件exampleB.xml:

    //exampleA.xml

    <?xml version="1.0" encoding="GBK"?>

    <bookList>

    <book>

    <name>Java編程入門</name>

    <author>張三</author>

    <publishDate>2002-6-6</publishDate>

    <price>35.0</price>

    </book>

    <book>

    <name>XML在Java中的應用</name>

    <author>李四</author>

    <publishDate>2002-9-16</publishDate>

    <price>92.0</price>

    </book>

    </bookList>

    //testJDOM.java

    import org.jdom.*;

    import org.jdom.output.*;

    import org.jdom.input.*;

    import java.io.*;

    public class TestJDOM{

    public static void main(String args[])throws Exception{

    SAXBuilder sb = new SAXBuilder();

    //從文件構造一個Document,因為XML文件中已經指定了編碼,所以這里不必了

    Document doc = sb.build(new FileInputStream("exampleA.xml"));

    ProcessingInstruction pi = new ProcessingInstruction//加入一條處理指令

    ("xml-stylesheet","href=\"bookList.html.xsl\" type=\"text/xsl\"");

    doc.addContent(pi);

    Element root = doc.getRootElement(); //得到根元素

    java.util.List books = root.getChildren(); //得到根元素所有子元素的集合

    Element book = (Element)books.get(0); //得到第一個book元素

    //為第一本書添加一條屬性

    Attribute a = new Attribute("hot","true");

    book.setAttribute(a);

    Element author = book.getChild("author"); //得到指定的字元素

    author.setText("王五"); //將作者改為王五

    //或 Text t = new Text("王五");book.addContent(t);

    Element price = book.getChild("price"); //得到指定的字元素

    //修改價格,比較郁悶的是我們必須自己轉換數據類型,而這正是JAXB的優勢

    author.setText(Float.toString(50.0f));

    String indent = " ";

    boolean newLines = true;

    XMLOutputter outp = new XMLOutputter(indent,newLines,"GBK");

    outp.output(doc, new FileOutputStream("exampleB.xml"));

    }

    };

    執行結果exampleB.xml:

    <?xml version="1.0" encoding="GBK"?>

    <bookList>

    <book hot=”true”>

    <name>Java編程入門</name>

    <author>50.0</author>

    <publishDate>2002-6-6</publishDate>

    <price>35.0</price>

    </book>

    <book>

    <name>XML在Java中的應用</name>

    <author>李四</author>

    <publishDate>2002-9-16</publishDate>

    <price>92.0</price>

    </book>

    </bookList>

    <?xml-stylesheet href="bookList.html.xsl" type="text/xsl"?>

    在默認情況下,JDOM的Element類的getText()這類的方法不會過濾空白字符,如果你需要過濾,用setTextTrim() 。

    posted @ 2007-04-29 14:08 flustar 閱讀(425) | 評論 (0)編輯 收藏

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmplay/mmp_sdk/settingsobject.asp

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <link href="style/style.css" rel="stylesheet" type="text/css">

    <script language="JavaScript">
    var state;

    //初始化
    function playerinit()
    {
     player.url="mp3.m3u";
     player.settings.autoStart = false ;
    }

    //播放
    function play()
    {
     if (player.controls.isavailable('play'))
     {
      player.controls.play();
      state=setInterval("updatetime()",1000);
      playerinfo.innerHTML = "播放";
     }
    }

    //暫停
    function pause()
    {
     if (player.controls.isavailable('pause'))
     {
      player.controls.pause();
      clearInterval(state);
      playerinfo.innerHTML = "暫停";
     }
    }

    //停止
    function stop()
    {
     if (player.controls.isavailable('stop'))
     {
      player.controls.stop();
      clearInterval(state);
      playerinfo.innerHTML = "停止";
     }
    }

    //前首
    function previous()
    {
     if (player.controls.isavailable( 'previous' ))
     {
      player.controls.previous();
      playerinfo.innerHTML = "前一首";
     }
    }

    //后首
    function next()
    {
     if (player.controls.isavailable( 'next' ))
     {
      player.controls.next();
      playerinfo.innerHTML = "下一首";
     }
    }

    //?
    function step()
    {
     if (player.controls.isavailable( 'step' ))
     player.controls.step( 1 );
    }

    //音量-
    function voldown()
    {
     if ( player.settings.volume < 5 )
     {
      player.settings.volume = 0;
      playerinfo.innerHTML = "0";
     }
     else
     {
      player.settings.volume -= 5;
      playerinfo.innerHTML = player.settings.volume;
     }
    }

    //音量+
    function volup()
    {
     if ( player.settings.volume > 95 )
     {
      player.settings.volume = 100;
      playerinfo.innerHTML = "100";
     }
     else
     {
      player.settings.volume += 5;
      playerinfo.innerHTML = player.settings.volume;
     }
    }

    //靜音
    function mute()
    {
     player.settings.mute = !player.settings.mute;
    }

    //聲道
    function balance()
    {
     switch (player.settings.balance)
     {
      case 0:
       player.settings.balance = 100;
       playerinfo.innerHTML = '左聲道';
       break;
      case 100:
       player.settings.balance = -100;
       playerinfo.innerHTML = '右聲道';
       break;
      case -100:
       player.settings.balance = 0;
       playerinfo.innerHTML = '全聲道';
       break;
      default :
       player.settings.balance = 0;
       playerinfo.innerHTML = '全聲道';
       break;
     }
    }

    //更新時間
    function updatetime()
    {
     playerinfo.innerHTML = player.controls.currentPositionString + " | " + player.currentMedia.durationString;
    }

    </script>
    </head>
    <body onload="playerinit();">
    <table width="300">
      <tr>
        <td><object id="player" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-oleobject" width="300" height="60">
          <param name="autoStart" value="false">
          <param name="balance" value="0">
          <param name="currentPosition" value="0">
          <param name="currentMarker" value="0">
          <param name="enableContextMenu" value="true">
          <param name="enableErrorDialogs" value="false">
          <param name="enabled" value="true">
          <param name="fullScreen" value="false">
          <param name="invokeURLs" value="false">
          <param name="mute" value="true">
          <param name="playCount" value="1">
          <param name="rate" value="1">
          <param name="uiMode" value="none">
          <param name="volume" value="100">
        </object></td>
      </tr>
      <tr>
        <td><span id="playerinfo"></span></td>
      </tr>
      <tr>
        <td>
          <div align="center">
    <input type="button" class="but11" onmouseover=this.className="but12"; onmouseout=this.className="but11"; name="previous" title="上一首" onclick="previous();">
    <input type="button" class="but21" onmouseover=this.className="but22"; onmouseout=this.className="but21"; name="play" title="播放" onclick="play();">
    <input type="button" class="but31" onmouseover=this.className="but32"; onmouseout=this.className="but31"; name="pause" title="暫停" onclick="pause();">
    <input type="button" class="but41" onmouseover=this.className="but42"; onmouseout=this.className="but41"; name="stop" title="停止" onclick="stop();">
    <input type="button" class="but51" onmouseover=this.className="but52"; onmouseout=this.className="but51"; name="next" title="下一首" onclick="next();">
    <input type="button" class="but61" onmouseover=this.className="but62"; onmouseout=this.className="but61"; name="voldown" title="音量-" onclick="voldown();">
    <input type="button" class="but61" onmouseover=this.className="but62"; onmouseout=this.className="but61"; name="volup" title="音量+" onclick="volup();">
    <input type="button" class="but61" onmouseover=this.className="but62"; onmouseout=this.className="but61"; name="mute" title="靜音" onclick="mute();">
    <input type="button" class="but61" onmouseover=this.className="but62"; onmouseout=this.className="but61"; name="balance" title="聲道" onclick="balance();">
       </div>
     </td>
      </tr>
    </table>
    <script language = "JavaScript"  for = player event = playstatechange(newstate)>
    switch (newstate){
      case 1:
       playerinfo.innerHTML = "停止";
       break;
      case 2:
       playerinfo.innerHTML = "暫停";
       break;
      case 3:
       playerinfo.innerHTML = "正在播放";
       break;
      case 4:
       playerinfo.innerHTML = "4";
       break;
      case 5:
       playerinfo.innerHTML = "5";
       break;
      case 6:
       playerinfo.innerHTML = "正在緩沖...";
       break;
      case 7:
       playerinfo.innerHTML = "7";
       break;
      case 8:
       playerinfo.innerHTML = "8";
       break;
      case 9:
       playerinfo.innerHTML = "正在連接...";
       break;
      case 10:
       playerinfo.innerHTML = "準備就緒。歡迎光臨<a ;
       break;
      case 11:
       playerinfo.innerHTML = "11";
       break;
      default:
       playerinfo.innerHTML = "";
    }
    </script>

    </body>
    </html>

    posted @ 2007-04-29 10:32 flustar 閱讀(796) | 評論 (0)編輯 收藏

    一.設置端口
    在server.xml文件中找到<!--   Define a non-SSL HTTP/1.1 Connector on port 8080, change it to 80.   -->
         < Connector
    port ="80"                maxHttpHeaderSize ="8192"
                   maxThreads ="150"  minSpareThreads ="25"  maxSpareThreads ="75"
                   enableLookups ="false"  redirectPort ="8443"  acceptCount ="100"
                   connectionTimeout ="20000"  disableUploadTimeout ="true"   />把其中的port改為你想要的端口即可。
    二 .設置虛擬路徑
      要在TOMCAT中設置虛擬路徑/abc/,映射到D:\temp中,可以有兩種方法:
    1. 在$Tomcat_home$\conf\Catalina\localhost路徑下新建一個XML文件,注意:XML文件的名稱必須和虛擬路徑的名稱相同,本例為abc.xml。內容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Context    docBase="D:\temp"    reloadable="true"    debug="0"/>//此處不用寫" path="/abc",寫不寫效果一樣

    這樣就設置好了/abc的虛擬路徑
    2.
    編輯server文件(%tomcathome%\conf\server.xml)
    因為在tomcat啟動時要讀取server文件的信息,所以更改server文件后,一定要重新啟動tomcat。
    舉個例子:
    我們打算建立一個myjsp的虛擬目錄,只要在%tomcathome%\conf\server.xml文件,在<host>標簽中加入文件中加入如下代碼即可:
    <Context path="/myjsp" docBase="c:\myjsp" debug="0" reloadable="true" crossContext="true"></Context>
    其中,path為我們要建立的虛擬目錄,docBase為實際目錄在硬盤上的位置。

    posted @ 2007-04-29 10:19 flustar 閱讀(2388) | 評論 (1)編輯 收藏



     一、環境

    1.eclipse 3.2.2
    2.myeclipse 5.1.1
    3.jdk 1.5

    二、簡要說明

    數據庫為mysql

     在mysql中建立一個test數據庫,建立cat表
    CREATE TABLE `cat` (
      `cat_id` varchar(32) NOT NULL,
      `name` varchar(16) NOT NULL,
      `sex` varchar(1) default NULL,
      `weight` float(9,3) default NULL,
      PRIMARY KEY  (`cat_id`)
    )

    三、步驟

    1.導入包的準備工作

    a.新建java project.建立包example
    在它下面編寫類Cat.java

    package example;

     public class Cat  implements java.io.Serializable {


        // Fields   

         private String catId;
         private String name;
         private String sex;
         private Float weight;


        // Constructors

        /** default constructor */
        public Cat() {
        }

     /** minimal constructor */
        public Cat(String name) {
            this.name = name;
        }
       
        /** full constructor */
        public Cat(String name, String sex, Float weight) {
            this.name = name;
            this.sex = sex;
            this.weight = weight;
        }

      
        // Property accessors

        public String getCatId() {
            return this.catId;
        }
       
        public void setCatId(String catId) {
            this.catId = catId;
        }

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

        public String getSex() {
            return this.sex;
        }
       
        public void setSex(String sex) {
            this.sex = sex;
        }

        public Float getWeight() {
            return this.weight;
        }
       
        public void setWeight(Float weight) {
            this.weight = weight;
        } 
    }

    同樣在此包下面編寫Cat.hbm.xml

      <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "<!--
        Mapping file autogenerated by MyEclipse - Hibernate Tools
    -->
    <hibernate-mapping>
        <class name="example.Cat" table="cat" catalog="testhibernate">
            <id name="catId" type="java.lang.String">
                <column name="cat_id" length="32" />
                <generator class="uuid.hex"></generator>
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="16" not-null="true" />
            </property>
            <property name="sex" type="java.lang.String">
                <column name="sex" length="1" />
            </property>
            <property name="weight" type="java.lang.Float">
                <column name="weight" precision="9" scale="3" />
            </property>
        </class>
    </hibernate-mapping>

    b.在工程的src里面加入一個包,用來存放將要生成的HibernateSessionFactory。包名如(example.util)。
    導入hibernate(生成的代碼:
    package example.util;

    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;

    /**
     * Configures and provides access to Hibernate sessions, tied to the
     * current thread of execution.  Follows the Thread Local Session
     * pattern, see
    {@link http://hibernate.org/42.html }.
     */
    public class HibernateSessionFactory {

        /**
         * Location of hibernate.cfg.xml file.
         * Location should be on the classpath as Hibernate uses 
         * #resourceAsStream style lookup for its configuration file.
         * The default classpath location of the hibernate config file is
         * in the default package. Use #setConfigFile() to update
         * the location of the configuration file for the current session.  
         */
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
     private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
        private  static Configuration configuration = new Configuration();
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;

        private HibernateSessionFactory() {
        }
     
     /**
         * Returns the ThreadLocal Session instance.  Lazy initialize
         * the <code>SessionFactory</code> if needed.
         *
         *  @return Session
         *  @throws HibernateException
         */
        public static Session getSession() throws HibernateException {
            Session session = (Session) threadLocal.get();

      if (session == null || !session.isOpen()) {
       if (sessionFactory == null) {
        rebuildSessionFactory();
       }
       session = (sessionFactory != null) ? sessionFactory.openSession()
         : null;
       threadLocal.set(session);
      }

            return session;
        }

     /**
         *  Rebuild hibernate session factory
         *
         */
     public static void rebuildSessionFactory() {
      try {
       configuration.configure(configFile);
       sessionFactory = configuration.buildSessionFactory();
      } catch (Exception e) {
       System.err
         .println("%%%% Error Creating SessionFactory %%%%");
       e.printStackTrace();
      }
     }

     /**
         *  Close the single hibernate session instance.
         *
         *  @throws HibernateException
         */
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);

            if (session != null) {
                session.close();
            }
        }

     /**
         *  return session factory
         *
         */
     public static org.hibernate.SessionFactory getSessionFactory() {
      return sessionFactory;
     }

     /**
         *  return session factory
         *
         * session factory will be rebuilded in the next call
         */
     public static void setConfigFile(String configFile) {
      HibernateSessionFactory.configFile = configFile;
      sessionFactory = null;
     }

     /**
         *  return hibernate configuration
         *
         */
     public static Configuration getConfiguration() {
      return configuration;
     }

    }

    對工程名點鼠標右鍵。選擇myeclipse->add

    hibernate capabicities。

    在彈出的窗口選擇中Hibernate 3.0 Core Libraries和Hibernate 3.0 Advanced Support Libraries

    下面選中Copy checked Library Jars to project folder and add to build-path。點擊下一步。

    c.默認(hibernate cofig file),下一步。

    d.選中User JDBC driver
    connect url:  jdbc:mysql://localhost:3306/test
    Driver class:  org.gjt.mm.mysql.Driver
    username:  root
    password: ******
    Dialect: mysql

    e.在第一行包選擇里面,選擇在前面第二大步建的包如(example)。點擊完成。

    f.彈出的畫面中 選擇properties的add按鈕。在Property中加入show_sql,Value中加入true。點確定

    保存設置。在mappings中點add加入前面建立的Cat.hbm.xml。最后生成的hibernate.cfg.xml文件如下
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "

    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>

    <session-factory>
     <property name="connection.username">root</property>
     <property name="connection.url">
      jdbc:mysql://localhost:3306/testhibernate
     </property>
     <property name="dialect">
      org.hibernate.dialect.MySQLDialect
     </property>
     <property name="connection.password">123456</property>
     <property name="connection.driver_class">
      org.gjt.mm.mysql.Driver
     </property>
     <property name="show_sql">true</property>
     <mapping resource="example/Cat.hbm.xml" />

    </session-factory>

    </hibernate-configuration>


    3.測試 新建包test 在其中建立測試文件TestHibernate.java
    package test;

    import java.util.Iterator;
    import java.util.List;
    import example.*;
    import example.util.*;
    import org.hibernate.Session;
    import org.hibernate.Transaction;

    public class TestHibernate {
     Session session=null;
     Transaction tx=null;
    public static void main(String[] args) {
     TestHibernate th=new TestHibernate(); 
     List cl=th.getAllCats();
     if(cl!=null){
      Iterator it=cl.iterator();
      while(it.hasNext()){
       Cat cat=(Cat)it.next();
       System.out.println("catID:"+cat.getCatId()+"name:"+cat.getName()+"sex:"+cat.getSex());
      }
     }
      
      

     }
    public List getAllCats(){
     session=HibernateSessionFactory.getSession();
     List catlist=null;
     try{
      tx=session.beginTransaction();
      catlist=session.createQuery("from Cat").list();
      return catlist;
     }catch(Exception ex){
      System.err.println(ex.getMessage());
      return null;
     }finally{
      HibernateSessionFactory.closeSession();
     }
    }

    }

     

     

    posted @ 2007-04-19 15:45 flustar 閱讀(5425) | 評論 (2)編輯 收藏

    1)啟動Tomcat服務器,打開瀏覽器,輸入http://localhost:8080/admin(其中localhost是名稱服務器或稱為主機),
    進入管理界面的登陸頁面,這時候請輸入原來安裝時要求輸入的用戶名和密碼,登陸到管理界面,

    2)選擇Resources-Data sources進入配置數據源界面,選擇
     Data Source Actions ->選擇Create New Data Source,進入配置詳細信息界面
    主要內容例如下:
    JNDI Name:   ->jdbc/mysql
    Data Source URL  ->jdbc:mysql://localhost:3306/test
    JDBC Driver Class-> org.gjt.mm.mysql.Driver
    3)修改\conf\Catalina\localhost目錄下建立一個xml文件,名稱為你所發布的web應用的名稱.xml,(如testpool.xml)打開添加內容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
     <Resource
          name="jdbc/mysql"
          type="javax.sql.DataSource"
          password="123456"
          driverClassName="org.gjt.mm.mysql.Driver"
          maxIdle="2"
          maxWait="50"
          username="root"
          url="jdbc:mysql://localhost:3306/test"
          maxActive="4"/>

    </Context>
    內容同conf/server.xml中<GlobalNamingResources>
     <Resource
          name="jdbc/mysql"
          type="javax.sql.DataSource"
          password="123456"
          driverClassName="org.gjt.mm.mysql.Driver"
          maxIdle="2"
          maxWait="50"
          username="root"
          url="jdbc:mysql://localhost:3306/test"
          maxActive="4"/>
      </GlobalNamingResources>

    少了這一步會報錯:Cannot create JDBC driver of class '' for connect URL 'null'
    4)修改web.xml

    打開%TOMCAT_HOME%\conf\web.xml或yourwebapp/web-inf/web.xml,添加以下內容:
        <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/mysql</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        </resource-ref>

        注意res-ref-name填寫的內容要與在上文提到的JNDI Name名稱一致。
     到這里,配置工作就基本完成了!

    5)引用JNDI時用"java:comp/env/jdbc/mysql";
    建立文件測試 test.jsp:
    <%@page contentType="text/html;charset=utf-8" %>
    <%@page import="java.sql.*" %>
    <%@page import="javax.sql.*" %>
    <%@page import="javax.naming.*" %>
    <html>
    <head>
    <title>Tomcat連接池測試</title>
    </head>
    <body>
    <%
      Context ctx=new InitialContext();
      Connection conn=null;
      DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
      conn=ds.getConnection();
      Statement stmt=conn.createStatement(ResultSet.CONCUR_READ_ONLY,ResultSet.CONCUR_UPDATABLE);
      ResultSet rs=stmt.executeQuery("select * from testexample");
      while(rs.next()){
      out.println(rs.getInt(1));
      out.println(rs.getString(2));
      out.println(rs.getString(3));
      }
      out.println("數據庫操作成功!");
      rs.close();
      stmt.close();
      conn.close();
       
     %>
    </body>
    </html>




     

    posted @ 2007-04-17 17:27 flustar 閱讀(51594) | 評論 (28)編輯 收藏

    運行環境配置

    1、工具下載與安裝 
          1>下載安裝JDK5.0(www.java.sun.com)
          2>下載安裝eclipse3.2.x(http://www.eclipse.org
          3>下載eclispse3.2多國語言包(http://download.eclipse.org/eclipse/downloads/drops/L-3.2.1_Language_Packs-200609210945/index.php
          4>下載和安裝jboss-4.0.X.GA 服務器(www.jboss.org)
          5>下載插件Lomboz3.2all in one for eclipse(http://forge.objectweb.org/projects/lomboz)
          6>下載xdoclet1.2.3(http://xdoclet.sourceforge.net/)
    2.插件安裝
       分別解壓lomboz 和多國語言包到Eclipse目錄中并把它們的文件名分別命名為lomboz 和language
         在Eclipse目錄中,建立links文件夾,在該文件夾下建立兩個.link文件,內容分別為:
       path=lomboz 和path=langage,lin文件名分別為lomboz.link和language.link.
    3、直接解壓jboss到某一目錄(如c:\jboss4.0.4GA)
    設置環境變量:
      假如 J2SDK安裝在c:\j2sdk,JBoss安裝在c:\jboss,環境變量的設置如下:
       JAVA_HOME=C:\j2sdk
       CLASSPATH=%CLASSPATH%;%JAVA_HOME%\lib\*.jar;%JAVA_HOME%\jre\lib\*.jar
       JBOSS_HOME=C:\jboss
       PATH=%PATH%;%JAVA_HOME%\bin;%JBOSS_HOME%\bin
    4、xdoclet安裝
    window—>preferences—>Xdoclet—>Xdoclet目錄
    5、服務器
    window —>preferences—>server—>jboss—>jboss4.0安裝目錄
      

    posted @ 2006-12-23 20:03 flustar 閱讀(1272) | 評論 (0)編輯 收藏

    運行環境配置

    1、工具下載與安裝?
    ????? 1>下載安裝JDK5.0(www.java.sun.com)
    ????? 2>下載安裝eclipse3.2.x(www.eclipse.org)(如果你下載了JBOSS IDE2.0(內含eclipse3.2.x,這個可以不要)
    ????? 3>下載和安裝jboss-4.0.5.GA 服務器(記住一定要下載安裝版,內含EJB3.0Container,地址:http://sourceforge.net/project/downloading.php?groupname=jboss&filename=jems-installer-1.2.0.CR1.jar&use_mirror=jaist
    ????? 4>下載插件JBOSS IDE 2.0(http://sourceforge.net/project/downloading.php?groupname=jboss&filename=JBossIDE-2.0.0.ALPHA-Bundle-win32.zip&use_mirror=nchc)
    ??????安裝JBOSS是要注意幾點:
    ???????1>議不要安裝在Program Files 目錄,否則一些應用會導致莫名的錯。
    ????? 2>選擇帶集群功能的安裝選項“ejb3-clustered”
    ????? 3>在輸入配置名稱時,輸入“all”
    ????? 4>在配置JMX時,把所有選擇薦都勾上,并輸入jmx-console的用戶名和密碼!
    ????? 5》運行JBOSS,進行JBOSS安裝目錄下,進入BIN目錄下,運行 run -c all,如果直接運行run,會報錯!(因為你run.bat不知道你運行的是那種配置all,default,還是min)
    2、設置環境變量
    ??? JAVA_HOME=JAVA安裝目錄
    ?? JBOSS_HOME=JBOSS安裝目錄

    3、認識JBOSS目錄用途

    目錄 描述
    bin 啟 動 和關閉JBoss的腳本
    client 客戶端與JBoss通信所需的Java 庫(JARs)
    docs 配置的樣本文件(數據庫配置等)
    docs/dtd 在JBoss中使用的各種XML文件的DTD。
    lib ?一些JAR,JBoss啟動時加載,且被所有JBoss配置共享。(不要把你的庫放在這里)
    server 各種JBoss配置。每個配置必須放在不同的子目錄。子目錄的名字表示配置的名字。JBoss
    包含3 個默認的配置:minimial,default和all,在你安裝時可以進行選擇
    server/all JBoss的完全配置,啟動所有服務,包括集群和IIOP。(本教程就采用此配置)
    server/default ?JBoss 的默認配置。在沒有在JBoss 命令航中指定配置名稱時使用。(本教程沒有安裝此
    配置,如果不指定配置名稱,啟動將會出錯)
    server/all/conf JBoss的配置文件。
    server/all/data JBoss的數據庫文件。比如,嵌入的數據庫,或者JBossMQ。
    server/all/deploy JBoss的熱部署目錄。放到這里的任何文件或目錄會被JBoss自動部署。EJB、WAR、EAR,甚至服務。
    server/all/lib 一些JAR,JBoss在啟動特定配置時加載他們。(default和minimial配置也包含這個和下面兩個目錄。)
    server/all/log JBoss的日志文件
    server/all/tmp JBoss的臨時文件

    4、EJB部署
    ?? JBoss中的部署過程非常的簡單、直接。在每一個配置中,JBoss不斷的掃描一個特殊目錄的變化:
    [jboss安裝目錄]/server/config-name/deploy。

    posted @ 2006-12-23 18:56 flustar 閱讀(3287) | 評論 (2)編輯 收藏

    如今Linux不僅在服務器領域的應用取得較大進展,而且在桌面應用領域也有越來越多的人選擇使用。下面就以Red Hat Linux 9.0為例,介紹如何與Windows XP組成雙系統。

      給Linux劃分領地

      由于Linux無法安裝在Windows的分區上,所以必須在硬盤中分割出一塊領地專供Linux使用,這里推薦用分區魔術師進行無損分區。為了方便講述,這里先舉一個實例來說明:裝有Windows XP計算機有一個30GB的硬盤,共分三個區(C盤、D盤、和E盤),其中E盤有16.6GB(有約7GB可用空間)。我們的目標是將7GB的可用空間剝離出來專供Red Hat使用。

      1.首先在Windows XP里啟動分區魔術師,從主窗口可以看到磁盤分區的詳細信息。單擊右側詳細窗格里的分區E以選中它。

      2.單擊左側任務列表里的“調整一個分區的容量”命令,即可彈出一個“調整容量/移動分區”對話框。

      3.在該對話框的頂部有一個條狀圖表示分區E的使用情況,其中左側的黑色條部分表示已用空間,右側的綠色條部分表示可用空間。可以用鼠標直接拖曳綠色條部分對E盤容量進行調整。很顯然,E盤的最小容量就是已用空間的容量(在小就要破壞原有數據了),減小的容量就成了自有空間。

      4.單擊“確定”按鈕,回到主界面,此時我們可以看到新劃分出的7GB自由空間。接下來的步驟非常重要。盡管這7GB的磁盤空間已經是“自由身”,但是它還是屬于Windows的擴展分區,所以要將這7GB的自由空間從Windows擴展分區里劃分出去。

      5.單擊擴展分區以選中它,如圖1所示。用類似的方法將這7GB自由空間從Windows擴展DOS分區里劃分出去。現在我們已經從Windows XP的領地里割出一塊7GB的自由空間供Linux專用。



    圖1 將自由空間從擴展分區里劃分出去


      注意,一定要將自由空間從Windows擴展分區里劃分出去,這是因為Linux的分區格式和Windows并不完全兼容。如果Red Hat所使用的磁盤空間屬于Windows擴展分區,就會導致“水土不服”。很多朋友反映裝上了Red Hat以后,發現Windows速度變得奇慢,就會歸咎于Red Hat,其實根本原因在于分區的時候沒有將自由空間從擴展分區里剝離出去。

      實現Windows與Linux雙重引導有多種方法:

      ◆ 對于具有雙硬盤的用戶,可以將Linux安裝在第二個硬盤上(Windows自然是安裝在第一個硬盤上),并且確保將GRUB(LILO)安裝在第二個硬盤的主引導扇區,然后每次開機時在BIOS里指定從哪個硬盤引導即可。

      ◆ 最常用的方法是借助Linux的引導裝載管理器GRUB(LILO),自動接管雙重系統的啟動選單。

      ◆ 可以借助Windows XP的NT引導程序ntldr、boot.ini來實現雙重啟動。這種方法的優點是今后刪除Linux比較方便,而且符合我們的使用習慣;缺點是實現起來相對比較復雜,需要獲取Linux系統的引導映像文件。

      ◆ 可以選擇不安裝Linux的引導裝載管理器(或者不要安裝在主引導扇區),但是要記住在安裝過程中一定要創建Linux啟動盤。今后需要時,用這張啟動盤引導系統進入Linux。

      這里介紹了四種雙重系統的實現方案,本文將分別介紹比較常見的第二和第三種方法。

    posted @ 2006-12-20 16:45 flustar 閱讀(317) | 評論 (1)編輯 收藏

    在我們學習Java的過程中,掌握其中的基本概念對我們的學習無論是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基礎,所以有必要對其中的基本概念做以歸納,以便大家在以后的學習過程中更好的理解java的精髓,在此我總結了30條基本的概念.

       Java概述:

       目前Java主要應用于中間件的開發(middleware)---處理客戶機于服務器之間的通信技術,早期的實踐證明,Java不適合pc應用程序的開發,其發展逐漸變成在開發手持設備,互聯網信息站,及車載計算機的開發.Java于其他語言所不同的是程序運行時提供了平臺的獨立性,稱許可以在windows,solaris,linux其他操作系統上使用完全相同的代碼.Java的語法與C++語法類似,C++/C程序員很容易掌握,而且Java是完全的徹底的面向對象的,其中提出了很好的GC(Garbage Collector)垃圾處理機制,防止內存溢出.

       Java的白皮書為我們提出了Java語言的11個關鍵特性.

       (1)Easy:Java的語法比C++的相對簡單,另一個方面就是Java能使軟件在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標準庫和線程支持的內存需要增加125kb.

       (2)分布式:Java帶有很強大的TCP/IP協議族的例程庫,Java應用程序能夠通過URL來穿過網絡來訪問遠程對象,由于servlet機制的出現,使Java編程非常的高效,現在許多的大的web server都支持servlet.

       (3)OO:面向對象設計是把重點放在對象及對象的接口上的一個編程技術.其面向對象和C++有很多不同,在與多重繼承的處理及Java的原類模型.

       (4)健壯特性:Java采取了一個安全指針模型,能減小重寫內存和數據崩潰的可能性。

       (5)安全:Java用來設計網路和分布系統,這帶來了新的安全問題,Java可以用來構建防病毒和防攻擊的System.事實證明Java在防毒這一方面做的比較好.

       (6)中立體系結構:Java編譯其生成體系結構中立的目標文件格式可以在很多處理器上執行,編譯器產生的指令字節碼(Javabytecode)實現此特性,此字節碼可以在任何機器上解釋執行.

       (7)可移植性:Java中對基本數據結構類型的大小和算法都有嚴格的規定所以可移植性很好.

       (8)多線程:Java處理多線程的過程很簡單,Java把多線程實現交給底下操作系統或線程程序完成.所以多線程是Java作為服務器端開發語言的流行原因之一

       (9)Applet和servlet:能夠在網頁上執行的程序叫Applet,需要支持Java的瀏覽器很多,而applet支持動態的網頁,這是很多其他語言所不能做到的.

       基本概念:

       1.OOP中唯一關系的是對象的接口是什么,就像計算機的銷售商她不管電源內部結構是怎樣的,他只關系能否給你提供電就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的屬性和行為對象組成的,不同的對象的訪問通過函數調用來完成,對象間所有的交流都是通過方法調用,通過對封裝對象數據,很大限度上提高復用率.

       2.OOP中最重要的思想是類,類是模板是藍圖,從類中構造一個對象,即創建了這個類的一個實例(instance)

       3.封裝:就是把數據和行為結合起在一個包中)并對對象使用者隱藏數據的實現過程,一個對象中的數據叫他的實例字段(instance field)

       4.通過擴展一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴展而得,根超類下文會做介紹.

       5.對象的3個主要特性
       behavior---說明這個對象能做什么.
       state---當對象施加方法時對象的反映.
       identity---與其他相似行為對象的區分標志.
       每個對象有唯一的indentity 而這3者之間相互影響.

       6.類之間的關系:
       use-a :依賴關系
       has-a :聚合關系
       is-a :繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在于共性中)

       7.構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象并對其初始化.
       例:Data類的構造器叫Data
       new Data()---構造一個新對象,且初始化當前時間.
       Data happyday=new
       Data()---把一個對象賦值給一個變量happyday,從而使該對象能夠多次使用,此處要聲明的使變量與對象變量二者是不同的.new返回的值是一個引用.
       構造器特點:構造器可以有0個,一個或多個參數
       構造器和類有相同的名字
       一個類可以有多個構造器
       構造器沒有返回值
       構造器總是和new運算符一起使用.

       8.重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法.

       9.包(package)Java允許把一個或多個類收集在一起成為一組,稱作包,以便于組織任務,標準Java庫分為許多包.java.lang java.util java,net等,包是分層次的所有的java包都在java和javax包層次內.

       10.繼承思想:允許在已經存在的類的基礎上構建新的類,當你繼承一個已經存在的類時,那么你就復用了這個類的方法和字段,同時你可以在新類中添加新的方法和字段.

       11.擴展類:擴展類充分體現了is-a的繼承關系. 形式為:class (子類) extends (基類).

       12.多態:在java中,對象變量是多態的.而java中不支持多重繼承.

       13.動態綁定:調用對象方法的機制.
       (1)編譯器檢查對象聲明的類型和方法名.
       (2)編譯器檢查方法調用的參數類型.
       (3)靜態綁定:若方法類型為priavte static final 編譯器會準確知道該調用哪個方法.
       (4)當程序運行并且使用動態綁定來調用一個方法時,那么虛擬機必須調用x所指向的對象的實際類型相匹配的方法版本.
       (5)動態綁定:是很重要的特性,它能使程序變得可擴展而不需要重編譯已存代碼.

       14.final類:為防止他人從你的類上派生新類,此類是不可擴展的.

       15.動態調用比靜態調用花費的時間要長,

       16.抽象類:規定一個或多個抽象方法的類本身必須定義為abstract例: public abstract string getDescripition

       17.Java中的每一個類都是從Object類擴展而來的.

       18.object類中的equal和toString方法.equal用于測試一個對象是否同另一個對象相等.toString返回一個代表該對象的字符串,幾乎每一個類都會重載該方法,以便返回當前狀態的正確表示.(toString 方法是一個很重要的方法)

       19.通用編程:任何類類型的所有值都可以同object類性的變量來代替.

       20.數組列表:ArrayList動態數組列表,是一個類庫,定義在java.uitl包中,可自動調節數組的大小.

       21.class類 object類中的getclass方法返回ckass類型的一個實例,程序啟動時包含在main方法的類會被加載,虛擬機要加載他需要的所有類,每一個加載的類都要加載它需要的類.

       22.class類為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為JavaBeans特別有用,使用反射Java能支持VB程序員習慣使用的工具.能夠分析類能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射機制十分強大.
       1.在運行時分析類的能力.
       2.在運行時探察類的對象.
       3.實現通用數組操縱代碼.
       4.提供方法對象.
       而此機制主要針對是工具者而不是應用及程序.
       反射機制中的最重要的部分是允許你檢查類的結構.用到的API有:
       java.lang.reflect.Field 返回字段.
       java.reflect.Method 返回方法.
       java.lang.reflect.Constructor 返回參數.
       方法指針:java沒有方法指針,把一個方法的地址傳給另一個方法,可以在后面調用它,而接口是更好的解決方案.

       23.接口(Interface)說明類該做什么而不指定如何去做,一個類可以實現一個或多個interface.

       24.接口不是一個類,而是對符合接口要求的類的一套規范.若實現一個接口需要2個步驟:
       1.聲明類需要實現的指定接口.
       2.提供接口中的所有方法的定義.
       聲明一個類實現一個接口需要使用implements 關鍵字class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是類,不能用new實例化一個接口.

       25.一個類只有一個超類,但一個類能實現多個接口.Java中的一個重要接口Cloneable

       26.接口和回調.編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發生時回調對象上的方法.例:ActionListener 接口監聽.
       類似的API有:java.swing.JOptionPane
             java.swing.Timer
             java.awt.Tookit

       27.對象clone:clone方法是object一個保護方法,這意味著你的代碼不能簡單的調用它.

       28.內部類:一個內部類的定義是定義在另一個內部的類
       原因是:1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據
       2.對于同一個包中的其他類來說,內部類能夠隱藏起來.
       3.匿名內部類可以很方便的定義回調.
       4.使用內部類可以非常方便的編寫事件驅動程序.

       29.代理類(proxy):1.指定接口要求所有代碼 2.object類定義的所有的方法(toString equals)

       30.數據類型:Java是強調類型的語言,每個變量都必須先申明它都類型,java中總共有8個基本類型.4種是整型,2種是浮點型,一種是字符型,被用于Unicode編碼中的字符,布爾型.
    以上內容摘自:http://java.ccidnet.com/art/3737/20060911/896379_1.html

    posted @ 2006-12-20 16:39 flustar 閱讀(500) | 評論 (0)編輯 收藏

    對于這個系列里的問題,每個學Java的人都應該搞懂。當然,如果只是學Java玩玩就無所謂了。如果你認為自己已經超越初學者了,卻不很懂這些問題,請將你自己重歸初學者行列。內容均來自于CSDN的經典老貼。

    問題一:我聲明了什么!

    String s = "Hello world!";

    許多人都做過這樣的事情,但是,我們到底聲明了什么?回答通常是:一個String,內容是“Hello world!”。這樣模糊的回答通常是概念不清的根源。如果要準確的回答,一半的人大概會回答錯誤。
    這個語句聲明的是一個指向對象的引用,名為“s”,可以指向類型為String的任何對象,目前指向"Hello world!"這個String類型的對象。這就是真正發生的事情。我們并沒有聲明一個String對象,我們只是聲明了一個只能指向String對象的引用變量。所以,如果在剛才那句語句后面,如果再運行一句:

    String string = s;

    我們是聲明了另外一個只能指向String對象的引用,名為string,并沒有第二個對象產生,string還是指向原來那個對象,也就是,和s指向同一個對象。

    問題二:"=="和equals方法究竟有什么區別?

    ==操作符專門用來比較變量的值是否相等。比較好理解的一點是:
    int a=10;
    int b=10;
    則a==b將是true。
    但不好理解的地方是:
    String a=new String("foo");
    String b=new String("foo");
    則a==b將返回false。

    根據前一帖說過,對象變量其實是一個引用,它們的值是指向對象所在的內存地址,而不是對象本身。a和b都使用了new操作符,意味著將在內存中產生兩個內容為"foo"的字符串,既然是“兩個”,它們自然位于不同的內存地址。a和b的值其實是兩個不同的內存地址的值,所以使用"=="操作符,結果會是false。誠然,a和b所指的對象,它們的內容都是"foo",應該是“相等”,但是==操作符并不涉及到對象內容的比較。
    對象內容的比較,正是equals方法做的事。

    看一下Object對象的equals方法是如何實現的:
    boolean equals(Object o){

    return this==o;

    }
    Object對象默認使用了==操作符。所以如果你自創的類沒有覆蓋equals方法,那你的類使用equals和使用==會得到同樣的結果。同樣也可以看出,Object的equals方法沒有達到equals方法應該達到的目標:比較兩個對象內容是否相等。因為答案應該由類的創建者決定,所以Object把這個任務留給了類的創建者。

    看一下一個極端的類:
    Class Monster{
    private String content;
    ...
    boolean equals(Object another){ return true;}

    }
    我覆蓋了equals方法。這個實現會導致無論Monster實例內容如何,它們之間的比較永遠返回true。

    所以當你是用equals方法判斷對象的內容是否相等,請不要想當然。因為可能你認為相等,而這個類的作者不這樣認為,而類的equals方法的實現是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列碼的集合(HashSet,HashMap,HashTable),請察看一下java doc以確認這個類的equals邏輯是如何實現的。

    問題三:String到底變了沒有?

    沒有。因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。請看下列代碼:

    String s = "Hello";
    s = s + " world!";

    s所指向的對象是否改變了呢?從本系列第一篇的結論很容易導出這個結論。我們來看看發生了什么事情。在這段代碼中,s原先指向一個String對象,內容是"Hello",然后我們對s進行了+操作,那么s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另一個String對象,內容為"Hello world!",原來那個對象還存在于內存之中,只是s這個引用變量不再指向它了。
    通過上面的說明,我們很容易導出另一個結論,如果經常對字符串進行各種各樣的修改,或者說,不可預見的修改,那么使用String來代表字符串的話會引起很大的內存開銷。因為String對象建立之后不能再改變,所以對于每一個不同的字符串,都需要一個String對象來表示。這時,應該考慮使用StringBuffer類,它允許修改,而不是每個不同的字符串都要生成一個新的對象。并且,這兩種類的對象轉換十分容易。
    同時,我們還可以知道,如果要使用內容相同的字符串,不必每次都new一個String。例如我們要在構造器中對一個名叫s的String引用變量進行初始化,把它設置為初始值,應當這樣做:
    public class Demo {
    private String s;
    ...
    public Demo {
    s = "Initial Value";
    }
    ...
    }
    而非
    s = new String("Initial Value");
    后者每次都會調用構造器,生成新對象,性能低下且內存開銷大,并且沒有意義,因為String對象不可改變,所以對于內容相同的字符串,只要一個String對象來表示就可以了。也就說,多次調用上面的構造器創建多個對象,他們的String類型屬性s都指向同一個對象。
    上面的結論還基于這樣一個事實:對于字符串常量,如果內容相同,Java認為它們代表同一個String對象。而用關鍵字new調用構造器,總是會創建一個新的對象,無論內容是否相同。
    至于為什么要把String類設計成不可變類,是它的用途決定的。其實不只String,很多Java標準類庫中的類都是不可變的。在開發一個系統的時候,我們有時候也需要設計不可變類,來傳遞一組相關的值,這也是面向對象思想的體現。不可變類有一些優點,比如因為它的對象是只讀的,所以多線程并發訪問也不會有任何問題。當然也有一些缺點,比如每個不同的狀態都要一個對象來代表,可能會造成性能上的問題。所以Java標準類庫還提供了一個可變版本,即StringBuffer。

    問題四:final關鍵字到底修飾了什么?

    final使得被修飾的變量"不變",但是由于對象型變量的本質是“引用”,使得“不變”也有了兩種含義:引用本身的不變,和引用指向的對象不變。

    引用本身的不變:
    final StringBuffer a=new StringBuffer("immutable");
    final StringBuffer b=new StringBuffer("not immutable");
    a=b;//編譯期錯誤

    引用指向的對象不變:
    final StringBuffer a=new StringBuffer("immutable");
    a.append(" broken!"); //編譯通過

    可見,final只對引用的“值”(也即它所指向的那個對象的內存地址)有效,它迫使引用只能指向初始指向的那個對象,改變它的指向會導致編譯期錯誤。至于它所指向的對象的變化,final是不負責的。這很類似==操作符:==操作符只負責引用的“值”相等,至于這個地址所指向的對象內容是否相等,==操作符是不管的。

    理解final問題有很重要的含義。許多程序漏洞都基于此----final只能保證引用永遠指向固定對象,不能保證那個對象的狀態不變。在多線程的操作中,一個對象會被多個線程共享或修改,一個線程對對象無意識的修改可能會導致另一個使用此對象的線程崩潰。一個錯誤的解決方法就是在此對象新建的時候把它聲明為final,意圖使得它“永遠不變”。其實那是徒勞的。

    問題五:到底要怎么樣初始化!

    本問題討論變量的初始化,所以先來看一下Java中有哪些種類的變量。
    1. 類的屬性,或者叫值域
    2. 方法里的局部變量
    3. 方法的參數

    對于第一種變量,Java虛擬機會自動進行初始化。如果給出了初始值,則初始化為該初始值。如果沒有給出,則把它初始化為該類型變量的默認初始值。

    int類型變量默認初始值為0
    float類型變量默認初始值為0.0f
    double類型變量默認初始值為0.0
    boolean類型變量默認初始值為false
    char類型變量默認初始值為0(ASCII碼)
    long類型變量默認初始值為0
    所有對象引用類型變量默認初始值為null,即不指向任何對象。注意數組本身也是對象,所以沒有初始化的數組引用在自動初始化后其值也是null。

    對于兩種不同的類屬性,static屬性與instance屬性,初始化的時機是不同的。instance屬性在創建實例的時候初始化,static屬性在類加載,也就是第一次用到這個類的時候初始化,對于后來的實例的創建,不再次進行初始化。這個問題會在以后的系列中進行詳細討論。

    對于第二種變量,必須明確地進行初始化。如果再沒有初始化之前就試圖使用它,編譯器會抗議。如果初始化的語句在try塊中或if塊中,也必須要讓它在第一次使用前一定能夠得到賦值。也就是說,把初始化語句放在只有if塊的條件判斷語句中編譯器也會抗議,因為執行的時候可能不符合if后面的判斷條件,如此一來初始化語句就不會被執行了,這就違反了局部變量使用前必須初始化的規定。但如果在else塊中也有初始化語句,就可以通過編譯,因為無論如何,總有至少一條初始化語句會被執行,不會發生使用前未被初始化的事情。對于try-catch也是一樣,如果只有在try塊里才有初始化語句,編譯部通過。如果在catch或finally里也有,則可以通過編譯。總之,要保證局部變量在使用之前一定被初始化了。所以,一個好的做法是在聲明他們的時候就初始化他們,如果不知道要出事化成什么值好,就用上面的默認值吧!

    其實第三種變量和第二種本質上是一樣的,都是方法中的局部變量。只不過作為參數,肯定是被初始化過的,傳入的值就是初始值,所以不需要初始化。

    問題六:instanceof是什么東東?

    instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回boolean類型的數據。舉個例子:

    String s = "I AM an Object!";
    boolean isObject = s instanceof Object;

    我們聲明了一個String對象引用,指向一個String對象,然后用instancof來測試它所指向的對象是否是Object類的一個實例,顯然,這是真的,所以返回true,也就是isObject的值為True。
    instanceof有一些用處。比如我們寫了一個處理賬單的系統,其中有這樣三個類:

    public class Bill {//省略細節}
    public class PhoneBill extends Bill {//省略細節}
    public class GasBill extends Bill {//省略細節}

    在處理程序里有一個方法,接受一個Bill類型的對象,計算金額。假設兩種賬單計算方法不同,而傳入的Bill對象可能是兩種中的任何一種,所以要用instanceof來判斷:

    public double calculate(Bill bill) {
    if (bill instanceof PhoneBill) {
    //計算電話賬單
    }
    if (bill instanceof GasBill) {
    //計算燃氣賬單
    }
    ...
    }
    這樣就可以用一個方法處理兩種子類。

    然而,這種做法通常被認為是沒有好好利用面向對象中的多態性。其實上面的功能要求用方法重載完全可以實現,這是面向對象變成應有的做法,避免回到結構化編程模式。只要提供兩個名字和返回值都相同,接受參數類型不同的方法就可以了:

    public double calculate(PhoneBill bill) {
    //計算電話賬單
    }

    public double calculate(GasBill bill) {
    //計算燃氣賬單
    }

    所以,使用instanceof在絕大多數情況下并不是推薦的做法,應當好好利用多態。

    posted @ 2006-12-20 16:28 flustar 閱讀(382) | 評論 (1)編輯 收藏

    僅列出標題
    共6頁: 上一頁 1 2 3 4 5 6 下一頁 

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 国产成人精品免费视频大全麻豆| 国产亚洲精品精华液| 91精品国产免费久久国语麻豆| 国产亚洲综合一区二区三区| 亚洲男人电影天堂| 亚洲AV无码精品色午夜在线观看| 免费一级毛片在线播放不收费| 亚洲人成7777| 亚洲国产老鸭窝一区二区三区| 亚洲免费电影网站| 爽爽爽爽爽爽爽成人免费观看| 国产综合激情在线亚洲第一页| 国产成人精品亚洲2020| 亚洲视频在线观看| 亚洲国产成人一区二区精品区| 亚洲色欲久久久久综合网| 日韩在线看片免费人成视频播放| 麻豆一区二区免费播放网站 | 日本免费网址大全在线观看| 99免费精品视频| 午夜在线免费视频| 免费观看四虎精品成人| 国产精品无码亚洲精品2021 | 91在线视频免费播放| 亚洲一区二区三区免费视频| 无码人妻AV免费一区二区三区| 三级黄色在线免费观看| 国产真人无码作爱免费视频| 一级做a爰性色毛片免费| 黄色毛片免费网站| 黄色大片免费网站| 羞羞视频在线观看免费| 一级毛片a免费播放王色| 人人公开免费超级碰碰碰视频| 无码日韩人妻AV一区免费l| 免费在线人人电影网| 国产成人精品免费大全| 成人A毛片免费观看网站| 99视频在线免费观看| 久久不见久久见免费视频7| 51精品视频免费国产专区|