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

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

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

    176142998

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      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 飛飛 閱讀(320) | 評論 (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)
    估計問題出在配置文件 services.xml
    查閱官方文檔,發現 xmlns="
    
    以下是一個實例
     
    <?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工程環境
    在eclipse里創建一個叫webservice的java工程,然后依次添加src-service、src-conf、src-test和src-util這幾個Source Folder以及web這個Folder
    目錄結構及文件如下:

    代碼
    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復制到WEB-INF/lib目錄
    web.xml內容如下:
    代碼
    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>  

     

    寫一個BookService
    我們將創建一個從ISBM號得到Book的Title的簡單查詢Web服務
    首先創建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. }   

    然后寫一個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的實現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中配置要發布的服務
    在src-conf的META-INF/xfire目錄創建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標簽決定了我們創建的該服務的WSDL的URL為http://xx.xx.xx/xx/xx/BookService?wsdl

     

    在Tomcat中發布
    可以簡單的修改Tomcat的server.xml來發布該Web服務,在<Host>標簽中添加以下內容:

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

    現在打開瀏覽器訪問http://localhost:8080/webservice/services/BookService?wsdl來看看生成的WSDL文檔

     

    客戶端調用測試
    我們將使用一個XfireClientFactory.java工具類來幫我們調用該Web服務:

    代碼
    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. }   

    然后編寫一個BookServiceTest.java來調用我們剛才發布的Web服務:
    代碼
    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. }   

    服務調用成功,Console打印內容如下:
    代碼
    1. Book with ISBN '123456': 《XFire Quick Start》   
    posted @ 2008-07-25 18:53 飛飛 閱讀(328) | 評論 (0)編輯 收藏

     終于,使用Java完成了一個WebService的例子,其中的一個非常小的問題,折騰了我將近一天的時間。下面給出步驟,說明在Java平臺上如何開發WebService。

        采用的工具:Eclipse3.1.2 + Tomcat5.5 + XFire1.1 。使用XFire開發WebService應該說非常的容易,只需要按照下面例子的步驟來做:

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

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

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

    (4)修改WebContent\WEB-INF\web.xml配置文件的內容,下面是修改后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請求全部交給org.codehaus.xfire.transport.http.XFireConfigurableServlet來處理。

    (5)編寫需要發布為WebService的Java類,這個例子中是一個非常簡單的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目錄下添加一個XFire使用的配置文件services.xml,該配置文件中的內容反映了要將哪些java類發布為web服務。本例中的services.xml內容如下:

    <?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會借助Spring來解析services.xml,從中提取需要發布為WebService的配置信息。

         很多文章介紹到這里就完了,然而當我按照他們所說的啟動WebService ,然后通過http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 來訪問服務描述時,卻拋出了異常,說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)非常關鍵的一點,就是這個小難題花費了我將近一天的時間。
        在WebContent\WEB-INF目錄下新建classes文件夾,然后需要將WebContent下的整個META-INF文件夾剪切到新建的classes文件夾下。
        到這里,項目的完整目錄結構如下:


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

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

     

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

    POJO、SOA 概述

    被重新審視的 POJO

    POJO(Plain Old Java Object,簡單 Java 對象)是 Java 社區中最早的成員(回想您學習 Java 時第一個興奮的時刻,那個簡單的 "Hello World!" 例子),也是最簡單、最容易實現的方式。

    然而現實中 Java 的發展已經遠遠超越了 POJO 的范圍,成為面向對象技術應用中最成功的編程語言,尤其是繼承、多態的應用為我們造就了一大批開發框架(如 Struts)和標準(如 EJB),隨之而來的就是實現的復雜化,我們必須面對一大堆繼承關系的限制。比如說:要開發一個基于 Struts 的應用,我們必須了解 Struts 特定的繼承關系如 ActionForm、ValidateActionForm;要開發一個 EJB 應用,我們必須繼承 EJBObject、SessionEJB 等。

    為了拋開這些限制,降低 Java 應用實現的難度,Java 社區開始重新審視 POJO 的價值,試圖將 POJO 的作用發揮到極致,最新的努力是 EJB3.0。Java 社區將 EJB3.0 設計為基于 POJO,而不是為他準備更多的繼承關系等限制。

    讓人愛恨交加的 SOA

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

    然而 SOA 在企業內的實施卻不是一項簡單的任務,即使拋開新建系統直接基于 SOA 架構實施的因素,要把企業已有系統納入 SOA 框架也不是一件容易的事情。企業必須在對當前架構深入了解的基礎上,對已有系統進行大規模的改造才能滿足新的要求。如何經濟的從原有技術架構切換到 SOA 架構成為很多企業的難題。




    XFire 概述

    XFire 是 codeHaus 組織提供的一個開源框架,它構建了 POJO 和 SOA 之間的橋梁,主要特性就是支持將 POJO 通過非常簡單的方式發布成 Web 服務,這種處理方式不僅充分發揮了 POJO 的作用,簡化了 Java 應用轉化為 Web 服務的步驟和過程,也直接降低了 SOA 的實現難度,為企業轉向 SOA 架構提供了一種簡單可行的方式。

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

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




    XFire 安裝包

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

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

    • api(目錄)

      api 目錄中是 XFire 框架中所有類(class)對應的 API 文檔,為開發者使用 XFire 完成應用開發提供幫助。

    • examples(目錄)

      examples 目錄中包含了所有隨 XFire 二進制包發布的實例,包括這些實例的源代碼和相關 Web 應用配置內容。

    • lib(目錄)

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

    • manual(目錄)

      manual 目錄中包含有 XFire 框架的幫助文檔,開發者可以從這些幫助文檔中學習更多運用 XFire 框架實現 SOA 的知識和技巧。

    • modules(目錄)

      modules 目錄中包含了 XFire 框架根據不同特性分別編譯的二進制包文件。發布基于 XFire 框架的 Web 項目時,可以選擇使用該目錄下的所有 .jar 文件,也可以選擇 XFire-all-1.2.6.jar 文件。

    • XFire-all-1.2.6.jar

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

    • LICENSE.txt

      LICENSE.txt 文件中包含了 XFire 框架的授權協議。

    • NOTICE.txt
    • README.txt

      這兩個文件中包含了 XFire 發布時的一些有用的信息。





    XFire 框架支撐環境

    XFire框架是一種基于Servlet技術的SOA應用開發框架,要正常運行基于XFire應用框架開發的企業應用,除了XFire框架本身之外,還需要JDK和Servlet容器的支持。

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

    XFire 支持非常多的特性,其中不同的特性對 JDK 版本的要求有所不同,比如如果項目中選擇基于 JSR181 標準發布 Web 服務,我們就需要選擇 JDK5 或者以上版本,如果僅僅選擇將 Web 服務綁定到最簡單的 POJO,我們只需要選擇 JDK1.4 版本即可。

    JDK 各版本均可以在 java.sun.com 網站上下載,如何安裝 JDK 請參考 SUN 公司的相關技術文檔和 JDK 的幫助文檔。

    2.Servlet 容器下載和安裝

    XFire 是一種基于 Servlet 技術的 SOA 應用開發框架,需要 Servlet 容器的支持。XFire 支持在多種 Servlet 容器中運行,包括 Websphere、Weblogic、TOMCAT 等。為了說明的簡單,我們選擇使用 TOMCAT(版本5.0.30)作為 XFire 的運行容器,所有配置過程和發布步驟的說明也均是針對 TOMCAT,如果讀者使用 TOMCAT 之外的其它 Servlet 容器或者選擇了 TOMCAT 的其它版本,下面的配置過程和步驟可能需要做出調整,請讀者根據實際 Servlet 容器的幫助文檔進行相應調整。

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

    3.xalan

    XFire 需要 xalan 項目的支持,然而 1.2.6 版本中并沒有帶有相應的 jar 文件,因此請訪問 xml.apache.org,下載 xalan 項目的二進制包。





    XFire 應用配置

    前面的章節中我們下載和安裝了 XFire 安裝包和所需要的支持環境,現在我們開始學習如何從零開始創建 XFire 應用開發環境。下面的所有配置過程和發布步驟均針對 TOMCAT(版本5.0.30)服務器,如果選擇其它的 Servlet 容器,下面的配置過程和步驟可能需要做出調整,請讀者根據實際 Servlet 容器的幫助文檔進行相應調整。

    1、創建 Web 應用目錄和基本元素

    1. 在 %TOMCAT_HOME%/webapps 目錄下創建新的 Web 應用目錄 “XFire”

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

    2. 在 ”XFire”目錄下創建 ”WEB-INF”目錄、
    3. 在 ” WEB-INF”目錄下創建 ”lib”目錄和 ”classes”目錄
    4. 在 ” WEB-INF”目錄下創建 Web 應用描述文件 ”web.xml”, ”web.xml”文件的內容見 清單 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實例</display-name>
                8、       <description>
                9、            基于XFire框架發布Web服務的例子
                10、       </description>
                11、
                12、 </web-app>

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

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

    [注] 為了減少拷貝的 jar 文件的數目,開發者可以根據項目的需要選擇需要拷貝的 jar 文件,而不是全部拷貝,如何根據需要選擇拷貝合適的類包文件請訪問 XFire 站點

    3、配置 XFire 框架運行所需的 Servlet

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

    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、創建 XFire 框架的服務發布文件 services.xml

    1. “1、創建 Web 應用目錄和基本元素” 中創建的 classes 目錄下新建目錄 ”META-INF\xfire”;
    2. 在步驟 a) 中新建的 ”xfire”文件目錄下創建新文件 services.xml,文件的默認內容如 清單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 發布成 Web 服務

    XFire 框架中,我們有兩種方式將 POJO 發布成 Web 服務:

    • 一種方式是直接使用 Web 服務接口和 Web 服務實現類(POJO)來發布;
    • 另一種方式是基于 JSR181 標準和注釋技術將被注釋的 POJO 發布成 Web 服務;

    下面的章節中我們將學習使用第一種方式來完成 POJO 的 Web 服務發布。我們將使用經典的 ”Hello World!”例子來演示將 POJO 發布成 Web 服務所需要的步驟,不過我們不再是簡單的訪問一個 Java 方法來輸出 ”Hello World!”字符串,而是轉為在 SOA 環境下實現:Web 服務客戶端通過訪問服務器端發布成 Web 服務的 POJO 獲得返回的 ”Hello World!”字符串后輸出到客戶端的控制臺上。

    將 POJO 發布成 Web 服務的基本步驟如下:

    1. 創建 Web 服務接口,聲明該 Web 服務對外暴露的接口;
    2. 創建 Web 服務實現類,為 Web 服務接口提供實現;
    3. 修改 XFire 框架的服務發布文件 ---- services.xml,將 POJO 發布成 Web 服務。

    下面我們通過創建 ”Hello World!”例子來具體說明如何實現這三個步驟。

    1.創建 Web 服務接口 ---- HelloWorldService

    要將 POJO 發布成 Web 服務,首先需要創建 Web 服務接口,在接口中聲明該 Web 服務需要對外暴露的接口。

    我們根據需要創建 Web 服務接口 ” HelloWorldService”,在其中聲明一個 ”sayHello”方法,該方法返回 ”String ”類型的內容。” HelloWorldService”接口對應的 Java 文件代碼如 清單 1-3


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

    2.創建 Web 服務實現類 ”HelloWorldServiceImpl”

    創建 Web 服務實現類 ”HelloWorldServiceImpl”,它繼承 ”1、創建Web服務接口 ---- HelloWorldService” 中創建的 HelloWorldService 接口,并且為它聲明的 ”sayHello”方法提供具體實現: 返回字符串”Hello World!”。 ”HelloWorldServiceImpl”類對應的 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 服務接口中聲明的所有 Java 方法提供具體實現
                5. * HelloWorldServiceImpl 作為 Web 服務的實現類
                6. */
                7.public class HelloWorldServiceImpl implements HelloWorldService {
                8.
                9. /*
                10.  * sayHello 方法為 HelloWorldService 服務接口定義的 sayHello 方法提供具體實現
                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 發布成 Web 服務

    我們可以在 WEB-INF\classes\META-INF\XFire\services.xml 文件中的 <beans …> 和 </beans> 元素中間加入如下的 xml 內容將上面創建的 HelloWorldService 發布成 Web 服務。

    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 標簽和它所包含的 xml 內容為發布成 Web 服務的 POJO 提供完整的描述。

    • name

      Web 服務被發布時所采用的唯一名稱。

    • namespace

      Web 服務發布時所使用的命名空間。

    • serviceClass

      Web 服務接口類的全名,包括包名和類名。

    • implemetationClass

      Web 服務實現類的全名,包括包名和類名。

    更多 service 元素的子元素和它們的用法請參考 XFire 站點

    通過上面的三個步驟,我們已經將新創建的HelloWorldService發布成了Web服務,我們可以使用下面的步驟測試一下創建的Web服務是否能夠正常運行:

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

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

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


    圖:瀏覽器中訪問效果

    如果瀏覽器中出現錯誤提示,請按照上面的步驟和說明檢查已經完成的開發、配置過程是否完全正確。





    結束語

    本文中作者首先講解了 XFire 框架的主要特性,XFire 框架的運行環境以及基于 XFire 框架開發 SOA 應用的基本步驟,并且借助于 SOA 環境下的 ”Hello World!”例子,詳細的講解和演示了如何基于 XFire 框架、經過簡單的開發、配置步驟就將一個 POJO 類中包含的方法發布成Web服務。從 ”Hello World!”例子實現的過程中,我們可以發現 XFire 框架最大化的發揮了 POJO 的作用,減少了 SOA 實施時對框架本身的依賴,降低了 SOA 實施的難度,企業實施 SOA 時并不需要增加太多的投入就可以實現目標。






    下載

    名字 大小 下載方法
    xfire.war 6 KB HTTP
    關于下載方法的信息


    參考資料

    學習

    獲得產品和技術
    posted @ 2008-07-25 18:48 飛飛 閱讀(253) | 評論 (0)編輯 收藏

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


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


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


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

    搜索
    作用域 功能 快捷鍵
    全局 出現在文件中 Ctrl+Shift+U
    全局 打開搜索對話框 Ctrl+H
    全局 工作區中的聲明 Ctrl+G
    全局 工作區中的引用 Ctrl+Shift+G

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

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

    項目
    作用域 功能 快捷鍵
    全局 全部構建 Ctrl+B

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

    運行
    作用域 功能 快捷鍵
    全局 單步跳入選擇 Ctrl+F5
    全局 調試上次啟動 F11
    全局 使用過濾器單步執行 Shift+F5
    全局 添加/去除斷點 Ctrl+Shift+B
    全局 顯示 Ctrl+D
    全局 運行上次啟動 Ctrl+F11
    全局 執行 Ctrl+U

    重構
    作用域 功能 快捷鍵
    全局 撤銷重構 Alt+Shift+Z
    全局 抽取方法 Alt+Shift+M
    全局 抽取局部變量 Alt+Shift+L
    全局 內聯 Alt+Shift+I
    全局 移動 Alt+Shift+V
    全局 重命名 Alt+Shift+R
    全局 重做 Alt+Shift+Y
    posted @ 2008-07-23 13:06 飛飛 閱讀(1178) | 評論 (1)編輯 收藏

    方法如下:

     

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

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

    盡管在我的網站和文章里都有提到CSS制作菜單的方法,但很多初學者還是不太清楚如何實現,以及實現原理,我想專門寫一篇詳細教程會對大家比較有幫助。

    我們先來看一個菜單的例子,最終效果是:

    然后我們來詳細講解步驟

    第一步:建立一個無序列表

    我們先建立一個無序列表,來建立菜單的結構。代碼是:

    <ul>
    <li><a href="1">首頁</a></li>
    <li><a href="2">產品介紹</a></li>
    <li><a href="3">服務介紹</a></li>
    <li><a href="4">技術支持</a></li>
    <li><a href="5">立刻購買</a></li>
    <li><a href="6">聯系我們</a></li>
    </ul>

    效果是:

    第二步:隱藏li的默認樣式

    因為看起來不是很好看,菜單通常都不需要li默認的圓點,我們給UL定義一個樣式來消除這些圓點。

    當然,為了更好的控制整個菜單,我們把菜單放在一個div里。頁面代碼變成:

    <div class="test"> <ul>
    <li><a href="1">首頁</a></li>
    <li><a href="2">產品介紹</a></li>
    <li><a href="3">服務介紹</a></li>
    <li><a href="4">技術支持</a></li>
    <li><a href="5">立刻購買</a></li>
    <li><a href="6">聯系我們</a></li>
    </ul> </div>

    CSS定義為:

    .test ul{list-style:none;}

    說明:“.test ul”表示我要定義的樣式將作用在test的層里的ul標簽上。

    現在的效果是沒有圓點了:

    第三步:關鍵的浮動

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

    CSS定義為:

    .test li{float:left;}

    效果是:

    看,菜單變橫向了。就這么簡單!下面需要做的就是優化細節了。

    第四步:調整寬度

    菜單都擠在一起不好看怎么辦?我們來調節li的寬度。

    在CSS中添加定義width:100px指定一個li的寬度是100px,當然你可以根據你的需要調整數值:

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

    效果是:

    如果我們同時定義外面div的寬度,li就會根據div的寬度自動換行,例如定義了div寬350px,6個li的總寬度是600px,一行排不下就自動變成兩行:

    .test{width:350px;}

    效果是:

    第五步:設置基本鏈接效果

    接下來,我們通過CSS來設置鏈接的樣式,分別定義:link、:visited、:hover的狀態

    .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;}

    效果是:

    第六步:將鏈接以塊級元素顯示

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

    同時我們微調了如下細節:

    • 用text-align:center將菜單文字居中;
    • 用height:30px增加背景的高度;
    • 用margin-left:3px使每個菜單之間空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;}

    效果變成:

    這樣就漂亮多了吧。

    第七步:定義背景圖片

    我們通常都會在每個鏈接前加一個小圖標,這樣導航更清楚。CSS是采用定義li的背景圖片來實現的:

    .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;}

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

    默認狀態下,圖標為arrow.off.gif,當鼠標移動到鏈接上,圖標變為arrow_on.gif

    效果變成:

    現在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;}

    頁面的完整代碼是:

    <div class="test">
    <ul>
    <li><a href="1">首頁</a></li>
    <li><a href="2">產品介紹</a></li>
    <li><a href="3">服務介紹</a></li>
    <li><a href="4">技術支持</a></li>
    <li><a href="5">立刻購買</a></li>
    <li><a href="6">聯系我們</a></li>
    </ul>
    </div>

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

    posted @ 2008-07-10 10:51 飛飛 閱讀(171) | 評論 (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}
        /* 這里可以自己擴展圖標.(15*10) */
    /* popHint End */
    -->
    </style>
    <script language="javascript" type="text/javascript">
    <!--

    // 這里都是公用函數,挺多的...
    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;
    },

    // 獲取元素坐標
    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;
       
        // 設置初始值
        _init = _init==undefined ? {_type : "wrong", _event : "click"} : _init;
        // obj如果不可見。設置彈出對象為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;
           
            // 有的時候initValues不為空.但是只設置一個值...避免發所錯誤.再次設置初始值...
            _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>請輸入您的用戶名!</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";
           
            // 關閉觸發事件
            switch(_event) {
                case "blur" :
                    myAddEventListener(_obj, 'blur', hide);
                    break;
                //default :
                case "click" :
                    myAddEventListener(document, 'mousedown', hide);
                    break;
                //這里可以自己擴展很多事件...
            }
        },
        // 關閉
        hide = function() {
            _objHint.style.display = "none";
            _objText.innerHTML = "";
            // 移除關閉觸發事件
            myRemoveEventListener(_obj, 'blur', hide);
            myRemoveEventListener(document, 'mousedown', hide);
        };
       
        init();
    }

     

    /*********************************************
    - 這里是測試函數
    *********************************************/
    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雖然看不見,但也不能為空...');
            $('Test4').value='填一點進去...';
            return false;
        }
        if($('Test5').value==''){
            popHint($('Test5'), 'Test5也一樣...');
            return false;
        }
    }

    -->
    </script>
    </head>

    <body>

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

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

        測試blur關閉:<input name="Test1_1" id="Test1_1" type="text" size="20" maxlength="20" onfocus="popHint(this, '文本框失去焦點就關閉.', {_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="測試" />
    </div>
    </body>
    </html>

    posted @ 2008-07-10 09:42 飛飛 閱讀(2978) | 評論 (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 飛飛 閱讀(12518) | 評論 (6)編輯 收藏

    僅列出標題
    共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 下一頁 
    主站蜘蛛池模板: 亚洲性日韩精品一区二区三区| 久久综合日韩亚洲精品色| 免费精品国产自产拍观看| 国产免费播放一区二区| 久久99亚洲网美利坚合众国| 两个人看的www免费| 亚洲自偷自偷在线制服| 亚洲精品免费在线| 人人爽人人爽人人片av免费 | 免费一级做a爰片性色毛片| 亚洲a级成人片在线观看| 在线成人精品国产区免费| 久久狠狠爱亚洲综合影院| 亚洲伊人久久综合影院| 国产成人免费高清激情明星 | 一级特黄aa毛片免费观看| 亚洲精品高清国产一线久久| 中文字幕久无码免费久久| 亚洲看片无码在线视频| 亚洲另类激情综合偷自拍图| 德国女人一级毛片免费| 国产一级在线免费观看| 亚洲va中文字幕| 亚洲日本在线免费观看| 成人免费a级毛片| a毛片免费观看完整| 污污视频网站免费观看| 亚洲天堂男人影院| 拔擦拔擦8x华人免费久久| 成人免费网站久久久| 亚洲国产成人精品激情| 亚洲国产精品一区| 亚洲成A人片777777| 亚洲国产成人精品女人久久久 | 国产黄色一级毛片亚洲黄片大全| 免费无码AV电影在线观看| 久久国产乱子伦精品免费不卡| 国产亚洲综合视频| 亚洲免费综合色在线视频| 亚洲一级毛片中文字幕| 亚洲综合久久综合激情久久|