1.通过MyEclipse创建基于JAX-WS的WebService
1.1创建webService服务端项目
如图中所示创建一个WebService项目
1.1创建服务类
1.1.1创建一个普通类
在创建了WebService项目后,我们便可以在项目中创建我们自己的类了。
我们创建一个Products.java类,在其中有一个public方法通过这个方法,我们可以取得一个书名的list列表
public List<String> getAllProduct(){
List<String> product = new ArrayList<String>();
product.add("java核心技术");
product.add("javaEE开发速成");
product.add("SOA面向方面架构");
return product;
}
1.1.2将类发布为webService服务类
选中WebService项目,单击鼠标右键new一个web service(如下图所示),因为我们创建的是服务端,所以我们选择Web Service选项
单击next,如下图所示,因为我们创建的是基于JAX-WS的项目,所以在framework处选择JAX-WS,在Strategy的选择上,我们选择从java类创建服务类,所以选择第二个。
选择需要转换成服务的java类,如果我们选中Generate WSDL in project 那么IDE会在我们项目的WEB-INF下,创建一个wsdl文件夹,其中保存生成的wsdl文件和xsd文件.我们也可以不选。
点击Finish后,我们完成了对服务类的创建。
在完成了对服务类的创建后,我们可以看到在Products.java的源包下多了一个ProductsDelegate.java文件。
在WEB-INF文件夹中也多了一个sun-jaxws.xml,其代码为:
<?xml version = "1.0"?>
<endpoints version="2.0"
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint name="ProductsPort"
implementation="cn.ls.webservice.ProductsDelegate"
url-pattern="/ProductsPort">
</endpoint>
</endpoints>
同时在web.xml文件中也自动添加了代码:
<servlet>
<description>JAX-WS endpoint - ProductsService</description>
<display-name>ProductsService</display-name>
<servlet-name>ProductsService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ProductsService</servlet-name>
<url-pattern>/ProductsPort</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
每添加一个服务类,都需要在这两个文件中进行注册,当然myeclipse会自动帮助我们完成这项工作。
启动服务器,在服务器启动成功后,在地址栏中输入http://luosheng:8080/WebService/ProductsPort?wsdl就可以看到浏览器中显示:
这是表示我们的服务类启用成功了。
1.2创建客户端项目
由于我们只需要查看能否访问服务端程序获取信息,所以在这里我们只需要创建一个java项目即可。
在创建了一个java项目后,选中新创建的java项目,按照创建服务类的方式,创建客户端,不过在选择创建内容的时候选择web service client,如下图所示:
如下图所示,我们需要选择WSDl文件,这里有两种方式供我们选择一种是访问本地wsdl文件,一种是通过访问网络地址来获取wsdl文件,图中我们是以网络地址来获取wsdl文件,然后我们需要选择生成的客户端类文件的保存地址图中,我们保存在了cn.ls.client包中,如果我们没有创建包,那么可以通过new键来创建包。点击next创建客户端类。
在完成创建后,我们可以在client包中看到刚刚生成的java类。
此时,我们可以通过编写一个main方法来验证我们能否成功的调用服务端的服务程序。main方法的代码为:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
ProductsDelegate products = new ProductsService().getProductsPort();
for(String str:products.getAllProduct()){
System.out.println(str);
}
}
}
运行成功后我们可以看到在控制太成功的打印除了产品信息:
这样我们就成功的完成了一次简单的基于JAX-WS的web service编程
2.基于手动的编写JAX-WS的WebService
在第一节中,我们是通过myeclipse来编译和生成的webService代码文件,那么怎么来通过手动的方式来创建web服务呢!接下来我们就来看看。
2.1手动编译创建服务端类
2.1.1创建编译服务类
我们还是以刚刚的项目来进行讲解。在创建好Products.java类后,如果要通过手动的方式将其变为服务类,还需要对Products.java文件进行注解。
@WebService
public class Products {
@WebMethod
public List<String> getAllProduct(){
List<String> product = new ArrayList<String>();
product.add("java核心技术");
product.add("javaEE开发速成");
product.add("SOA面向方面架构");
return product;
}
}
在代码中,@WebService将Products类标注为web服务类,@WebMethod将方法getAllproduct标注为服务类。完成上述步骤后,我们就通过手动的方式来生成相应的wsdl等文件。打开系统的cmd界面。进入到项目目录下。
我们通过命令wsgen来生成相应的wsdl等文件。如下图所示:(在运行时需要现在项目下创建wsdl和wssrc两个
文件夹,否则会报错)
其中:
-wsdl参数代表生成webservice
- s参数代表生成的.java文件置于何处
-d 参数代表生成的编译class文件置于何处(这个可以忽略,我们利用eclipse编译)
-r 参数代表生成的.wsdl文件与.xsd文件生成在何处
-cp参数代表classpath,即Hello.class的所在,为什么我们的-cp后是这么长一个路径呢?请看Eclipse里工程编译输出目录的路径就知道了:
完成后,刷新项目,此时我们可以看到项目中的wsdl文件夹和wssrc文件夹下多出了一些文件。
我们将wssrc下的文件拷贝到src下。
2.1.2配置,部署服务类
由于我们是手动生成的服务类,所以我们还需要手动的去修改web.xml和在WEB-INF文件夹下添加sun-jaxws.xml文件,之前这些工作都是myeclipse帮我们做的。
修改web.xml添加如下代码:
<servlet>
<servlet-name>ProductsService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ProductsService</servlet-name>
<url-pattern>/ProductsPort</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
创建sun-jaxws.xml文件
<?xml version = "1.0"?>
<endpoints version="2.0"
xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
<endpoint name="ProductsPort"
implementation="cn.ls.webservice.Products"
url-pattern="/ProductsPort">
</endpoint>
</endpoints>
完成上述步骤后,运行项目,访问地址相应地址,如http://-luosheng:8080/WebService/ProductsPort?wsdl,能够在浏览器中正确的查看wsdl文件,即表示创建成功。
2.2通过服务端的wsdl和xsd文件生成客户端java类
将服务端生成的wsdl文件和xsd文件拷贝到客户端项目下,我们通过命令
wsimport来完成对客户端java的生成。
在cmd界面进入客户端项目文件夹。运行如下图所示命令:
/**
* @param args
*/
public static void main(String[] args) {
Products products = new ProductsService().getProductsPort();
for(String str:products.getAllProduct()){
System.out.println(str);
}
}
此时运行main方法,程序会报错,为什么呢?我们打开ProductsService.java类,可以看到
@WebServiceClient(name = "ProductsService", targetNamespace = "http://webservice.ls.cn/", wsdlLocation = "file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl")
和
static {
URL url = null;
try {
URL baseUrl;
baseUrl = cn.ls.webservice.ProductsService.class.getResource(".");
url = new URL(baseUrl, "file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl");
} catch (MalformedURLException e) {
logger.warning("Failed to create URL for the wsdl Location: 'file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl', retrying as a local file");
logger.warning(e.getMessage());
}
PRODUCTSSERVICE_WSDL_LOCATION = url;
}
通过这两段代码,我们看到在第一段的wsdlLocation和第二段的url中,均为file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl,这是表示的程序运行时,程序获取wsdl文件的地址,在这里我们需要对她进行修改,修改为我们服务器端相应的wsdl地址,如:
http://luosheng:8080/WebService/ProductsPort?wsdl,修改后我们再运行程序,即可以成功的看到正确的运行结果了!
更详细的手动创建webService方法,请参照博客:http://blog.csdn.net/lifetragedy/article/details/7205832