176142998

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

          #

          <html>
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
          <title>css菜單</title>
          <style>
          body{
          background-color:#B8B8A0;
          }
          #fbtn{
          display:none;
          overflow:hidden;
          border-style:solid;
          border-width:1px;
          border-color:#e1e1c9 #e1e1c9 #6e6e56 #6e6e56;
          padding:1 1 1 1;
          width:115px;
          height:30px;
          }
          #fbtn_txt{
          position:relative;
          }
          #fbtn_txt div{
          height:30px;
          padding-top:11px;
          font-size:12px;
          color:#800080;
          text-align:center;
          cursor:hand;
          }
          #fbtn_mask{
          background-color:#ffffff;
          position:relative;
          width:100%;
          height:100%;
          }
          </style>
          </head>
          <body>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>G1</div>
          <div>good morning</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>G2</div>
          <div>good evening</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>M1</div>
          <div>my name is fireyy</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>M2</div>
          <div>mm mm i love u</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>G1</div>
          <div>good morning</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>G2</div>
          <div>good evening</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>M1</div>
          <div>my name is fireyy</div>
          </div>
          </div>
          <div id=fbtn>
          <div id=fbtn_mask></div>
          <div id=fbtn_txt>
          <div>M2</div>
          <div>mm mm i love u</div>
          </div>
          </div>
          <script>
          var current=null;
          var t=null;
          for(var i=0;i<fbtn.length;i++){
          fbtn_txt[i].style.posTop=-30;
          fbtn_mask[i].style.posTop=-30;
          fbtn[i].index=i;
          fbtn[i].style.display="block";
          fbtn[i].onmouseover=function(){
          if(!current){
          current=this;
          domove(this.index);
          }
          else
          if(current!=this){
          domove(current.index);
          domove(this.index);
          current=this;
          }
          }
          fbtn[i].onmouseout=function(){
          if(event.toElement==this.parentElement&t==this){
          domove(this.index);
          current=null;
          }
          }
          }
          function domove(num){
          var o=fbtn_txt[num];
          var m=fbtn_mask[num];
          if(o.style.posTop<-60){
          o.style.display="none";
          var t=o.children[1].innerHTML;
          o.children[1].innerHTML=o.children[0].innerHTML;
          o.children[0].innerHTML=t;
          o.style.posTop=-30;
          o.style.display="block";
          if(m.style.posTop>30)
          m.style.posTop=-30;
          else
          m.style.posTop=0;
          }
          else{
          m.style.posTop+=3;
          o.style.posTop-=3;
          setTimeout('domove('+num+')',15);
          }
          }
          </script>
          </body>
          </html>
          posted @ 2008-07-25 18:56 飛飛 閱讀(321) | 評(píng)論 (0)編輯 收藏

          不明原因拋出 異常如下

          org.springframework.beans.factory.BeanDefinitionStoreException: Unrecognized xbean namespace mapping: http://XFire.codehaus.org/config/1.0
          org.apache.xbean.spring.context.v1.XBeanXmlBeanDefinitionParser.parseBeanFromExtensionElement(XBeanXmlBeanDefinitionParser.java:182)
          org.apache.xbean.spring.context.v1.XBeanXmlBeanDefinitionParser.parseBeanDefinitions(XBeanXmlBeanDefinitionParser.java:807)
          org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.registerBeanDefinitions(DefaultXmlBeanDefinitionParser.java:191)
          org.apache.xbean.spring.context.v1.XBeanXmlBeanDefinitionReader.registerBeanDefinitions(XBeanXmlBeanDefinitionReader.java:78)
          org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:223)
          org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:173)
          org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:148)
          org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:103)
          org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
          org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)
          org.codehaus.xfire.transport.http.XFireConfigurableServlet.createXFire(XFireConfigurableServlet.java:54)
          org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:45)
          javax.servlet.GenericServlet.init(GenericServlet.java:211)
          org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
          org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
          org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
          org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
          org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
          org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
          java.lang.Thread.run(Unknown Source)
          估計(jì)問(wèn)題出在配置文件 services.xml
          查閱官方文檔,發(fā)現(xiàn) xmlns="
          
          以下是一個(gè)實(shí)例
           
          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="
          <service>
             <name>HelloWorldService</name>
             <namespace>http://localhost:8080/HelloService</namespace>
             <serviceClass>
              com.tom.pojo.HelloService
             </serviceClass>
             <implementationClass>
              com.tom.pojo.HelloServiceImp
             </implementationClass>
          </service>
          </beans>

          下載XFrie
          首先,去http://xfire.codehaus.org下載最新版本的XFire

          搭建webservice工程環(huán)境
          在eclipse里創(chuàng)建一個(gè)叫webservice的java工程,然后依次添加src-service、src-conf、src-test和src-util這幾個(gè)Source Folder以及web這個(gè)Folder
          目錄結(jié)構(gòu)及文件如下:

          代碼
          1. webservice   
          2.      src-service   
          3.          cn.hidetoishandsome.xfire.model   
          4.              Book.java   
          5.          cn.hidetoishandsome.xfire.service   
          6.              BookService.java   
          7.          cn.hidetoishandsome.xfire.service.impl   
          8.              BookServiceImpl.java   
          9.      src-conf   
          10.          META-INF   
          11.              xfire   
          12.                  services.xml   
          13.      src-test   
          14.          cn.hidetoishandsome.xfire.test   
          15.              BookServiceTest.java   
          16.      src-util   
          17.          cn.hidetoishandsome.xfire.util   
          18.              XfireClientFactory.java   
          19.      web   
          20.          WEB-INF   
          21.              lib   
          22.              web.xml   
          23.          index.html   

          然后將解壓后的xfire的lib目錄下所有jar包和xfire-all-1.*.jar復(fù)制到WEB-INF/lib目錄
          web.xml內(nèi)容如下:
          代碼
          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"  
          3.          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
          4.   
          5.     <servlet>  
          6.         <servlet-name>xfire</servlet-name>  
          7.         <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>  
          8.     </servlet>  
          9.   
          10.     <servlet-mapping>  
          11.         <servlet-name>xfire</servlet-name>  
          12.         <url-pattern>/services/*</url-pattern>  
          13.     </servlet-mapping>  
          14.   
          15. </web-app>  

           

          寫(xiě)一個(gè)BookService
          我們將創(chuàng)建一個(gè)從ISBM號(hào)得到Book的Title的簡(jiǎn)單查詢Web服務(wù)
          首先創(chuàng)建Book.java

          代碼
          1. package cn.hidetoishandsome.xfire.model;   
          2.   
          3. public class Book {   
          4.   
          5.     private String title;   
          6.   
          7.     private String isbn;   
          8.   
          9.     public String getIsbn() {   
          10.         return isbn;   
          11.      }   
          12.   
          13.     public void setIsbn(String isbn) {   
          14.         this.isbn = isbn;   
          15.      }   
          16.   
          17.     public String getTitle() {   
          18.         return title;   
          19.      }   
          20.   
          21.     public void setTitle(String title) {   
          22.         this.title = title;   
          23.      }   
          24.   
          25. }   

          然后寫(xiě)一個(gè)BookService接口BookService.java
          代碼
          1. package cn.hidetoishandsome.xfire.service;   
          2.   
          3. import cn.hidetoishandsome.xfire.model.Book;   
          4.   
          5. public interface BookService {   
          6.      Book findBookByISBN(String isbn);   
          7. }   

          然后是BookService的實(shí)現(xiàn)BookServiceImpl.java
          代碼
          1. package cn.hidetoishandsome.xfire.service.impl;   
          2.   
          3. import cn.hidetoishandsome.xfire.model.Book;   
          4. import cn.hidetoishandsome.xfire.service.BookService;   
          5.   
          6. public class BookServiceImpl implements BookService {   
          7.   
          8.     private Book book;   
          9.   
          10.     public BookServiceImpl() {   
          11.          book = new Book();   
          12.          book.setTitle("XFire Quick Start");   
          13.          book.setIsbn("123456");   
          14.      }   
          15.   
          16.     public Book findBookByISBN(String isbn) {   
          17.         if (isbn.equals(book.getIsbn()))   
          18.             return book;   
          19.         throw new RuntimeException("Can't find book");   
          20.      }   
          21.   
          22. }   

           

          在services.xml中配置要發(fā)布的服務(wù)
          在src-conf的META-INF/xfire目錄創(chuàng)建services.xml

          代碼
          1. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
          2.     <service>  
          3.         <name>BookService</name>  
          4.         <namespace>http://localhost:8080/xfire/services/BookService</namespace>  
          5.         <serviceClass>cn.hidetoishandsome.xfire.service.BookService</serviceClass>  
          6.         <implementationClass>cn.hidetoishandsome.xfire.service.impl.BookServiceImpl</implementationClass>  
          7.     </service>  
          8. </beans>  

          其中name標(biāo)簽決定了我們創(chuàng)建的該服務(wù)的WSDL的URL為http://xx.xx.xx/xx/xx/BookService?wsdl

           

          在Tomcat中發(fā)布
          可以簡(jiǎn)單的修改Tomcat的server.xml來(lái)發(fā)布該Web服務(wù),在<Host>標(biāo)簽中添加以下內(nèi)容:

          代碼
          1. Context path="/webservice" docBase="D:\project\webservice\web" reloadable="true"/>   

          現(xiàn)在打開(kāi)瀏覽器訪問(wèn)http://localhost:8080/webservice/services/BookService?wsdl來(lái)看看生成的WSDL文檔

           

          客戶端調(diào)用測(cè)試
          我們將使用一個(gè)XfireClientFactory.java工具類來(lái)幫我們調(diào)用該Web服務(wù):

          代碼
          1. package cn.hidetoishandsome.xfire.util;   
          2.   
          3. import java.net.MalformedURLException;   
          4.   
          5. import org.apache.commons.logging.Log;   
          6. import org.apache.commons.logging.LogFactory;   
          7. import org.codehaus.xfire.client.XFireProxyFactory;   
          8. import org.codehaus.xfire.service.Service;   
          9. import org.codehaus.xfire.service.binding.ObjectServiceFactory;   
          10. import org.springframework.util.Assert;   
          11.   
          12. public class XfireClientFactory {   
          13.     private static XFireProxyFactory serviceFactory = new XFireProxyFactory();   
          14.   
          15.     private static final Log log = LogFactory.getLog(XfireClientFactory.class);   
          16.   
          17.     private XfireClientFactory() {   
          18.      }   
          19.   
          20.     public static <T> T getClient(String serviceURL, Class<T> serviceClass) {   
          21.          Assert.notNull(serviceURL);   
          22.          Assert.notNull(serviceClass);   
          23.          Service serviceModel = new ObjectServiceFactory().create(serviceClass);   
          24.         try {   
          25.             return (T) serviceFactory.create(serviceModel, serviceURL);   
          26.          } catch (MalformedURLException e) {   
          27.              log.error(e.getMessage(), e);   
          28.             return null;   
          29.          }   
          30.      }   
          31.   
          32. }   

          然后編寫(xiě)一個(gè)BookServiceTest.java來(lái)調(diào)用我們剛才發(fā)布的Web服務(wù):
          代碼
          1. package cn.hidetoishandsome.xfire.test;   
          2.   
          3. import cn.hidetoishandsome.xfire.service.BookService;   
          4. import cn.hidetoishandsome.xfire.util.XfireClientFactory;   
          5.   
          6. public class BookServieTest {   
          7.   
          8.     public static void main(String[] args) {   
          9.          String serviceURL = "http://localhost:8080/webservice/services/BookService";   
          10.         try {   
          11.              BookService service = XfireClientFactory.getClient(serviceURL, BookService.class);   
          12.              System.out.println("Book with ISBN '123456': 《" + service.findBookByISBN("123456").getTitle() + "》");   
          13.          } catch (Exception e) {   
          14.              e.printStackTrace();   
          15.          }   
          16.   
          17.      }   
          18. }   

          服務(wù)調(diào)用成功,Console打印內(nèi)容如下:
          代碼
          1. Book with ISBN '123456': 《XFire Quick Start》   
          posted @ 2008-07-25 18:53 飛飛 閱讀(338) | 評(píng)論 (0)編輯 收藏

           終于,使用Java完成了一個(gè)WebService的例子,其中的一個(gè)非常小的問(wèn)題,折騰了我將近一天的時(shí)間。下面給出步驟,說(shuō)明在Java平臺(tái)上如何開(kāi)發(fā)WebService。

              采用的工具:Eclipse3.1.2 + Tomcat5.5 + XFire1.1 。使用XFire開(kāi)發(fā)WebService應(yīng)該說(shuō)非常的容易,只需要按照下面例子的步驟來(lái)做:

          (1)在Eclipse中新建一個(gè)dynamic Web Project ,假設(shè)名為XFireZhuweiTest。

          (2)導(dǎo)入XFire用戶庫(kù)。該庫(kù)中應(yīng)包含xfire-1.1目錄下的xfire-all-1.1.jar文件,以及xfire-1.1\lib目錄下的所有文件。

          (3)將上述的XFire用戶庫(kù)中的所有文件拷貝到XFireZhuweiTest項(xiàng)目的WebContent\WEB-INF\lib目錄下。

          (4)修改WebContent\WEB-INF\web.xml配置文件的內(nèi)容,下面是修改后web.xml:
          <?xml version="1.0" encoding="UTF-8"?>
          <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 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">
               <display-name>
               XFireZhuweiTest</display-name>
               <welcome-file-list>
                   <welcome-file>index.html</welcome-file>
                   <welcome-file>index.htm</welcome-file>
                   <welcome-file>index.jsp</welcome-file>
                   <welcome-file>default.html</welcome-file>
                   <welcome-file>default.htm</welcome-file>
                   <welcome-file>default.jsp</welcome-file>
               </welcome-file-list>
              
               <servlet>
                    <servlet-name>XFireServlet</servlet-name>
                    <servlet-class>
                            org.codehaus.xfire.transport.http.XFireConfigurableServlet
                    </servlet-class>
                </servlet>
               
                <servlet-mapping>
                    <servlet-name>XFireServlet</servlet-name>
                    <url-pattern>/servlet/XFireServlet/*</url-pattern>
                </servlet-mapping>

                <servlet-mapping>
                    <servlet-name>XFireServlet</servlet-name>
                     <url-pattern>/services/*</url-pattern>
                </servlet-mapping>
              
          </web-app>

              web.xml中添加的servlet映射表明,所有匹配“/services/*”的url請(qǐng)求全部交給org.codehaus.xfire.transport.http.XFireConfigurableServlet來(lái)處理。

          (5)編寫(xiě)需要發(fā)布為WebService的Java類,這個(gè)例子中是一個(gè)非常簡(jiǎn)單的MathService.java。

          package com.zhuweisky.xfireDemo;
          public class MathService
          {
              
          public int Add(int a ,int b)
               {
                  
          return a+b ;
               }
          }

          (6)在WebContent\META-INF目錄下新建xfire文件夾,然后在xfire目錄下添加一個(gè)XFire使用的配置文件services.xml,該配置文件中的內(nèi)容反映了要將哪些java類發(fā)布為web服務(wù)。本例中的services.xml內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://xfire.codehaus.org/config/1.0">
              
          <service>
                
          <name>MathService</name>
                
          <namespace>http://com.zhuweisky.xfireDemo/MathService</namespace>
                <serviceClass>com.zhuweisky.xfireDemo.MathService</serviceClass>
              
          </service>
          </beans>


              XFire會(huì)借助Spring來(lái)解析services.xml,從中提取需要發(fā)布為WebService的配置信息。

               很多文章介紹到這里就完了,然而當(dāng)我按照他們所說(shuō)的啟動(dòng)WebService ,然后通過(guò)http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 來(lái)訪問(wèn)服務(wù)描述時(shí),卻拋出了異常,說(shuō)services.xml文件不存在--
          “org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/xfire/services.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist”。  

          (7)非常關(guān)鍵的一點(diǎn),就是這個(gè)小難題花費(fèi)了我將近一天的時(shí)間。
              在WebContent\WEB-INF目錄下新建classes文件夾,然后需要將WebContent下的整個(gè)META-INF文件夾剪切到新建的classes文件夾下。
              到這里,項(xiàng)目的完整目錄結(jié)構(gòu)如下:


             (8)在處理完這個(gè)問(wèn)題后.從新部署并運(yùn)Tomcat.但接著問(wèn)題又來(lái)了錯(cuò)誤內(nèi)容如下:Unrecognized xbean element mapping: services in namespace                         http://xfire.codeh.
                      經(jīng)過(guò)分析得出XFire1.26需要xalan.jar包的支持.但它自身的Lib下無(wú)此jar。需要我們?cè)赼pache官方下載.然后將此包放入工程的lib下
             (9)再次從新編譯運(yùn)行.本以為一切OK了.但還是出來(lái)問(wèn)題java.lang.NoClassDefFoundError: org/apache/xml/serializer/TreeWalker錯(cuò)誤
                       這次通過(guò)在Apache官方找到了出錯(cuò)誤的原因:
                       原本這個(gè)類是包含在xalan.jar中的,但是xalan-j2.7.0版的發(fā)布包中,將serializer包中的類單獨(dú)打包成serializer.jar,不再包含在xalan.jar中,所以才會(huì)即使添加了
                      xalan.jar也無(wú)法找到該類,添加后即可解決問(wèn)題
          (10)OK。一切搞定在IE中輸入 http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 會(huì)得到正確的web服務(wù)描述文檔

          posted @ 2008-07-25 18:52 飛飛 閱讀(812) | 評(píng)論 (0)編輯 收藏

           

          Java 社區(qū)一直試圖將 POJO 的作用發(fā)揮到極致,降低 Java 應(yīng)用實(shí)現(xiàn)的難度,最近的嘗試是將 EJB3.0 建立在 POJO 之上;另一方面,SOA 是目前 Java 社區(qū)炙手可熱的名詞,非常多的企業(yè)都在努力應(yīng)用和實(shí)施 SOA;XFire 為這兩方面的需求提供了一種魔術(shù)般的解決方式,我們很快能夠發(fā)現(xiàn)使用 XFire 創(chuàng)建和發(fā)布 Web 服務(wù)可以直接基于 POJO,將煩人的繼承關(guān)系和一大堆其他可能的約束丟在一邊。

          POJO、SOA 概述

          被重新審視的 POJO

          POJO(Plain Old Java Object,簡(jiǎn)單 Java 對(duì)象)是 Java 社區(qū)中最早的成員(回想您學(xué)習(xí) Java 時(shí)第一個(gè)興奮的時(shí)刻,那個(gè)簡(jiǎn)單的 "Hello World!" 例子),也是最簡(jiǎn)單、最容易實(shí)現(xiàn)的方式。

          然而現(xiàn)實(shí)中 Java 的發(fā)展已經(jīng)遠(yuǎn)遠(yuǎn)超越了 POJO 的范圍,成為面向?qū)ο蠹夹g(shù)應(yīng)用中最成功的編程語(yǔ)言,尤其是繼承、多態(tài)的應(yīng)用為我們?cè)炀土艘淮笈_(kāi)發(fā)框架(如 Struts)和標(biāo)準(zhǔn)(如 EJB),隨之而來(lái)的就是實(shí)現(xiàn)的復(fù)雜化,我們必須面對(duì)一大堆繼承關(guān)系的限制。比如說(shuō):要開(kāi)發(fā)一個(gè)基于 Struts 的應(yīng)用,我們必須了解 Struts 特定的繼承關(guān)系如 ActionForm、ValidateActionForm;要開(kāi)發(fā)一個(gè) EJB 應(yīng)用,我們必須繼承 EJBObject、SessionEJB 等。

          為了拋開(kāi)這些限制,降低 Java 應(yīng)用實(shí)現(xiàn)的難度,Java 社區(qū)開(kāi)始重新審視 POJO 的價(jià)值,試圖將 POJO 的作用發(fā)揮到極致,最新的努力是 EJB3.0。Java 社區(qū)將 EJB3.0 設(shè)計(jì)為基于 POJO,而不是為他準(zhǔn)備更多的繼承關(guān)系等限制。

          讓人愛(ài)恨交加的 SOA

          SOA 已經(jīng)成為了目前 Java 社區(qū)中炙手可熱的名詞,幾乎所有的軟件廠商都在討論它,為他提供解決方案和產(chǎn)品支持,大部分的企業(yè)也已經(jīng)在企業(yè)內(nèi)部實(shí)施或者正在考慮實(shí)施 SOA。

          然而 SOA 在企業(yè)內(nèi)的實(shí)施卻不是一項(xiàng)簡(jiǎn)單的任務(wù),即使拋開(kāi)新建系統(tǒng)直接基于 SOA 架構(gòu)實(shí)施的因素,要把企業(yè)已有系統(tǒng)納入 SOA 框架也不是一件容易的事情。企業(yè)必須在對(duì)當(dāng)前架構(gòu)深入了解的基礎(chǔ)上,對(duì)已有系統(tǒng)進(jìn)行大規(guī)模的改造才能滿足新的要求。如何經(jīng)濟(jì)的從原有技術(shù)架構(gòu)切換到 SOA 架構(gòu)成為很多企業(yè)的難題。




          XFire 概述

          XFire 是 codeHaus 組織提供的一個(gè)開(kāi)源框架,它構(gòu)建了 POJO 和 SOA 之間的橋梁,主要特性就是支持將 POJO 通過(guò)非常簡(jiǎn)單的方式發(fā)布成 Web 服務(wù),這種處理方式不僅充分發(fā)揮了 POJO 的作用,簡(jiǎn)化了 Java 應(yīng)用轉(zhuǎn)化為 Web 服務(wù)的步驟和過(guò)程,也直接降低了 SOA 的實(shí)現(xiàn)難度,為企業(yè)轉(zhuǎn)向 SOA 架構(gòu)提供了一種簡(jiǎn)單可行的方式。

          XFire 目前最新的版本是 1.2.2,目前支持的特性主要包括:

          • 支持將 Web 服務(wù)綁定到 POJO、XMLBeans、JAXB1.1、JAXB2.0 和 Castor;
          • 支持基于 HTTP、JMS、XMPP 等多種協(xié)議訪問(wèn) Web 服務(wù);
          • 支持多種 Web 服務(wù)業(yè)界重要標(biāo)準(zhǔn)如 SOAP、WSDL、Web 服務(wù)尋址(WS-Addressing)、Web 服務(wù)安全(WS-Security)等;
          • 支持 JSR181,可以通過(guò) JDK5 配置 Web 服務(wù);
          • 高性能的 SOAP 實(shí)現(xiàn);
          • 服務(wù)器端、客戶端代碼輔助生成;
          • 對(duì) Spring、Pico、Plexus 等項(xiàng)目的支持等。




          XFire 安裝包

          XFire 框架目前的最新版本是 1.2.6,可以訪問(wèn) xfire.codehaus.org 下載 XFire 框架的安裝包,下載時(shí)請(qǐng)選擇“全部二進(jìn)制發(fā)布包(Binary Distribution in zip package)”,而不僅僅是“XFire jar 文件(Jar of all XFire modules)”。

          下載完成后,我們可以將下載的 .zip 文件解壓縮到任意的文件夾中(后面的章節(jié)中使用 % XFIRE_HOME % 表示 XFire 框架的安裝目錄),解壓縮后形成的文件目錄結(jié)構(gòu)如下:

          • api(目錄)

            api 目錄中是 XFire 框架中所有類(class)對(duì)應(yīng)的 API 文檔,為開(kāi)發(fā)者使用 XFire 完成應(yīng)用開(kāi)發(fā)提供幫助。

          • examples(目錄)

            examples 目錄中包含了所有隨 XFire 二進(jìn)制包發(fā)布的實(shí)例,包括這些實(shí)例的源代碼和相關(guān) Web 應(yīng)用配置內(nèi)容。

          • lib(目錄)

            lib 目錄中包含 XFire 運(yùn)行所需要的外部支持類包(.jar文件),可以根據(jù)不同項(xiàng)目所需的 XFire 特性選擇所需要的支持類包。保守的方法是在 Web 項(xiàng)目中包含所有的外部支持類包(.jar文件)。

          • manual(目錄)

            manual 目錄中包含有 XFire 框架的幫助文檔,開(kāi)發(fā)者可以從這些幫助文檔中學(xué)習(xí)更多運(yùn)用 XFire 框架實(shí)現(xiàn) SOA 的知識(shí)和技巧。

          • modules(目錄)

            modules 目錄中包含了 XFire 框架根據(jù)不同特性分別編譯的二進(jìn)制包文件。發(fā)布基于 XFire 框架的 Web 項(xiàng)目時(shí),可以選擇使用該目錄下的所有 .jar 文件,也可以選擇 XFire-all-1.2.6.jar 文件。

          • XFire-all-1.2.6.jar

            XFire 框架的二進(jìn)制包文件,包含了全部的模塊(modules)。

          • LICENSE.txt

            LICENSE.txt 文件中包含了 XFire 框架的授權(quán)協(xié)議。

          • NOTICE.txt
          • README.txt

            這兩個(gè)文件中包含了 XFire 發(fā)布時(shí)的一些有用的信息。





          XFire 框架支撐環(huán)境

          XFire框架是一種基于Servlet技術(shù)的SOA應(yīng)用開(kāi)發(fā)框架,要正常運(yùn)行基于XFire應(yīng)用框架開(kāi)發(fā)的企業(yè)應(yīng)用,除了XFire框架本身之外,還需要JDK和Servlet容器的支持。

          1.JDK 版本選擇、下載和安裝

          XFire 支持非常多的特性,其中不同的特性對(duì) JDK 版本的要求有所不同,比如如果項(xiàng)目中選擇基于 JSR181 標(biāo)準(zhǔn)發(fā)布 Web 服務(wù),我們就需要選擇 JDK5 或者以上版本,如果僅僅選擇將 Web 服務(wù)綁定到最簡(jiǎn)單的 POJO,我們只需要選擇 JDK1.4 版本即可。

          JDK 各版本均可以在 java.sun.com 網(wǎng)站上下載,如何安裝 JDK 請(qǐng)參考 SUN 公司的相關(guān)技術(shù)文檔和 JDK 的幫助文檔。

          2.Servlet 容器下載和安裝

          XFire 是一種基于 Servlet 技術(shù)的 SOA 應(yīng)用開(kāi)發(fā)框架,需要 Servlet 容器的支持。XFire 支持在多種 Servlet 容器中運(yùn)行,包括 Websphere、Weblogic、TOMCAT 等。為了說(shuō)明的簡(jiǎn)單,我們選擇使用 TOMCAT(版本5.0.30)作為 XFire 的運(yùn)行容器,所有配置過(guò)程和發(fā)布步驟的說(shuō)明也均是針對(duì) TOMCAT,如果讀者使用 TOMCAT 之外的其它 Servlet 容器或者選擇了 TOMCAT 的其它版本,下面的配置過(guò)程和步驟可能需要做出調(diào)整,請(qǐng)讀者根據(jù)實(shí)際 Servlet 容器的幫助文檔進(jìn)行相應(yīng)調(diào)整。

          TOMCAT 各版本均可以在 tomcat.apache.org 網(wǎng)站上下載,如何正確安裝 TOMCAT 服務(wù)器請(qǐng)參考 TOMCAT 服務(wù)器的幫助文檔。

          3.xalan

          XFire 需要 xalan 項(xiàng)目的支持,然而 1.2.6 版本中并沒(méi)有帶有相應(yīng)的 jar 文件,因此請(qǐng)?jiān)L問(wèn) xml.apache.org,下載 xalan 項(xiàng)目的二進(jìn)制包。





          XFire 應(yīng)用配置

          前面的章節(jié)中我們下載和安裝了 XFire 安裝包和所需要的支持環(huán)境,現(xiàn)在我們開(kāi)始學(xué)習(xí)如何從零開(kāi)始創(chuàng)建 XFire 應(yīng)用開(kāi)發(fā)環(huán)境。下面的所有配置過(guò)程和發(fā)布步驟均針對(duì) TOMCAT(版本5.0.30)服務(wù)器,如果選擇其它的 Servlet 容器,下面的配置過(guò)程和步驟可能需要做出調(diào)整,請(qǐng)讀者根據(jù)實(shí)際 Servlet 容器的幫助文檔進(jìn)行相應(yīng)調(diào)整。

          1、創(chuàng)建 Web 應(yīng)用目錄和基本元素

          1. 在 %TOMCAT_HOME%/webapps 目錄下創(chuàng)建新的 Web 應(yīng)用目錄 “XFire”

            [注] 其中的 %TOMCAT_HOME% 指向 TOMCAT 的安裝目錄。

          2. 在 ”XFire”目錄下創(chuàng)建 ”WEB-INF”目錄、
          3. 在 ” WEB-INF”目錄下創(chuàng)建 ”lib”目錄和 ”classes”目錄
          4. 在 ” WEB-INF”目錄下創(chuàng)建 Web 應(yīng)用描述文件 ”web.xml”, ”web.xml”文件的內(nèi)容見(jiàn) 清單 1-1

          清單 1-1 WEB-INF\web.xml
                          
                      1、 <?xml version="1.0" encoding="ISO-8859-1"?>
                      2、 <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
                      3、       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      4、       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
                      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
                      5、       version="2.4">
                      6、
                      7、       <display-name>XFire實(shí)例</display-name>
                      8、       <description>
                      9、            基于XFire框架發(fā)布Web服務(wù)的例子
                      10、       </description>
                      11、
                      12、 </web-app>

          2、拷貝 XFire 所需的支持類包文件

          拷貝 %XFIRE_HOME%/lib 目錄下所有文件到 “1、創(chuàng)建 Web 應(yīng)用目錄和基本元素” 中所創(chuàng)建的 ”lib”目錄下,將 %XFIRE_HOME%/XFire-all-1.2.6.jar 文件也拷貝到 “1、創(chuàng)建 Web 應(yīng)用目錄和基本元素” 中所創(chuàng)建的 ”lib”目錄下。將 xalan 安裝包中的所有 jar 文件和所需要的支持 jar 文件拷貝到相同的 ”lib”目錄下。

          [注] 為了減少拷貝的 jar 文件的數(shù)目,開(kāi)發(fā)者可以根據(jù)項(xiàng)目的需要選擇需要拷貝的 jar 文件,而不是全部拷貝,如何根據(jù)需要選擇拷貝合適的類包文件請(qǐng)?jiān)L問(wèn) XFire 站點(diǎn)

          3、配置 XFire 框架運(yùn)行所需的 Servlet

          修改 web.xml 文件,在其中增加如下 Servlet 定義內(nèi)容。

          1、 <servlet>
                      2、       <servlet-name>XFireServlet</servlet-name>
                      3、       <display-name>XFire Servlet</display-name>
                      4、       <servlet-class>
                      5、           org.codehaus.xfire.transport.http.XFireConfigurableServlet
                      6、       </servlet-class>
                      7、     </servlet>
                      8、
                      9、     <servlet-mapping>
                      10、       <servlet-name>XFireServlet</servlet-name>
                      11、       <url-pattern>/servlet/XFireServlet/*</url-pattern>
                      12、     </servlet-mapping>
                      13、
                      14、     <servlet-mapping>
                      15、       <servlet-name>XFireServlet</servlet-name>
                      16、       <url-pattern>/services/*</url-pattern>
                      17、 </servlet-mapping>

          4、創(chuàng)建 XFire 框架的服務(wù)發(fā)布文件 services.xml

          1. “1、創(chuàng)建 Web 應(yīng)用目錄和基本元素” 中創(chuàng)建的 classes 目錄下新建目錄 ”META-INF\xfire”;
          2. 在步驟 a) 中新建的 ”xfire”文件目錄下創(chuàng)建新文件 services.xml,文件的默認(rèn)內(nèi)容如 清單1-2

          清單 1-2 WEB-INF\classes\META-INF\xfire\services.xml
                          
                      1、 <beans xmlns="http://XFire.codehaus.org/config/1.0">
                      2、 </beans>





          將 POJO 發(fā)布成 Web 服務(wù)

          XFire 框架中,我們有兩種方式將 POJO 發(fā)布成 Web 服務(wù):

          • 一種方式是直接使用 Web 服務(wù)接口和 Web 服務(wù)實(shí)現(xiàn)類(POJO)來(lái)發(fā)布;
          • 另一種方式是基于 JSR181 標(biāo)準(zhǔn)和注釋技術(shù)將被注釋的 POJO 發(fā)布成 Web 服務(wù);

          下面的章節(jié)中我們將學(xué)習(xí)使用第一種方式來(lái)完成 POJO 的 Web 服務(wù)發(fā)布。我們將使用經(jīng)典的 ”Hello World!”例子來(lái)演示將 POJO 發(fā)布成 Web 服務(wù)所需要的步驟,不過(guò)我們不再是簡(jiǎn)單的訪問(wèn)一個(gè) Java 方法來(lái)輸出 ”Hello World!”字符串,而是轉(zhuǎn)為在 SOA 環(huán)境下實(shí)現(xiàn):Web 服務(wù)客戶端通過(guò)訪問(wèn)服務(wù)器端發(fā)布成 Web 服務(wù)的 POJO 獲得返回的 ”Hello World!”字符串后輸出到客戶端的控制臺(tái)上。

          將 POJO 發(fā)布成 Web 服務(wù)的基本步驟如下:

          1. 創(chuàng)建 Web 服務(wù)接口,聲明該 Web 服務(wù)對(duì)外暴露的接口;
          2. 創(chuàng)建 Web 服務(wù)實(shí)現(xiàn)類,為 Web 服務(wù)接口提供實(shí)現(xiàn);
          3. 修改 XFire 框架的服務(wù)發(fā)布文件 ---- services.xml,將 POJO 發(fā)布成 Web 服務(wù)。

          下面我們通過(guò)創(chuàng)建 ”Hello World!”例子來(lái)具體說(shuō)明如何實(shí)現(xiàn)這三個(gè)步驟。

          1.創(chuàng)建 Web 服務(wù)接口 ---- HelloWorldService

          要將 POJO 發(fā)布成 Web 服務(wù),首先需要?jiǎng)?chuàng)建 Web 服務(wù)接口,在接口中聲明該 Web 服務(wù)需要對(duì)外暴露的接口。

          我們根據(jù)需要?jiǎng)?chuàng)建 Web 服務(wù)接口 ” HelloWorldService”,在其中聲明一個(gè) ”sayHello”方法,該方法返回 ”String ”類型的內(nèi)容。” HelloWorldService”接口對(duì)應(yīng)的 Java 文件代碼如 清單 1-3


          清單 1-3 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldService.java
                          
                      1.package org.vivianj.xfire.pojo;
                      2.
                      3. /**
                      4. * HelloWorldService 中聲明需要發(fā)布成 Web 服務(wù)的所有 Java 方法
                      5. * HelloWorldService 作為Web服務(wù)接口
                      6. */
                      7. public interface HelloWorldService {
                      8. /**
                      9.        * sayHello 方法聲明了 Web 服務(wù)對(duì)外暴露的接口
                      10.  *
                      11.  * @return 返回給客戶端的字符串
                      12.  */
                      13. public String sayHello();
                      14.}

          2.創(chuàng)建 Web 服務(wù)實(shí)現(xiàn)類 ”HelloWorldServiceImpl”

          創(chuàng)建 Web 服務(wù)實(shí)現(xiàn)類 ”HelloWorldServiceImpl”,它繼承 ”1、創(chuàng)建Web服務(wù)接口 ---- HelloWorldService” 中創(chuàng)建的 HelloWorldService 接口,并且為它聲明的 ”sayHello”方法提供具體實(shí)現(xiàn): 返回字符串”Hello World!”。 ”HelloWorldServiceImpl”類對(duì)應(yīng)的 Java 文件代碼如 清單 1-4


          清單 1-4 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldServiceImpl.java
                          
                      1.package org.vivianj.xfire.pojo;
                      2.
                      3./**
                      4. * HelloWorldServiceImpl 中為 Web 服務(wù)接口中聲明的所有 Java 方法提供具體實(shí)現(xiàn)
                      5. * HelloWorldServiceImpl 作為 Web 服務(wù)的實(shí)現(xiàn)類
                      6. */
                      7.public class HelloWorldServiceImpl implements HelloWorldService {
                      8.
                      9. /*
                      10.  * sayHello 方法為 HelloWorldService 服務(wù)接口定義的 sayHello 方法提供具體實(shí)現(xiàn)
                      11.  *  
                      12.  * @see org.vivianj.XFire.pojo.HelloWorldService#sayHelloToXFire()
                      13.  */
                      14. public String sayHello() {
                      15.  return "Hello World!";
                      16. }
                      17.
                      18.}

          3.修改 services.xml,將 POJO 發(fā)布成 Web 服務(wù)

          我們可以在 WEB-INF\classes\META-INF\XFire\services.xml 文件中的 <beans …> 和 </beans> 元素中間加入如下的 xml 內(nèi)容將上面創(chuàng)建的 HelloWorldService 發(fā)布成 Web 服務(wù)。

          1.<service>
                      2. <name>HelloWorldService</name>
                      3. <namespace>http://vivianj.org/HelloWorldService</namespace>
                      4. <serviceClass>
                      5.  org.vivianj.xfire.pojo.HelloWorldService
                      6. </serviceClass>
                      7. <implementationClass>
                      8.  org.vivianj.xfire.pojo.HelloWorldServiceImpl
                      9. </implementationClass>
                      10.</service>

          其中各元素的功能如下:

          • service

            service 標(biāo)簽和它所包含的 xml 內(nèi)容為發(fā)布成 Web 服務(wù)的 POJO 提供完整的描述。

          • name

            Web 服務(wù)被發(fā)布時(shí)所采用的唯一名稱。

          • namespace

            Web 服務(wù)發(fā)布時(shí)所使用的命名空間。

          • serviceClass

            Web 服務(wù)接口類的全名,包括包名和類名。

          • implemetationClass

            Web 服務(wù)實(shí)現(xiàn)類的全名,包括包名和類名。

          更多 service 元素的子元素和它們的用法請(qǐng)參考 XFire 站點(diǎn)

          通過(guò)上面的三個(gè)步驟,我們已經(jīng)將新創(chuàng)建的HelloWorldService發(fā)布成了Web服務(wù),我們可以使用下面的步驟測(cè)試一下創(chuàng)建的Web服務(wù)是否能夠正常運(yùn)行:

          1. 編譯上面的步驟中創(chuàng)建的 Java 接口和類;
          2. 啟動(dòng) TOMCAT 服務(wù)器。
          3. 等 TOMCAT 服務(wù)器完全啟動(dòng)后,打開(kāi)瀏覽器,在地址欄中輸入 http://localhost:8080/XFire/services/HelloWorldService?wsdl。

          其中 HelloWorldServcie 是配置文件中 service\name 元素所定義的內(nèi)容,”wsdl”參數(shù)表示查看該 Web 服務(wù)的 WSDL(Web服務(wù)描述語(yǔ)言)文件。

          如果瀏覽器中出現(xiàn)如下圖所示類似的內(nèi)容,表示 Web 服務(wù)發(fā)布成功,我們可以編寫(xiě)客戶端訪問(wèn)該 Web 服務(wù)從服務(wù)器獲取返回字符串,本文下載資源中提供的下載文件中包含有可供參考的客戶端類 org.vivianj.xfire.pojo.client.HelloWorldServiceClient。


          圖:瀏覽器中訪問(wèn)效果

          如果瀏覽器中出現(xiàn)錯(cuò)誤提示,請(qǐng)按照上面的步驟和說(shuō)明檢查已經(jīng)完成的開(kāi)發(fā)、配置過(guò)程是否完全正確。





          結(jié)束語(yǔ)

          本文中作者首先講解了 XFire 框架的主要特性,XFire 框架的運(yùn)行環(huán)境以及基于 XFire 框架開(kāi)發(fā) SOA 應(yīng)用的基本步驟,并且借助于 SOA 環(huán)境下的 ”Hello World!”例子,詳細(xì)的講解和演示了如何基于 XFire 框架、經(jīng)過(guò)簡(jiǎn)單的開(kāi)發(fā)、配置步驟就將一個(gè) POJO 類中包含的方法發(fā)布成Web服務(wù)。從 ”Hello World!”例子實(shí)現(xiàn)的過(guò)程中,我們可以發(fā)現(xiàn) XFire 框架最大化的發(fā)揮了 POJO 的作用,減少了 SOA 實(shí)施時(shí)對(duì)框架本身的依賴,降低了 SOA 實(shí)施的難度,企業(yè)實(shí)施 SOA 時(shí)并不需要增加太多的投入就可以實(shí)現(xiàn)目標(biāo)。






          下載

          名字 大小 下載方法
          xfire.war 6 KB HTTP
          關(guān)于下載方法的信息


          參考資料

          學(xué)習(xí)

          獲得產(chǎn)品和技術(shù)
          • 訪問(wèn) java.sun.com 獲得 JDK 各種版本二進(jìn)制安裝包。
          • 訪問(wèn) tomcat.apache.org 獲得 TOMCAT 服務(wù)器各種版本二進(jìn)制安裝包。
          • 訪問(wèn) xml.apache.org 獲得 xalan 框架各種版本二進(jìn)制安裝包。
          • 訪問(wèn) XFire.codehaus.org 獲得 XFire 框架的二進(jìn)制安裝包。
          posted @ 2008-07-25 18:48 飛飛 閱讀(256) | 評(píng)論 (0)編輯 收藏

          作用域 功能 快捷鍵
          文本編輯器 查找上一個(gè) Ctrl+Shift+K
          文本編輯器 查找下一個(gè) Ctrl+K
          全局 恢復(fù)上一個(gè)選擇 Alt+Shift+↓
          全局 快速修正 Ctrl1+1
          全局 內(nèi)容輔助 Alt+/
          全局 上下文信息 Alt+?
          Alt+Shift+?
          Ctrl+Shift+Space
          Java編輯器 顯示工具提示描述 F2
          Java編輯器 選擇封裝元素 Alt+Shift+↑
          Java編輯器 選擇上一個(gè)元素 Alt+Shift+←
          Java編輯器 選擇下一個(gè)元素 Alt+Shift+→
          文本編輯器 增量查找 Ctrl+J
          文本編輯器 增量逆向查找 Ctrl+Shift+J
          全局 重做 Ctrl+Y


          查看
          作用域 功能 快捷鍵
          全局 放大 Ctrl+=
          全局 縮小 Ctrl+-


          窗口
          作用域 功能 快捷鍵
          全局 激活編輯器 F12
          全局 切換編輯器 Ctrl+Shift+W
          全局 上一個(gè)編輯器 Ctrl+Shift+F6
          全局 上一個(gè)視圖 Ctrl+Shift+F7
          全局 上一個(gè)透視圖 Ctrl+Shift+F8
          全局 下一個(gè)編輯器 Ctrl+F6
          全局 下一個(gè)視圖 Ctrl+F7
          全局 下一個(gè)透視圖 Ctrl+F8
          文本編輯器 顯示標(biāo)尺上下文菜單 Ctrl+W
          全局 顯示視圖菜單 Ctrl+F10
          全局 顯示系統(tǒng)菜單 Alt+-


          導(dǎo)航
          作用域 功能 快捷鍵
          Java編輯器 打開(kāi)結(jié)構(gòu) Ctrl+F3
          全局 打開(kāi)類型 Ctrl+Shift+T
          全局 打開(kāi)類型層次結(jié)構(gòu) F4
          全局 打開(kāi)聲明 F3
          全局 打開(kāi)外部javadoc Shift+F2
          全局 打開(kāi)資源 Ctrl+Shift+R
          全局 后退歷史記錄 Alt+←
          全局 前進(jìn)歷史記錄 Alt+→
          全局 上一個(gè) Ctrl+,
          全局 下一個(gè) Ctrl+.
          Java編輯器 顯示大綱 Ctrl+O
          全局 在層次結(jié)構(gòu)中打開(kāi)類型 Ctrl+Shift+H
          全局 轉(zhuǎn)至匹配的括號(hào) Ctrl+Shift+P
          全局 轉(zhuǎn)至上一個(gè)編輯位置 Ctrl+Q
          Java編輯器 轉(zhuǎn)至上一個(gè)成員 Ctrl+Shift+↑
          Java編輯器 轉(zhuǎn)至下一個(gè)成員 Ctrl+Shift+↓
          文本編輯器 轉(zhuǎn)至行 Ctrl+L

          搜索
          作用域 功能 快捷鍵
          全局 出現(xiàn)在文件中 Ctrl+Shift+U
          全局 打開(kāi)搜索對(duì)話框 Ctrl+H
          全局 工作區(qū)中的聲明 Ctrl+G
          全局 工作區(qū)中的引用 Ctrl+Shift+G

          文本編輯
          作用域 功能 快捷鍵
          文本編輯器 改寫(xiě)切換 Insert
          文本編輯器 上滾行 Ctrl+↑
          文本編輯器 下滾行 Ctrl+↓

          文件
          作用域 功能 快捷鍵
          全局 打印 Ctrl+P
          全局 全部保存 Ctrl+Shift+S
          全局 全部關(guān)閉 Ctrl+Shift+F4
          全局 屬性 Alt+Enter

          項(xiàng)目
          作用域 功能 快捷鍵
          全局 全部構(gòu)建 Ctrl+B

          源代碼
          作用域 功能 快捷鍵
          Java編輯器 格式化 Ctrl+Shift+F
          Java編輯器 取消注釋 Ctrl+\
          Java編輯器 注釋 Ctrl+/
          Java編輯器 添加導(dǎo)入 Ctrl+Shift+M
          Java編輯器 組織導(dǎo)入 Ctrl+Shift+O

          運(yùn)行
          作用域 功能 快捷鍵
          全局 單步跳入選擇 Ctrl+F5
          全局 調(diào)試上次啟動(dòng) F11
          全局 使用過(guò)濾器單步執(zhí)行 Shift+F5
          全局 添加/去除斷點(diǎn) Ctrl+Shift+B
          全局 顯示 Ctrl+D
          全局 運(yùn)行上次啟動(dòng) Ctrl+F11
          全局 執(zhí)行 Ctrl+U

          重構(gòu)
          作用域 功能 快捷鍵
          全局 撤銷(xiāo)重構(gòu) Alt+Shift+Z
          全局 抽取方法 Alt+Shift+M
          全局 抽取局部變量 Alt+Shift+L
          全局 內(nèi)聯(lián) Alt+Shift+I
          全局 移動(dòng) Alt+Shift+V
          全局 重命名 Alt+Shift+R
          全局 重做 Alt+Shift+Y
          posted @ 2008-07-23 13:06 飛飛 閱讀(1179) | 評(píng)論 (1)編輯 收藏

          方法如下:

           

          <select onbeforeactivate="return false" onfocus="this.blur()" onmouseover="this.setCapture()" onmouseout="this.releaseCapture()"> 
          <option>1</option>
          </select>
          posted @ 2008-07-22 16:47 飛飛 閱讀(488) | 評(píng)論 (0)編輯 收藏

          作者:阿捷 2005-4-11 16:54:52

          盡管在我的網(wǎng)站和文章里都有提到CSS制作菜單的方法,但很多初學(xué)者還是不太清楚如何實(shí)現(xiàn),以及實(shí)現(xiàn)原理,我想專門(mén)寫(xiě)一篇詳細(xì)教程會(huì)對(duì)大家比較有幫助。

          我們先來(lái)看一個(gè)菜單的例子,最終效果是:

          然后我們來(lái)詳細(xì)講解步驟

          第一步:建立一個(gè)無(wú)序列表

          我們先建立一個(gè)無(wú)序列表,來(lái)建立菜單的結(jié)構(gòu)。代碼是:

          <ul>
          <li><a href="1">首頁(yè)</a></li>
          <li><a href="2">產(chǎn)品介紹</a></li>
          <li><a href="3">服務(wù)介紹</a></li>
          <li><a href="4">技術(shù)支持</a></li>
          <li><a href="5">立刻購(gòu)買(mǎi)</a></li>
          <li><a href="6">聯(lián)系我們</a></li>
          </ul>

          效果是:

          第二步:隱藏li的默認(rèn)樣式

          因?yàn)榭雌饋?lái)不是很好看,菜單通常都不需要li默認(rèn)的圓點(diǎn),我們給UL定義一個(gè)樣式來(lái)消除這些圓點(diǎn)。

          當(dāng)然,為了更好的控制整個(gè)菜單,我們把菜單放在一個(gè)div里。頁(yè)面代碼變成:

          <div class="test"> <ul>
          <li><a href="1">首頁(yè)</a></li>
          <li><a href="2">產(chǎn)品介紹</a></li>
          <li><a href="3">服務(wù)介紹</a></li>
          <li><a href="4">技術(shù)支持</a></li>
          <li><a href="5">立刻購(gòu)買(mǎi)</a></li>
          <li><a href="6">聯(lián)系我們</a></li>
          </ul> </div>

          CSS定義為:

          .test ul{list-style:none;}

          說(shuō)明:“.test ul”表示我要定義的樣式將作用在test的層里的ul標(biāo)簽上。

          現(xiàn)在的效果是沒(méi)有圓點(diǎn)了:

          第三步:關(guān)鍵的浮動(dòng)

          這里是菜單變成橫向的關(guān)鍵,我們給li元素加上一個(gè)“float:left;”屬性,讓每個(gè)li浮動(dòng)在前面一個(gè)li的左面。

          CSS定義為:

          .test li{float:left;}

          效果是:

          看,菜單變橫向了。就這么簡(jiǎn)單!下面需要做的就是優(yōu)化細(xì)節(jié)了。

          第四步:調(diào)整寬度

          菜單都擠在一起不好看怎么辦?我們來(lái)調(diào)節(jié)li的寬度。

          在CSS中添加定義width:100px指定一個(gè)li的寬度是100px,當(dāng)然你可以根據(jù)你的需要調(diào)整數(shù)值:

          .test li{float:left;width:100px;}

          效果是:

          如果我們同時(shí)定義外面div的寬度,li就會(huì)根據(jù)div的寬度自動(dòng)換行,例如定義了div寬350px,6個(gè)li的總寬度是600px,一行排不下就自動(dòng)變成兩行:

          .test{width:350px;}

          效果是:

          第五步:設(shè)置基本鏈接效果

          接下來(lái),我們通過(guò)CSS來(lái)設(shè)置鏈接的樣式,分別定義:link、:visited、:hover的狀態(tài)

          .test a:link{color:#666;background:#CCC;text-decoration:none;}
          .test a:visited{color:#666;text-decoration:underline;}
          .test a:hover{color:#FFF; font-weight:bold;text-decoration:underline;background:#F00;}

          效果是:

          第六步:將鏈接以塊級(jí)元素顯示

          有朋友問(wèn),菜單鏈接的背景色為什么沒(méi)有填滿整個(gè)li的寬度?恩,解決的方法很簡(jiǎn)單,在a的樣式定義中增加display:block,使鏈接以塊級(jí)元素顯示。

          同時(shí)我們微調(diào)了如下細(xì)節(jié):

          • 用text-align:center將菜單文字居中;
          • 用height:30px增加背景的高度;
          • 用margin-left:3px使每個(gè)菜單之間空3px距離;
          • 用line-height:30px;定義行高,使鏈接文字縱向居中;

          CSS定義象這樣:

          .test a{display:block;text-align:center;height:30px;}
          .test li{float:left;width:100px;background:#CCC;margin-left:3px;line-height:30px;}

          效果變成:

          這樣就漂亮多了吧。

          第七步:定義背景圖片

          我們通常都會(huì)在每個(gè)鏈接前加一個(gè)小圖標(biāo),這樣導(dǎo)航更清楚。CSS是采用定義li的背景圖片來(lái)實(shí)現(xiàn)的:

          .test a:link{color:#666;background:url(arrow_off.gif) #CCC no-repeat 5px 12px;text-decoration:none;}
          .test a:hover{color:#FFF; font-weight:bold;text-decoration:none;background:url(arrow_on.gif) #F00 no-repeat 5px 12px;}

          說(shuō)明:“background:url(arrow_off.gif) #CCC no-repeat 5px 12px;”這句代碼是一個(gè)CSS縮寫(xiě),表示背景圖片是arrow_off.gif;背景顏色是#CCC;背景圖片不重復(fù)"no-repeat",背景圖片的位置是左邊距5px、上邊距12px;

          默認(rèn)狀態(tài)下,圖標(biāo)為arrow.off.gif,當(dāng)鼠標(biāo)移動(dòng)到鏈接上,圖標(biāo)變?yōu)閍rrow_on.gif

          效果變成:

          現(xiàn)在css的完整代碼是:

          .test ul{list-style:none;}
          .test li{float:left;width:100px;background:#CCC;margin-left:3px;line-height:30px;}
          .test a{display:block;text-align:center;height:30px;}
          .test a:link{color:#666;background:url(arrow_off.gif) #CCC no-repeat 5px 12px;text-decoration:none;}
          .test a:visited{color:#666;text-decoration:underline;}
          .test a:hover{color:#FFF; font-weight:bold;text-decoration:none;background:url(arrow_on.gif) #F00 no-repeat 5px 12px;}

          頁(yè)面的完整代碼是:

          <div class="test">
          <ul>
          <li><a href="1">首頁(yè)</a></li>
          <li><a href="2">產(chǎn)品介紹</a></li>
          <li><a href="3">服務(wù)介紹</a></li>
          <li><a href="4">技術(shù)支持</a></li>
          <li><a href="5">立刻購(gòu)買(mǎi)</a></li>
          <li><a href="6">聯(lián)系我們</a></li>
          </ul>
          </div>

          好了,主要步驟就是這7步,立刻拷貝和修改代碼試試,你也可以用CSS做橫向菜單了!

          posted @ 2008-07-10 10:51 飛飛 閱讀(173) | 評(píng)論 (0)編輯 收藏

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
          <title>POPHint 彈出提示框</title>
          <style type="text/css">
          <!--
          body {margin: 3em; font: 12px "宋體"; background: #EAEAEA}
          input {font: 12px "宋體"; color: #666666}
          .case {padding: 2em; border: solid 1px #EAEAEA; background: #FFFFFF; margin-bottom: 3em; line-height: 150%}
          a {color: #666666; text-decoration: none}
          a:hover {color: #333333}

          /* popHint Start */
          #popHint {position: absolute}
          #popHint .popLeft, #popHint .popRight, #popHint .popAngle span, #popHintText, #popHint .popIcon {background-image: url(http://i.namipan.com/files/48ee6e2804bb4b1d84ecea96218e4a50081349ba960100008f09/0/PopHint.gif)}
          #popHint .popHeader {height: 1%; overflow: hidden !important; overflow /**/: visible}
              #popHint .popLeft {float: left; width: 5px; height: 24px; background-position: 0 0; background-repeat: no-repeat}
              #popHint .popRight {float: left; width: 5px; height: 24px; background-position: -10px -25px; background-repeat: no-repeat}
              #popHint .popAngle {clear: both; position: relative; height: 10px}
              #popHint .popAngle span {position: absolute; top: -3px; left: 15px; width: 7px; height: 13px; background-position: 0 -75px; background-repeat: no-repeat}
          #popHintText {float: left; color: #975400; height: 19px !important; height /**/: 24px; padding: 5px 0 0 0; white-space: nowrap; background-position: 0 -50px; background-repeat: repeat-x; overflow: hidden}
              #popHintText .popIcon {float: left; width: 15px; height: 10px; margin: 1px 3px 0 0}
              #popHint .wrong {background-position: 0 -90px; background-repeat: no-repeat}
              #popHint .right {background-position: 0 -105px; background-repeat: no-repeat}
              /* 這里可以自己擴(kuò)展圖標(biāo).(15*10) */
          /* popHint End */
          -->
          </style>
          <script language="javascript" type="text/javascript">
          <!--

          // 這里都是公用函數(shù),挺多的...
          var

          // 獲取元素
          $ = function(element) {
              return (typeof(element) == 'object' ? element : document.getElementById(element));
          },

          // 生成元素到refNode
          appendElement = function(tagName, Attribute, strHtml, refNode) {
              var cEle = document.createElement(tagName);
              // 屬性值
              for (var i in Attribute){
                  cEle.setAttribute(i, Attribute[i]);
              }
              cEle.innerHTML = strHtml;
             
              refNode.appendChild(cEle);
              return cEle;
          },

          // 獲取元素坐標(biāo)
          getCoords = function(node){
              var x = node.offsetLeft;
              var y = node.offsetTop;
              var parent = node.offsetParent;
              while (parent != null){
                  x += parent.offsetLeft;
                  y += parent.offsetTop;
                  parent = parent.offsetParent;
              }
              return {x: x, y: y};
          },

          // 事件操作(可保留原有事件)
          eventListeners = [],
          findEventListener = function(node, event, handler){
              var i;
              for (i in eventListeners){
                  if (eventListeners[i].node == node && eventListeners[i].event == event && eventListeners[i].handler == handler){
                      return i;
                  }
              }
              return null;
          },
          myAddEventListener = function(node, event, handler){
              if (findEventListener(node, event, handler) != null){
                  return;
              }
              if (!node.addEventListener){
                  node.attachEvent('on' + event, handler);
              }else{
                  node.addEventListener(event, handler, false);
              }
              eventListeners.push({node: node, event: event, handler: handler});
          },
          removeEventListenerIndex = function(index){
              var eventListener = eventListeners[index];
              delete eventListeners[index];
              if (!eventListener.node.removeEventListener){
                  eventListener.node.detachEvent('on' + eventListener.event,
                  eventListener.handler);
              }else{
                  eventListener.node.removeEventListener(eventListener.event,
                  eventListener.handler, false);
              }
          },
          myRemoveEventListener = function(node, event, handler){
              var index = findEventListener(node, event, handler);
              if (index == null) return;
              removeEventListenerIndex(index);
          },
          cleanupEventListeners = function(){
              var i;
              for (i = eventListeners.length; i > 0; i--){
                  if (eventListeners[i] != undefined){
                      removeEventListenerIndex(i);
                  }
              }
          };

           


          /*********************************************
              - POPHint 彈出提示框
              - By Mudoo 2008.5
          **********************************************/
          function popHint(obj, msg, initValues) {
              var
              _obj = $(obj),
              _objHint = $("popHint"),
              _msg = msg,
              _init = initValues;
             
              // 初始化失敗...
              if(_obj==undefined || _msg==undefined || _msg=="") return;
             
              // 設(shè)置初始值
              _init = _init==undefined ? {_type : "wrong", _event : "click"} : _init;
              // obj如果不可見(jiàn)。設(shè)置彈出對(duì)象為obj父元素
              if(_obj.style.display=='none' || _obj.style.visibility=='hidden' || _obj.getAttribute('type')=='hidden') _obj = _obj.parentNode;
             
              var
              _type = null,
              _event = null,
              _place = getCoords(_obj),
              _marTop = null,
              _objText = $("popHintText"),
             
              // 初始化
              init = function() {
                  _hint = _obj.getAttribute("hint");
                  if(_hint=="false") return;
                 
                  // 有的時(shí)候initValues不為空.但是只設(shè)置一個(gè)值...避免發(fā)所錯(cuò)誤.再次設(shè)置初始值...
                  _type = _init._type==undefined ? "wrong" : _init._type;
                  _type = _type.toLowerCase();
                  _event = _init._event==undefined ? "click" : _init._event;
                  _event = _event.toLowerCase();
                 
                  /*
                  ******************************************
                  popHtml
                  ******************************************
                  <div id="popHint">
                      <div id="popHeader">
                          <div class="popLeft"></div>
                          <div id="popHintText"><span class=\"popIcon wrong></span>請(qǐng)輸入您的用戶名!</div>
                          <div class="popRight"></div>
                      </div>
                      <div class="popAngle"><span></span></div>
                  </div>
                  */
                 
                  // 好了.輸出...
                  var _Html = "<div id=\"popHeader\">" +
                              "    <div class=\"popLeft\"></div>" +
                              "    <div id=\"popHintText\"></div>" +
                              "    <div class=\"popRight\"></div>" +
                              "</div>"+
                              "<div class=\"popAngle\"><span></span></div>"
                 
                  if(_objHint==null) {
                      _objHint = appendElement("div", {"id" : "popHint"}, _Html, document.body);
                      _objHint.style.display = "none";
                      _objText = $("popHintText");
                  }
                 
                  show();
              },
              // 顯示
              show = function() {
                  _objHint.style.display = "";
                  _marTop = _objHint.offsetHeight;
                 
                  _msg = "<span class=\"popIcon "+ _type +"\"></span>"+ _msg;
                  _objText.innerHTML = _msg;
                 
                  _objHint.style.left = _place.x +"px";
                  _objHint.style.top = (_place.y-_marTop+8) +"px";
                 
                  // 關(guān)閉觸發(fā)事件
                  switch(_event) {
                      case "blur" :
                          myAddEventListener(_obj, 'blur', hide);
                          break;
                      //default :
                      case "click" :
                          myAddEventListener(document, 'mousedown', hide);
                          break;
                      //這里可以自己擴(kuò)展很多事件...
                  }
              },
              // 關(guān)閉
              hide = function() {
                  _objHint.style.display = "none";
                  _objText.innerHTML = "";
                  // 移除關(guān)閉觸發(fā)事件
                  myRemoveEventListener(_obj, 'blur', hide);
                  myRemoveEventListener(document, 'mousedown', hide);
              };
             
              init();
          }

           

          /*********************************************
          - 這里是測(cè)試函數(shù)
          *********************************************/
          function testPopHint() {
              if($('Test2').value==''){
                  popHint($('Test2'), 'Test2不能為空...', {_event : 'blur'});
                  $('Test2').focus();
                  return false;
              }
              if($('Test3').value==''){
                  popHint($('Test3'), 'Test3也不能為空...', 'blur');
                  $('Test3').focus();
                  return false;
              }
              if($('Test4').value==''){
                  popHint($('Test4'), 'Test4雖然看不見(jiàn),但也不能為空...');
                  $('Test4').value='填一點(diǎn)進(jìn)去...';
                  return false;
              }
              if($('Test5').value==''){
                  popHint($('Test5'), 'Test5也一樣...');
                  return false;
              }
          }

          -->
          </script>
          </head>

          <body>

          <div class="case">
              好了.可以繼續(xù)了.
              接下來(lái)調(diào)用方法.<br />
              ===========================================================<br />
              popHint(Element, Hint, {Type, Event});<br />
              ===========================================================<br />
              Element:彈出對(duì)象。根據(jù)它來(lái)定位的。<br />
              Hint:彈出的信息。<br />

              Type:彈出類型。其實(shí)說(shuō)類型是不對(duì)的。只是定義個(gè)圖標(biāo)而已...(可自己在樣式里加很多很多"類型")<br />
              Event:關(guān)閉觸發(fā)事件。(默認(rèn)click=document.onmousedown,blur=Element.onblur) 一樣可以自己定義很多事件.
          </div>
              <div class="case">
              測(cè)試:<input name="Test1_0" id="Test1_0" type="text" size="20" maxlength="20" onfocus="popHint(this, '失去焦點(diǎn)不會(huì)關(guān)閉提示.按TAB鍵看看');" value="" />
              blur不觸發(fā)關(guān)閉<a href="###"> </a>
              <br />

              測(cè)試blur關(guān)閉:<input name="Test1_1" id="Test1_1" type="text" size="20" maxlength="20" onfocus="popHint(this, '文本框失去焦點(diǎn)就關(guān)閉.', {_event : 'blur'});" value="" />
          </div>
          <div class="case">
              <div>Test2:<input name="Test2" id="Test2" type="text" size="20" maxlength="20" value="" /></div>
              <div>Test3:<input name="Test3" id="Test3" type="text" size="20" maxlength="20" value="" /></div>
              <div>Test4:<input name="Test4" id="Test4" type="hidden" size="20" maxlength="20" value="" /></div>
              <div>Test5:<input name="Test5" id="Test5" type="text" size="20" maxlength="20" value="" style="display:none" /></div>

              <input name="" type="button" onclick="testPopHint();" value="測(cè)試" />
          </div>
          </body>
          </html>

          posted @ 2008-07-10 09:42 飛飛 閱讀(2982) | 評(píng)論 (3)編輯 收藏

          信息: Illegal access: this web application instance has been stopped already.  Could not load java.net.BindException.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
          java.lang.IllegalStateException
           at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1244)
           at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
           at java.lang.ClassLoader.loadClassInternal(Unknown Source)
           at com.mysql.jdbc.SQLError.createLinkFailureMessageBasedOnHeuristics(SQLError.java:1220)
           at com.mysql.jdbc.CommunicationsException.<init>(CommunicationsException.java:51)
           at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1070)
           at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246)
           at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1656)
           at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4261)
           at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1248)
           at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2655)
           at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
           at java.lang.ref.Finalizer.runFinalizer(Unknown Source)
           at java.lang.ref.Finalizer.access$100(Unknown Source)
           at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
          log4j:WARN No appenders could be found for logger (org.apache.struts.util.PropertyMessageResources).
          log4j:WARN Please initialize the log4j system properly.
          2008-7-10 8:56:40 org.apache.catalina.core.ApplicationContext log
          信息: Initializing WebApplicationContext for Struts ActionServlet 'action', module ''


          Question: What causes these frequent Tomcat catalina.log messages "INFO: Illegal access: this web application instance has been stopped already."? I do not want to disable INFO level logging, so it would be nice to stop the root of the problem. I tried disabling RSS and Lucence and they still keep coming out. The full log entry looks like this: May 8, 2005 9:34:09 PM org.apache.catalina.loader.WebappClassLoader loadClass INFO: Illegal access: this web application instance has been stopped already. Could not load org.xml.sax.helpers.XMLReaderFactory. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.

          A:I found this explanation from web: It is possible that this is caused by Tomcat unsuccessfully reloading the web application. The app is unloaded, but all threads don't get shut down properly. As a result, when the threads try to run, they get clobbered by the fact that Tomcat has shut down its classloader, and an error is logged. The best fix is to turn off automatic webapp reloading for the application: in Tomcat's server.xml , find the <Context> declaration, and ensure it is set to: reloadable="false"

          posted @ 2008-07-10 09:00 飛飛 閱讀(12524) | 評(píng)論 (6)編輯 收藏

          僅列出標(biāo)題
          共12頁(yè): First 上一頁(yè) 4 5 6 7 8 9 10 11 12 下一頁(yè) 
          主站蜘蛛池模板: 福海县| 炎陵县| 连云港市| 常德市| 盱眙县| 通化市| 衡南县| 嘉黎县| 临泽县| 长泰县| 龙南县| 余庆县| 香格里拉县| 吉隆县| 加查县| 北碚区| 绵阳市| 织金县| 旺苍县| 海伦市| 遵义县| 鄢陵县| 二手房| 马关县| 大石桥市| 聂拉木县| 金乡县| 黄大仙区| 南充市| 墨玉县| 多伦县| 云阳县| 牙克石市| 松滋市| 红原县| 长顺县| 华亭县| 洛隆县| 曲松县| 丹江口市| 格尔木市|