重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1,在Java项目中发布一个WebService服务:
创新互联建站专业为企业提供易县网站建设、易县做网站、易县网站设计、易县网站制作等企业网站建设、网页设计与制作、易县企业网站模板建站服务,10多年易县做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
如何发布?
——JDK1.6中JAX-WS规范定义了如何发布一个WebService服务;
(1)用jdk1.6.0_21以后的版本发布;
(2)与Web服务相关的类,都位于Javax.jws.*包中
@WebService——此注解用在类上指定将此类发布成一个WebService;
EndPoint——此类为端点服务类,其中publish()方法用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上,用于发布。
2,例子:
(1)发布WebService服务
HelloWebService.java:
[java] view plain copy
span style="font-family:KaiTi_GB2312;font-size:18px;"package cn.tgb.ws;
importjavax.jws.WebMethod;
importjavax.jws.WebService;
importjavax.xml.ws.Endpoint;
/**
* @WebService - 它是一个注解,用在类上指定将此类发布成一个ws.
Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
* @author xuemin
*
*/
@WebService
public classHelloWebService {
publicString HelloWord(String name){
return"Hello: "+name;
}
/**
*添加exclude=true后,HelloWord2()方法不会被发布
* @param name
* @return
*/
@WebMethod(exclude=true)
publicString HelloWord2(String name){
return"Hello: "+name;
}
publicstatic void main(String[] args) {
/**
*参数1:服务的发布地址
*参数2:服务的实现者
*/
Endpoint.publish("",new HelloWebService());
}
}/span
注:
@WebService- 它是一个注解,用在类上指定将此类发布成一个ws.
Endpoint –此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
运行以上程序进行发布。
(2)查看wsdl
地址:
只要在客户端浏览器能看到此WSDL文档,说明服务发布成功
以上服务发布成功;
总结:
如何发布一个Web服务:
a,在类上添加@WebService注解
(注:此注解是jdk1.6提供的,位于javax.jws.WebService包中)
b,通过EndPoint(端点服务)发布一个WebService
(注:EndPoint是jdk提供的一个专门用于发布服务的类,该类的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。位于 javax.xml.ws.Endpoint包中)
c,注:
类上添加注解@WebService,类中所有非静态方法都会被发布;
静态方法和final方法不能被发布;
方法上加@WebMentod(exclude=true)后,此方法不被发布;
(3)客户端访问发布的服务
根据WSDL文档来在客户端编写代码,访问发布的服务;
但是,WSDL文档看不懂怎么办?代码该如何编写?
——你看不懂,JDK看得懂,wsimport是JDK自带的,可以根据WSDL文档生成客户端调用代码的工具。无论服务器端WebService使用什么语言编写的,豆浆在客户端生成Java代码。所以服务器用什么语言编写的并不重要。
wsimport.exe命令参数熟知:
-d:生成class文件。默认参数。
-s:生成Java文件
-p:自定义包结构
解析地址生成源码到E盘:
执行以上命令后,即可在E盘下生成如下包及类
注:还可以自定义包结构:
自定义包结构的命令:
将生成的包及.java文件复制到客户端:如下图
创建访问服务的类:MyClient.java:
MyClient.java:
[java] view plain copy
span style="font-family:KaiTi_GB2312;font-size:18px;"package cn.tgb.ws;
public classMyClient {
publicstatic void main(String[] args) {
HelloWebServiceServicehwss = new HelloWebServiceService();
HelloWebServicehws = hwss.getHelloWebServicePort();
Stringresult=hws.helloWord("hanxuemin");
System.out.println(result);
}
}/span
要看你说的哪种了 是j2se还是j2ee
j2se的话,首先将java项目打包成jar文件,这个不用多说,很多开发平台都有此功能,如eclipse就可以直接将java项目export成jar文件,然后写一个bat文件(Windows操作系统下)或者sh文件(unix系列操作系统下),这个文件大致语句包括以下:java –jar myjar.jar
还可以通过相关辅助软件发布,比如exe4j软件辅助创建可执行文件
这款软件专门针对java项目发布成可执行文件,具体操作可以见如下链接
你如果要 我可以发一个软件给你 叫j2ewiz蛮简单的 给个邮箱就可以了
对于j2ee的话,就是将web工程部署至服务器,可以通过控制台命令或者eclipse等工具生成war包 也可以直接使用eclipse部署至服务器 将war包拷贝至tomcat的webapps下 当然你服务器可以使用其他的
如果是把代码发给别人,把整个工程复制或者导出,压缩下发给别人或者放到网上一个网络硬盘或代码托管平台。
如果是把web工程部署到网上给他人访问,先把web工程以war的形式导出,war类型的文件可以说就是web工程的webroot的压缩文件,可以把这个war文件放到运行状态的tomcat的webapps的目录下,tomcat会自动把你的war文件解压缩并运行(相关处理这里不解释),然后就可以项目正常的运行(比如数据库啥的可以正常连接),就可以通过浏览器访问了。这是在本地的情况,如果是放到网络上,你就必须要有的网络上的主机,域名,这些你可以在网上找到免费的,免费资源部落可以找到很多,注意要找提供相关web服务环境的主机,网络上有asp主机,php主机等,你的javaweb就需要jsp的主机,同时你要注意提供数据库服务的主机是跟你提供tomcat主机是否是同一主机!!部署到网络上的项目不成功,经常是因为数据库的连接不成功导致。
JDK 1.4.2 + Myeclipse 6.0(实在经不起诱惑,尝尝鲜) + Tomcat 5.0.28 + AXIS 1.4。 AXIS 1.4包可以在 找到。 假设所有的环境你已经搭好,并且AXIS包也已经下好了。OK, Here we go~
解压axis-bin-1_4.zip这个包可以看到webapps目录,双击进入把里面的AXIS文件夹拷到 %TOMCAT_HOME%\webapps目录下,之后拷贝activation.jar、mail.jar、tools.jar到% TOMCAT_HOME%\webapps\axis\WEB-INF\lib目录下。启动tomcat,访问 如果访问成功,恭喜你!基本的配置你已经做完了。
PS:此处的%TOMCAT_HOME%指的是Tomcat的安装目录,至于那另外的三个jar包,J2EE 1.4库里就能找的到。
现在来说一下最关键的Webservice的发布。AXIS提供了两种发布方式,一种是即时发布(Instant Deployment),另外一种是定制发布(Custom Deployment)。即时发布提供了一种非常简单的webservice的发布方式,但是其中限制太多,因此在实际的开发中定制发布才是首选。这里也将会以定制发布为重点来介绍。
1.即时发布 JWS (Java Web Service) Files - Instant Deployment
即时发布提供了一种非常简单发布方式,发布者只要有Java源代码(也就是.java文件),然后把其后缀名改成jws(也就是 java web service的缩写)拷贝到%TOMCAT_HOME%\webapps\axis目录下即完成了所有的发布工作。AXIS的编译引擎会处理接下来的所有事情。下面是一段示例代码:
java 代码
1. public class HelloAXIS {
2.
3. public String Hello(String name){
4. return "AXIS say hello to " + name;
5. }
6. }
把 HelloAXIS.java 文件改成 HelloAXIS.jws 然后拷贝到%TOMCAT_HOME%\webapps\axis目录下,启动Tomcat之后访问 如果能看到 Click to see the WSDL这个超链接就说明已经发布成功了,点击进去就可以看到这个Webservice的WSDL描述文件。server端的发布已经完成了,接下来就是编写Client端测试代码了。
java 代码
1. package com.chnic.test;
2.
3. import java.net.URL;
4.
5. import javax.xml.namespace.QName;
6.
7. import org.apache.axis.client.Call;
8. import org.apache.axis.client.Service;
9.
10. public class Test {
11.
12. public static void main(String[] args) throws Exception{
13. String targetEendPoint = "" ;
14. Service service = new Service();
15. Call call = (Call) service.createCall();
16. call.setOperationName( new QName(targetEendPoint, "Hello" ));
17. call.setTargetEndpointAddress( new URL(targetEendPoint));
18. String result = (String) call.invoke( new Object[]);
19. System.out.println(result);
20. }
21. }
测试代码很简单,如果熟悉java反射机制的朋友不用两分钟就能看明白。运行后客户端控制台出现 AXIS say hello Robert。测试成功。果然很简单吧。不过在这简单背后却是以牺牲灵活性为代价的。假如你现在手里只有.class 或者一个jar包,jws就不再能满足你的需求了,最要命的就是即时发布不支持带包的类,这点AXIS的用户手册上写的也很明白。
Important: JWS web services are intended for simple web services. You cannot use packages in the pages, and as the code is compiled at run time you can not find out about errors until after deployment. Production quality web services should use Java classes with custom deployment.
2.定制发布 Custom Deployment - Introducing WSDD
比起即时发布定制发布更加烦琐也更复杂,但是换来的却是更大的灵活性,因此在实际项目中定制发布还是不二的选择。定制发布需要你自己编写一个WSDD (Web Service Deployment Descriptor)文件,这个东东类似与XML稍后会做出介绍。废话不多说,我们来看代码:
java 代码
1. package com.chnic.webservice;
2.
3. public class HelloWorld {
4.
5. public HelloWorld(){
6.
7. }
8.
9. public String hello(String str){
10. return "Hello " + str;
11. }
12.
13. public int add( int a, int b){
14. return a + b;
15. }
16.
17. }
一个带包的很简单的类,在eclipse下编译后按照包名拷到 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes 目录下。以这个类为例,拷贝完之后这个HelloWorld.class的路径就是 %TOMCAT_HOME%\webapps\axis\WEB-INF\classes\com\chnic\webservice。PS: 如果嫌这样太麻烦,可以另外建一个Java Web工程用myeclipse的发布工具发布到Tomcat之后,整体一次性拷贝到websericve的工程中。
接下来就需要编写发布文件deploy.wsdd。到%TOMCAT_HOME%\webapps\axis\WEB-INF 目录下建立这个文件并在其中添加如下内容:
xml 代码
1. deployment xmlns =
2. xmlns:java = ""
3.
4. service name = "HelloWorld" provider = "java:RPC"
5. parameter name = "className" value = "com.chnic.webservice.HelloWorld" /
6. parameter name = "allowedMethods" value = "*" /
7. / service
8. / deployment
简单的介绍下各个节点的含义,"HelloWorld"当然是这个webservice的名字,后面紧跟的java:RPC指的是服务类型。这里一共有有4种类型,分别是:RPC, Document, Wrapped 和 Message。有兴趣可以看下 org.apache.axis.providers这个包和子包下面的类的API文档。之后的parameter节点第一个当然是指出具体的类,第二个从字面上也很好理解:允许调用的方法。这里的配置告诉引擎可以调用所有的public方法,当然你也可以自己指定。
编写完配置发布文件之后,cmd打开windows的控制台,进入%TOMCAT_HOME%\webapps\axis\WEB-INF目录下键入如下命令
1. java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
之后控制台返回Processing file deploy.wsdd 和 Done processing 这两段话即说明发布成功。(此时会在同级目录生成一个server-config.wsdd文件 )在这里的AdminClient是AXIS提供的一个客户端管理工具。至于java.ext.dirs的含义可以去了解一下classloader和JVM类装载机制方面的知识,在这里就不多解释。 还有一点要注意的是在发布的时候Tomcat服务必须处于启动状态,否则就会抛出一堆无法连接的异常信息。发布成功之后你可以通过访问 来查看你所有的定制发布的服务。
客户端测试代码
1. String targetEendPoint = "" ;
2. Service service = new Service();
3. Call call = (Call) service.createCall();
4. call.setTargetEndpointAddress( new URL(targetEendPoint));
5.
6. call.setOperationName( new QName(targetEendPoint, "hello" ));
7. String result = (String) call.invoke( new Object[]);
8. System.out.println(result);
9.
10. call.setOperationName( new QName(targetEendPoint, "add" ));
11. Integer res = (Integer) call.invoke( new Object[]);
12. System.out.println( "The result is: " + res);
运行测试代码,控制台显示 Hello Robert 和 The result is: 3 这两句话,说明发布成功。仔细观察下发现其实除了那个targetEndpoint 之外,即时发布和定制发布的客户端调用代码基本上都是一样的。定制发布的URL可以在WSDL文件里找到。