义齿


Springの強さは、多くのフレームワークとシームレスに結合できることです.ここではaxisとのステップについて説明します(axisはaxis 2ではないことに注意してください).
問題を説明できるように、demoを例に挙げます.Webserviceといえば、サービス側とクライアントの開発にほかならないが、ここではそれぞれ説明する.
 
サービス開発:
1必要なjarをプロジェクトディレクトリの下に置く(必要なパッケージはwsdl 4 j-1.5.1.jar、spring.jar、saaj.jar、mail-1.4.jar、log 4 j-1.2.8.jar、
   jaxrpc.jar,commons-logging-1.0.4.jar,commons-discovery-0.2.jar,axis-ant.jar,axis.jar,activation-1.1.jar)
 
2ソースコードの開発:このステップはビジネスに関連しているため、ここでは議論しませんが、WebServiceとしてパブリッシュされるサーブレットEndpointSupportを継承するクラスが必要です.
具体的なコード形は以下の通りです.
package com.ecgit.eccm.webservice;



import javax.xml.rpc.ServiceException;
import javax.xml.rpc.server.ServiceLifecycle;

import org.springframework.remoting.jaxrpc.ServletEndpointSupport;

import com.skywin.service.MyService;

public class InterchangeDataServiceImpl extends ServletEndpointSupport {

	private MyService service;
	
	protected void onInit() throws ServiceException {
		service=(MyService) getApplicationContext().getBean("MyService");
		
	}

	public String getMonthInterchange(String marketDate) {
		System.out.println("   Facade");
		service.doTrans(marketDate);
		return marketDate;
	}

}

 
 
ビジネス層コード(実装クラスのみを書き込み、インタフェースは比較的簡単なので省略):
package com.skywin.service;

import com.skywin.dao.MyDao;

public class MyServiceImpl implements MyService{
    private MyDao myDao;
	public void doTrans(String message) {
		myDao.doTrans(message);
		System.out.println("      "+this.getClass().getName()+"----"+message);
		
	}
	public MyDao getMyDao() {
		return myDao;
	}
	public void setMyDao(MyDao myDao) {
		this.myDao = myDao;
	}
      
}
 
 
 
     (      ,      ,    )

3 web-infディレクトリの下でserver-configという名前を確立する.wsddのファイルは、それらのパッケージのどのクラスのどの方法がwebServiceにパブリッシュされるかを指定し、内容は以下の通りです.
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	<handler name="URLMapper"
		type="java:org.apache.axis.handlers.http.URLMapper" />

	<!--      -->

	<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>

	<!--       -->
	<service name="MPSWebService" provider="java:RPC">
		<parameter name="className" value="com.ecgit.eccm.webservice.InterchangeDataServiceImpl" />
		<parameter name="allowedMethods" value="*" />
		 
	</service>
	 <!--  
	<beanMapping languageSpecificType="java:com.skywin.mps.sa.model.SPParamObject"
      			qname="ns1:SPParamObject" xmlns:ns1="urn:BeanService" /> 
   
      <beanMapping languageSpecificType="java:com.skywin.mps.sa.model.OrderSubItem"
      			qname="ns2:OrderSubItem" xmlns:ns2="urn:BeanService" />
      			
     <beanMapping languageSpecificType="java:java.util.List"
      			qname="ns3:List" xmlns:ns3="urn:BeanService" />  
     <beanMapping languageSpecificType="java:java.util.ArrayList"
      			qname="ns4:ArrayList" xmlns:ns4="urn:BeanService" />  
      -->
	<transport name="http">
		<requestFlow>
			<handler type="URLMapper" />
		</requestFlow>
	</transport>
</deployment>





4 Web-infディレクトリの下でspringプロファイル(applicationContext.xmlという名前)を作成します.内容は以下の通りです.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

	 <bean id="serviceFace" class="com.ecgit.eccm.webservice.InterchangeDataServiceImpl"></bean>
	 <bean id="MyService" class="com.skywin.service.MyServiceImpl">
	    <property name="myDao" ref="myDao"></property>
	 </bean>
	 <bean id="myDao" class="com.skywin.dao.MyDaoImpl"></bean>
