一、解决问题及解决方法

  • 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致。
  • 解决方案:将webService绑定到web工程中,使得共用一个端口。

二、案例

  2.1  创建一个web工程名:web_webService

  2.2  编写两个服务接口

  • 注意:
  1.   本例使用apache CXF3.2.0的框架来架构webService服务
  2. 在接口定义之前加上@WebService标注,表明这是一个WebService服务,否则在生成服务端时不能找到相应的接口;
  3. 这里@WebService标注的targetNamespace一定要填写内容,不然在生成WebService服务端的时候会报如下的错误,这个命名空间起始就是包名的倒序。
package www.shyroke.com;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService; @WebService(targetNamespace="http://service.shyroke.com/")
public interface IFirst { @WebResult(name="addResult")
public int add(@WebParam(name="x")int x,@WebParam(name="y")int y);
}
package www.shyroke.com;

import javax.jws.WebResult;
import javax.jws.WebService; /**
* 锟节讹拷锟斤拷锟接口凤拷锟斤拷
* 锟斤拷锟节伙拷取锟斤拷前系统时锟斤拷
* @author Administrator
*
*/
@WebService(targetNamespace="http://service.shyroke.com/")
public interface ISecond { @WebResult(name="getSysTimeResult")
public String getSysTime();
}

  2.2  编写服务接口实现类

package www.shyroke.com;

import javax.jws.WebService;

@WebService(endpointInterface="www.shyroke.com.IFirst")
public class FirstImpl implements IFirst { @Override
public int add(int x, int y) {
return x+y;
} }
package www.shyroke.com;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.jws.WebService; @WebService(endpointInterface = "com.shyroke.service.ISecond")
public class SecondImpl implements ISecond { @Override
public String getSysTime() {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); return dateFormat.format(date);
} }

  2.3  发布服务并把服务绑定到web工程

  • 生成webService服务  : File->New->Other->Web Services->WebService,在Service implementation中选择提供服务的实现类。
  • 上述发布了第一个服务并绑定到了web工程,第二个服务的发布也按照上面图的操作来做即可。
  • 发布完两个服务的项目结构为下图:
  • 注意:    1. 到现在为止如果开启服务器会报错,因为工具在cxf-beans.xml中生成了如下,而我们在该目录下并没有,所以要把这三行去掉:
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
  • 注意:    2. 在cxf-beans.xml中把<jaxws:endpoint>属性里面有serviceName的属性和endpointName和address属性去掉,如下:
<?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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:endpoint xmlns:tns="http://service.shyroke.com/"
id="first" implementor="www.shyroke.com.FirstImpl" wsdlLocation="wsdl/firstimpl.wsdl">
<jaxws:features>
<bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>
</jaxws:endpoint>
<jaxws:endpoint xmlns:tns="http://service.shyroke.com/"
id="second" implementor="www.shyroke.com.SecondImpl" wsdlLocation="wsdl/secondimpl.wsdl">
<jaxws:features>
<bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>
</jaxws:endpoint>
</beans>
  • 注意:3. 修改 firstimpl.wsdl和secondimpl.wsdl文件中的端口号,不能和tomcat工程一致(本例中的tomcat端口号为8080)
  • firstimpl.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="FirstImplService" targetNamespace="http://com.shyroke.www/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.shyroke.www/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://service.shyroke.com/">
<wsdl:import namespace="http://service.shyroke.com/" location="IFirst.wsdl">
</wsdl:import>
<wsdl:binding name="FirstImplServiceSoapBinding" type="ns1:IFirst">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="add">
<soap12:operation soapAction="" style="document"/>
<wsdl:input name="add">
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output name="addResponse">
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="FirstImplService">
<wsdl:port name="FirstImplPort" binding="tns:FirstImplServiceSoapBinding">
<soap12:address location="http://localhost:8082/web_webService/services/FirstImplPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
  • secondimpl.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="SecondImplService" targetNamespace="http://com.shyroke.www/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://com.shyroke.www/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://service.shyroke.com/">
<wsdl:import namespace="http://service.shyroke.com/" location="ISecond.wsdl">
</wsdl:import>
<wsdl:binding name="SecondImplServiceSoapBinding" type="ns1:ISecond">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getSysTime">
<soap12:operation soapAction="" style="document"/>
<wsdl:input name="getSysTime">
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output name="getSysTimeResponse">
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SecondImplService">
<wsdl:port name="SecondImplPort" binding="tns:SecondImplServiceSoapBinding">
<soap12:address location="http://localhost:8081/web_webService/services/SecondImplPort"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
  • 2.4      启动服务

  • 查看web.xml ,可知webservice的端口url-pattern
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>web_webService</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description>Apache 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>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/cxf-beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>

  2.5  生成客户端

  • 用工具生成客户端(具体步骤查看前几章)

  2.6  测试

