前段时间有博友在看个人博文《WebService入门案例》后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用。想一想本身入职也有一段时间了,彷佛也该总结一下本身对于接口化开发的认识,以及如何利用java开发一些能够供其余应用程序使用的web服务。html
其实最开始对Web服务的认识仍是在课堂上,老师反复地在讲SOAP协议,其实也不懂到底是什么意思,平白无故就在大脑中造成了条件反射,SOAP协议的中文意思就是简单对象访问协议;并且,更加巧合的是本身在求职面试时就被项目经理问到这么一个问题,直接回答简单对象访问协议!此时,只能对当时上课的老师表示感谢。java
好了,废话很少说,转入正题。在本文中,首先总结一下本身对接口化编程的认识,本身在项目结构方面MVC思想的体现,而后谈谈对WebService的印象,最后以Xfire的实际开发为案例具体谈谈本身的接口开发,以及如何在MVC的结构思想基础上开发WebService。本文为本身学习和工做总结积累所得,欢迎转载。请保留原文出处。mysql
接口化编程,在项目结构方面MVC思想web
随着J2EE实际开发的机会增多,经验也在慢慢地积累,就是这些小知识的积累就造成了本身开发实践的一种模式。可是就整个项目的结构思想而言,是没有任何变化的,即MVC。毕竟就MVC自己来讲,它已是一种软件典范,这种逻辑,界面,数据分离的设计早就被行业内所承认。就拿都比较熟悉的,也比较热的J2EE中SSH三大框架来讲,就是很好的体现了这么一个特色,而有一些企业则是用ibatis或mybatis替代Hibernate进行数据层的操做。二者都有其各自的优缺点,此处就不谈了。由于毕竟不是在说MVC或者框架的开发实践。可是,咱们须要在这样的基础上开发接口,就必需要对这些框架有必定的了解。面试
在我我的而言,开发接口,我喜欢用interface的首字母加上须要开发的接口名称再加上服务的英文单词就能够了。好比说,我须要开发一个用户的接口,那么我给这个接口的名称就是IUserService;并且实现这个接口的类则命名为UserService。我的感受比较简单,容易分辨。至于在此基础上的框架开发,不一样的功能使用不一样的包名,其命名规范也得讲究才行,我本身的项目中包名一般用com.red.功能包,实体包bean,接口包service,DAO包dao,工具包util等,具体状况具体分析;实体bean类,则用User或UserBean,若是数据层采用的是Hibernate那就用User.hbm.xml或UserBean.hbm.xml;若是是ibatis等,那就用User.xml或UserBean.xml。个人原则就是尽量一眼就分辨出这个java类或文件具体是干什么的,其主要内容是什么。sql
接口化本身的程序方法能够将本身的实现类进行必定程度的封装,只提供接口方法给其它程序,若是其它程序须要调用这个接口,它再也不须要关心具体的实现,数据的如何处理,并且,这也更加体现了分布式应用程序的好处。好比我有一个程序做为整个系统多个项目的数据处理中心,为不一样的项目提供数据服务,即全部的项目都是创建在这个基础上的,并且,其它的项目再也不进行数据处理服务,只是负责页面和业务逻辑,有效地将数据完全和业务分开,并且,它尚未数据库和相关环境的依赖。这样开发的优势就不言而喻了。实际上,这样作对数据的安全也有必定的保障。 数据库
接着谈谈WebService,开发了这么久的WebService,今天就痛快的总结一下吧。编程
WebService在当下,它是开发分布式的互操做的应用程序不可缺乏的一部分。Web服务,可以使部署在不一样平台上的不一样语言开发的不一样的应用在不须要借助第三方的基础上进行数据的交互和系统的集成。而WebService的基础特色就是开放性,刚才已经体现出来了。要使用WebService,就必须得会用两种技术,分别是XML和SOAP。XML无疑是在web中传输结构化数据的一种伟大方式,它能够用来标记数据,定义数据类型,然而WebService正是须要以一种可靠的方式处理数据,所以XML来实现这样的功能是最理想的;SOAP,前文已经提到的简单对象访问协议,是一种基于XML的简单,轻量的交换数据的协议规范,一条SOAP信息就是一个标准的XML文档,SOAP使用XML信息调用远程方法,这样WebService就能够经过不一样的请求方式与远程机进行交互。其实SOAP的实现也挺有意思的,因为篇幅有限,此处就再也不赘述。浏览器
谈了如此多的接口开发,毕竟实践是检验真理的惟一标准。下面就以一个小Demo来讲说利用Xfire开发接口,而且供其它程序调用的方式。tomcat
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方法测试结果:控制台打印结果。
顺利完成。
做者:itRed 邮箱:it_red@sina.com 博客:http://www.cnblogs.com/itred 我的网站:http://wangxingyu.jd-app.com ***版权声明:本文版权归做者和博客园共有,欢迎转载,但请在文章显眼位置标明文章出处。未经本人书面赞成,将其做为他用,本人保留追究责任的全部权利。