学习笔记
第15章,开发xfire,web,service应用
1.中间交互层标注协议(不同系统交互的中间语言.接口)
2.web service 基于网络,分布式的模块化组件
3.
soap 简单对象访问协议
wsdl web服务描述语言
uddi 统一描述/发现/集成
client<--soap 通过http交换xml-->server
client--查找-->uddi--描述信息-->wsdl-描述服务-->server
client--(查找-->uddi 列出服务可略)--指向服务-->server
数据绑定,协议和传输独立性,web服务REST样式支持,易开发
4.xfire (java servlet2.4+容器)
基于spring代理机制(pojo->spring生成代理类->xfire核心servlet将其暴露为webservice
客户端开发:XFire HTTP Client Libraries
JAX-WS JAX-RPC (javaee5?)
web service project
web service
jetty and tomcat do not implement the entire javaee 5 spac and will need the JAX-WS libraries
=========================
使用xfire 创建web service project ,添加web service功能 添加核心包,客户端包
//client 代码
public static void main(String[] args) {
Service serviceModel = new ObjectServiceFactory().create(IHelloWorldService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String url = "http://localhost:8080/HelloWorld/services/HelloWorldService";
try {
IHelloWorldService service = (IHelloWorldService) factory.create(serviceModel, url);//service
String result = service.hi("hello world");
System.out.print(result);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
///////////////////////第三方服务调用
public static void main(String[] args) {
MobileCodeWSClient client = new MobileCodeWSClient();
//create a default service endpoint
MobileCodeWSSoap service = client.getMobileCodeWSSoap();
ArrayOfString arrs=service.getDatabaseInfo();
if(arrs!=null){
List<String> lists=arrs.getString();
for(String s:lists){
if(s.indexOf("厦门")!=-1)
System.out.println(s);
}
System.out.println("=========");
}
System.out.println(service.getMobileCodeInfo("15812345678", null));
System.exit(0);
}
客户端-->soap 请求信封-->地址对应servlet方法-->得到soap响应信封-->解析-->结果
避免jar包冲突 包含spring包
5.javaEE5 支持JSR-181 规定web服务标注
xfire支持JSR-181
jboss,glassfish,weblogic10都支持javaee5 ,tomcat只是web层,不支持ejb和web服务开发
a)使用xfire开发 对pojo标注配置为web服务,加入services.xml发布服务
@WebService标注被xfire读取最终生成web service
http://localhost:8080/HelloWorldService/services/Jsr181EchoService?wsdl
项目,services,无serviceName默认类名称?wsd
@WebService(name = "EchoService", serviceName = "EchoServiceTest", targetNamespace = "http://www.openuri.org/2004/04/HelloWorld")
public class Jsr181EchoService {
@WebMethod(operationName = "echoString", action = "urn:EchoString")
@WebResult(name = "echoResult")
public String echo(@WebParam(name = "echoParam", header = true)String input) {
return input;
}
}
service.xml配置
<service>
<name>ServiceName</name> <!--最终发布名以此为准-->
<namespace>http://www.un.gov/HelloEcho</namespace>
<serviceClass>echo.Jsr181EchoService</serviceClass>
<serviceFactory> <!--要是annotationServiceFactory才可-->
org.codehaus.xfire.annotations.AnnotationServiceFactory
</serviceFactory>
</service>
b)使用javaee5开发(需服务器支持javaee5)pojo,在web.xml配置为servlet
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class HelloWorldService {
@WebMethod
public String hello(String name) {
return "欢迎您访问 JBoss Web 服务:" + name;
}
}
发布
<servlet>
<servlet-name>HelloWorldService</servlet-name>
<servlet-class>webservice.HelloWorldService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldService</servlet-name>
<url-pattern>/HelloWorldService/*</url-pattern>
</servlet-mapping>
jboss服务路径:http://localhost:8080/JBossWS/HelloWorldService/?wsdl
新建wsdl
prefix:tns
create wsdl skeleton
protocol:soap
soap binding options:document literal
6.Web Service Security
7.暴露的方法变量应为简单类型(字符,数组,整数)
或POJO?