利用jws发布一个查询员工信息的Web服务(员工信息存储在数据库中)

这是《基于服务的软件系统》的课程设计:

一.作业要求

编写查询员工信息的Web服务(员工信息存储在数据库中)。第一个Web服务:输入员工号,返回该员工号的员工的基本信息,包括员工号、员工名称、所在部门、出生日期、职位、职称、入职日期等信息。第二个Web服务:输入部门、职称,返回该部门具有该职称的所有员工的基本信息,员工基本信息与上面相同。分别针对上述两个Web服务,分别编写调用这两个Web服务的程序(或网页)。要求在输入界面上输入待查询数据,调用Web服务,并将Web服务返回的员工信息查询结果显示到输出界面上。


二.JAVA发布Web服务的发展

目前自己只是简单了解了下Axis、xfire、axis2、cxf、jws、jax-rs这6项技术,其中Axis是较老的框架,从ppt的文档中也可看出进行开发需要的配置过程会很繁琐。Axis2是axis的升级版本,速度有显著提高,内存占用低,同时保留通过各种方式扩展功能的空间。Xfire和axis2地位相似,是新一代的web框架,但用XFire 进行WebService 的开发比Axis2 简单很多。CXF 更注重开发人员的工效(ergonomics )和嵌入能力(embeddability )。大多数配置都可以API 来完成,替代了比较繁琐的XML 配置文件, 用Spring 的会比较常用cxf。JAX-WS规范是一组XML web services的JAVA API,JAX-WS是使用RPC模式 来实现自己的web services,而jax-rs是用表述性状态转移(REST)架构风格创建Web服务,不同于RPC,是一种新的远程通信架构。目前jws用的较多,应用所杨老师的一个系统用的就是jws框架。


三.查询员工信息的Web服务-JWS

3.1 数据库设计

根据要求,设计员工信息staff表。

属性数据类型
staffID员工号Int(4)
staffName员工名Varchar(20)
Department部门Varchar(20)
Title职称Vachar(20)
Position职位Vachar(20)
Birth出生日期Datatime
Jionday入职日期Datatime

数据库名称为company,表的名称为staff,表的内容:
这里写图片描述


3.2 发布Web服务以及客户端远程调用服务

JAVA JDK1.6中JAX-WS规范定义了如何发布一个WebService服务。与Web服务相关的类都位于Javax.jws.*包中。其中:
@WebService——此注解用在类上指定将此类发布成一个WebService。targetNamespace属性定义了自己的命名空间,serviceName则定义了< definitions >标签和标签的name属性。
EndPoint——此类为端点服务类,其中publish()方法用于将一个已经添加了@WebService注解的Web服务(类)绑定到一个地址的端口上,用于发布。
@WebMethod定义Web Service运作的方法。
@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT。

然后在客户端,通过Service.getPort()方法提取服务端口,远程调用服务中运作的方法。框架图:
这里写图片描述

由于两个web服务功能相近,操作相似,不同点在于调用服务的参数不同。这里详细介绍根据员工ID号查询员工基本信息的服务。根据部门和职称查询员工信息的服务会给出必要的截图,并在附件中给出源代码。
客户端调用远程服务流程图:
这里写图片描述

流程图说明:
1)定义类sqlserverImpl,按要求实现查询数据库的服务,本地实现用于测试。
2)将类用@webservice注释,标明将该类暴露为webservice,供远程调用
3)用端点类Endpoint的publish()方法,定义好发布服务的URL,指定发布地址以及端口号,发布web服务。
4)在浏览器输入自己发布的web服务wsdl地址,(http://localhost:10101/myweb?wsdl),如果显示如图4.4,说明服务发布成功
这里写图片描述
5)在客户端创建service对象,通过getport()方法远程访问服务端口
6)调用远程服务readsql(),在客户端返回结果。

执行结果:输入员工号1001,显示如图:
这里写图片描述


四.分析总结
本次课程作业,对SBS中soap、wsdl、uddi有了深刻了解。掌握了java发布web服务的几种方式。总结如下:
1)SOAP,作为传输层,是Web services 的通信协议。用来在消费者和服务提供者之间传送消息。SOAP是一种基于XML 的机制,用于在网络应用程序之间进行结构化数据交换。SOAP中会指定服务端调用的方法,已经调用的参数等。
2)WSDL用来描述服务。它是一个XML 文档,实现SOAP协议,把它写成可供电脑识别的文件,描述了web服务的三个属性:(1)服务所提供的操作(2)如何访问服务(3)服务位于何处(通过 URL 来确定)。
3)UDDI用来注册和查找服务。它就是一个目录,只不过在这个目录中存放的是一些关于 Web 服务的信息而已,用户可以在这个目录中查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务(这个过程叫把web服务请求者和合适的web服务绑定)。

另外Java类若想发布为Web Service需要注意以下几点:这个类必须是public类;这些类不能是final的或者abstract;这个类必须有一个公共的默认构造函数;这个类不能有finalize()方法。

六.附件
6.1 服务一的代码:
代码1:接口

package myweb.service;
    import javax.jws.WebService;
    import javax.jws.WebMethod;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.Style;
    @WebService
    @SOAPBinding(style=Style.RPC)
    public interface SqlServer {
        @WebMethod
        void readSql(int ID);
    }

代码2:实现接口的类,重写其中的方法。

package myweb.service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.util.Date;
import java.util.Scanner;

import javax.jws.WebService;

/*
  @WebService - 它是一个注解,用在类上指定将此类发布成一个ws. 
    Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
    */
@WebService(endpointInterface = "myweb.service.SqlServer")
public class SqlServerImpl implements SqlServer {