package www.chyroke.com.test;

import com.shyroke.service.IFirst;

import www.shyroke.client.FirstImplService;

public class TestkMain {
public static void main(String[] args) {
FirstImplService firstService=new FirstImplService();
IFirst iFirst=firstService.getFirstImplPort();
System.out.println("result==="+iFirst.add(5, 8));
}
}

结果:

  • 缺陷:虽然将webservice和web项目绑定在了一起,但是还是不能共同一个端口。

(十一)web服务与javaweb结合(2)的更多相关文章

  1. Java进阶(三十一) Web服务调用

    Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...

  2. (十)web服务与javaweb结合(1)

    一.解决方法 A . 编写一个监听器,在监听器中发布服务 二.案例一 方法A:编写一个监听器,在监听器中发布服务 1. 编写服务接口 package com.shyroke.service; impo ...

  3. (十二) web服务与javaweb结合(3)

    一.需求 上一章节虽然将webservice和web项目绑定在了一起,但是还是不能共同一个端口,本章讲解webservice和web项目绑定且共同端口. 二.案例 2.1 创建web工程,并引入依赖 ...

  4. JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码

    JavaWeb使用Filter进行字符编码过滤 预防web服务中文乱码 准备条件:一个创建好的 JavaWeb 项目 步骤: 1.创建一个类并实现 Filter 接口 import javax.ser ...

  5. 大规模web服务开发技术

    大规模web服务开发技术 总评        这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接 ...

  6. 上传文件服务与web服务分离

    业务场景:1. 后端服务为java web应用,使用tomcat容器,多实例集群化部署.2. 前端使用nginx作为后端应用的反向代理. 业务需求:现在需要在java web应用端上传文件,同时还要能 ...

  7. Web服务器之Nginx详解(操作部分)

    大纲 一.前言 二.Nginx 安装与配置 三.Nginx 配置文件详解 四.Nginx 命令参数 五.配置Nginx提供Web服务 六.配置Nginx的虚拟主机 七.配置Nginx的用户认证 八.配 ...

  8. HTTP协议基础与web服务的重定向,跳转以及请求转发

    JavaWeb中,HttpServletRequest与HttpServletResponse几乎是处理各种请求与操作必备的参数,与原始的ServletRequest/ServletResponse相 ...

  9. Nginx Web服务(一)

    一.Nginx原理介绍 1.1:什么是Nginx Nginx是一个开源的,支持高性能.高并发的WWW服务和代理服务软件 1.2:Nginx的功能特点及应用场合 ① 支持高并发:能支持几万并发连接,特别 ...

随机推荐

  1. Tomcat中配置URIEncoding="UTF-8"来处理中文的处理

    Tomcat中配置URIEncoding="UTF-8"来处理中文的处理 打开 server.xml 文件,更改两个地方. 配置一:添加 URIEncoding="UTF ...

  2. celery的介绍和在爬虫的中使用

    https://mp.weixin.qq.com/s/FzvZHQpF5mhV9t_HBzlcwg

  3. CV3——学习笔记-续

    使用Jupyter.https://jupyter.org/install https://baijiahao.baidu.com/s?id=1601883438842526311&wfr=s ...

  4. rand随机函数

    1.rand() rand()函数是使用线性同余法做的,它并不是真的随机数,因为其周期特别长,所以在一定范围内可以看成随机的. rand()函数不需要参数,它将会返回0到RAND_MAX之间的任意的整 ...

  5. mac安装 bcolz出现错误

    使用的是命令pip install bcolz c-blosc//snappy-stubs-:: fatal error: 'algorithm' file not found #include &l ...

  6. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_01-我的课程-需求分析与PageHelper技术

    1 我的课程 1.1需求分析 课程添加完成后可通过我的课程进入课程修改页面,此页面显示我的课程列表,如下图所示,可分页查询. 注意:由于课程图片服务器没有搭建,这里在测试时图片暂时无法显示. 上边的查 ...

  7. yml内容如何转map?

    yml内容如何转map   解决方法: Map map = null; Yaml yaml = new Yaml(); File ymlFile = new File("c:/src/tes ...

  8. (十一)使用Jconsole监控线程

    一.案例 监控线程情况,包括阻塞.死循环等 1.1 代码如下,下述代码共有三个线程,Main.mythread01.mythread02线程,其中mythread01线程为死循环.mythread02 ...

  9. (十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用

    一.JDBC相关概念介绍 1.1 JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这样,开发人员只需要学习 ...

  10. php-fpm优化参数介绍

    1.php-fpm优化参数介绍他们分别是:pm.pm.max_children.pm.start_servers.pm.min_spare_servers.pm.max_spare_servers. ...