AXIS实现WebService
发布时间:2020-12-17 02:06:13 所属栏目:安全 来源:网络整理
导读:AXIS实现WebService webservice里面对axis最熟悉了吧。做过一个CRM系统使用这个东东,不过还没有好好的测试一下他能 承受的压力。据说SOAP的效率不高。 结合SPRING + axis配置和使用起来都比较简单。 首先是下载axis过来咯。是apache的。 然后需要修改web.xm
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); } } ???????????????????????????????
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |