【JavaEE】经典JAVA EE企业应用实战-读书笔记20
来源:互联网 发布:网线接入网络方式 编辑:程序博客网 时间:2024/05/17 22:52
@WebMethod用于修饰EJB Bean实现类的方法
使用该注解的最常用功能是将Bean实现类中某个方法排除在WebService之外。如果不使用该注解修饰,在默认情况下,EJB容器会将Bean实现类中所有方法暴露成WebService。
WebService经常与SOA一起被提起,SOA即Service Orient Architecture,也就是面向服务的结构,而WebService通常被作为SOA的实现技术。WebService负责把底层多个细粒度的方法进行包装、组合,然后包装成粗粒度的服务对外提供。SOA应用内部以低耦合、面向服务的方式进行通信,这就是SOA的基本思想。
属性说明
1)exclude,非必须,指定是否将该方法排除在WebService之外
2)action,非必须,指定WSDL中的SOAPAction,默认为空
3)operationName,非必须,指定该WebService操作的名称,默认与方法名相同
@Stateless@WebService(name = "person", serviceName = "personWS", portName = "personPort", targetNamespace = "http://www.kingdz.org")public class PersonServiceBean implements PerspmService {@Override@WebMethod(operationName = "sayHello", action = "http://www.kingdz.org/greet")public String hello(String name, String age) {return name + age;}@Override@WebMethod(exclude = true)public long test() {return Math.round(Math.random() * 100);}}
部署后的部分WSDL
<portType name='person'> <operation name='sayHello' parameterOrder='sayHello'> <input message='tns:person_sayHello'></input> <output message='tns:person_sayHelloResponse'></output> </operation> </portType> <binding name='personBinding' type='tns:person'> <soap:binding style='document' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='sayHello'> <soap:operation soapAction='http://www.kingdz.org/greet'/> <input> <soap:body use='literal'/> </input> <output> <soap:body use='literal'/> </output> </operation> </binding>
使用@SOAPBing指定WebService风格
JAX-WS2.0不仅支持面向RPC的WebSe,也支持面向文档的WebService。
属性说明
1)style,非必须,指定WebService风格,支持两个属性值
a)SOAPBingding.Style.DOCUMENT:使用面向文档的WebService,默认值
b)SOAPBingding.Style.RPC:使用面向RPC的WebService
2)use,非必须,指定SOAP消息风格,支持两个属性值
a)SOAPBingding.Use.LITERAL:使用字面风格的SOAP消息。这是默认值。如果WebService服务器端和客户端不在一起开发,就应该使用这种风格的消息
b)SOAPBingding.Use.ENCODED:使用SOAP编码风格的SOAP消息。可能导致WebService互操作方面的问题,应尽量少使用这种风格的消息
3)parameterStyle:非必须,指定调用WebService操作的参数风格,支持两个属性值
a)SOAPBingding.ParamterStyle.WRAPPED:使用包装后的参数,默认值
b)SOAPBingding.ParamterStyle.BARE:使用未经包装的参数
注意:虽然use属性值可以为SOAPBingding.Use.ENCODED,但实际上该属性值指定为SOAP编码风格的消息可能并不实用,在WebLogic中会忽略该属性值,在JBoss服务器中会直接不支持这种风格的SOAP消息。
@Stateless@WebService( name = "person", serviceName = "personWS", portName = "personPort", targetNamespace = "http://www.kingdz.org")@SOAPBinding( style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.ENCODED)public class PersonServiceBean implements PerspmService { ...}
上面的类部署在JBoss中会直接提示错误。
SOAP encoding is not supported for JSR-181 deployments
使用@WebParam
该注解用于定义WebService操作的参数风格,该注解通常与@WebMethod一起使用
属性说明
1)header,非必须,指定是否从消息头中提取消息。
2)mode,非必须,指定参数的传递模式
a)WebParam.Mode.IN:指定使用传入参数的模式
b)WebParam.Mode.OUT:指定使用传出参数的模式
c)WebParam.Mode.INOUT:指定使用传入、传出参数的模式
3)name,非必须,指定该WSDL中message元素的name属性值,没有指定该属性值,系统自动生成的name属性值与该形参名相同
4)targetNamespace,非必须,指定消息部分的目标命名空间。如果没有指定属性,默认使用与WebService相同的命名空间
例如
public String hello(@WebParam( name=”somebd”, targetNamespace=”http://blog.kingdz.org”)Person person){ ...}
使用@WebResult
@WebResult与@WebParam十分相似,区别在于@WebResult用于定制返回值,因此比@WebParam少支持一个属性:mode。
另外该注解用于修饰Bean方法本身
@Override@WebMethod(operationName = "sayHello", action = "http://www.kingdz.org/greet")@WebResult(name="helloResult",targetNamespace="http://www.hehe.org")public String hello(@WebParam(name = "somebd", targetNamespace = "http://blog.kingdz.org") Person person) {return person.getName();}
客户端调用WebService
以Java作为编程语言,借助于CXF框架的支持来调用EJB所提供的WebService操作。此处采用动态客户端调用——客户端无需服务器端的任何东西,只要能访问远程WebService的WSDL文档即可。
这里借助CXF来开发客户端
使用cxf需要借助wsdl2java工具
wsdl2java http://127.0.0.1:8080/Hello/PersonServiceBean?wsdl
这样会生成org的文件夹,包含了大量的Java源文件,是开发动态客户端的基础
public static void main(String[] args) {PersonWS service = new PersonWS();Person pws = service.getPersonPort();Person_Type person = new Person_Type();person.setName("kingdz");person.setAge(20);SayHello sh = new SayHello();sh.setSomebd(person);System.out.println(pws.sayHello(sh).getHelloResult());}
运行,输出kingdz
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记20
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记1
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记2
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记3
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记4
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记5
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记6
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记7
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记8
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记9
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记10
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记11
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记12
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记13
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记14
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记15
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记16
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记18
- 重叠IO模型2
- 深入springMVC
- mybatis mybatis-generator 代码自动生成工具
- 有关于身份证号码的组成
- wdatepicker的常用日期格式
- 【JavaEE】经典JAVA EE企业应用实战-读书笔记20
- Mac 下Sublime Text3 快捷键 (亲测!)
- 索引概述
- python字典多键值及重复键值的使用方法(详解)
- SQL like与regexp区别
- 仿知乎app登录界面(Material Design设计框架拿来就用的TexnInputLayout)
- java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
- Multiple operations with path 'api/Plan/AllocateTransport' and method 'GET'
- 文章标题