使用axis1+spring+hibernate搭建webservice
写在前面的话:
网上的教程大多都是使用wsdl2java工具构建webservice。本文则直接采用编辑server-config.wsdd来发布webservice,相比而言,可以比较快速的部署一个项目,适应工作需要。
本教程模拟提供用户接口用于和别的系统结合,主要功能包括接受用户的增删改查。
一数据库创建
创建数据库webservice,创建用户表user,用户表内容如下:
`uid` int(10) unsigned NOT NULL auto_increment,
`name` varchar(45) NOT NULL default '',
`password` varchar(45) NOT NULL default '',
`nickname` varchar(45) NOT NULL default '',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
(您也可以直接使用附件中的sql文件创建数据库)
二新建web项目,搭建spring+hibernate框架。
1)新建用户模型,User类,如下:
public class User {
/*
* 用户属性,分别对应user表
*/
/*
* 用户id
*/
private Integer uid;
/*
* 用户名
*/
private String name;
/*
* 密码
*/
private String password;
/*
* 用户昵称
*/
private String nickname;
/*
* 必须提供一不带参数的构造方法,以供hibernate初始化User
*/
public User(){
}
/*
* 使用参数构建User
*/
public User(String name ,String password ,String nickname){
this.name=name;
this.password=password;
this.nickname=nickname;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
另外user的配置文件User.hbm.xml如下:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<class name="org.yoo.model.User" table="user">
<id name="uid" type="java.lang.Integer" column="UID">
<generator class="native"></generator>
</id>
<property
name="name"
type="java.lang.String"
column="NAME"
length="45"
insert="true"
update="true"
/>
<property
name="password"
type="java.lang.String"
column="PASSWORD"
length="45"
insert="true"
update="true"
/>
<property
name="nickname"
type="java.lang.String"
column="NICKNAME"
length="45"
insert="true"
update="true"
/>
</class>
</hibernate-mapping>
2)新建DAO,UserDAO类,如下:
import java.util.List;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
import org.yoo.model.User;
public class UserDAO extends HibernateDaoSupport {
public User getUser(int uid){
return (User) getHibernateTemplate().get(User.class, new Integer(uid));
}
/**
* 添加用户
* @param user
*/
public void saveUser(User user){
getHibernateTemplate().save(user);
}
/**
* 删除用户
* @param uid
*/
public void deleteUser(int uid){
StringBuffer strBuf=new StringBuffer();
strBuf.append("from User as u where u.uid=");
strBuf.append(uid);
getHibernateTemplate().delete(strBuf.toString());
}
/**
* 更新用户
* @param user
*/
public void updateUser(User user){
getHibernateTemplate().saveOrUpdate(user);
}
/**
* 根据用户名查找用户
* @param name
* @return user or null
*/
/*
* return null if can't find
*/
public User getUserByName(String name){
StringBuffer strBuf=new StringBuffer();
strBuf.append("select u from User as u where u.name='");
strBuf.append(name);
strBuf.append("'");
List tempList=getHibernateTemplate().find(strBuf.toString());
if (tempList!=null && tempList.size() >0) {
return (User) tempList.get(0);
} else {
return null;
}
}
/**
* 用户列表
* @return user List
*/
public List listUser(){
StringBuffer strBuf=new StringBuffer();
strBuf.append("select u from User as u ");
return getHibernateTemplate().find(strBuf.toString());
}
}
3)新建管理层,UserManager接口和其实现UserManagerImpl。
UserManager接口:
import java.util.List;
import org.yoo.model.User;
public interface UserManager {
/**
* 根据uid查找用户
* @param uid
* @return user
*/
public User getUserByUid(int uid);
/**
* 增加用户
* @param user
*/
public void saveUser(User user);
/**
* 删除用户
* @param uid
*/
public void deleteUser(int uid);
/**
* 更新用户信息
* @param user
*/
public void updateUser(User user);
/**
* 根据用户名查找用户
* @param name
* @return user
*/
public User getUserByName(String name);
/**
* 用户列表
* @return user List
*/
public List listUser();
}
UserManagerImpl如下:
import java.util.List;
import org.yoo.dao.UserDAO;
import org.yoo.model.User;
import org.yoo.service.UserManager;
public class UserManagerImpl implements UserManager {
private UserDAO userDAO = null;
public void deleteUser(int uid) {
userDAO.deleteUser(uid);
}
public User getUserByName(String name) {
return userDAO.getUserByName(name);
}
public User getUserByUid(int uid) {
return userDAO.getUser(uid);
}
public List listUser() {
return userDAO.listUser();
}
public void saveUser(User user) {
userDAO.saveUser(user);
}
public void updateUser(User user) {
userDAO.updateUser(user);
}
/*
* Ioc By Spring
*/
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
4)配置xml文件。
Spring-config.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- ==DATA SOURCE========================================-->
<!-- Data Source for MYSQL -->
<bean id="dataSource_MYSQL"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://127.0.0.1:3306/webservice?useUnicode=true&characterEncoding=GBK</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<!--==SESSION FACTORY=====================================-->
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource_MYSQL" />
</property>
<property name="mappingResources">
<list>
<value>org/yoo/model/mysql/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!--sql dialect for MYSQL -->
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.MySQLDialect
</prop>
<prop key="connection.pool.size">10</prop>
<prop key="statement_cache.size">25</prop>
<prop key="jdbc.fetch_size">50</prop>
<prop key="jdbc.batch_size">30</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="cglib.use_reflection_optimizer">true</prop>
</props>
</property>
</bean>
<!--==TRANSACTION=======================================-->
<!-- Transaction manager for a single Hibernate SessionFactory -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
</beans>
Spring-dao.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="userDAO" class="org.yoo.dao.UserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>
Spring-service.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="userManager"
class="org.yoo.service.impl.UserManagerImpl">
<property name="userDAO">
<ref bean="userDAO" />
</property>
</bean>
</beans>
(您也可以将这三个文件合并在一个文件中,我将它们分开是觉得便于管理。另外如果这部分的配置您不明白,请先查看有关spring+hibernate的相关文章)
5)构建bean工厂
在此只前,都是和利用spring+hibernate搭建web项目一致,这一步开始要有些不同了。由于axis1不支持spring,所以无法直接创建spring的容器,我们需要自己构建bean工厂。
创建BeanxmlFactoryl类,如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.yoo.service.StudentManager;
import org.yoo.service.UserManager;
/**
* 单列模式的bean工厂类
* SpringBean Factory
* @author yoo
*
*/
public class BeanxmlFactory {
private static BeanxmlFactory beanxmlfactory = null;
private UserManager userManager = null;
/*
*私有的构造方法
*/
private BeanxmlFactory(){
/**
* 读取spring+hibernate的配置文件
*/
String[] configs={"/spring_hibernate/spring-config.xml","/spring_hibernate/spring-dao.xml","/spring_hibernate/spring-service.xml"};
ApplicationContext context=new ClassPathXmlApplicationContext(configs);
/*
* 获取制定的bean
*/
this.userManager=(UserManager) context.getBean("userManager");
}
/*
*
*/
public synchronized static BeanxmlFactory getInstance(){
if(beanxmlfactory==null){
beanxmlfactory=new BeanxmlFactory();
}
return beanxmlfactory;
}
public UserManager getUserManager() {
return userManager;
}
}
到此我们的web项目已经搭建完成了,余下的事情就是构建webservice的服务了。
三构建service
1)新建一个类,我们命名它为UserService。该类利用由Spring提供的UserManager Bean,生产用户的增加和删除服务,如下:
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.yoo.beanfactory.BeanxmlFactory;
import org.yoo.model.User;
import org.yoo.service.UserManager;
public class UserService {
private static Log log = LogFactory.getLog(UserService.class);
private UserManager userManager =null;
/*
* 获取spring提供的userManager bean
*/
private UserService(){
this.userManager=BeanxmlFactory.getInstance().getUserManager();
}
/**
* 使用信息创建用户
* @param name 用户名
* @param password 密码
* @param nickname 昵称
* @return user‘uid or error code
* 0 用户名已存在
* -1 创建用户出错
*/
public int createUserByUserInfo(String name,String password,String nickname){
log.info("come in createUser method");
int resultCode=0;
try {
User userTemp=userManager.getUserByName(name);
if (userTemp == null) {
User user=new User(name,password,nickname);
userManager.saveUser(user);
resultCode=user.getUid().intValue();
} else {
resultCode=0;
}
} catch (Exception e) {
log.error("createUser have error:", e);
resultCode=-1;
}
return resultCode;
}
/**
* 删除用户
* @param uid
* @return boolean value
*/
public boolean deleteUser(int uid){
log.info("come in deleteUser method");
boolean resultCode=true;
try {
userManager.deleteUser(uid);
} catch (Exception e) {
log.error("deleteUser have error:", e);
resultCode=false;
}
return resultCode;
}
}
2)添加axis1所需要的jar包。
复制axis-1_4"lib下所有的包到你的项目lib下。
(可以到apache网站上下载axis-1——4,或者在本文附件中获取)
3)Ok,最重要的一步,也是最奇妙的一步来了,构建server-config.wsdd,即利用axis1搭建webservice服务的描述文件。在web.xml同目录下,新建一xml文件,命名为server-config.wsdd文件类容如下:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="wsdlTargetNamespace" value="http://model.yoo.org"/>
<parameter name="adminPassword" value="admin"/>
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
<parameter name="sendXsiTypes" value="true"/>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="axis.sendMinimizedElements" value="true"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<!--服务的名称-->
<service name="UserService" provider="java:RPC">
<parameter name="scope" value="Request"/>
<!--所有的方法都可以访问-->
<parameter name="allowedMethods" value="*"/>
<!-- 服务指向的类-->
<parameter name="className" value="org.yoo.webservice.UserService"/>
</service>
<!-- other service -->
<!-- 可以部署多个服务 -->
<!--
<service name="balabala" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="Request"/>
<parameter name="className" value="balabala"/>
</service>
-->
<!-- axis1 -->
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
4)最后一步,需要使用tomcat支持我们搭建的webservice。编辑web.xml,编辑后的文件内容如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>aoservice-axis1</display-name>
<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAPMonitorService</display-name>
<servlet-class>
org.apache.axis.monitor.SOAPMonitorService
</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<!-- uncomment this if you want the admin servlet -->
<!--
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
-->
<session-config>
<!-- Default to 5 minute session timeouts -->
<session-timeout>5</session-timeout>
</session-config>
<!-- currently the W3C havent settled on a media type for WSDL;
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
for now we go with the basic 'it's XML' response -->
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<welcome-file-list id="WelcomeFileList">
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jws</welcome-file>
</welcome-file-list>
</web-app>
到此,我们可以歇口气啦,我们已经搭建好了一个简单的webservice了。