XFire创建WebService服务端和客户端

WebService 接口在java中的开发

 接口化自己的程序方法可以将自己的实现类进行一定程度的封装,只提供接口方法给其它程序,如果其它程序需要调用这个接口,它不再需要关心具体的实现,数据的如何处理,而且,这也更加体现了分布式应用程序的好处。比如我有一个程序作为整个系统多个项目的数据处理中心,为不同的项目提供数据服务,即所有的项目都是建立在这个基础上的,而且,其它的项目不再进行数据处理服务,只是负责页面和业务逻辑,有效地将数据彻底和业务分开,而且,它还没有数据库和相关环境的依赖。这样开发的优点就不言而喻了。实际上,这样做对数据的安全也有一定的保障。 

     接着谈谈WebService 。

     WebService在当下,它是开发分布式的互操作的应用程序不可缺少的一部分。Web服务,能够使部署在不同平台上的不同语言开发的不同的应用在不需要借助第三方的基础上进行数据的交互和系统的集成。而WebService的基础特点就是开放性,刚才已经体现出来了。要使用WebService,就必须得会用两种技术,分别是XML和SOAP。XML无疑是在web中传输结构化数据的一种伟大方式,它可以用来标记数据,定义数据类型,然而WebService正是需要以一种可靠的方式处理数据,因此XML来实现这样的功能是最理想的;SOAP,前文已经提到的简单对象访问协议,是一种基于XML的简单,轻量的交换数据的协议规范,一条SOAP信息就是一个标准的XML文档,SOAP使用XML信息调用远程方法,这样WebService就可以通过不同的请求方式与远程机进行交互。其实SOAP的实现也挺有意思的,由于篇幅有限,此处就不再赘述。

以Xfire的实际开发,在MVC的结构思想基础上开发WebService

1. 建库:

   所用的数据库demo和测试用表userinfo:

CREATE TABLE `userinfo` (
  `USER_ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `USER_NAME` varchar(45) DEFAULT NULL COMMENT '用户名',
  `USER_PASSWORD` varchar(45) DEFAULT NULL COMMENT '用户密码',
  `USER_EMAIL` varchar(45) DEFAULT NULL COMMENT '用户邮箱',
  PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

测试数据如下

2. 服务器端:提供WebService

 a. 新建一个web工程,为其添加xfire功能;直接点击项目,然后鼠标右键,添加Xfire功能,根据向导下一步就行。我在这个demo中只是把xfire配置文件的路径给改了,放到了WEB-INF下面;添加完成后,在web.xml中可以看到多出的几行代码:

<servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

b. 可以新建一个接口了,然后实现它,数据处理等。就如同我在上文中提到的一样,以MVC的方式进行结构化,我在这个demo中只是为了说明WebService的开发,就没涉及到多的框架,采用JDBC访问的mysql数据库,demo的项目结构整体如下:

c. 现将重点代码粘贴:

    User实体类:其get和set方法以及构造方法已经省略。

 private int user_id;
    private String user_name;
    private String user_password;
    private String user_email;

数据库开启和关闭链接的工具类Conn类:

public Connection getConn() {
        try {
            String Driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://127.0.0.1:3306/demo";
            String user = "root";
            String password = "123456";
            Class.forName(Driver);
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (Exception e) {
           e.printStackTrace();
        }
        return null;
    }
    public void closeConn(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if (null != rs && !rs.isClosed()) rs.close();
            if (null != stmt && !stmt.isClosed()) stmt.close();
            if (null != conn && !conn.isClosed()) conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

用户接口类IUserService:

public interface IUserServices {
    /**
     * 查询所有
     * @return list集合
     */
    public List<User> findAll();
    /**
     * 通过用户id查找
     * @param user_id 客户id
     * @return 用户对象
     */
    public User findById(int user_id);
}

用户接口实现类UserService:

public class UserServices implements IUserServices {
    private UserDao userDao=new UserDao();
    public List<User> findAll() {
        return userDao.findAll();
    }
    public User findById(int userId) {
        return userDao.findById(userId);
    }
    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
} 

数据库操作类UserDao:

public List<User> findAll() {
        try {
            List<User> list = new ArrayList<User>();
            String sql = "SELECT USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL FROM userinfo";
            Connection conn = new ConnUtil().getConn();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                User user = new User();
                user.setUser_id(rs.getInt("USER_ID"));
                user.setUser_name(rs.getString("USER_NAME"));
                user.setUser_password(rs.getString("USER_PASSWORD"));
                user.setUser_email(rs.getString("USER_EMAIL"));
                list.add(user);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public User findById(int userId) {
        try {
            User user = new User();
            String sql = "SELECT USER_ID, USER_NAME, USER_PASSWORD, USER_EMAIL FROM userinfo AS u WHERE u.USER_ID= '"
                         + userId + "'";
            Connection conn = new ConnUtil().getConn();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                user.setUser_id(rs.getInt("USER_ID"));
                user.setUser_name(rs.getString("USER_NAME"));
                user.setUser_password(rs.getString("USER_PASSWORD"));
                user.setUser_email(rs.getString("USER_EMAIL"));
            }
            return user;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
}

此时的开发已经基本上完成了,最后配置xfire.xml就算完成了webService 的开发。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
    <service>
       <name>UserServices.cis</name>
       <serviceClass>com.red.services.IUserServices</serviceClass>
       <implementationClass>com.red.services.UserServices
       </implementationClass>
    </service>
</beans>

将这个新项目部署到tomcat,然后启动tomcat。在浏览器中输入:http://localhost:8080/svc/UserServices.cis?wsdl 就会看到如下的页面,说明开发完成:

输入以后可以看到这个

3. 客户端访问WebService的开发:

  a. 为了方便,直接新建一个java工程,只要能够访问刚刚开发好的webService就行。项目结构如下:

b. 重点代码粘贴:同名类的代码和service端相同。

    ConfigUtil类:

public class ConfigUtil {
    private static final long serialVersionUID = -5639833339612968585L;
    private volatile static ConfigUtil client = null;
    public static ConfigUtil getInstance() {
        if (null == client) {
            client = new ConfigUtil();
        }
        return client;
    }
    public Object createTunnel(Class<?> interfaceclass, String url) {
        try {
            Service srvcModel = new ObjectServiceFactory().create(interfaceclass);
            XFire client = XFireFactory.newInstance().getXFire();
            XFireProxyFactory factory = new XFireProxyFactory(client);
            Object service = factory.create(srvcModel, url);
            return service;
        } catch (MalformedURLException e) {
        }
        return null;
    }
} 

ServiceTest类进行测试:

public class ServiceTest {
    public static void main(String[] args) {
        try {
            IUserServices service = getService();
            List<User> list = service.findAll();
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).getUser_name() + "::" + list.get(i).getUser_email());
            }
            User user=service.findById(1);
            System.out.println(user.getUser_email()+"::mail");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static IUserServices getService() {
        ConfigUtil util = ConfigUtil.getInstance();
        String url = "http://127.0.0.1:8080/svc/UserServices.cis";
        IUserServices ctservice = (IUserServices) util.createTunnel(IUserServices.class, url);
        return ctservice;
    }
}

Main方法测试结果:控制台打印结果。

最后感谢

https://www.cnblogs.com/itred/p/4285067.html

提供的demo

猜你喜欢

转载自blog.csdn.net/qq_41755287/article/details/82986453