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 飞飞 阅读(308) | 评论 (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="http://xfire.codehaus.org/config/1.0"> 是全部小写,立即替换,解决!
以下是一个实例
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
   <name>HelloWorldService</name>
   <namespace>http://localhost:8080/HelloService</namespace>
   <serviceClass>
    com.tom.pojo.HelloService
   </serviceClass>
   <implementationClass>
    com.tom.pojo.HelloServiceImp
   </implementationClass>
</service>
</beans>
posted @ 2008-07-25 18:54 飞飞 阅读(4938) | 评论 (2)编辑 收藏

下载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 飞飞 阅读(311) | 评论 (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 飞飞 阅读(802) | 评论 (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 飞飞 阅读(242) | 评论 (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 飞飞 阅读(1169) | 评论 (1)编辑 收藏

方法如下:

 

<select onbeforeactivate="return false" onfocus="this.blur()" onmouseover="this.setCapture()" onmouseout="this.releaseCapture()"> 
<option>1</option>
</select>
posted @ 2008-07-22 16:47 飞飞 阅读(478) | 评论 (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 飞飞 阅读(158) | 评论 (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 飞飞 阅读(2965) | 评论 (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 飞飞 阅读(12482) | 评论 (6)编辑 收藏

仅列出标题
共12页: First 上一页 4 5 6 7 8 9 10 11 12 下一页