</beans>

 
5 webを修正する.xmlファイルは、主にaxisに関連するservletを追加し、springを起動することを目的としています.内容はよく知られています.コードは以下の通りです.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<servlet>
		<servlet-name>AxisServlet</servlet-name>
		<servlet-class>
			org.apache.axis.transport.http.AxisServlet
		</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>AxisServlet</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>
	
	
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
</web-app>

 
ここでサービス側の開発が完了し、ステップごとに問題がなければ、アプリケーションサーバにプロジェクトをパブリッシュし、アドレスバーに入力します.http://localhost:8080/aspring/services/MPSWebService?wsdl車に戻るとさっき配布されたサービスが見えます.
 
二クライアントの開発:
実はクライアントはあまり開発されていません.主な仕事はサービスを利用するuriです.http://localhost:8080/aspring/services/MPSWebService?wsdl)いくつかのクラスを生成し、生成したクラスを利用してパラメータを入力すればよい.
1必要なjarパッケージをプロジェクトに導入し、必要なjarは基本的にサービス側と同じであるがspringは必要ない.jarだけですが、ここでは詳しく説明しません.
2サービス側が提供するuriを利用してクラスを生成する:
入力するコマンドは次のとおりです.
java org.apache.axis.wsdl.WSDL2Java http://localhost:8080/aspring/services/MPSWebService?wsdl -p com.skywin.mps.webservice.client
そのうちorg.apache.axis.wsdl.WSDL 2 Javaはパッケージaxisの中のクラスであり、ユーザーは対応するディレクトリに入って上述のコマンドを実行する必要がある.このクラスはコンパイル時に他のクラスが必要であるため、上記のコマンドを実行する上でclasspathに以下のパッケージをcommons-logging-1.0.4に追加する必要がある.jar,commons-discovery-0.2.jar,jaxrpc.jar,saaj.jar,wsdl4j-1.5.1.jar
 
3ステップ2のコマンドを実行すると、client側で4つのクラス(InterchangeDataServiceImpl,InterchangeDataServiceImplService,InterchangeDataServiceImplServiceLocator,MPSwebServiceSoapBindingStub)が得られます.
 
4.入力パラメータは、サービス側のサービスを呼び出す:コードは以下の通りである.
package aspring;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;


import com.skywin.mps.webservice.client.InterchangeDataServiceImpl;
import com.skywin.mps.webservice.client.InterchangeDataServiceImplService;
import com.skywin.mps.webservice.client.InterchangeDataServiceImplServiceLocator;


public class Test {
	
	
	public static void main(String[] args) throws ServiceException, RemoteException {
		InterchangeDataServiceImplService server= new InterchangeDataServiceImplServiceLocator();
	    InterchangeDataServiceImpl serverDo=server.getMPSWebService();
	    serverDo.getMonthInterchange("funk");
	}
	
	
	
}

またクライアントは次のようなプログラムを直接書くこともでき,次のクラスを実行しても上記と同様の結果が得られる.
package aspring;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class Test2 {
	
	public static void main(String[] args) {
		
		

          try 

          {

                 String wsdlUrl= "http://localhost:8080/aspring/services/MPSWebService?wsdl";

                 String nameSpaceUri = "http://localhost:8080/aspring/services/MPSWebService";

                 //        <o:p> </o:p>

                 Service service = new Service();

                 Call call = null;

                 call = (Call) service.createCall();

                 //    getMessage

                 System.out.println(">>>getMessage");

                 call.setOperationName(new QName(nameSpaceUri, "getMonthInterchange"));

                 call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));

                 String ret = (String) call.invoke(new Object[] { "ABC" });

                 System.out.println("return value is " + ret);

          } 

          catch (Exception e) 

          {

                 e.printStackTrace();

          } 
		
	}

}
 
 
3ダウンロードの説明:asrpingはサービス側の工事で、aspringClientはクライアントの工事です;トラフィックの問題を考慮すると、2つのプロジェクトのlibディレクトリにはjarパッケージがありません.ダウンロードするにはlib_001,lib_002のパッケージはプロジェクトのlibディレクトリに置けばいいです(トラフィックの問題でspring.jarとaxis.jarはアップロードされていません)