JAXWS实现WebService
- 格式:doc
- 大小:81.00 KB
- 文档页数:3
真正的轻量级WebService框架——使⽤JAX-WS(JWS)发布WebService WebService历来都很受重视,特别是Java阵营,WebService框架和技术层出不穷。
知名的XFile(新的如CXF)、Axis1、Axis2等。
⽽Sun公司也不⽢落后,从早期的JAX-RPC到现在成熟的、⽀持RPC调⽤与消息传递的JAX-WS都经过了市场的考验,⼗分成熟,⽽且使⽤JAX-WS开发WebService的收益是很⼤的,它是轻量级的。
我们使⽤JAX-WS开发WebService只需要很简单的⼏个步骤:写接⼝和实现=>发布=>⽣成客户端(测试或使⽤)。
⽽在开发阶段我们也不需要导⼊外部jar包,因为这些api都是现成的。
⾸先是接⼝的编写(接⼝中只需要把类注明为@WebService,把要暴露给客户端的⽅法注明为@WebMethod即可,其余如@WebResult、@WebParam等都不是必要的,⽽客户端和服务端的通信⽤RPC 和Message-Oriented两种,区别和配置以后再说):package service;import java.util.Date;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;/*** 作为测试的WebService接⼝** @author Johness**/@WebService@SOAPBinding(style = SOAPBinding.Style.RPC)public interface SayHiService {/*** 执⾏测试的WebService⽅法*/@WebMethodvoid SayHiDefault();/*** 执⾏测试的WebService⽅法(有参)** @param name*/@WebMethodvoid SayHi(@WebParam(name = "name") String name);/*** 执⾏测试的WebService⽅法(⽤于时间校验)** @param clentTime 客户端时间* @return 0表⽰时间校验失败 1表⽰校验成功*/@WebMethod@WebResult(name = "valid")int CheckTime(@WebParam(name = "clientTime") Date clientTime);}然后是实现类(注解@WebService及其endpointInterface属性是必要的):package service.imp;import java.text.SimpleDateFormat;import java.util.Date;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import service.SayHiService;/*** 作为测试的WebService实现类** @author Johness**/@WebService(endpointInterface = "service.SayHiService")@SOAPBinding(style = SOAPBinding.Style.RPC)public class SayHiServiceImp implements SayHiService {@Overridepublic void SayHiDefault() {System.out.println("Hi, Johness!");}@Overridepublic void SayHi(String name) {System.out.println("Hi, " + name + "!");}@Overridepublic int CheckTime(Date clientTime) {// 精确到秒String dateServer = new java.sql.Date(System.currentTimeMillis()).toString()+ " "+ new java.sql.Time(System.currentTimeMillis());String dateClient = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(clientTime);return dateServer.equals(dateClient) ? 1 : 0;}}然后是发布(⼀般有两种⽅式): ⽅式⼀(此⽅式只能作为调试,有以下bug: jdk1.6u17?以下编译器不⽀持以Endpoint.publish⽅式发布document⽅式的soap,必须在service接⼝和实现类添加“@SOAPBinding(style =SOAPBinding.Style.RPC)”注解; 访问受限,似乎只能本机访问(应该会绑定到publish的URL上,如下使⽤localhost的话就只能本机访问)……):package mian;import javax.xml.ws.Endpoint;import service.imp.SayHiServiceImp;public class Main {/*** 发布WebService* 简单*/public static void main(String[] args) {Endpoint.publish("http://localhost:8080/testjws/service/sayHi", new SayHiServiceImp());}}⽅式⼆(基于web服务器Servlet⽅式): 以Tomcat为例,⾸先编写sun-jaxws.xml⽂件并放到WEB-INF下:<?xml version="1.0" encoding="UTF-8"?><endpoints xmlns="/xml/ns/jax-ws/ri/runtime"version="2.0"><endpoint name="SayHiService"implementation="service.imp.SayHiServiceImpl"url-pattern="/service/sayHi"/></endpoints>然后改动web.xml,添加listener和servlet(url-pattern要相同哦):<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xmlns:web="/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="/xml/ns/javaee http://ja <listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener><servlet><servlet-name>SayHiService</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class></servlet><servlet-mapping><servlet-name>SayHiService</servlet-name><url-pattern>/service/sayHi</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>最后部署到Tomcat⾥,值得⼀提的是您可能需要添加以下jar包(因为Tomcat没有): 启动Tomcat。
SpringBoot使⽤JAX-WS调⽤WebService服务除了 CXF 我们还可以使⽤ Spring Boot ⾃⾝默认的组件 JAX-WS 来实现 WebService 的调⽤。
1 新建 Spring Boot Maven ⽰例⼯程项⽬注意:是⽤来 IDEA 开发⼯具1. File > New > Project,如下图选择Spring Initializr然后点击【Next】下⼀步2. 填写GroupId(包名)、Artifact(项⽬名)即可。
点击下⼀步groupId=com.fishproartifactId=webservicejaxws3. 选择依赖Spring Web Starter前⾯打钩。
4. 项⽬名设置为spring-boot-study-webservicejaxws.注意不需要额外导⼊第三⽅组件2 ⾃动⽣成 JAX-WS 代码右键包 user (没有新建⼀个包名)弹出⽣成框中输⼊wsdl的地址在启动类中输⼊测试代码@SpringBootApplicationpublic class WebservicejaxwsApplication {public static void main(String[] args) {SpringApplication.run(WebservicejaxwsApplication.class, args);UserService userService=new UserService();UserDto userDto= userService.getUserPortName().getUserById("1");System.out.println("userdto "+userDto.getUserName());}}**右键 WebserviceclientApplication 点击 Run WebserviceclientApplication**2019-08-12 21:40:29.230 INFO 64345 --- [ main] c.f.w.WebservicejaxwsApplication : Started WebservicejaxwsApplication in 2.087 seconds (JVM running for 2.765) userdto admin。
Java使⽤JAX-WS来写webservice时UnabletocreateJAXBCo。
webservice,作为web开发⼈员来说必须掌握的⼀门技术,它的好处这⾥就不多说了,eclipse中⾃带了⼀种⽣成webservice的⽅法,使⽤JAX-WS,如果我没有弄错的话,它需要javaEE5.0、JDK1.5以上,了解完这些就开始写接⼝⽅法。
各种随⼼所欲。
不料在⽤ eclipse⽣成webservice时出现错误了,⽣成不了,错误信息如下“ An internal error occurred during: "Generating JAX-WS Web Services". Unable to create JAXBContext ” ,错误堆栈如下:⼗⼀⽉ 16, 2015 1:01:32 下午 org.apache.catalina.core.ApplicationContext log信息: Initializing Spring root WebApplicationContext⼗⼀⽉ 16, 2015 1:01:35 下午 org.apache.catalina.core.StandardContext filterStart严重: Exception starting filter ssoFilterjavax.xml.ws.WebServiceException: Unable to create JAXBContextat com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:156)at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:84)at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:234)at com.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:328)at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:190)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:498)at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:246)at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:170)at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:118)at javax.xml.ws.Endpoint.publish(Endpoint.java:240)at com.pcitc.sso.client.SSOFilter.init(SSOFilter.java:42)at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4038)at org.apache.catalina.core.StandardContext.start(StandardContext.java:4692)at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061)at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)at org.apache.catalina.core.StandardService.start(StandardService.java:525)at org.apache.catalina.core.StandardServer.start(StandardServer.java:701)at org.apache.catalina.startup.Catalina.start(Catalina.java:585)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at ng.reflect.Method.invoke(Method.java:606)at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions javax.servlet.http.HttpServletRequest is an interface, and JAXB can't handle interfaces.this problem is related to the following location:at javax.servlet.http.HttpServletRequestat public javax.servlet.http.HttpServletRequest com.pcitc.sso.client.webservice.jaxws.GetLoginUser.arg0at com.pcitc.sso.client.webservice.jaxws.GetLoginUserjavax.servlet.http.HttpServletResponse is an interface, and JAXB can't handle interfaces.this problem is related to the following location:at javax.servlet.http.HttpServletResponseat public javax.servlet.http.HttpServletResponse com.pcitc.sso.client.webservice.jaxws.GetLoginUser.arg1at com.pcitc.sso.client.webservice.jaxws.GetLoginUserat java.security.AccessController.doPrivileged(Native Method)at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:143)... 37 moreCaused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptionsjavax.servlet.http.HttpServletRequest is an interface, and JAXB can't handle interfaces.this problem is related to the following location:at javax.servlet.http.HttpServletRequestat public javax.servlet.http.HttpServletRequest com.pcitc.sso.client.webservice.jaxws.GetLoginUser.arg0at com.pcitc.sso.client.webservice.jaxws.GetLoginUserjavax.servlet.http.HttpServletResponse is an interface, and JAXB can't handle interfaces.this problem is related to the following location:at javax.servlet.http.HttpServletResponseat public javax.servlet.http.HttpServletResponse com.pcitc.sso.client.webservice.jaxws.GetLoginUser.arg1at com.pcitc.sso.client.webservice.jaxws.GetLoginUserat com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:442)at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:274)at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:125)at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1127)at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:173)at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:95)at com.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:98)at com.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:151)at com.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:143)... 39 more⼗⼀⽉ 16, 2015 1:01:35 下午 org.apache.catalina.core.ApplicationContext log信息: Closing Spring root WebApplicationContext真⼼让⼈郁闷,尤其是刚开始搞webservice的时候。
WebService学习之旅(二)JAX-WS基于Web容器发布WebService在上节中我们定义Web服务接口和实现类后,调用Endpoint类的静态方法publish发布来webservice,这种方法使用起来虽然简单,但是对于一个企业级应用来说通常对外提供的服务可能不止一个,如果每个WebService都去编写一个main方法显然不合适,不利于Web服务的集中管理,而且不方便WebService与Web应用整合。
所以绝大多数情况下都会使用Web容器集中管理WebService,本文將向大家介绍如何使用JAX-WS基于Web应用服务器来发布WebService。
一、准备工作1.获取JAX-WS所需所有JAR包,如下图所示所有jar包下载地址:/detail/rongbo_j/94718772.打开Eclipse,新建一个web工程,將上节中的WebService接口和实现类拷贝到src目录下。
HelloWorld .javapackage com.csdn.jaxws.recipe01;import javax.jws.WebMethod;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.jws.soap.SOAPBinding.Style;import e;@WebService@SOAPBinding(style = Style.DOCUMENT, use=Use.LITERAL) public interface HelloWorld {@WebMethodString sayHello(String text);}HelloWorldImpl.javapackage com.csdn.jaxws.recipe01;import javax.jws.WebService;@WebService(endpointInterface = "com.csdn.jaxws.recipe01.HelloWorld")public class HelloWorldImpl implements HelloWorld {@Overridepublic String sayHello(String name) {return "hello," + name;}}3.將上面的jar包添加的classpath中,并发布到WEB-INF/lib目录下,接着在WEB-INF/web.xml文件中,添加如下内容:<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextLi stener</listener-class></listener><servlet><servlet-name>WSServlet</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>WSServlet</servlet-name><url-pattern>/service/*</url-pattern></servlet-mapping>以/service/*结尾的Http请求会经过WSServlet处理,生成WebService及WSDL文档。
1.下载安装myeclipse2.新建javawebservice工程,选择【file】--【new】--【web service project】如下图所示:进入如下对话框:在framework里面选择jax-ws,单击【finish】3.在新建的工程里,新建名为org.test.service的包文件,在该新建的包下新建calculate.java源文件,代码如下在工具栏上单击New Web Service,如下图的按钮:弹出如下的对话框:在strategy里面选择Create web service from java class,点击next,在弹出的对话框如下图:选择上述建立的calculate.java源文件,勾选【Generate WSDL in project】后完成,这样webservice建立完成。
4.配置tomcat服务器。
打开myeclipse的【window】-【reference】,如下图:选择安装的tomcat,本机上的tomcat版本为6.0,选择tomcat的安装路径,如上图。
单击tomcat6.x下的jdk,弹出下图的对话框:点击【add】添加本机上安装的jdk,完成后确定。
5.添加myeclipse库文件,在项目上右击,点击【reference】,弹出的对话框如下:点击【add library】,在弹出的对话框中选择【Myeclipse libraries】,如下图:单击【next】,选择如下图的两个jar文件:然后确定,目前为止,所有的环境配置完成。
6.部署项目:点击工具栏上的如下图的按钮:点击【configure server】进入如下的对话框:注意点击tomcat server下的【enable】命令,完成。
启动tomcat6.x服务器。
在工具栏上点击命令,弹出如下的对话框:点击add,弹出如下的对话框:选择自己的项目,发布即可。
7.测试在浏览器上输入如下的地址:http://localhost:8080/webservice/calculatePort?wsdl,可以测试wsdl文件。
基于JAX-WS开发部署WebService1.1 基于wsdl开发WebService客户端1.1.1 一般Webservice客户端开发1.1.1.1 使用wsimport生成客户端代码一般的,发布WebService时要公布wsdl文件,以供客户端程序调用时使用。
该wsdl文件一般可以通过在浏览器上访问http地址来获取,比如http://localhost:7001/WebRoot/HelloService?wsdl,对于这种情况,可采用以下步骤自动生成WebService客户端。
WSDL文件示例如下:<?xml version="1.0" encoding="UTF-8" ?>-<!-- Published by JAX-WS RI at . RI's version is Oracle JAX-WS 2.1.3-07/10/2008 08:41 PM(bt).--><!-- Generated by JAX-WS RI at . RI's version is Oracle JAX-WS2.1.3-07/10/2008 08:41 PM(bt). --><definitions xmlns:soap="/wsdl/soap/"xmlns:tns="http://endpoint.helloservice/"xmlns:xsd="/2001/XMLSchema"xmlns="/wsdl/"targetNamespace="http://endpoint.helloservice/" name="HelloService"><types><xsd:schema><xsd:import namespace="http://endpoint.helloservice/"schemaLocation="http://localhost:7001/WebRoot/HelloService?xsd=1"/></xsd:schema></types><message name="sayHello"><part name="parameters" element="tns:sayHello" /></message><message name="sayHelloResponse"><part name="parameters" element="tns:sayHelloResponse" /></message><portType name="Hello"><operation name="sayHello"><input message="tns:sayHello" /><output message="tns:sayHelloResponse" /></operation></portType><binding name="HelloPortBinding" type="tns:Hello"><soap:binding transport="/soap/http"style="document" /><operation name="sayHello"><soap:operationsoapAction="" /><input><soap:body use="literal" /></input><output><soap:body use="literal" /></output></operation></binding><service name="HelloService"><port name="HelloPort" binding="tns:HelloPortBinding"><soap:addresslocation="http://localhost:7001/WebRoot/HelloService" /></port></service></definitions>在本地磁盘新建一个目录,比如D:\jaxWSClient,在该目录下,新建一个文件夹generate运行如下命令:Wsimport–s generatehttp://localhost:7001/WebRoot/HelloService?wsdl如果返回Parsing WSDL… generating code…说明运行成功。
Java WebService 接口实现方式什么是 WebServiceWebService 是一种基于 Web 的服务通信协议,通过使用标准的 HTTP 协议传输数据,使得不同平台、不同语言的应用程序能够进行互操作。
它使用 XML 格式来描述请求和响应的数据,并使用 SOAP(简单对象访问协议)来封装和传输这些数据。
WebService 可以提供各种功能,例如数据查询、数据传输、远程过程调用等。
它是一种跨平台、跨语言的解决方案,能够实现不同系统之间的集成和通信。
Java WebService 实现方式Java 提供了多种方式来实现 WebService 接口,下面介绍两种常用的实现方式。
JAX-WSJAX-WS(Java API for XML Web Services)是 Java EE 的一部分,用于开发和部署 WebService。
它提供了一种简单的方式来创建和发布 WebService 接口。
创建接口首先,我们需要定义一个接口,用于描述我们要提供的服务。
接口中的每个方法都将成为可远程调用的操作。
import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic interface MyWebService {@WebMethodString sayHello(String name);}在上面的例子中,我们定义了一个名为MyWebService的接口,其中有一个名为sayHello的方法,该方法接受一个字符串参数并返回一个字符串结果。
实现接口接下来,我们需要实现上述接口。
这里我们可以使用一个普通的 Java 类来实现接口中的方法。
@WebService(endpointInterface = "com.example.MyWebService")public class MyWebServiceImpl implements MyWebService {@Overridepublic String sayHello(String name) {return "Hello, " + name + "!";}}在上面的例子中,我们创建了一个名为MyWebServiceImpl的类,并实现了MyWebService接口中的sayHello方法。
java webservice 接口实现方式摘要:1.Java WebService 简介2.Java WebService 的实现方式3.实现Java WebService 的步骤4.结论正文:【1.Java WebService 简介】Java WebService 是一种基于Java 语言的Web 服务技术,可以使用Java 语言开发各种Web 服务,如SOAP、RESTful 等。
Java WebService 技术可以帮助开发者构建可扩展、可交互和可靠的Web 服务,以满足现代Web 应用的需求。
【2.Java WebService 的实现方式】Java WebService 的实现方式主要有两种,分别是:(1)使用JAX-WS(Java API for XML Web Services)JAX-WS 是Java EE 5 引入的一种新的Web 服务技术,它支持开发基于SOAP 和XML 的Web 服务。
使用JAX-WS 实现Web 服务需要以下几个步骤:1.定义Web 服务的接口,使用Java 接口或者SEI(Service Endpoint Interface)规范。
2.实现Web 服务的接口,使用Java 类或者SEI 规范。
3.部署Web 服务,将实现的接口和实现类部署到支持JAX-WS 的应用服务器中。
(2)使用JAX-RS(Java API for RESTful Web Services)JAX-RS 是Java EE 6 引入的一种新的Web 服务技术,它支持开发基于RESTful 和JSON 的Web 服务。
使用JAX-RS 实现Web 服务需要以下几个步骤:1.定义Web 服务的资源,使用Java 类或者WADL(Web Application Description Language)规范。
2.实现Web 服务的资源,使用Java 类或者WADL 规范。
3.部署Web 服务,将实现的资源和实现类部署到支持JAX-RS 的应用服务器中。
* Document:使用MyEclipse9.0开发Web Service* Author:虫不知*Date:2013-5-20*/之前使用的都是MyEclipse6.0在做WEB服务,里面使用的是XFIRE框架搭建服务平台,后来因为XFIRE更名之后不再更新,导致在最新MyEclipse9.0中使用的是JAX搭建服务。
此文档就是教如何快速的使用9.0开发WEB服务。
步骤一:创建Web Service Project点击yes这里我们使用的框架是JAX-WS。
他是目前比较流行和成熟的服务框架。
注意,这里虽然我们选择了JAX-WS框架,但是最让人气愤的是MyEclipse9.0跟本不会导入这个JAR包……汗,JDK里又不自带,只有自己导了,否则后面在运行服务时会报类找不到的错误。
导入jar包步骤:1.然后选择MyEclipse Libraires3.选择最后两个选项(jax-ws 相对应的包)在项目工程src创建一个类class注意要给Package命名,以方便后面的使用在helleworld 类输入代码如下:(服务请求者请求服务绑定后调用的程序)创建web service在Strategy 策略中选择第二项点击Browse ,再键入common.(注意common 的后面还有一点“.”)Generate WSDL in project 该选项可选可不选完成后,(出现多一个helloworldDelegate.java)有:启动服务器的步骤:选择TomcatStart 点击后:出现然后点击Manage Deployments....选择MyEclipse TomcatProject 选择你要启动的服务:如果启动成功,就可打开下面的Web Service,如下图:在创建服务的时候会自动生成一个业务类的代理类。
而请求服务的路径和对应的业务都记录在该XML文件中。
点击”http://localhost:8080/MyService/helloworldPort?wsdl”进入在服务注册中心注册发布的服务的步骤:点击第二个出现:点击UDDI MainInquiry URL 键入上面的服务发布地址Registry Name 登记名任意点击go在然后打开发布的服务:再次注意需要输入的服务发布地址打开成功:步骤五:写客户端调用服务我们可以创建一个Java工程来测试我们的服务。
jax-ws,jax-rs规范的webservice客户端调⽤⽅式及soap安全验证Java调⽤webservice⽅式的总结柿⼦当然要拿软的捏,笔者先讲基于http协议的jax-rs规范的webservice的调⽤⽅式。
客户端调⽤WebService的⽅式:1.通过wximport⽣成代码2.通过客户端编程⽅式(同第⼀种是⼀样都是本地调⽤)3.通过ajax调⽤⽅式(可能存在跨域jax-rs)4.通过URL Connection ⽅式调⽤5.通过HttpClient⽅式调⽤6.xfire框架下⽣成的客户端(不⽤)1.wximport根据wsdl⽂档⽣成客户端代码,再调⽤在eclipse中,根据操作⽣成客户端代码,Eg:调⽤helloWS⽅法即可2.客户单编程⽅式(和第⼀种⽅式⼀样)先⽣成客户端代码后,调⽤以下是经测试后的实例:URL url = new URL("http://localhost:88/webServiceWS/wsWSPort?wsdl");QName sname = new QName("http://ws.webservice.suan/", "wsWSService");Service service = Service.create(url,sname);WsWSDelegate ms = service.getPort(WsWSDelegate.class);System.out.println(ms.helloWS("suansuan"));} catch (MalformedURLException e) {e.printStackTrace();第⼆种⽅式中,还可以直接创建了SOAP消息后使⽤dispatch便可以进⾏传递,通过extractConentAsDocument⽅法得到Document类型的返回值参考⽹页:/doc/e1f26763763231126edb11a2.html /wanghuan203/article/details/92195653.使⽤ajax+xml+js的⽅式调⽤具体使⽤⽅法,参考整理的ajax跨域⽂档4.URL Connection⽅式//服务的地址//服务的地址URL wsUrl = new URL("http://localhost:88/webServiceWS/wsWSPort");HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");OutputStream os = conn.getOutputStream();//创建SOAPMessageSOAPMessage msg=MessageFactory.newInstance().createMessage(); SOAPEnvelope envelope =msg.getSOAPPart().getEnvelope();SOAPBody body=envelope.getBody();//创建QName来指定消息中传递数据QName ename=new QName("http://ws.webservice.suan/","HelloWS","wsWSService");//SOAPBodyElement ele=body.addBodyElement(ename);ele.addChildElement("arg0").setValue("suansuan");String soap1=soap.toSoapString(msg);os.write(soap1.getBytes());InputStream is = conn.getInputStream();byte[] b = new byte[1024];int len = 0;String s = "";while((len = is.read(b)) != -1){String ss = new String(b,0,len,"UTF-8");s += ss;}System.out.println(s);is.close();os.close();conn.disconnect();5.httpclient⽅式需要commons-codec-1.3.jar,commons-logging-1.0.4.jar,commons-httpclient-3.1.jar//定义⼀个PostMethod,这时需要指定web服务的Url//soapRequestData是传递的soap协议的信息,可以通过soap建⽴,也可以直接String PostMethod postMethod =new PostMethod("http://localhost:88/webServiceWS/wsWSPort");byte[] b = soapRequestData.getBytes("utf-8");InputStream is =new ByteArrayInputStream(b,0,b.length);//RequestEntity re = new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");//不能设置后⾯的内容,设置了报415错误RequestEntity re =new InputStreamRequestEntity(is,b.length);postMethod.setRequestEntity(re);HttpClient httpClient =new HttpClient();int statusCode = httpClient.executeMethod(postMethod);//请求状态200 okString result =postMethod.getResponseBodyAsString();//返回的字符串形式的soap,进⼀步解析System.out.println(statusCode);System.out.println(result.toString());6.xfire框架下⽣成的客户端也是通过wsdl⽣成客户端程序后调⽤,⾄于soap header的验证,使⽤map加⼊验证信息后验证具体的操作,在我⼯作⽂档中,有⼀个短信平台接⼝⽂档有详细的xfire的使⽤过程,通⽤性不错注意,以上关于soap信息,我是根据⽣成的本地调⽤类的注释,编写soap信息,此外可以直接使⽤String类型的字符串,只要你熟悉soap的格式,就可以⼿动编写传递的soap消息。
在JAX-WS 中实现多个Service间会话保持作者:刘嘉欣南开大学信息学院liujx@在JAX-WS 中实现多个Service间会话保持 (1)服务器端 (1)客户端 (2)1.在同一个Service的不同调用之间保持会话 (2)2.在不同的Service调用时保持会话 (3)本文不是JAX-WS的入门文档,如需了解JAX-WS,请参阅其它文章。
WebService为客户端与服务器沟通提供了非常良好的开发体验,由其在Java中体现尤为明显。
JAX-WS是Java世界里一个非常优秀的WebService开发工具,通过采用JAX-WS,开发人员可以用非常简单的方式从客户端调用服务器开放的服务。
在采用C/S模式开发的时候,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。
由于这几次交互过程是密切相关的,服务器在进行这些交互过程的某一个交互步骤时,往往需要了解上一次交互过程的处理结果,或者上几步的交互过程结果,这就需要在这几次交互过程中保持会话状态。
基于HTTP的应用开发中,要在多个调用之间保持会话状态,通常可以采用以下几种方式:●URL重写,把要传递的参数重写在URL中;●使用Cookie,把要传递的参数写入到客户端cookie中;●使用隐含表单,把要传递的参数写入到隐含的表单中;●使用Session,把要传递的参数保存在session对象中(其实Session机制基于cookie或者URL重写)。
上面几个方式有一个共同点:把要传递的参数保存在两个页面都能共享的对象中,前一个页面在这个对象中写入状态、后一个页面从这个对象中读取状态。
特别是对于使用session 方式,每个客户端在服务端都对应了一个sessionid,服务端维持了由sessionid标识的一系列session对象,而session对象用于保持共享的信息上述保持会话状态的方式,较常用的是服务器Session技术。
java webservice 接口实现方式
Java Web Service接口可以通过以下几种方式来实现:
1. JAX-WS(Java API for XML Web Services):JAX-WS是Java EE的一部分,它提供了一套用于开发和部署Web服务的标准API。
使用JAX-WS,可以通过注解或者基于XML配置来定义和实现Web服务接口。
2. Apache Axis:Apache Axis是一个开源的Web服务框架,它提供了通过Java编程语言开发和部署Web服务的功能。
Apache Axis支持JAX-RPC标准和JAX-WS标准,并且提供了一套基于Java的API来创建和访问Web服务接口。
3. Spring Web Services:Spring Web Services是基于Spring框架的一组API,它支持开发和部署Web服务。
Spring Web Services提供了一套简单的API来创建和发布Web服务,可以通过注解或者基于XML配置来定义和实现Web服务接口。
4. Apache CXF:Apache CXF是一个开源的Web服务框架,它提供了一套用于开发和部署Web服务的功能。
Apache CXF 支持JAX-WS和JAX-RS标准,并且提供了一套基于Java的API来创建和访问Web服务接口。
这些实现方式各有优劣,选择适合自己项目的方式进行实现。
同时,可以根据项目具体需求和技术栈选择合适的工具和框架来开发和部署Web服务接口。
功能说明:该webservice提供Float浮点数运算服务和Double浮点数运算服务
1. 新建webservice服务端项目(web project)
2.在src下建立一个包com.server;并且建立两个类:FloatArith和DoubleArith
3.建立一个包com.delegate,用来存放JAX-WS插件生成的服务端文件
4.生成webservice服务端文件
同理,生成com.delegate.FloatArithDelegate类,完成会发现多了一个sun-jaxws.xml文件
5.运行程序,输入
http://localhost:8080/JAXServer1/DoubleArithPort?wsdl或者
http://localhost:8080/JAXServer1/FloatArithPort?wsdl,出现如下界面,则部署成功
6.建立webservice客户端(java project),并建立com.mapper和com.test两个包。
7.生成webservice客户端文件
同理,可以生成Float运算的客户端程序
8.使用客户端文件调用webservice接口,在com.test包下添加Test类,运行Test文件,即可得到结果。
9.如要把webservice服务端部署到tomcat,把JAXServer1打包成war,然后放在tomcat的webapp目录下,输入url即可访问。
注意点:webService的方法返回值不能是对象,否则javaBean无法发布为webService,客户端也无法解析。
webService的服务端使用spring时,发布为webService的javaBean中不能有spring的依赖注入(暂时注释,等javaBean发布为webService后再释放注释)使用Myeclipse开发基于JAX-WS的Web service实例开发Web service服务程序,需要了解以下相关内容,WSDL, SOAP, XML。
这些是组成Web service 的基础。
在Myeclipse下开发Web service程序,目前系统支持的开发框架有3个,JAX-WS,REST(JAX-RS),XFire。
其中系统建议不要使用XFire 的框架,可能是要被淘汰了(deprecated)。
我们选择的是JAX-WS框架。
这个需要Java EE 5.0的支持。
所以后面选择Web server容器的时候,是要能支持Java EE 5.0的才可以部署成功。
(一)Web service服务端开发1. 新建一个Web service project, 菜单File -> New -> Web Service Project,在上面的框中输入项目名myWebSvc,框架选择JAX-WS, J2EE只能选择Java EE 5.0。
Finish完成项目新建。
2. 新建一个Java Bean, 就是一个普通的Class, File -> New -> Class,包名输入com.myweb.ws, 类名输入SayHello, Finish 结束新建类。
在类中加入一个方法sayHaha如下,package com.myweb.ws;public class SayHello {public String sayHaha(String request) {return "Haha, " + request + ", O.K. !";}}3. 新建一个Web service,菜单File –> New -> Other -> MyEclipse -> Web Services -> Web Service,Next 进入下一步,选择Create web service from java class(Bottom-up scenario),Next进入下一步,Java class 输入com.myweb.ws.SayHello, 选中Generate WSDL in project 选项,Finish 结束新建。
MyEclipse开发WebService(基于JAX-WS框架)在这里,我们使用JAX-WS方式。
JAX-WSJax-WS是Java1.6中才有的,新的WebService模式,基于注解的方式配置WebService,很类似Asp中的WebService,难度已经比Xfire方式的配置降低了很多.REST(JAX-RS)用的比较少Xfire(已过时)配置比较繁琐一、新加Web Service ProjectStep 1:Step 2: 选择WebServices Framework为JAX-WSStep 3: 选择JAX-WS版本为2.1Step 4:Step 5:Step 6: 选择JAX-WS Library为MyEclipse LibraryStep 7: 勾取所有jar包二、编写业务代码Step 1:编写业务接口(可选项,不写接口也可以)Step 2: 编写业务类三、根据Java类,创建Web ServiceStep 1: 新建Web Service-截图1Step 2: 新建Web Service-截图2Step 3: 选择from Java classStep 4: 选择已写的业务Java类Step 5: 指定代理类的名称及WSDL相关项(使用默认也可以)Step 6: 查看新生成的代理类及配置文件sun-jaxws.xml,还有web.xml中的添加内容Step 7: 部署后启动Step 8 : 根据web.xml中的url映射测试http://localhost:9090/Calculator/CalculatorPort?WSDL四、生成客户端代码-----测试调用WebService Step 1: 新建一个Java Project, 命名工程为ClientStep 2:创建Web Service ClientStep 3: 指定工程名称为已存在的Client工程Step 4: 指定WebService客户端对应的WSDB URL及代码存放的包名Step 5: WSDL路径验证成功后点击Finish完成(请确保WebService服务端正在运行,可访问到)Step 6: 自动生成的代码结构如下:其中CalculatorService为客户端需要实例化的类Step 7: 编写客户端调用代码,并运行: 控制台中的输出结果正确。
JAX-WS+SSH创建webServiceJAX-WS 创建SSH项目的WebService 接口主要试用MyEclipse 自动生成service 和client创建接口: (客户端和服务端都需要导入如下两个包(myeclipse library 自带的有))项目->new->other->web service ->Next第二个框里有时会有,如果有要修改service port (例如/wbs/iuserServImplPort) 并重写web.xml中的struts2的FilterAndDispatcher类以实现struts2的url和webService 接口的url的过滤部署到tomcat后localhost:8080/app-name/wbs/xxxxport会显示点击wsdl会出现自己定义的接口如果这个框里不可以填写,那么在部署后要手动修改web.xml中webservice的url-pattern和自动生成的xml里面修改即可Finish创建Client导入jar后在客户端利用myEclipse自动生成然后客户端调用JAX – WS +SSH 创建接口错误记录如果:@WebService(name="iuserServImpl")public class UserServImpl implements IUserServ{private IUserDao iuserDao;……..@WebMethodpublic int addUser(User user){return iuserDao.addUser(user);}}Wsdl可以正常的访问到,但是客户端调用的过程中会出现:IuserDao 为null 的空指针异常,Client:Server:解决办法,通过UserServImpl 继承SpringBeanAutowiringSupport 并对iuserDao 进行注解@Autowired 进行spring对iuserDao的注入@WebService(name="iuserServImpl")public class UserServImpl extends SpringBeanAutowiringSupport implements IUserServ { @Autowiredprivate IUserDao iuserDao;部署时报错:类似于:jax不能够处理接口云云之类处理方法:在生成的xxxDelegate.java对setDao 和getDao 前边添加注解@WebMethod(exclude = true) 表示此方法不被用作发布的接口。
1.在web.xml中配置下列代码
<!-- 配置环境参数,制定Spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Spring的ContextLoaderListener监听器,初始化Spring容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderList ener</listener-class>
</listener>
<servlet>
<servlet-name>JAXWSServlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServ let</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JAXWSServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
2.在编写serviceImpl实现类的时候注意注解问题,如:
package com.jboa.service.impl;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebService;
import .EmployeeBiz;
import com.jboa.pojo.Employee;
import com.jboa.service.EmployeeService;
@WebService(serviceName="employeeService",name="employeeService") public class EmployeeServiceImpl implements EmployeeService{ @Resource
private EmployeeBiz employeebiz;
@WebMethod(exclude=true)
public EmployeeBiz getEmployeebiz() {
return employeebiz;
}
@WebMethod(exclude=true)
public void setEmployeebiz(EmployeeBiz employeebiz) {
this.employeebiz = employeebiz;
}
/**
* 根据Id查询员工信息
* @param id
* @return
*/
@WebMethod
public Employee findById(String id){
return employeebiz.findById(id);
}
}
3.在applicationContext.xml中需要应用的
<beans
xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:p="/schema/p"
xmlns:ws="/spring/core"
xmlns:wss="/spring/servlet"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.0.xsd
/spring/core
/spring/core.xsd
/spring/servlet
/spring/servlet.xsd
">
以及配置
<wss:binding url="/ws/employeeService">
<wss:service>
<ws:service bean="#employeeService"
impl="com.jboa.service.impl.EmployeeServiceImpl"></ws:service> </wss:service>
</wss:binding>
4.在项目中新建文件夹(名字为wsdl)
然后将项目拷贝到D盘上面,进入DOS命令
5,新建项目的时候需要添加所需要的架包
1.新建新的项目以后选中项目右击new----->Other----->MyEclipse----->WebService选中需要的,然后将服务器端查看wsdl文档的网址复制进去生成文件
2.applicationContext.xml中添加,如:
<bean id="employeeService"
class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean"> <property name="serviceInterface"
value="com.jboa.service.impl.EmployeeService"></property>
<property name="wsdlDocumentUrl"
value="http://localhost:8080/JBOA_JAXWS_Service/ws/employeeService?ws dl"></property>
<property name="namespaceUri"
value="/"></property>
<property name="serviceName"
value="employeeService"></property>
<property name="portName"
value="employeeServicePort"></property>
</bean>
<bean id="employeeAction"class="com.jboa.action.EmployeeAcion" scope="prototype">
<property name="employeeService"
ref="employeeService"></property>
</bean>。