Web Service进阶(五)SOAPBinding方式讲解,该如何高效实用Kotlin

30 阅读4分钟

最后

推荐一些系统学习的途径和方法。

路线图

每个Web开发人员必备,很权威很齐全的Web开发文档。作为学习辞典使用,可以查询到每个概念、方法、属性的详细解释,注意使用英文关键字搜索。里面的一些 HTML,CSS,HTTP 技术教程也相当不错。

HTML 和 CSS:

html5知识

css基础知识

开源分享:docs.qq.com/doc/DSmRnRG…

  在JAX-WS时代,wscompile已经被wsimport与wsgen代替。wsimport用于导入wsdl并生成可移植性组件(artifact)wsgen生成编译后的SEI并生成可移植性组件(artifact). 当前wsgen并不产生wsdl.WSDL在部署的时候产生。但通过配置项可让wsgen产生wsdl。
wscompile主于用于早期的RPC,使用wscompile需要编写一个config.xml文件,作为wscompile的输入。

  昨天在GF3上部署webservice,在webserivce上添加了SOAPBinding(style=Style.RPC),[这个annotation最好写在类层次上,写在方面层次上容易与出现与类出现冲突],结果部署失败。后来发现写成SOAPBinding(style=Style.RPC,use=literal)才可以。从Google上找到一点证据:RPC/encoded is not a supported style/use mode with JAX-WS 2.0. JAX-WS2.0 is fully compliant with the WS-I Basic Profile 1.1 which mandates literal mode. The supported style/use modes are: rpc/literal and document/literal. 

  JAX-WS 中的SoapBinding目前支持3种方式:

1)Document Wrapped(默认使用方式,由下面的错误可见):
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
2)Document Bare:
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.BARE)
3)RPC:
@SOAPBinding(style=SOAPBinding.Style.RPC,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

  另外 The java.util.Collection classes cannot be used with rpc/literal or document/literal BARE style due to a limitation in JAXB. However, they do work in the default document/literal WRAPPED style

  为了更形象具体的解释以上三种绑定方式,作者采用示例代码的形式进行演示,并对三种绑定方式进行对比。

1)Document Wrapped:

//它是一个注解,用在类上指定将此类发布成一个ws.
//修改目标空间,修改服务名,端口名.在wsdl那里的xml文件显示对应的修改信息
@WebService(targetNamespace = "ujn.cn/",serviceNa… = "UserService", portName = "UserPort")
public interface UserService {
// 添加用户
@WebMethod
@ResponseWrapper(localName = "add_Status", targetNamespace = "ujn.cn/", className = "cn.ujn.edu.dto.User")
@RequestWrapper(localName = "userInfo", targetNamespace = "ujn.cn/", className = "cn.ujn.edu.dto.User")
@WebResult(name="add_Status")
public int add(String userStr);
// 查找用户
@WebMethod
@WebResult(name="login_Status")
public int login(String userStr);
}

  刚开始写注解的时候,感觉应该会很简单,其实不然。对于这三种绑定方式,我们首先应该考虑应用场景,针对不同的应用场景选择不同的绑定形式。后面会具体分析绑定方式的选择问题。

  在Document wrapped方式中,我们设置的@WebResult(name="add_Status")和@WebParam(name="userInfo")其中的name属性值必须进行包装,相关代码

// 添加用户

<span style="font-size:18px;">@WebMethod
	@ResponseWrapper(localName = "add_Status", targetNamespace = "http://ujn.cn/", className = "cn.edu.ujn.dto.User")
	@RequestWrapper(localName = "userInfo", targetNamespace = "http://ujn.cn/", className = "cn.edu.ujn.dto.User")
	@WebResult(name="add_Status")
	public int add(@WebParam(name="userInfo")String userStr);</span>
<span style="font-size:18px;">其中,相应包装类为className = "cn.edu.ujn.dto.User",其具体内容如下:</span>
<span style="font-size:18px;">public class User {
	private String userInfo;
	private String login_Status;
	public String getUserInfo() {
		return userInfo;
	}
	public void setUserInfo(String userInfo) {
		this.userInfo = userInfo;
	}
	public String getLogin_Status() {
		return login_Status;
	}
	public void setLogin_Status(String login_Status) {
		this.login_Status = login_Status;
	}
}</span>
<span style="font-size:18px;">在进行参数名的替换时,会将localName = "userInfo"在className = "cn.edu.ujn.dto.User"中匹配,若匹配成功,则进行替换操作,替换后的效果可以在wsdl文件中查看,如下图1-1所示,否则编译器会报如图1-2所示的错误:</span>

 

图1-1 wsdl文档

图1-2 错误提示

  出现此错误的原因正是因为所定义的变量userInfo1未存在于包装类user中。

此种绑定形式的缺点是在进行参数初始化时需进行两次new操作(分别为in和out阶段),浪费内存,当然可以考虑使用工厂设计模式。

**注:**在进行重复部署服务的时候,应当将Tomcat容器中的web项目删除,否则会因为缓存的原因而看不到新部署的服务效果。

2)DocumentBare:

其指定形式如下:

<span style="font-size:18px;">public interface UserService {
	// 添加用户
	@WebMethod
	@WebResult(name="add_Status")
	public int add(@WebParam(name="userInfo")String userStr);
	// 查找用户
	@WebMethod
	@WebResult(name="login_Status")
	public int login(@WebParam(name="userInfo")String userStr);
}</span>
<span style="font-size:18px;">其中,最重要的参数设置是红色部分的内容。此种方式对于数据类型简单如intString、array类型的数据使用,对于list、map等集合复杂类型的数据不适用。此种形式的优点是节省内存。</span>

3)RPC**:**

紧跟潮流

大前端和全栈是以后前端的一个趋势,懂后端的前端,懂各端的前端更加具有竞争力,以后可以往这个方向靠拢。

这边整理了一个对标“阿里 50W”年薪企业高级前端工程师成长路线,由于图片太大仅展示一小部分

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】