我的第一次WebService接口开发教程 |
您所在的位置:网站首页 › webservice方法 › 我的第一次WebService接口开发教程 |
一、前言:
工作中,接触到很多系统要互相对接,因为大多数公司(项目)所用的平台不同,要想一方提供数据信息供对方提取,首先想到的就是开放出一个WebService接口调用文档和WebService地址,这样对方就能根据文档地址编程去调用。于是便在网上搜罗相关资料,尝试写一个WebService接口,非科班出身,仅供大家参考、指教。 二、WebService优点: 可远程调用(WebService可以向全世界提供信息,或提供某项功能,只要有网就OK)。 跨平台调用(WebService可以在Windows上调用linux上的WebService服务,反之同理)。 跨语言调用(WebService可以在Java语言中调用asp.net语言提供的WebService服务,反之其他编程语言同理) ...... 三、详细开发步骤: 1)使用JDK开发WebServiceWebService服务端 1.1首先我们先创建一个java项目,目录及Util工具类和所应用的包:这里我用的是 C3p0 JDBC连接池方式我给大家提供MySql和oracle工具类,代码如下: MySql: package Util; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtil2 { static ComboPooledDataSource dataSource = null; static{ dataSource = new ComboPooledDataSource(); } public static DataSource getDataSource(){ return dataSource; } /** * 获取连接对象 * @return * @throws SQLException */ public static Connection getConn() throws SQLException{ return dataSource.getConnection(); } /** * 释放资源 * @param conn * @param st * @param rs */ public static void release(Connection conn , Statement st , ResultSet rs){ closeRs(rs); closeSt(st); closeConn(conn); } public static void release(Connection conn , Statement st){ closeSt(st); closeConn(conn); } private static void closeRs(ResultSet rs){ try { if(rs != null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null; } } private static void closeSt(Statement st){ try { if(st != null){ st.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ st = null; } } private static void closeConn(Connection conn){ try { if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } } public static void main(String[] args) throws Exception{ System.out.println(getConn()); System.out.println("---------------------------南清风工具类测试-------------------------------"); System.out.println("+++++++++++++++++++MySql Connection Successful!+++++++++++++++++++++"); System.out.println("---------------------------------------------------------------------"); } }Oracle: package Util; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtil { private static ComboPooledDataSource ds = new ComboPooledDataSource(); private static ThreadLocal tl=new ThreadLocal(); /** * 从线程中获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { //从线程中获取conneciton Connection conn = tl.get(); if(conn==null){ conn=ds.getConnection(); //和当前线程绑定 tl.set(conn); } return conn; } // 获取数据源 public static DataSource getDataSource() { return ds; } // 释放资源 public static void closeResource( Statement st, ResultSet rs) { closeResultSet(rs); closeStatement(st); } // 释放资源 public static void closeResource(Connection conn, Statement st, ResultSet rs) { closeResource(st, rs); closeConn(conn); } // 释放 connection public static void closeConn(Connection conn) { if (conn != null) { try { conn.close(); //和线程解绑 tl.remove(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } // 释放 statement ctrl + shift + f 格式化代码 public static void closeStatement(Statement st) { if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } st = null; } } // 释放结果集 public static void closeResultSet(ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; } } //开启事务 public static void startTransaction() throws SQLException{ getConnection().setAutoCommit(false); } /** * 事务提交且释放连接 */ public static void commitAndClose(){ Connection conn = null; try { conn=getConnection(); //事务提交 conn.commit(); //关闭资源 conn.close(); //解除版定 tl.remove(); } catch (SQLException e) { e.printStackTrace(); } } /** * 事务回滚且释放资源 */ public static void rollbackAndClose(){ Connection conn = null; try { conn=getConnection(); //事务回滚 conn.rollback(); //关闭资源 conn.close(); //解除版定 tl.remove(); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception{ System.out.println(getConnection()); System.out.println("---------------------------南清风工具类测试-------------------------------"); System.out.println("+++++++++++++++++++Oracle Connection Successful!+++++++++++++++++++++"); System.out.println("---------------------------------------------------------------------"); } } 1.2我们现在需要写一个接口类、封装对象类、实现类和拦截器,代码如下:接口类: package Dao; import java.sql.SQLException; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface fwsyq { @WebMethod() String Get_fwsyq( @WebParam(name="cxtj",targetNamespace = "http://Dao.Get_fwsyq_impl.Get_fwsyq")String cxtj, @WebParam(name="cxnr",targetNamespace = "http://Dao.Get_fwsyq_impl.Get_fwsyq")String cxnr) throws SQLException; }Bean封装类: package Bean; public class fwsyq_table2 { private int id; private String SLID; private String DJYY; private String DYH; private String QLR; private String BH; private String ZH; private float JZMJ; private String FDZL; private String XZ; private String DJSJ; private String djbzt; public fwsyq_table2() { super(); } public fwsyq_table2(int id, String sLID, String dJYY, String dYH, String qLR, String bH, String zH, float jZMJ, String fDZL, String xZ, String dJSJ, String djbzt) { this.id = id; SLID = sLID; DJYY = dJYY; DYH = dYH; QLR = qLR; BH = bH; ZH = zH; JZMJ = jZMJ; FDZL = fDZL; XZ = xZ; DJSJ = dJSJ; this.djbzt = djbzt; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSLID() { return SLID; } public void setSLID(String sLID) { SLID = sLID; } public String getDJYY() { return DJYY; } public void setDJYY(String dJYY) { DJYY = dJYY; } public String getDYH() { return DYH; } public void setDYH(String dYH) { DYH = dYH; } public String getQLR() { return QLR; } public void setQLR(String qLR) { QLR = qLR; } public String getBH() { return BH; } public void setBH(String bH) { BH = bH; } public String getZH() { return ZH; } public void setZH(String zH) { ZH = zH; } public float getJZMJ() { return JZMJ; } public void setJZMJ(float jZMJ) { JZMJ = jZMJ; } public String getFDZL() { return FDZL; } public void setFDZL(String fDZL) { FDZL = fDZL; } public String getXZ() { return XZ; } public void setXZ(String xZ) { XZ = xZ; } public String getDJSJ() { return DJSJ; } public void setDJSJ(String dJSJ) { DJSJ = dJSJ; } public String getDjbzt() { return djbzt; } public void setDjbzt(String djbzt) { this.djbzt = djbzt; } @Override public String toString() { return "fwsyq_table2 [id=" + id + ", SLID=" + SLID + ", DJYY=" + DJYY + ", DYH=" + DYH + ", QLR=" + QLR + ", BH=" + BH + ", ZH=" + ZH + ", JZMJ=" + JZMJ + ", FDZL=" + FDZL + ", XZ=" + XZ + ", DJSJ=" + DJSJ + ", djbzt=" + djbzt + "]"; } }接口实现类: package Dao; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import Bean.fwsyq_table; import Util.JDBCUtil2; import net.sf.json.JSONArray; public class Get_fwsyq_impl implements fwsyq { @Override public String Get_fwsyq(String cxtj, String cxnr) { try { QueryRunner qr = new QueryRunner(JDBCUtil2.getDataSource());if(cxtj!=null && cxnr!=null){ String sql="select id,slid,djyy,dyh,qlr,bh,zh,jzmj,fdzl,xz,djsj,djbzt from bqh_fq1 where "+cxtj+"="+"'"+cxnr+"'" +"order by id"; String sql1="select count(*) from bqh_fq1 where "+cxtj+"="+"'"+cxnr+"'"; List data = qr.query(sql, new BeanListHandler(fwsyq_table.class)); Long total=(Long) qr.query(sql1, new ScalarHandler()); //统计查询总数 System.out.println("来自客户端接口访问:查询成功!"); int count=total.intValue(); int code=0; String msg="\"查询成功\""; String json1="{\"code\":"+code+",\"msg\":"+msg+",\"count\":"+count+",\"data\":"+JSONArray.fromObject(data).toString()+"}"; System.out.println(json1); return json1; }else { List data =null; System.out.println("来自客户端接口访问:查询失败!"); int code=4; int count=0; String msg="\"查询失败\""; String json1="{\"code\":"+code+",\"msg\":"+msg+",\"count\":"+count+",\"data\":"+JSONArray.fromObject(data).toString()+"}"; return json1; } } catch (Exception e) { e.printStackTrace(); } return null; } } 1.3使用Endpoint类发布WebService package Publish_interface; import javax.xml.ws.Endpoint; import Dao.Get_fwsyq_impl; public class Get_FWSYQ { public static void main(String[] args){ //发布接口地址 String address="http://192.168.0.188:9999/BDBDCDJ/Get_fwsyq"; //jdk方法实现 Endpoint.publish(address, new Get_fwsyq_impl()); System.out.println("Published successfully!"); } } 1.4启动main方法运行这个类,打印出结果Published successfully,表示服务发布成功:WSDL结构描述: OK,这样一个简单的WebService接口就OK了。 2)使用CXF开发WebServicecxf是java开发webService的一种实现框架技术。目前,cxf是主流的webService实现框架。 2.1使用cxf开发需引入cxf开发jar包Jetty是一个内嵌的web服务器,使用JaxWsServerFactoryBean类创建工厂设置接口地址、接口类、接口实现类,创建即可发布。所以我们得引入jetty包,作为WebService发布的Server。
上边验证拦截器是否生效,下边正常填写参数,成功返回查询结果: 通过wsimport命令生成客户端代码(通过cmd进入到当前项目的src路径下,wsimport.exe命令在jdk的bin目录下) 第一种方式【远程地址】wsimport -s . 接口地址(加?wsdl) 第二种方式【xml文件】wsimport -s . 文件路径(文件路径后面不需要加?wsdl)wsimport -s . http://192.168.0.188:9999/BDBDCDJ/Get_fwsyq?wsdl 我们在看一下客户端项目:刷新一下如下: Client console:
server console:: OK!一个基本的接口开发过程到此结束。
参考地址: WebService几个常见的异常 CXF报安全性错误 Cannot create a secure XMLInputFactory WebService-JDK的wsimport命令和cxf的wsdl2java命令的区别和使用 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |