Archive for June 26th, 2007

You are currently browsing the archives of Enabling Technology .

loopback具体作用

loopback具体作用
在一些实验拓扑图上常会看到loopback,似乎ccna的视频教程上没有,所以特地在网上找了一下。

loopback具体作用是什么?怎么用?
    此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常
见于如下用途。
1 、作为一台路由器的管理地址
    系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个
loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址,管理员会
使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称
一类的功能。
    但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢?
原因如下:由于telnet 命令使用TCP 报文,会存在如下情况:路由器的某一个
接口由于故障down 掉了,但是其他的接口却仍旧可以telnet ,也就是说,到
达这台路由器的TCP 连接依旧存在。所以选择的telnet 地址必须是永远也不会
down 掉的,而虚接口恰好满足此类要求。由于此类接口没有与对端互联互通
的需求,所以为了节约地址资源,loopback 接口的地址通常指定为32 位掩码。
2 、使用该接口地址作为动态路由协议OSPF 、BGP 的router id
    动态路由协议OSPF 、BGP 在运行过程中需要为该协议指定一个Router id ,作
为此路由器的唯一标识,并要求在整个自治系统内唯一。由于router id 是一个
32 位的无符号整数,这一点与IP 地址十分相像。而且IP 地址是不会出现重复
现象的,所以通常将路由器的router id 指定为与该设备上的某个接口的地址相
同。由于loopback 接口的IP 地址通常被视为路由器的标识,所以也就成了
router id 的最佳选择。
3、使用该接口地址作为BGP 建立TCP 连接的源地址
    在BGP 协议中,两个运行BGP 的路由器之间建立邻居关系是通过TCP 建立连
接完成的。
    在配置邻居时通常指定loopback 接口为建立TCP 连接的源地址(通常只用于
IBGP ,原因同2.1 ,都是为了增强TCP 连接的健壮性)
配置命令如下:
router id 61.235.66.1
interface loopback 0
ip address 61.235.66.1 255.255.255.255
router bgp 100
neighbor 61.235.66.7 remote-as 200
neighbor 61.235.66.7 update-source LoopBack0

Loop口在实际中有非常广泛的应用,这个文章是是关于Loopback口使用的大全

BGP Update-Source

因为Loopback口只要Router还健在,则它就会一直保持Active,这样,只要BGP的Peer的Loopback口之间满足路由可达,就可以建立BGP 回话,总之BGP中使用loopback口可以提高网络的健壮性。
neighbor 215.17.1.35 update-source loopback 0
Router ID

使 用该接口地址作为OSPF 、BGP 的Router-ID,作为此路由器的唯一标识,并要求在整个自治系统内唯一,在Ipv6中的BGP/OSPF的Router-ID仍然是32位的IP地 址。在OSPF中的路由器优先级是在接口下手动设置的,接着才是比较OSPF的Router-ID(Router-ID的选举在这里就不多说了,PS:一 台路由器启动OSPF路由协议后,将选取物理接口的最大IP地址作为其RouterID,但是如果配置Loopback接口,则从Loopback中选取 IP地址最大者为RouterID。另外一旦选取RouterID,OSPF为了保证稳定性,不会轻易更改,除非作为RouterID的IP地址被删除或 者OSPF被重新启动),在OSPF和BGP中的Router-ID都是可以手动在路由配置模式下设置的。
OSPF: Router-ID *.*.*.*
BGP:BGP Router-ID *.*.*.*
 
IP Unnumbered Interfaces

无编号地址可以借用强壮的loopback口地址,来节约网络IP地址的分配。
例子:
interface loopback 0
ip address 215.17.3.1 255.255.255.255
!
interface Serial 5/0
bandwidth 128
ip unnumbered loopback 0
Exception Dumps by FTP

当Router 宕机,系统内存中的文件还保留着一份软件内核的备份,CISCO路由器可以被配置为向一台FTP服务器进行内核导出,作为路由器诊断和调试处理过程的一部 分,可是,这种内核导出功能必须导向一台没有运行公共FTP服务器软件的系统,而是一台通过ACLS过滤(TCP地址欺骗)被重点保护的只允许路由器访问 的FTP服务器。如果Loopback口地址作为Router的源地址,并且是相应地址块的一部分,ACLS的过滤功能很容易配置。
 
Sample IOS configuration:
ip ftp source-interface Loopback0
ip ftp username cisco
ip ftp password 7 045802150C2E
exception protocol ftp
exception dump 169.223.32.1
TFTP-SERVER Access

对于TFTP的安全意味着应该经常对IP源地址进行安全方面的配置,CISCO IOS软件允许TFTP服务器被配置为使用特殊的IP接口地址,基于Router的固定IP地址,将运行TFTP服务器配置固定的ACLS.
ip tftp source-interface Loopback0
SNMP-SERVER Access

路由器的Loopback口一样可以被用来对访问安全进行控制,如果从一个路由器送出的SNMP网管数据起源于Loopback口,则很容易在网络管理中心对SNMP服务器进行保护
Sample IOS configuration:
access-list 98 permit 215.17.34.1
access-list 98 permit 215.17.1.1
access-list 98 deny any
!
snmp-server community 5nmc02m RO 98
snmp-server trap-source Loopback0
snmp-server trap-authentication
snmp-server host 215.17.34.1 5nmc02m
snmp-server host 215.17.1.1 5nmc02m.Wednesday, June 06, 2001
TACACS/RADIUS-Server Source Interface

当采用TACACS/RADIUS协议,无论是用户管理性的接入Router还是对拨号用户进行认证,Router都是被配置为将Loopback口作为Router发送TACACS/RADIUS数据包的源地址,提高安全性。
TACACS
aaa new-model
aaa authentication login default tacacs+ enable
aaa authentication enable default tacacs+ enable
aaa accounting exec start-stop tacacs+
!
ip tacacs source-interface Loopback0
tacacs-server host 215.17.1.2
tacacs-server host 215.17.34.10
tacacs-server key CKr3t#
!
RADIUS
radius-server host 215.17.1.2 auth-port 1645 acct-port 1646
radius-server host 215.17.34.10 auth-port 1645 acct-port 1646
ip radius source-interface Loopback0
!
NetFlow Flow-Export

从一个路由器向NetFlow采集器传送流量数据,以实现流量分析和计费目的,将路由器的Router的Loopback地址作为路由器所有输出流量统计数据包的源地址,可以在服务器或者是服务器外围提供更精确,成本更低的过滤配置。
ip flow-export destination 215.17.13.1 9996
ip flow-export source Loopback0
ip flow-export version 5 origin-as
!
interface Fddi0/0/0
description FDDI link to IXP
ip address 215.18.1.10 255.255.255.0
ip route-cache flow
ip route-cache distributed
no keepalive
!
FDDDI 0/0/0 接口被配置成为进行流量采集。路由器被配置为输出第五版本类型的流量信息到IP地址为215.17.13.1的主机上,采用UDP协议,端口号9996,统计数据包的源地址采用Router的Loopback地址。
NTP Source Interface

NTP 用来保证一个网络内所有Rdouter的时钟同步,确保误差在几毫秒之内,如果在NTP的Speaker之间采用Loopback地址作为路由器的源地 址,会使得地址过滤和认证在某种程度上容易维护和实现,许多ISP希望他们的客户只与他们的客户只与ISP自己的而不是世界上其他地方的时间服务器同步。
clock timezone SST 8
!
access-list 5 permit 192.36.143.150
access-list 5 permit 169.223.50.14
!.Cisco ISP Essentials
39
ntp authentication-key 1234 md5 104D000A0618 7
ntp authenticate
ntp trusted-key 1234
ntp source Loopback0
ntp access-group peer 5
ntp update-calendar
ntp peer 192.36.143.150
ntp peer 169.223.50.14
!
SYSLOG Source Interface

系 统日志服务器同样也需要在ISP骨干网络中被妥善保护。许多ISP只希望采集他们自己的而不是外面网络发送来的昔日日志信息。对系统日志服务器的DDOS 攻击并不是不知道,如果系统信息数据包的源地址来自于被很好规划了的地址空间,例如,采用路由器的Loopback口地址,对系统日志服务器的安全配置同 样会更容易。
A configuration example:
logging buffered 16384
logging trap debugging
logging source-interface Loopback0
logging facility local7
logging 169.223.32.1
!
Telnet to the Router

远程路由器才用Loopback口做远程接入的目标接口,这个一方面提高网络的健壮性,另一方面,如果在DNS服务器做了Router的DNS映射条目,则可以在世界上任何路由可达的地方Telnet到这台Router,ISP会不断扩展,增加新的设备
 
由 于telnet 命令使用TCP 报文,会存在如下情况:路由器的某一个接口由于故障down 掉了,但是其他的接口却仍旧可以telnet ,也就是说,到达这台路由器的TCP 连接依旧存在。所以选择的telnet 地址必须是永远也不会down 掉的,而虚接口恰好满足此类要求。由于此类接口没有与对端互联互通的需求,所以为了节约地址资源,loopback 接口的地址通常指定为32 位掩码。
DNS前向和反向转发区域文件的例子:
; net.galaxy zone file
net.galaxy. IN SOA ns.net.galaxy. hostmaster.net.galaxy. (
1998072901 ; version == date(YYYYMMDD)+serial
10800 ; Refresh (3 hours)
900 ; Retry (15 minutes)
172800 ; Expire (48 hours)
43200 ) ; Mimimum (12 hours)
IN NS ns0.net.galaxy.
IN NS ns1.net.galaxy.
IN MX 10 mail0.net.galaxy.
IN MX 20 mail1.net.galaxy.
;
localhost IN A 127.0.0.1
gateway1 IN A 215.17.1.1
gateway2 IN A 215.17.1.2
gateway3 IN A 215.17.1.3
;
;etc etc
; 1.17.215.in-addr.arpa zone file
;
1.17.215.in-addr.arpa. IN SOA ns.net.galaxy. hostmaster.net.galaxy. (
1998072901 ; version == date(YYYYMMDD)+serial
10800 ; Refresh (3 hours)
900 ; Retry (15 minutes)
172800 ; Expire (48 hours)
43200 ) ; Mimimum (12 hours)
IN NS ns0.net.galaxy.
IN NS ns1.net.galaxy.
1 IN PTR gateway1.net.galaxy.
2 IN PTR gateway2.net.galaxy..Wednesday, June 06, 2001
3 IN PTR gateway3.net.galaxy.
;
;etc etc
On the router, set the telnet source to the loopback interface:
ip telnet source-interface Loopback0

RCMD to the router

RCMD 要求网络管理员拥有UNIX的rlogin/rsh客户端来访问路由器。某些ISP采用RCMD来捕获接口统计信息,上载或下载路由器配置文件,或者获取 Router路由选择表的简易信息,Router可以被配置采用Loopback地址作为源地址,使得路由器发送的所有数据包的源地址都采用 Loopback地址来建立RCMD连接:
ip rcmd source-interface Loopback0
 

Posted by micas on Jun 26th 2007 | Filed in IT Knowledge Sharing | Comments (0)

Enabling technology / 促成科技

Enabling technology / 促成科技

任何能夠讓各自獨立的構成要素(components)進行互動的軟體、硬體或是操作的方法論;例如,企業訊息化(enterprise messaging)或是中介軟體(middleware),可以將分散的,甚至是先前不相容的電腦或軟體連結了起來,這就是促成科技。

来自:http://tw.dictionary.yahoo.com/enterprise_content?p=Enabling+technology

Posted by micas on Jun 26th 2007 | Filed in Site Management | Comments (0)

应届大学毕业生辞职不按就业协议付违约金

应届大学毕业生辞职不按就业协议付违约金
问:用人单位录用应届大学毕业生时,须与学校共同签订三方就业协议,在就业协议中常有相应的违约金条款。毕业生就业后如签订了劳动合同,一旦提前辞职,就业协议中约定的违约金究竟应不应当支付呢?
  答:高校学生在签订正式劳动合同之前,其参加社会劳动不需缴纳社会保险,不纳入失业登记,不享受失业救济,所以,高校学生不具有《劳动法》上劳动者的主体身份。因此,劳动部《关于贯彻执行<中华人民共和国劳动法>若干问题的意见》第十二条规定,在校生利用业余时间勤工助学,不视为就业。毕业生就业协议书并非《劳动法》意义上的劳动合同,而是一般的民事协议,应适用《民法通则》而非《劳动法》。
  就业协议的功能在于确保协议一方当事人按照协议的约定,在符合就业主体资格的情况下,到对方或者对方指定的地点工作。此协议因一方履行该义务、与对方或者对方指定的机构订立劳动合同,则被劳动合同所替代。(来源《新民晚报》)

Posted by micas on Jun 26th 2007 | Filed in Work | Comments (0)

Oracle 存储过程hello world

存储过程


环境:pl/sql developer

create or replace procedure HelloWorld is
vMsg varchar2(255);
begin
 vMsg :=’Hello World!’;
 dbms_output.put_line(vMsg); 
end HelloWorld;

exec HelloWorld

使用test window 来测试

Posted by micas on Jun 26th 2007 | Filed in SQL | Comments (0)

学习sql 第二天

查看数据版本信息:

SQL> select * from v$version;

BANNER
—————————————————————-
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production

TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production


日期: 

 SQL> select sysdate from dual;

SYSDATE
———–
2005-06-30

SQL> select sysdate-1 from dual;

SYSDATE-1
———–
2005-06-29

Posted by micas on Jun 26th 2007 | Filed in SQL | Comments (0)

数据库基本概念

数据库基本概念


PK:unique and not null

order by 用于排序的字段可以出现不在select中的字段

原因:select 是投影,最后才奏效的条件。

count/sum/avg/min/max can be only used in ’select’ or ‘ having’


group by 关系代数解释:返回(g1,g2….,a1,a2…)其中,ai 是

用聚集函数对相应的以gi为分组标志所得得分组施加得结果,例如:sum(Gi)

Gi=很多行,以gi为标志。

示例:

select fgroupid ,sum(salary) from mytable group by fgroupid

这里,用fgroupid将原记录集分组,对每组施加sum(salary),

返回结果由分组标记和聚集函数结果共同构成Ti

Posted by micas on Jun 26th 2007 | Filed in SQL | Comments (0)

数据库常用命令速查

常用命令速查


BASICS:插入:insert into xx_media[(col1,col2….)] values(v1,v2,v3…)

列-colN可以省略,那么就要插入所有的列了,建议不要省略,会造成问题

创建表格:create table TOM_CLIENT
(
  FORGID           NUMBER(10) not null,
  F_102            NUMBER(8),
  FACCOUNT         VARCHAR2(40),
  FADDRACCT        VARCHAR2(50),
  FADDRESS         VARCHAR2(250),
  FAPACCOUNTID     NUMBER(8),
  FARACCOUNTID     NUMBER(8),

删除纪录:delete from xx_media where ..

更新:update xx_media set fordernumber= where …

删除表格:drop table yy;


 加入完整性校验

create table test2

(    

    sex  char not null   check(sex in (’m',’f')),

    primary key(sex)

)

注意顺序和逗号 


sequencedrop  sequence xx_Client_fOrgID;
create sequence xx_Client_fOrgID
minvalue 1
maxvalue 999999999999999999
start with 1
increment by 1
nocache;

Posted by micas on Jun 26th 2007 | Filed in SQL | Comments (0)

JSP写的小BBS源代码

Code1:

<%@ page import=”java.util.Date” %>
<%@ page import=”java.io.*” %>
<%–
  Created by IntelliJ IDEA.
  User: Yang Yuan
  Date: Oct 29, 2005
  Time: 6:00:32 PM
  To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=”text/html;charset=UTF-8″ language=”java” %>
<html>
<head><title>Simple jsp page</title></head>

<body>

<%
    try {
        request.setCharacterEncoding(”utf-8″);
        String path = request.getSession().getServletContext().getRealPath(”WorkExperience.txt”);
        FileOutputStream os = new FileOutputStream(path, true);
        OutputStreamWriter osw = new OutputStreamWriter(os, “utf-8″);

        String newPost = request.getParameter(”newPost”);
        if (null != newPost && !”".equalsIgnoreCase(newPost)) {
            osw.append(new Date() + “\r\n\t” + newPost + “\r\n—————–\r\n\r\n”);
        }
        osw.close();
        ;
        FileInputStream fis = new FileInputStream(path);
        InputStreamReader isr = new InputStreamReader(fis, “UTF8″);
        BufferedReader bf = new BufferedReader(isr);
        String string = null;
        out.println(”<pre>”);

        while ((string = bf.readLine()) != null) {
            out.println(string);
        }
        out.println(”</pre>”);
        bf.close();
    } catch (Exception ex) {
        out.println(ex);
    }
%>

<FORM METHOD=POST>
    New Post: <br>
    <TEXTAREA NAME=”newPost” ROWS=”20″ COLS=”100″></TEXTAREA><br>
    <input type=submit value=”Submit”>
</FORM>

</body>
</html>

Posted by micas on Jun 26th 2007 | Filed in J2EE | Comments (0)

Web Service 简明教程

Web Service - xml over http!

——————————————————————————–
 
 下载Apache Axis用来实现SOAP(简单对象访问协议)。http://ws.apache.org/axis/

目前最稳定的版本是1.1

SOAP是用于在分散的或者分布式的环境中交换信息的一个轻量级协议。SOAP基于XML,由三部分组成:一个必须的SOAP封装,一个可选的SOAP头和一个必须的SOAP体。

通常情况下,SOAP = HTTP + RPC + XML。 即:SOAP以HTTP作为底层通信协议,以RPC作为交互方式,以XML作为数据传送的格式。

Web Service开发所需要掌握的技能:

JAVA,线程,同步,Classloader,错误排除,知道NPE(NullPointerException)和其他一些常见的错误,并能够处理,Servlet,如何发布Web 应用到应用服务器(Tomcat等)

TCP/IP,socket API,XML…多得吓人啊!要学习啊:(

1 安装配置Axis

~~安装Tomcat 4.X以上版本(4.X后的版本都带XML的解析器)

~~解压Axis1.1.zip包,找到webapps目录下的axis文件夹,拷贝axis文件夹到Tomcat中的webapps文件夹下。

~~将Tomcat中的axis目录下的WEB-INF\lib中的所有的文件copy到Tomcat的common\lib目录中。(以后凡是要在axis的lib中添加jar文件,都要copy一份到Tomcat的common\lib目录下)。

~~我的电脑->属性->高级->环境变量->系统变量中添加:

AXIS_HOME
%TOMCAT_HOME%\webapps\axis(TOMCAT的目录)

AXIS_LIB
%AXIS_HOME%\lib

AXISCLASSPATH
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar

修改CLASSPATH ,在末尾加上:
%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery.jar; %AXIS_LIB%\commons-logging.jar;%AXIS_LIB%\jaxrpc.jar; %AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar

注意检查CLASSPATH是否正确:(有些软件会在用户变量区设置一个classpath,会有影响,如:XMLSPY)

在DOS方式下

输命令:Echo %CLASSPATH%

~~检查配置:

启动Tomcat,访问http://localhost:8080/axis/

验证axis的是否工作:http://localhost:8080/axis/happyaxis.jsp如果正常显示表示正常。

上图中 倒数第3行字“The core axis libra….”,要保证core axis libraries are present,如果有任何core library is missing,就到其提供的相应的链接上找到对应的jar文件,并copy到tomcat目录里面的axis文件夹WEB-INF\lib中,别忘了Tomcat自己的common\lib也copy一份。

直到所有的core library are present.

好啦基本上都配置好了。现在我们开始做一个有点模样的web Service的例子啦。一步一步来:)

目标:模拟一个银行存取款系统,存取款的具体实现作为服务来提供

Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment),一种是定制发布(Custom Deployment)。

1. 使用即时发布 Java Web Service(JWS)

  “对即时发布的支持是Axis的特色之一,使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调用这类服务的时候,Axis会自动进行编译,即使服务器重启了也不必对其做任何处理,使用非常简单快捷。”

使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到Tomcat下面的webapps\axis目录下即可。但是JWS的web服务发布是一个很简单的Web服务发布方式,在页面中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。

就是不好罗,但是我们还是来看一个例子:大家在Tomcat的webapps\axis下找到Calculate.jws文件,然后打开看看。不用编译的。

发布吧:http://localhost:8080/axis/Distance.jws?wsdl 如果你看到下面的WSDL描述表示你已经发布成功啦:

怎么使用这个服务呢?大家到

Tomcat 5.0\webapps\axis\WEB-INF\classes\samples\userguide\example2

里面是不是看到一个CalcClient.class的文件啊?这个文件就是对应的axis提供的calculate的客户端的例子。在dos方式,到Tomcat 5.0\webapps\axis\WEB-INF\classes\目录下:

java samples.userguide.example2.CalcClient add 3 4

是不是得到7了啊?如果出现NoDefClass的错误的话就用echo检查各个环境变量吧。一般都错在这里。

Calculator对应的源代码在下载的axis.zip里面的samples\userguide\example2里面。

2. 使用定制发布 Web Service Deployment Descriptor(WSDD)

  “即时发布是一项令人激动的技术,它使Web服务的开发变得如此简单;然而即时发布并不总是最好的选择,比如有些应用系统是第三方提供的,我们没有购买源代码,只有.class文件,但我们又希望将这个应用系统的一些功能对外发布成Web服务,使其能够在更大范围内产生作用,这个时候即时发布技术就无能为力了。此外,即时发布技术并不灵活,无法进行更多的服务配置,这使得它并不能满足一些特定系统的需求。”

      好啦 到我们啦,我先不说定制发布有什么好,大家先往下看,自然会有体会的:)

首先给出我们的模拟银行存取款的java文件:

Account.java

package com.duckur;
public class? Account

{

          /*************************************************************

          /*从随机数中获取帐户(一次性有效)*/

          public static int fund = (int)(java.lang.Math.random()*10000);

          //模拟,大家可以从文件中读取数据,或者从数据库中取出这个fund值

           /*************************************************************

            /*检查输入的有效性*/

           public boolean checkInput(int money)//只能取整数

           {

            if(money > fund)

            {

                  return false;

             }

             else

             {

                 return true;

               }

            }
           /*************************************************************

           /*存款*/

           public int deposit(int money)

          {

                fund? = fund + money;

                return fund;

           }
          /*************************************************************

          /*取款*/

          public int withdraw(int money)

          {

                    if(checkInput(money))

                     {

                              fund = fund - money;

                     }

                     return fund;

           }
          /*************************************************************

           /*获取当前的帐户值*/

           public int getAccount()

           {

                     return fund;

          }
}

    然后编译,通过后生成的class文件应该放在Tomcat下的webapps\axis\WEB-INF\com\duckur\下面。

下面发布:

     在Tomcat下的webapps\axis\WEB-INF\com\duckur\目录下新建一个deploy.wsdd文件描述服务的名称、入口等信息:
wsdd文件的显示有问题下载吧
 

其中service项重的名称为该服务的名称即Account,java:RPC指明了一个JAVA RPC服务,做这个处理的类是org.apache.axis.providers.java.RPCProvider。

   “我们是通过一个标签告诉RPC服务应该调用的类,而另外一个标签则告诉引擎,它可以调用这个类中的任何的Public方法。你也可以指定通过使用名字空间或者一些可以调用的方法列表,来指明那些方法可以被调用。”

     当然也可以用Axis提供的一个客户端管理工具——AdminClient来完成服务的定制发布。这里不说:)