    public String readSql(int ID){
        String url="jdbc:mysql://localhost:3306/company";
        String user="root";
        String password="";//没有密码
        String sqll="select * from staff where staffID=";
        //String staff="";
        //System.out.println("11");
        String fanhui="";
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            Connection connection;
            connection = DriverManager.getConnection(url,user,password);
            System.out.println("数据库连接成功");
            Statement statement =connection.createStatement();
            ResultSet result=statement.executeQuery(sqll+ID);

            while(result.next()){
                String staffID=result.getString("staffID");
                String staffName=result.getString("staffName");
                String department=result.getString("department");
                String title=result.getString("title");
                String position=result.getString("position");
                String birth=result.getString("birth");
                String joinDay=result.getString("joinDay");
                //staff=staffID+staffName;
                fanhui=staffID+"        "+staffName+"   "+department+"      "+title+"       "+position+"    "+" "+birth+"       "+joinDay;
                //System.out.println(staffID+"      "+staffName+"   "+department+"      "+title+"       "+position+"    "+" "+birth+"       "+joinDay);
            }
            if(result!=null){result.close();result=null;}
            if(statement!=null){statement.close();statement=null;}
            if(connection!=null){connection.close();connection=null;}


        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        return  fanhui;
    }

代码3:发布服务

package myweb.service;
import javax.xml.ws.Endpoint;
public class SqlServerPublisher {
    public static void main(String[] args){
        // 第一个参数是发布的URL
        // 第二个参数是服务的实现
        Endpoint.publish("http://127.0.0.1:10101/myweb", new SqlServerImpl());
    }
}

代码4:客户端调用服务

package myweb.client;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
import java.util.Scanner;

import myweb.service.*;

public class SqlClient {
    public static void main(String[] args) throws Exception{
        URL url = new URL("http://localhost:10103/myweb?wsdl");
        // 第一个参数是服务的URI
        // 第二个参数是在WSDL发布的服务名
        QName qname = new QName("http://service.myweb/","SqlServerImplService");
        // 创建服务
        Service service = Service.create(url, qname);
        // 提取端点接口,服务“端口”。
        SqlServer eif = service.getPort(SqlServer.class);

        System.out.println("请输入员工ID号:");
        Scanner scanner=new Scanner(System.in);
        int ID=scanner.nextInt();
        System.out.println("staffID  staffName    department    title    position    birth    joinDay");
        System.out.println(eif.readSql(ID));

    }
}

6.2 第二个服务-根据department和title查询用户title。

1) 服务端查询数据库代码及截图:服务实现部分只有黄色加注不同于服务一,其余相同。

package myweb.service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.util.Date;
import java.util.Scanner;

import javax.jws.WebService;

/*
  @WebService - 它是一个注解,用在类上指定将此类发布成一个ws. 
    Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
    */
@WebService(endpointInterface = "myweb.service.SqlServer")
public class SqlServerImpl implements SqlServer {
public String readSql2(String depar, String tit){
        String url="jdbc:mysql://localhost:3306/company";
        String user="root";
        String password="";//没有密码
        String fanhui2="";
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            Connection connection;
            connection = DriverManager.getConnection(url,user,password);
            System.out.println("数据库连接成功");
            Statement statement =connection.createStatement();
            String temp = "select * from staff where department  = '"+depar+"' and title = '"+tit+"'";
            ResultSet result=statement.executeQuery(temp);

            while(result.next()){
                String staffID=result.getString("staffID");
                String staffName=result.getString("staffName");
                String department=result.getString("department");
                String title=result.getString("title");
                String position=result.getString("position");
                String birth=result.getString("birth");
                String joinDay=result.getString("joinDay");
                fanhui2=staffID+"       "+staffName+"   "+department+"      "+title+"       "+position+"    "+" "+birth+"       "+joinDay;
                //return fanhui2;
                //System.out.println(staffID+"      "+staffName+"   "+department+"      "+title+"       "+position+"    "+" "+birth+"       "+joinDay);
            }
            if(result!=null){result.close();result=null;}
            if(statement!=null){statement.close();statement=null;}
            if(connection!=null){connection.close();connection=null;}


        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        return fanhui2;
    }

}

这里写图片描述

2) 发布服务,端口号从新选择为10103:

package myweb.service;
import javax.xml.ws.Endpoint;
public class SqlServerPublisher {
    public static void main(String[] args){
        // 第一个参数是发布的URL
        // 第二个参数是SIB实现,10103是服务绑定的地址端口号。
        Endpoint.publish("http://127.0.0.1:10103/myweb", new SqlServerImpl());
    }
}

3) 服务二的wsdl截图如下:
这里写图片描述
4)客户端代码:

package myweb.client;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
import java.util.Scanner;

import myweb.service.*;

public class SqlClient {
    public static void main(String[] args) throws Exception{
        URL url = new URL("http://localhost:10103/myweb?wsdl");
        // 第一个参数是服务的URI
        // 第二个参数是在WSDL发布的服务名
        QName qname = new QName("http://service.myweb/","SqlServerImplService");
        // 创建服务
        Service service = Service.create(url, qname);
        // 提取端点接口,服务“端口”。
        SqlServer eif = service.getPort(SqlServer.class);

        System.out.println("请输入员工department:");
        Scanner scanner=new Scanner(System.in);
        String depart=scanner.nextLine();
        System.out.println("请输入员工title:");
        String tit=scanner.nextLine();
        System.out.println("staffID  staffName    department    title    position    birth    joinDay");
        //System.out.println(eif.readSql(ID));
        //Scanner scanner=new Scanner(System.in);
        //String dep=scanner.nextLine();
        //String tit=scanner.nextLine();
        System.out.println(eif.readSql2(depart, tit));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值