当前位置:Gxlcms > 数据库问题 > 基于Jax-WS和Mysql数据库的WEB服务开发

基于Jax-WS和Mysql数据库的WEB服务开发

时间:2021-07-01 10:21:17 帮助过:3人阅读

:服务接口设计 package webservice; import java.sql.SQLException; import java.util.ArrayList; import javax.jws.WebMethod; import javax.jws.WebService; /** * @author 孟政宇 * @Time 2016-6-10 22:23:29 * 接口 声明方法 */ @WebService public interface WebServiceI { // 使用@WebMethod注解标注WebServiceI接口中的方法 @WebMethod ArrayList<Userbean> getInfoByID(int ID) throws Exception; //web服务1 @WebMethod ArrayList<Userbean> getInfoByDD(String Dept,String rank) throws Exception; //web服务2 @WebMethod String soa(String name); //测试 @WebMethod boolean sayHello(String name); //测试 }
代码片2:服务接口实现

package webservice;

import java.io.IOException;
import java.lang.reflect.Array;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebService;

import cn.edu.neu.dinner.app.WMMP.factory.MinaClient;
import cn.edu.neu.dinner.app.WMMP.factory.NotifyObject;
import cn.edu.neu.dinner.app.WMMP.factory.TransObject;

/**
 * @author 孟政宇 SEI的具体实现 Service endpoint interface
 */
// 使用@WebService注解标注WebServiceI接口的实现类WebServiceImpl

@WebService
public class ServiceDemoImpl implements WebServiceI {

    @Override
    public String soa(String name) {
        System.out.println("测试调用");
        return ("你的名字:" + name);
    }

    @Override
    public ArrayList<Userbean> getInfoByID(int id) throws Exception {
        // 通过ID查询
        System.out.println("调用方法成功yeah!");
        Class.forName("com.mysql.jdbc.Driver");
        java.sql.Connection conn = DriverManager
            .getConnection("jdbc:mysql://localhost:3306/soa?user=root&password=123456");
        java.sql.Statement sql = conn.createStatement();
        StringBuffer sb = new StringBuffer();
        sb.append("SELECT *");
        sb.append(" FROM  ");
        sb.append(" user ");
        sb.append(" WHERE ID =");
        java.sql.ResultSet rs = sql
                .executeQuery(sb.toString() + "‘" + id + "‘");
        ArrayList<Userbean> list = new ArrayList<Userbean>();
        Userbean ub = new Userbean();
        while (rs.next()) {
            ub.setId(rs.getString(1));
            ub.setName(rs.getString(2));
            ub.setDept(rs.getString(3));
            ub.setBirthday(rs.getString(4));
            ub.setLocation(rs.getString(5));
            ub.setRank(rs.getString(6));
            ub.setDateIn(rs.getString(7));
            list.add(ub);
        }
        return list;
    }

    @Override
    public ArrayList<Userbean> getInfoByDD(String Dept, String rank) throws Exception  {
        // 联合查询
                System.out.println("调用方法成功yeah!");
                Class.forName("com.mysql.jdbc.Driver");
                java.sql.Connection conn = DriverManager
                        .getConnection("jdbc:mysql://localhost:3306/soa?user=root&password=123456");
                java.sql.Statement sql = conn.createStatement();
                StringBuffer sb = new StringBuffer();
                sb.append("SELECT *");
                sb.append(" FROM  ");
                sb.append(" user ");
                sb.append(" WHERE  dept=");
                java.sql.ResultSet rs = sql
                        .executeQuery(sb.toString() + "‘" + Dept + "‘"+ "and rank=" +"‘"+rank+"‘");  
                ArrayList<Userbean> list = new ArrayList<Userbean>();
                while (rs.next()) {
                    Userbean ub = new Userbean();
                    ub.setId(rs.getString(1));
                    ub.setName(rs.getString(2));
                    ub.setDept(rs.getString(3));
                    ub.setBirthday(rs.getString(4));
                    ub.setLocation(rs.getString(5));
                    ub.setRank(rs.getString(6));
                    ub.setDateIn(rs.getString(7));
                    list.add(ub);
                }
                return list;
    }

    @Override
    public boolean sayHello(String name) {

        System.out.println("WebService sayHello " + name);
        return true;

    }
代码片3:自定义复杂类型(必须实现序列化)

package webservice;

import java.io.*;
public class Userbean implements Serializable{
    private String id;
    private String name;
    private String dept;
    private String birthday;
    private String location;
    private String rank;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDept() {
        return dept;
    }
    public void setDept(String dept) {
        this.dept = dept;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public String getRank() {
        return rank;
    }
    public void setRank(String rank) {
        this.rank = rank;
    }
    public String getDateIn() {
        return dateIn;
    }
    public void setDateIn(String dateIn) {
        this.dateIn = dateIn;
    }
    private String dateIn;
}
代码片4:服务发布类

package webservice;

import javax.xml.ws.BindingType;
import javax.xml.ws.Endpoint;

/**
 * @author 孟政宇
 *
 * 发布Web Service
 */
@BindingType("http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/")
public class WebServicePublish {
    public static void main(String[] args) {
        //定义WebService的发布地址,这个地址就是提供给外界访问Webervice的URL地址,URL地址格式为:http://ip:端口号/xxxx
        String address = "http://127.0.0.1:8989/hdfs/webservice";
        //使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用
        /**
         *参数1:服务的发布地址 
         *参数2:服务的实现者
         */
        Endpoint.publish(address , new ServiceDemoImpl());
        System.out.println("发布webservice成功!");
    }
}

技术分享


5 客户端开发

实现思路:
为了验证服务端是否发布成功,我们可以采用三种方式来验证。
一.采用jdk自带工具wsimport来生成客户端,并编写客户端程序测试。
二.使用诸如MyEclipse(Eclipse for Jave EE也可以)创建一个Web Service Client的项目
三.本地编程实现,这里我采用编程实现。即编写client类,由于服务已经发布,故可以通过指定服务的URI和服务类对象,创建service对象调用getPort方法访问服务端口,并调用远端服务。

实现代码:

//服务器起来后,调用服务
//在客户端需要将wsimport导出的文件夹和Userbean考到客户端目录,且不能
//更改文件名
package webservice;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Scanner;


public class client {
    public static void main(String[] args) throws Exception_Exception, MalformedURLException  {
        URL url = new URL("http://127.0.0.1:8989/hdfs/webservice?wsdl");
        // 第一个参数是服务的URI
        // 第二个参数是在WSDL发布的服务名
        QName qname = new QName("http://webservice/","ServiceDemoImplService");
        // 创建服务
        Service service = Service.create(url, qname);
        ServiceDemoImpl sd = service.getPort(ServiceDemoImpl.class);

        System.out.println("**********************web服务1测试**********************");
        System.out.println("根据ID查询信息,请输入ID编号:");
        Scanner scanner=new Scanner(System.in);
        String ID=scanner.nextLine();
        ArrayList<Userbean> list = new ArrayList<Userbean>();
        list  = (ArrayList<Userbean>)sd.getInfoByID(ID);

        System.out.println("查询结果:");
        for(int i=0 ; i< list.size() ; i++){
            System.out.print("员工号:" + list.get(i).getId() + "     ");
            System.out.print("员工名称:" + list.get(i).getName() + "     ");
            System.out.print("所在部门:" + list.get(i).getDept() + "     ");
            System.out.println("出生日期:" + list.get(i).getBirthday() + "     ");
            System.out.print("职位:" + list.get(i).getLocation() + "     ");
            System.out.print("职称:" + list.get(i).getRank() + "     ");
            System.out.println("入职日期:" + list.get(i).getDateIn() + "     ");
        }
        System.out.println("**********************web服务1测试**********************");

//      System.out.println("**********************web服务2测试**********************");
//      System.out.println("根据部门、职称查询信息,请输入参数:");
//      Scanner scanner=new Scanner(System.in);
//      String dept=scanner.nextLine();
//      String rank=scanner.nextLine();
//      ArrayList<Userbean> list = new ArrayList<Userbean>();
//      list  = (ArrayList<Userbean>)sd.getInfoByDD(dept,rank);
//      
//      System.out.println("查询结果:");
//      for(int i=0 ; i< list.size() ; i++){
//          System.out.print("员工号:" + list.get(i).getId() + "     ");
//          System.out.print("员工名称:" + list.get(i).getName() + "     ");
//          System.out.print("所在部门:" + list.get(i).getDept() + "     ");
//          System.out.println("出生日期:" + list.get(i).getBirthday() + "     ");
//          System.out.print("职位:" + list.get(i).getLocation() + "     ");
//          System.out.print("职称:" + list.get(i).getRank() + "     ");
//          System.out.println("入职日期:" + list.get(i).getDateIn() + "     ");
//      }
//      System.out.println("**********************web服务2测试**********************");
//  
//  }
}}

结果展示:
Web服务1测试:客户端通过输入员工的ID编号,传递参数到服务端,服务端调用服务getInfoByID并返回一个ArrayList类型的参数,客户端获取参数解析并显示,如图所示。
技术分享
Web服务2测试:客户端通过输入员工的部门和职称两个参数,服务端调用服务getInfoByDD,并返回一个ArrayList类型的参数,客户端获取参数解析并显示,如图所示。
技术分享

6 遇到的问题

问题:服务器向客户端传递的list为object无法解析为自定义的Userbean
解决方法:采用序列化的方式,在自定义的Javabean类实现Serializable即可

基于Jax-WS和Mysql数据库的WEB服务开发

标签:

人气教程排行