一、什么是webservice?有什么用?
webservice是一种跨平台、跨语言的一种远程调用技术。其主要用于不同系统中的相互调用。
二、webservice的技术特点
1、XML:XML是webservice传递信息的载体。
2、SOAP:通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。
3、WSDL:Web Service Description Language, Web Service描述语言。它用XML的格式描述了WebService有哪些方法、参数类型、访问路径等等。
三、webservice实践
1、使用JDK来开发webservice
①服务端编写
public interface WebService { ???????int addUp(int a, int b); ???????int minus(int a, int b);}@javax.jws.WebServicepublic class WebServiceImpl implements WebService { ???????@Override ???public int addUp(int a, int b) { ???????return a + b; ???} ???@Override ???public int minus(int a, int b) { ???????return ?a - b; ???}}//使用监听器来进行发布,这样就可以在项目启动的时候就可以将webservice服务发布出来@WebListenerpublic class WebServiceListener implements ServletContextListener { ???public void contextInitialized(ServletContextEvent arg0) ?{ ???????String address = "http://127.0.0.1:9999/ws/webservice"; ???????Endpoint.publish(address, new WebServiceImpl()); ???????System.out.println("发布webservice服务成功。。。。。"); ???} ???@Override ???public void contextDestroyed(ServletContextEvent arg0) { ???????????} ???}
②客户端编写的两种方式:
Ⅰ、使用 wsimport -s f:\ http://127.0.0.1:9999/ws/webservice?wsdl来生成客户端代码
public class test { ???public static void main(String[] args) { ???????WebServiceImplService ws = new WebServiceImplService(); ???????WebServiceImpl wsImpl = ws.getWebServiceImplPort(); ???????int addUp = wsImpl.addUp(1, 2); ???????int minus = wsImpl.minus(0, 1); ???????System.out.println(addUp); ???????System.out.println(minus); ???}}
Ⅱ、使用eclispe直接新建websercice client
public class test { ???public static void main(String[] args) { ???????WebServiceImplProxy proxy = new WebServiceImplProxy(); ???????try { ???????????int addUp = proxy.addUp(1, 1); ???????????int minus = proxy.minus(2, 1); ???????????System.out.println(addUp); ???????????System.out.println(minus); ???????} catch (RemoteException e) { ???????????e.printStackTrace(); ???????} ???????????}}
2.使用spring 构建webservice服务端(不用webservice框架)
<!-- webservice配置 --> ???<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"> ???????<property name="baseAddress" value="http://127.0.0.1:8888/ws/"/> ???</bean>
@Component@WebService(serviceName="UserInfoWebService")public class UserInfoWebService { ???@Autowired ???private UserMapper userMapper; ???@WebMethod ???public User getUserInfoById(Integer id) { ???????User user = userMapper.selectByPrimaryKey(id); ???????return user; ???} ???}
四、spring 集成cxf
0.引入cxf相关的jar包
<dependency> ???????<groupId>org.apache.cxf</groupId> ???????<artifactId>cxf-rt-frontend-jaxws</artifactId> ???????<version>3.1.8</version> ???</dependency> ???<dependency> ???????<groupId>org.apache.cxf</groupId> ???????<artifactId>cxf-rt-transports-http</artifactId> ???????<version>3.1.8</version> ???</dependency> ???<dependency> ???????<groupId>org.codehaus.woodstox</groupId> ???????<artifactId>stax2-api</artifactId> ???????<version>3.1.4</version> ???</dependency>
1.web.xml中,增加如下配置
<!-- spring 加载配置文件 --> ??<listener> ???<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> ??</listener> ??<context-param> ???<param-name>contextConfigLocation</param-name> ???<param-value> ???????classpath:applicationContext.xml, ???????classpath:application-cxf.xml ???</param-value> ??</context-param> ????????<!-- cxf webservices --> ???<servlet> ???????<description>CXF Endpoint</description> ???????<display-name>cxf</display-name> ???????<servlet-name>cxf</servlet-name> ???????<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> ???????<load-on-startup>2</load-on-startup> ???</servlet> ???<servlet-mapping> ???????<servlet-name>cxf</servlet-name> ???????<url-pattern>/ws/*</url-pattern> ???</servlet-mapping>
2.新建application-cxf.xml配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" ???xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ????xmlns:soap="http://cxf.apache.org/bindings/soap" ???xmlns:jaxws="http://cxf.apache.org/jaxws" ???xsi:schemaLocation="http://www.springframework.org/schema/beans ????http://www.springframework.org/schema/beans/spring-beans.xsd ???http://cxf.apache.org/bindings/soap ????http://cxf.apache.org/schemas/configuration/soap.xsd ???http://cxf.apache.org/jaxws ????http://cxf.apache.org/schemas/jaxws.xsd"> ???<import resource="classpath:META-INF/cxf/cxf.xml" /> ???<import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> ???????<!-- ?Cxf WebService 服务端示例 --> ???<jaxws:endpoint id="DemoWebservice" implementor="com.myproject.webservice.impl.UserInfoWebServiceImpl" ?address="/UserInfoWebService"/></beans>
3.业务代码
@WebServicepublic class UserInfoWebServiceImpl{ ???@Autowired ???private UserMapper userMapper; ???public String getUserInfoById(@WebParam(name="id")Integer id) { ???????User user = userMapper.selectByPrimaryKey(id); ???????return user.toString(); ???} ???}
这样基于cxf和spring集成的webservice就完成了,http://localhost:8080/zmyproject/ws/UserInfoWebService?wsdl
4.cxf客户端调用webservice
application-cxf.xml
<!-- ?Cxf WebService 客户端调用--> ???<jaxws:client id="arithmeticWebServiceClient" serviceClass="com.myproject.webservice.client.ArithmeticWebServiceClient" address="http://127.0.0.1:9999/ws/webservice?wsdl"></jaxws:client>
//这个要和wsdl文件中的targetNamespace以及name对应//创建这个接口来和webservice服务对应,接口名不限,但是方法名和参数一定要和webservice@WebService(targetNamespace = "http://server.webservice/", name = "WebServiceImplService")public interface ArithmeticWebServiceClient { ???int addUp(int a, int b); ???????int minus(int a, int b); ???}
@RequestMapping(value="/add", method=RequestMethod.POST) ???public Result add(HttpServletRequest request) throws ServiceException{ ???????Result result = new Result(); ???????Map<String, Object> params = HttpRequestUtil.initParameters(request); ???????result.setData(userService.add(params)); ???????return result; ???}
@Override ???public int add(Map<String, Object> params) { ???????int a = Integer.parseInt(params.get("a").toString()); ???????int b = Integer.parseInt(params.get("b").toString()); ???????int result = arithmeticWebServiceClient.addUp(a, b); ???????return result; ???}
WebService
原文地址:https://www.cnblogs.com/kyleinjava/p/9371760.html