WebService 2

来源:互联网 发布:游戏开发行业前景知乎 编辑:程序博客网 时间:2024/05/16 15:54

一.回顾

soap :简单对象访问协议 http+xml
Soa :面向服务的架构,它是一种思想

二.带接口webservice发布

1.service接口@WebService

@WebServicepublic interface JobService {    public String getJob();}

2serviceImpl@WebService(endpointInterface=”com.kinth.service”)

@WebService(endpointInterface="com.kinth.JobService")//设置服务端点接口 ,指定对外提供服务的接口public class JobServiceImpl implements JobService {    @Override    public String getJob() {        return "JEE研发工程师|Android研发工程师|数据库工程师|前端工程师|测试工程师|运维工程师";    }    public void say(){        System.out.println("早上好!");    }}

3main中Endpoint.publish(address, jobService);

public static void main(String[] args) {        JobService jobService=new JobServiceImpl();        String address="http://192.168.0.199:9999/jobservice";        Endpoint.publish(address, jobService);        System.out.println("wsdl地址:"+address+"?WSDL");    }

可以给下载的类打成jar包,类似linux:
jar cvf jobService.jar ./cn
测试:导入工程,新建服务,获取访问方式,获取方法,输出

三、 jsp+ajax+servlet+webservice 远程访问天气预报服务

step:
1. 了解第三方天气预报webservice服务
广东 广州 东莞 深圳, 温度信息
2. wsimport 生成本地代理
3. 准备一个index.jsp 页面,显示城市信息 ,下拉城市,显示天气信息

<body>    <select id="province">        <option value="31124">广东省</option>    </select>    <select id="city">        <option value="2350">广州</option>        <option value="2419">深圳</option>        <option value="2351">东莞</option>    </select>    <hr />    <span>XXXX</span>    <script type="text/javascript">        $("#city").change(function() {            var city = $("#city option:selected").val();            $.post("weatherServlet", {                "city" : city            }, function(backdata) {                $("span").text(backdata).css("color", "blue");            });        });    </script></body>

4 准备一个weatherServlet ,通过它来访问webservcie
servlet:init一个服务,setCharacterEncoding,获取访问方式和方法,获取ajax过来的城市信息入参,printWriter写回去,ajax发送请求返回值取得值,写回去。
5.servlet注册

四.cxf框架发布webservice

1.cxf:为BUS,类似于Spring的 ApplicationContext,内置jetty。
2.cxf支持注解方式发布,可显示webservice服务列表。
可添加拦截器,输入输出拦截器,用户权限验证拦截器

       1. ServerFactoryBean         - 不设置注解也可以发布webservice服务, 不支持注解         - 不支持拦截器的添加       2. JaxWsServerFactoryBean         - 支持注解         - 可以添加拦截器       3. webservice 访问流程:         1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手         2. 通过soap协议实现通信 ,采用post请求 , 数据封装在满足soap规约的xml中         3. 返回数据 同样采用的是soap通信,  数据封装在满足soap规约的xml中

发布:添加Jar,此时impl不用Enpoint注解

LanguageService languageService=new LanguageServiceImpl();        JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();        //Endpoint :地址  , 实现对象bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");        bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口        bean.setServiceBean(languageService);//服务的实现bean        //添加输入拦截器  :输入显示日志信息的拦截器        bean.getInInterceptors().add(new LoggingInInterceptor());        //添加输出拦截器  :输出显示日志信息的拦截器        bean.getOutInterceptors().add(new LoggingOutInterceptor());        bean.create();//创建,发布webservice

五.CXF+Spring发布WebService

step:
1. 添加cxf.jar ,spring.jar,servlet.jar
2. 编写业务类,通过CXF来发布webservice
员工管理:
方法 :添加员工、查询员工
bean:Employee
业务类:

@WebService(serviceName="EmployeeService")public interface EmployeeManager {    public abstract void add(@WebParam(name="employee")Employee employee);    public abstract @WebResult(name="employees")List<Employee> query();}

业务实现类:

public class EmployeeManagerImpl implements EmployeeManager {    private List<Employee> employees=new ArrayList<>();    @Override    public void add(Employee employee){        //添加到集合中        employees.add(employee);    }    @Override    public List<Employee> query(){        return employees;    }}

3添加一个CXF请求的 Servlet,用来处理webservice的请求
过滤的地址/ws/*

4.配置Spring的配置文件: applicationContext.xml ,把cxf的bean在spring配置
添加命名空间约束

<bean id="employeeManagerImpl" class="com.kinth.EmployeeManagerImpl"></bean>    <!-- 配置cxf 地址: http://192.168.0.199:8080/CXF_Server/ws/employeeManager         组成 : http://192.168.0.199:808 +CXF_Server( 项目名)+ws(过滤的路径)+/employeeManager(自定义部分)         服务类 : 服务的实现类: 拦截器 -->    <jaxws:server address="/employeeManager" serviceClass="cn.it.ws.cxf.b.EmployeeManager">        <jaxws:serviceBean>            <ref bean="employeeManagerImpl" />        </jaxws:serviceBean>        <!-- 配置输入显示日志信息的拦截器 -->        <jaxws:inInterceptors>            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>        </jaxws:inInterceptors>        <jaxws:outInterceptors>            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>        </jaxws:outInterceptors>    </jaxws:server>

5.在web.xml中配置 CXF的 Servlet , 添加spring的监听

  <!-- 添加 CXF 的Servlet ,处理 webservice的请求 -->    <servlet>        <servlet-name>cxf</servlet-name>        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>        <load-on-startup>0</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>cxf</servlet-name>        <url-pattern>/ws/*</url-pattern>    </servlet-mapping>
  1. 通过wsimport生成本地代理 ,访问webservice

六.WebService测试:eclipse launch web servcie explorer

可看请求的客户端和服务端输出,免每次wsimport

原创粉丝点击