AXIS实现WebService webservice里面对axis最熟悉了吧。做过一个CRM系统使用这个小编,不过还没有好好的测试一下他能 承受的压力。据说SOAP的效率不高。 结合SPRING + axis配置和使用起来都比较简单。 首先是下载axis过来咯。是apache的。 然后需要修改web.xml文件,配置axis的servlet: <!-- axis webservice --> <servlet> <servlet-name>axis</servlet-name> <servlet-class> org.apache.axis.transport.http.AxisServlet </servlet-class> <load-on-startup>4</load-on-startup> </servlet> <!-- axis webservice filter --> <servlet-mapping> <servlet-name>axis</servlet-name> <url-pattern>/axis/*</url-pattern> </servlet-mapping> 增加了一个wsdd文件server-config.wsdd在Webroot/WEB-INF下面: <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <globalConfiguration> <parameter name="adminPassword" value="admin"/> <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="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <service name="User" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="com.sillycat.core.webservice.impl.JaxRpcUserService"/> <beanMapping languageSpecificType="java:com.sillycat.core.webservice.model.IUser" qname="ns:IUser" xmlns:ns="urn:BeanService"/> </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> 其中的有些地方需要修改: <service name="User" provider="java:RPC"> <parameter name="allowedMethods" value="*"/> <parameter name="className" value="com.sillycat.core.webservice.impl.JaxRpcUserService"/> <beanMapping languageSpecificType="java:com.sillycat.core.webservice.model.IUser" qname="ns:IUser" xmlns:ns="urn:BeanService"/> </service> 要改成自己的类名和包名 webservice设置一个自己的spring配置文件,配置服务端和客户端,applicationContext-webservice.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- webservice axis server --> <bean name="/user" class="org.springframework.remoting.httpinvoker.httpinvokerServiceExporter"> <property name="service"> <ref bean="jaxRpcUserService" /> </property> <property name="serviceInterface"> <value>com.sillycat.core.webservice.IUserManager</value> </property> </bean> <bean name="jaxRpcUserService" class="com.sillycat.core.webservice.impl.JaxRpcUserService"/> <!-- webservice axis client --> <bean id="userManagerRemote" class="com.sillycat.plugin.webservice.axis.AxisPortProxyfactorybean" lazy-init="true"> <property name="serviceFactoryClass"> <value>org.apache.axis.client.ServiceFactory</value> </property> <property name="wsdlDocumentUrl"> <value>http://localhost/easyLife/axis/User?wsdl</value> </property> <property name="namespaceUri"> <value>http://localhost/easyLife/axis/User</value> </property> <property name="serviceName"> <value>JaxRpcUserServiceService</value> </property> <property name="portName"> <value>User</value> </property> <property name="serviceInterface"> <value>com.sillycat.core.webservice.IUserManager</value> </property> </bean> </beans> 配置就到这里结束了。另外说说类的结构 webservice下面分别有三块 webservice/impl/ JaxRpcUserService.java 核心实现类 webservice/model IUser.java 和外部接口决定的接口类,不能直接用自己的User对象抛给别人,都要定义接口 webservice/transformer UserTransformer.java 接口类和内部类的转换工具 webservice IUserManager.java 抛给别人的接口,不能直接把内部的spring bean给别人使用,接口上专门包装一 个bean webservice/axis 客户端调用的时候使用的plugin类,放置在plugin下面吧。在接口上要注册了 IUser类 才能相互传递 AxisPortProxyfactorybean.java IUserManager.java类,提供给外部的接口: package com.sillycat.core.webservice; import java.util.List; import com.sillycat.core.webservice.model.IUser; public interface IUserManager { public List getAllUser(); public IUser getUser(Integer id); public void saveUser(IUser user); public void removeUser(Integer id); } JaxRpcUserService.java接口实现类,调用内部的manager完成业务逻辑: package com.sillycat.core.webservice.impl; import java.util.List; import org.springframework.remoting.jaxrpc.ServletEndpointSupport; import com.sillycat.core.model.User; import com.sillycat.core.service.UserManager; import com.sillycat.core.webservice.IUserManager; import com.sillycat.core.webservice.model.IUser; import com.sillycat.core.webservice.transformer.UserTransformer; public class JaxRpcUserService extends ServletEndpointSupport implements IUserManager { private UserManager userManager; protected void onInit() { userManager = (UserManager) getWebApplicationContext().getBean( "userManager"); } public List getAllUser() { return userManager.getAllUser(); } public IUser getUser(Integer id) { User u = userManager.getUser(id); IUser i = UserTransformer.transformUser2IUser(u); return i; } public void removeUser(Integer id) { userManager.removeUser(id); } public void saveUser(IUser i) { User u = UserTransformer.transformIUser2User(i); userManager.saveUser(u); } } IUser.java定义的接口,相互传递参数: package com.sillycat.core.webservice.model; import java.io.Serializable; import org.apache.commons.lang.builder.ToStringBuilder; public class IUser implements Serializable { private static final long serialVersionUID = 1993559722178981779L; private Integer id; private String name; public IUser() { } public IUser(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return new ToStringBuilder(this).append("name",this.name).append("id", this.id).toString(); } } UserTransformer.java转换类,接口和内部类的转换: package com.sillycat.core.webservice.transformer; import com.sillycat.core.model.User; import com.sillycat.core.webservice.model.IUser; public class UserTransformer { public static IUser transformUser2IUser(User u) { IUser i = new IUser(); i.setId(u.getId()); i.setName(u.getName()); return i; } public static User transformIUser2User(IUser i) { User u = new User(); u.setId(i.getId()); u.setName(i.getName()); return u; } } AxisPortProxyfactorybean.java客户端调用时的基类: package com.sillycat.plugin.webservice.axis; import javax.xml.namespace.QName; import javax.xml.rpc.Service; import javax.xml.rpc.encoding.TypeMapping; import javax.xml.rpc.encoding.TypeMappingRegistry; import org.apache.axis.encoding.ser.BeanDeserializerFactory; import org.apache.axis.encoding.ser.BeanSerializerFactory; import org.springframework.remoting.jaxrpc.JaxRpcPortProxyfactorybean; import com.sillycat.core.webservice.model.IUser; public class AxisPortProxyfactorybean extends JaxRpcPortProxyfactorybean { protected void postProcessJaxRpcService(Service service) { TypeMappingRegistry registry = service.getTypeMappingRegistry(); TypeMapping mapping1 = registry.createTypeMapping(); registerBeanMapping(mapping1,IUser.class,"IUser"); registry.register("http://schemas.xmlsoap.org/soap/encoding/",mapping1); } protected void registerBeanMapping(TypeMapping mapping,Class type,String name) { QName qName = new QName("urn:BeanService",name); mapping.register(type,qName,new BeanSerializerFactory(type,qName), new BeanDeserializerFactory(type,qName)); } } 嘿嘿。最后单元测试一下就行了,UserManagerRemoteTest.java: package com.sillycat.core.webservice; import com.sillycat.core.webservice.model.IUser; import com.sillycat.plugin.commons.base.ServiceTestBase; public class UserManagerRemoteTest extends ServiceTestBase { protected void setUp() throws Exception { super.setUp(); } public void testGetAddressById() { IUserManager iUserManager = (IUserManager) appContext .getBean("userManagerRemote"); IUser iUser = iUserManager.getUser(Integer.valueOf("1")); assertNotNull(iUser); System.out.println(iUser); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。