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

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

1 简介

近几年来,SOA,EAI等架构体系的日渐成熟,Webservice越来越炽手可热,尤其是在企业做异质平台整合时成为了首选的技术。Java的Webservice技术更是层出不穷,比较流行的有:Axis2,XFire以及JaxWS。

JAXWS适合几乎所有Webservice客户端的调用,因此不少巨头型的厂商如:IBM,Weblogic等,在他们的产品上都使用了以JAXWS为标准的Webservice接口。

另外,由于实验室的项目目前采用JaxWS作为Wevservice框架,同时JaxWS也是目前最标准,需要额外第三方插件最少,配置最少最灵活的webservice,故对其进行研习。


2 案例驱动学习

编写查询员工信息的Web服务(员工信息存储在数据库中)。

第一个Web服务:输入员工号,返回该员工号的员工的基本信息,包括员工号、员工名称、所在部门、出生日期、职位、职称、入职日期等信息。

第二个Web服务:输入部门、职称,返回该部门具有该职称的所有员工的基本信息,员工基本信息与上面相同。分别针对上述两个Web服务,分别编写调用这两个Web服务的程序(或网页)。

要求在输入界面上输入待查询数据,调用Web服务,并将Web服务返回的员工信息查询结果显示到输出界面上。

数据库表:

属性 含义 数据类型
ID 员工号 Int(11)
name 员工名 Varchar(20)
dept 部门 Varchar(20)
title 职称 Varchar(20)
position 职位 Varchar(20)
birthday 出生日期 Varchar(20)
dateIn 入职日期 Varchar(20)

这样的web服务如何用jax-ws实现呢?


3 开发流程

我们使用JAX-WS开发WebService只需要很简单的几个步骤:写接口和实现=>发布=>生成客户端(测试或使用)。

而在开发阶段我们也不需要导入外部jar包,因为这些api都是现成的。首先是接口的编写(接口中只需要把类注明为@WebService,把要暴露给客户端的方法注明为@WebMethod即可,其余如@WebResult、@WebParam等都不是必要的,而客户端和服务端的通信用RPC和Message-Oriented)。

开发采用Eclipse Indigo和JDK6


4 服务端开发

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。

实现思路:

服务器端编写服务接口类、服务实现类、服务发布类,以及自定义复杂数据类型Userbean。服务器端通过调用API中的Endpoint.publish()方法发布服务,客户端通过service.getPort()方法提取服务端口,远程调用服务端的服务。服务器端和客户端传输数据采用的是复杂数据类型ArrayList,保存了Userbean类型的数据。

代码实现:

代码片1:服务接口设计
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即可

时间: 2024-10-10 17:18:47

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

基于jersey和Apache Tomcat构建Restful Web服务(一)

基于jersey和Apache Tomcat构建Restful Web服务(一) 现如今,RESTful架构已然成为了最流行的一种互联网软件架构,它结构清晰.符合标准.易于理解.扩展方便,所以得到越来越多网站的采用.那么问题来了,它是什么呢? 起源 REST(Representational state transfer)在 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一. REST 中最重要的概念是资源(resources

基于jersey和Apache Tomcat构建Restful Web服务(二)

基于jersey和Apache Tomcat构建Restful Web服务(二) 上篇博客介绍了REST以及Jersey并使用其搭建了一个简单的“Hello World”,那么本次呢,再来点有趣的东西,当然也是很简单了,仅仅是在路径中包含参数而已了.接下来开始动手实践吧. 在路径中包含参数 接下来就在上次的基础上进行改动即可,或者是再添加一个方法,随意了,这个方法主要就是在路径中加入输入的参数,并且根据参数的不同,它的返回值也不同,返回值为“Hello”+你输入的参数.这里用到了“PathPar

读书笔记--大规模web服务开发技术

总评   这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接地气. 书的内容不是很难,所以总的来说比较容易阅读,不需要特别累的啃,可想而知,不是非常深入的,更多的还是把作者的一些经验写出来,hatena这种量级的在国内应该是一个中型网站的水平,作者基本把这个量级web服务的运维的方方面面都讲了一遍,看完可以对这个这种量级网站有一个总体的了解,个人认为还是值得一读的. 逐章读书笔记: 第一章 大

大规模web服务开发技术 读书笔记之一

作为一个web开发的小白,本书对我还是很有指导意义的. 1. 本书讲解的内容 一开始本书就给出了讲述的内容 1. 什么是大规模web服务开发? 2. 面对大规模数据问题时,处理的基本思路和重点在那里? 例如cache缓存机制,大规模数据情况下数据库的运用方法. 3. 算法与数据结构的选择 4. 规模超出RDBMS处理能力时,如何处理? 上面的内容贯穿整本书,怎么强调都不为过. 2. web 服务的规模 多大才算大规模? 1. 百万级用户注册,millions, 独立用户(unique user)

简单web服务开发(JWS,CXF,AXIS)

(一)利用JWS开发web服务 开发Web服务器端: 1.定义接口HelloWorld,使用@WebService注解修饰接口名,使用@WebMethod修饰需要对外发布的方法. 2.HelloWorld接口实现类 3.发布类HelloWorldService 4.编译运行HelloWorldService 类之后查看WSDL文档http://localhost:8080/ HelloWorld?wsdl 客户端代码: 1.生成客户端所需要的文件 新建工程WebServerClient,进入工程

mysql数据库与web主机分离实验

真正企业中的网站,为保证数据的安全,数据库是与网站主机分离的,今天用这个实验研究下这个效果是如何实现的. 先上拓扑图: 配置过程: 一.WEB端: 安装Apache: tar -vxf httpd-2.2.27.tar.gz cd httpd-2.2.27 ./configure --prefix=/usr/local/apache2 make && make install 2. 安装PHP: tar vxf php-5.3.29.tar.bz2 cd php-5.3.29 ./conf

解决mysql数据库在web开发中的乱码问题

首先,出现的乱码的原因在于编码方式不统一,主要是mysql数据库的编码方式和web项目的编码方式,只有遵循了编码方式统一的原则,才能避免产生乱码问题. 通常项目中使用的都是UTF-8编码,因此,我们在新建数据库时,要设置默认编码方式为UTF-8,具体步骤如下: 一.Windows环境下的mysql配置: 进入mysql安装目录,找到my.ini或者是my-default.ini文件,在[mysqld]和[client]后面增加"default-character-set=utf8",设

三、自动化测试平台搭建-django-如何用mysql数据库做web项目

前景:django自带的数据库是sqlite3,这是一种轻量级数据库,一般用于手机中,web项目用的大多数还是mysql,这次做一个项目'图书-英雄'信息管理 1.在家目录下的Desktop创建一个文件夹,在这个文件夹下创建一个名为pytest1虚拟环境(第一篇已经说过怎么安装虚拟环境) (1)cd ~/Desktop (2)mkdir project_1 (3)mkvietualenv -p python3.5 pytest1  #创建虚拟环境 (4)workon pytest1 #进入虚拟环

如何在Ubuntu 14.04上利用jexus搭建支持php+mysql数据库的网站服务

准备部分:sudo apt-get update          sudo apt-get install unzip -y第一部分:安装jexus    在终端运行以下命令    cd /tmp    wget https://www.linuxdot.net/down/jexus-5.8.2-x64.tar.gz     tar -zxvf jexus-5.8.2-x64.tar.gz     sudo mv jexus /usr    sudo mkdir -p /var/www/def