然后在DOS下到该目录下,

java org.apache.axis.client.AdminClient deploy.wsdd

如果出现:

Processing file deploy.wsdd
Doneprocessing

这表明Capacity服务定制发布完成。

好现在你就可以通过http://localhost:8080/axis/services/Account?wsdl来查看WSDL描述了。

Web Service发布好了现在调用它吧.

这里说一个最基本的调用需要用的类和方法:

(取出当前的金额)

//新建一个服务对象

Service service = new Service();??

//调用服务对象的createCall()方法返回一个命令

Call call = (Call) service.createCall();??

// Sets the address of the target service endpoint.

call.setTargetEndpointAddress(new java.net.URL(”http://localhost:8080/axis/services/LxAccount“));

//?Sets the name of the operation to be invoked using this Call instance

call.setOperationName(“getAccount”);

//Convenience method to invoke a //method with a default (empty) namespace

Integer myFund = (Integer) call.invoke(new Object[] {});

详细函数可以参考开发API在下载的axis.zip中的docs里面。

下面是详细的代码:

编译后执行就可以。

LxClient.java

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

import org.apache.axis.utils.Options;

import javax.xml.rpc.ParameterMode;

import javax.xml.namespace.QName;

public class LxClient

extends JFrame {

  JTextField jTextField1 = new JTextField();

  JLabel jLabel3 = new JLabel();

  JLabel jLabel1 = new JLabel();

  JButton jButton1 = new JButton();

  JButton jButton2 = new JButton();

  JButton jButton3 = new JButton();

  JLabel jLabel2 = new JLabel();

  JTextField jTextField2 = new JTextField();

  public LxClient() {

    try {

       jbInit();

    }

     catch (Exception e) {

       e.printStackTrace();

     }

  }

  public static void main(String args[]){

    LxClient myframe=new LxClient();

    myframe.setSize(400,200);

    myframe.setVisible(true);

  }

 private void jbInit() throws Exception {

    this.getContentPane().setLayout(null);

    jTextField1.setText(”");

    jTextField1.setBounds(new Rectangle(131, 51, 80, 24));

    jLabel3.setText(”A0317286 李迅”);

    jLabel3.setBounds(new Rectangle(102, 15, 108, 17));

    jLabel1.setText(”填入金额:”);

    jLabel1.setBounds(new Rectangle(64, 54, 55, 21));

    jButton1.setBounds(new Rectangle(50, 96, 58, 23));

    jButton1.setText(”存款”);

    jButton1.addActionListener(new LxClient_jButton1_actionAdapter(this));

    jButton2.setBounds(new Rectangle(126, 96, 63, 23));

    jButton2.setText(”取款”);

    jButton2.addActionListener(new LxClient_jButton2_actionAdapter(this));

    jButton3.setBounds(new Rectangle(205, 94, 81, 24));

    jButton3.setText(”查看金额”);

    jButton3.addActionListener(new LxClient_jButton3_actionAdapter(this));

    jLabel2.setText(”当前的金额:”);

    jLabel2.setBounds(new Rectangle(59, 136, 74, 21));

    jTextField2.setEditable(false);

    jTextField2.setText(”");

    jTextField2.setBounds(new Rectangle(127, 133, 85, 25));

    this.getContentPane().add(jTextField1, null);

    this.getContentPane().add(jLabel3, null);

    this.getContentPane().add(jLabel1, null);

    this.getContentPane().add(jButton2, null);

    this.getContentPane().add(jButton1, null);

    this.getContentPane().add(jButton3, null);

    this.getContentPane().add(jLabel2, null);

    this.getContentPane().add(jTextField2, null);

   }

 /***************************************************************************

 调用WebService* /

 存款*/

  void jButton1_actionPerformed(ActionEvent e) {

    try {

    String endpoint = “http://localhost:8080/axis/services/LxAccount“;

    String method = “deposit”;

    Integer i = Integer.valueOf(jTextField1.getText());

    Service service = new Service();

    Call call = (Call) service.createCall();

    call.setTargetEndpointAddress(new java.net.URL(endpoint));

    call.setOperationName(method);

    Integer myFund = (Integer) call.invoke(new Object[] {i});

    //更新数据

    jTextField2.setText(myFund.toString());

    jLabel1.updateUI();

    }

    catch (Exception ex) {

    System.err.println(ex.toString());

    }

  }

 /***************************************************************************

   取款*/

  void jButton2_actionPerformed(ActionEvent e) {

    try {

    String endpoint = “http://localhost:8080/axis/services/LxAccount“;

    String method = “withdraw”;

    Integer i = Integer.valueOf(jTextField1.getText());

    Service service = new Service();

    Call call = (Call) service.createCall();

        call.setTargetEndpointAddress(new java.net.URL(endpoint));

        call.setOperationName(method);

            Integer myFund = (Integer) call.invoke(new Object[] {i});

        //更新数据

        jTextField2.setText(myFund.toString());

        jLabel1.updateUI();

       }

        catch (Exception ex) {

        System.err.println(ex.toString());

    }

  }

  /***************************************************************************

   显示当前金额*/

  void jButton3_actionPerformed(ActionEvent e) {

    try {

        String endpoint = “http://localhost:8080/axis/services/LxAccount“;

        String method = “getAccount”;

        Service service = new Service();

        Call call = (Call) service.createCall();

        call.setTargetEndpointAddress(new java.net.URL(endpoint));

        call.setOperationName(method);

        Integer myFund = (Integer) call.invoke(new Object[] {});

        //更新数据

        jTextField2.setText(myFund.toString());

        jLabel1.updateUI();

    }

    catch (Exception ex) {

        System.err.println(ex.toString());

    }

  }

}

class LxClient_jButton1_actionAdapter

     implements java.awt.event.ActionListener {

  LxClient adaptee;

  LxClient_jButton1_actionAdapter(LxClient adaptee) {

      this.adaptee = adaptee;

  }

  public void actionPerformed(ActionEvent e) {

     adaptee.jButton1_actionPerformed(e);

  }

}

class LxClient_jButton2_actionAdapter

     implements java.awt.event.ActionListener {

 LxClient adaptee;

 LxClient_jButton2_actionAdapter(LxClient adaptee) {

     this.adaptee = adaptee;

 }

 public void actionPerformed(ActionEvent e) {

     adaptee.jButton2_actionPerformed(e);

  }

}

class LxClient_jButton3_actionAdapter

    implements java.awt.event.ActionListener {

 LxClient adaptee;

   LxClient_jButton3_actionAdapter(LxClient adaptee) {

    this.adaptee = adaptee;

  }

  public void actionPerformed(ActionEvent e) {

      adaptee.jButton3_actionPerformed(e);

  }

}
 

Posted by micas on Jun 26th 2007 | Filed in Web Framework | Comments (0)

如何使用和编译包呢?

假设建立如下目录:

c:\workingDirectory\

建立一个工程:myProject

建立两个包:a,b

package myProject.a;

public class Test1{

}

package myProject.b;

import myProject.a.*;

public class Test2 extends Test1

{

    public static void main(String [] args){

        new Test1();

    }

}

则:

c:\workingDirectory\myProject\a\Test1.java

c:\workingDirectory\myProject\b\Test2.java

编译语句如下:

1。确保当前目录为c:\workingDirectory\myProject\b\

javac -sourcepath ..\.. -d c:\compiledClassLib Test2.java

则,在c:\compiledClassLib下按照生成:

c:\compiledClassLib\myProjecta\Test1.class

c:\compiledClassLib\myProject\b\Test2.class

Done.

Micas

Posted by micas on Jun 26th 2007 | Filed in JavaBasic | Comments (0)

Next »