Webservice-基于JWS初级实例(二)

JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的,是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。

去年这个时候在亿阳工作,经理让我做数据同步功能,用到WS,于是草草研究之后,就投入使用了。前两天同事给我讲解分配给我的项目时,讲到其中一块是数据同步功能,我不禁一笑,同事问笑什么,我说世界真是奇妙,去年这时候在做数据同步,今年换公司换项目换领导,还让我做数据同步。其实,从这也看出,随着信息化在中国的大力推进,像移动、广电这样的单位用的企业系统已经不止是一个两个,而是几十个,甚至上百,也就必然出现了系统间的通信和数据传输的问题,WSSOA这些技术应该就是在此背景下出来的。

翻了翻之前关于WS的博客,就写了一篇《Webservice-初涉(一)》,我看有必要继去年的博客写个系列了。上篇大概提了几个关于WS的点,我们先做一个快速实例,暂且抛开CXFAxis等框架,从简单的例子入手,再一步步来究其原理。创建两个Java Project,一个为服务器01_service,另一个为客户端01_service_client。首先编写服务器端:

1. 实体类User

package cn.net.easyway.service;

public class User {

	private int id;
	
	private String username;
	
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

2. 提供服务的接口类

package cn.net.easyway.service;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService() //将此接口发布成WS
public interface IMyService {

	@WebResult(name="loginUser") //在生成wsdl文件时,返回值显示成为loginUser
	//在生成wsdl文件时,参数不是arg,而显示为username,password
	public User login(@WebParam(name="username")String username,@WebParam(name="password")String password);
}

此接口称为服务提供接口,SEIService Endpoint Interface),以上代码中,@WebResult@WebParam是可选注

解,读者在去掉前后观察wsdl文档,看看究竟发生了哪些变化。

3. 实现类

package cn.net.easyway.service;

import javax.jws.WebService;

@WebService(endpointInterface="cn.net.easyway.service.IMyService") //endpointInterface:接入点接口
public class MyServiceImpl implements IMyService {

	@Override
	public User login(String username, String password) {
		
		System.out.println(username + "is logining");
		
		User user = new User();
		
		user.setId(1);
		user.setUsername(username);
		user.setPassword(password);
		
		return user;
	}
}

此类称为服务实现BeanSIBServiceimplemention Bean),

endpointInterface属性指向接口。

4. 服务发布类

package cn.net.easyway.service;

import javax.xml.ws.Endpoint;

public class Server {

	public static void main(String[] args) {
		
		String address = "http://localhost:8888/ws";
		
		//两个参数,一个是发布服务地址,一个是发布的服务实现
		Endpoint.publish(address, new MyServiceImpl());
	}
}

编写完服务发布类后,读者可运行起来,在浏览器中敲入:http://localhost:8888/ws?wsdl,即可看到相应的wsdl文档。到此时服务已经发布成功,接下来我们编写客户端,在项目01_service_client中创建类TestClient,代码如下:

package cn.net.easyway.service;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

public class TestClient {

	public static void main(String[] args) throws MalformedURLException {
		//创建访问wsdl服务地址的url
		URL url = new URL("http://localhost:8888/ws?wsdl");
		//通过Qname指明服务的具体信息
		QName sname = new QName("http://service.easyway.net.cn/","MyServiceImplService");
		
		//-------------------------方式一-------------------------
		MyServiceImplService msis = new MyServiceImplService(url, sname);
		
		IMyService ms1 = msis.getMyServiceImplPort();
		System.out.println(ms1.login("张三", "123"));
		
		
		//------------------------方式二----------------------------------------
		//创建服务
		//Service service = Service.create(url,sname);
		//实现接口
		//IMyService ms = service.getPort(IMyService.class);
		//System.out.println(ms.login("李四", "123"));
	}
}

此时,你会看到自己编辑器报错,那是因为客户端这个项目中还没有创建和服务端一致的接口,把服务端源代码直接拷贝明显是行不通,因为在实际项目开发中,别人给你提供接口,是没有必要把源代码给你的,因此这里我们需要一个命令wsimport,这是一个JDK自带的命令,如果您安装了jdk,那么就可以在命令窗口使用该命令了,该命令是将wsdl文档生成相应的类文件,我们可以把生成的这个类文件拷贝到客户端目录下,如同在本地调用一样,调用服务端了,生成的源文件大家可以看一下,是和服务端完全不同的代码,此时,我的客户端项目目录如下图:


wsimport命令参数解释如下:

wsimport -dd   :/wsimport -keep -verbosehttp://localhost:8888/ws?wsdl

-d d:/temp    :指定生成的目录;

-keep         :指定是否生成Java源文件;

-verbose      :显示生成的详细过程;

http://localhost:8888/ws?wsdl:网络中的wsdl文件;

下一篇讲解WSDL和工具。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
中文乱码通常是由于字符编码不一致导致的。解决方法如下: 1. 在客户端中设置字符编码为UTF-8(或与服务端相同的编码),例如: ```java String encoding = "UTF-8"; BindingProvider provider = (BindingProvider) port; Map<String, Object> requestContext = provider.getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); requestContext.put(BindingProvider.USERNAME_PROPERTY, username); requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true); requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers); requestContext.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 3000); requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); requestContext.put(JAXWSProperties.HTTP_RESPONSE_TIMEOUT, 3000); requestContext.put(JAXWSProperties.HTTP_CLIENT_ALLOW_CHUNKING, true); requestContext.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); requestContext.put(JAXWSProperties.CONNECT_TIMEOUT, 3000); requestContext.put(JAXWSProperties.REQUEST_TIMEOUT, 3000); requestContext.put(JAXWSProperties.HTTP_RESPONSE_TIMEOUT, 3000); requestContext.put(JAXWSProperties.HTTP_CLIENT_ALLOW_CHUNKING, true); requestContext.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 3000); requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); requestContext.put(JAXWSProperties.HTTP_RESPONSE_TIMEOUT, 3000); requestContext.put(JAXWSProperties.HTTP_CLIENT_ALLOW_CHUNKING, true); requestContext.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192); //设置字符编码 requestContext.put(BindingProviderProperties.ENCODING, encoding); ``` 2. 在服务端中设置字符编码为UTF-8(或与客户端相同的编码),例如: ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost:8080/HelloWorld" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8080/HelloWorld"> <types> <xsd:schema> <xsd:import namespace="http://localhost:8080/HelloWorld" schemaLocation="http://localhost:8080/HelloWorld?xsd=1"/> </xsd:schema> </types> <message name="sayHello"> <part name="name" type="xsd:string"/> </message> <message name="sayHelloResponse"> <part name="return" type="xsd:string"/> </message> <portType name="HelloWorld"> <operation name="sayHello"> <input message="tns:sayHello"/> <output message="tns:sayHelloResponse"/> </operation> </portType> <binding name="HelloWorldSoapBinding" type="tns:HelloWorld"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="sayHello"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="HelloWorldService"> <port name="HelloWorldPort" binding="tns:HelloWorldSoapBinding"> <soap:address location="http://localhost:8080/HelloWorld"/> </port> </service> </definitions> ``` 在这个例子中,我们在WSDL文件头部设置了编码为UTF-8,并在SOAP消息的body元素中使用了use="literal"来指定使用XML文本格式。这样可以确保服务端和客户端使用相同的字符编码,避免中文乱码问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值