亚洲一区二区三区免费在线观看,久久亚洲sm情趣捆绑调教,亚洲人妖女同在线播放http://m.tkk7.com/fool/category/16908.html堅持就是勝利!zh-cnTue, 27 Feb 2007 10:11:41 GMTTue, 27 Feb 2007 10:11:41 GMT60j2ee web service開發(六) 跟其它編程語言寫的Web服務通信 Holder類型http://m.tkk7.com/fool/archive/2006/12/05/85571.html傻 瓜傻 瓜Tue, 05 Dec 2006 06:31:00 GMThttp://m.tkk7.com/fool/archive/2006/12/05/85571.htmlhttp://m.tkk7.com/fool/comments/85571.htmlhttp://m.tkk7.com/fool/archive/2006/12/05/85571.html#Feedback0http://m.tkk7.com/fool/comments/commentRss/85571.htmlhttp://m.tkk7.com/fool/services/trackbacks/85571.html閱讀全文

傻 瓜 2006-12-05 14:31 發表評論
]]>
j2ee web service開發(五) 把ejb發布為web服務 http://m.tkk7.com/fool/archive/2006/12/04/85302.html傻 瓜傻 瓜Mon, 04 Dec 2006 02:57:00 GMThttp://m.tkk7.com/fool/archive/2006/12/04/85302.htmlhttp://m.tkk7.com/fool/comments/85302.htmlhttp://m.tkk7.com/fool/archive/2006/12/04/85302.html#Feedback0http://m.tkk7.com/fool/comments/commentRss/85302.htmlhttp://m.tkk7.com/fool/services/trackbacks/85302.html ejb 作為 web 服務發布比 JSE 端點要復雜些 . 并且只有無狀態會話 Bean 才能發布成 Web 服務 . 利用 ejb 的一大好處就是容器管理的事務 . 但是 spring 同樣能做到這個 , 這一點不再具有很大的吸引力了 . 那么剩下的好處估計就只有用在必須用 ejb 的情況下又同時需要 web 服務這種情況了 . EJB 端點跟 JSE 端點跟一個不同點在于 : 不需要在 web.xml 文件中配置 servlet 映射 , 但是需要在 ejb-jar.xml 文件中配置 web 服務端點接口 . 另一個不同之處就是不需要一個實現 web 服務接口的具體類 . Jboss 4.04 版本下具體實現 .

建立一個無狀態會話 bean

package ejb;

?

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

import javax.ejb.CreateException;

?

public class WebServiceBean implements SessionBean {

??? SessionContext sessionContext;

??? public void ejbCreate() throws CreateException {

??? }

?

??? public void ejbRemove() {

??? }

?

??? public void ejbActivate() {

??? }

?

??? public void ejbPassivate() {

??? }

?

?

??? public void setSessionContext(SessionContext sessionContext) {

??????? this.sessionContext = sessionContext;

??? }

?

??? public void hello() {

??????? System.out.println("hello");

??? }

}

?

package ejb;

?

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

?

public interface WebService extends EJBObject {

??? public void hello() throws RemoteException;

}

?

package ejb;

?

import javax.ejb.EJBHome;

import javax.ejb.CreateException;

import java.rmi.RemoteException;

?

?

public interface WebServiceBeanHome extends EJBHome {

? public WebService create() throws CreateException, RemoteException;

}

?

沒有什么好多說的 .

定義一個 Web 服務接口


package ejb;

?

import java.rmi.*;

?

public interface WebServiceTest extends Remote {

??? public void hello() throws RemoteException;

}

生成 Web 服務所需的配置文件 :

<?xml version="1.0" encoding="UTF-8"?>

<!--

? wstools -cp? classes -config wstools-config.xml

-->

?

<configuration xmlns="http://www.jboss.org/jbossws-tools"

?? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

?? xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">

? <java-wsdl>

??? <service name="WebServiceTest" style="rpc" endpoint="ejb.WebServiceTest"/>

??? <namespaces target-namespace="http://ejb" type-namespace="http://ejb"/>

??? <mapping file="jaxrpc-mapping.xml"/>

??? <webservices ejb-link="WebServiceBean"/>

? </java-wsdl>

</configuration>

?

利用 Jboss 自帶的工具生成 Web 服務所需要的布署文件 . wstools -cp? classes -config wstools-config.xml

把生成的布署文件放到 META-INF 文件夾而不是 JSE 端點的 web-INF 文件夾下 .

修改 ejb-jar.xml 文件加上 <service-endpoint>ejb.WebServiceTest</service-endpoint> 元素 , 注意順序 .OK 打包發布 .

客戶端調用程序

package ejb;

?

import java.net.URL;

import javax.xml.rpc.*;

import javax.xml.namespace.QName;

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import javax.naming.InitialContext;

import java.util.Hashtable;

?

public class ClientTest {

?

??? private WebServiceTest getPort() throws Exception {

??????? ServiceFactory factory = ServiceFactory.newInstance();

??????? URL wsdlURL = new URL("http://hechang:8080/ejb/TestService?wsdl");

??????? QName qname = new QName("http://ejb", "WebServiceTest");

??????? Service service = factory.createService(wsdlURL, qname);

??????? WebServiceTest port = (WebServiceTest) service.getPort(WebServiceTest.class);

??????? return port;

??? }

?

??? private WebService ejbTest() throws Exception {

??????? Hashtable environment = new Hashtable();

?

??????? environment.put(Context.INITIAL_CONTEXT_FACTORY,

??????????????????????? "org.jnp.interfaces.NamingContextFactory");

??????? environment.put(Context.URL_PKG_PREFIXES,

??????????????????????? "org.jboss.naming:org.jnp.interfaces");

??????? environment.put(Context.PROVIDER_URL, "jnp://localhost:1099");

??????? Context context = new InitialContext(environment);

??????? Object ref = context.lookup("WebServiceBean");

??????? WebServiceBeanHome webServiceHome = (WebServiceBeanHome) PortableRemoteObject.

??????????????????????????????????????? narrow(ref, WebServiceBeanHome.class);

??????? WebService webService = webServiceHome.create();

??????? return webService;

??? }

?

??? public static void main(String[] args) throws Exception {

??????? ClientTest clienttest = new ClientTest();

??????? WebServiceTest webService = clienttest.getPort();

??????? webService.hello();

??????? WebService webService2=clienttest.ejbTest();

??????? webService2.hello();

??? }

}

打包?ejb文件下載:EJBModlue.jar

歡迎加入QQ群:30406099



傻 瓜 2006-12-04 10:57 發表評論
]]>
j2ee web service開發(四) soap報頭與處理http://m.tkk7.com/fool/archive/2006/11/13/80901.html傻 瓜傻 瓜Mon, 13 Nov 2006 07:28:00 GMThttp://m.tkk7.com/fool/archive/2006/11/13/80901.htmlhttp://m.tkk7.com/fool/comments/80901.htmlhttp://m.tkk7.com/fool/archive/2006/11/13/80901.html#Feedback0http://m.tkk7.com/fool/comments/commentRss/80901.htmlhttp://m.tkk7.com/fool/services/trackbacks/80901.html ?? SOAPHeaderElement 對象中的屬性決定了接收者怎樣處理消息,可以認為header屬性提供了擴展消息的方法,給出了像身份認證,支付,轉發消息這樣的相關的事情。JAX-RPC客戶API(占位程序,動態代理,DII)均沒有提供對SOAP文件頭的支持,SAAJ API提供了支持。所有消息處理程序都必須實現javax.xml.rpc.handler.Handler接口,該接口有一系列的方法用以處理soap消息。javax.xml.rpc.handler.GenericHandler是一個缺省適配器類,創建我們自己的消息處理程序的時候從該類繼承覆寫我們自己感興趣的方法就可以了。但每一個handler必須實現 getHeader()方法跟 handleRequest()方法.具體實現:

服務類HandlerServic:

package handler;

?

public class HandlerService implements HandlerServiceInterface1 {

? public void testInOutHeader(String bodyMsg, String headerMsg)

?? {

????? System.out.print("testInHeader: " + bodyMsg + "," + headerMsg);

?

?? }

?

}

?

消息處理類:

package handler;

?

import javax.xml.rpc.handler.*;

import javax.xml.soap.*;

import javax.xml.namespace.QName;

import javax.xml.rpc.JAXRPCException;

import javax.xml.rpc.handler.soap.SOAPMessageContext;

import java.util.Iterator;

?

public class CutomerHandler extends GenericHandler {

? ??protected QName[] headers = new QName[] {

??????????????????????????????? new QName("http://handler", "headerMsg")

??? };

??? public QName[] getHeaders() {

??????? return headers;

??? }// 返回handler要處理的文件頭元素名的素組.

?

??? // 處理接收到的soap消息.如果返回值為falseJAX-RPC會立即中斷對SOAP消息處理并將soap消息回傳。關于saaj api使用方法見j2ee web service開發()

??? public boolean handleRequest(MessageContext msgContext) {

?

??????? try {

??????????? SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).

????????????????????????????????????? getMessage();

??????????? SOAPHeader soapHeader = soapMessage.getSOAPHeader();

??????????? Iterator it = soapHeader.extractAllHeaderElements();

??????????? while (it.hasNext()) {

??????????????? SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

????? ??????????Name headerName = headerElement.getElementName();

??????????????? System.out.println(" header name is: " +

?????????????????????????????????? headerName.getQualifiedName());

??????????????? System.out.println(" header value is: " +

????????????? ?????????????????????headerElement.getValue());

??????????? }

??????????? SOAPBody soapBody = soapMessage.getSOAPBody();

??????????? Iterator bodyIterator = soapBody.getChildElements();

??????????? while (bodyIterator.hasNext()) {

??????????????? SOAPBodyElement soapBodyElement = (SOAPBodyElement)

????????????????????????????????????????????????? bodyIterator.next();

??????????????? System.out.println("soapBodyElement print: " +

?????????????????????????????????? soapBodyElement.getNodeName());

??????????? }

??????????? SOAPBodyElement nextSoapBodyElement = (SOAPBodyElement) soapBody.

????????????????????????????????????????????????? getChildElements().next();

??????????? SOAPElement soapElement = (SOAPElement) nextSoapBodyElement.

????????????????????????? ????????????getChildElements().next();

??????????? System.out.println("soapElement print: " + soapElement.getLocalName() +

?????????????????????????????? "? " + soapElement.getValue());

??????? } catch (SOAPException e) {

??????????? throw new JAXRPCException(e);

??????? }

?

??????? return true;

??? }

?

// 返回soap應答消息,本例修改soap文件頭的值再返傳給客戶端.

??? public boolean handleResponse(MessageContext msgContext) {

?

??????? try {

??????????? SOAPMessage soapMessage = ((SOAPMessageContext) msgContext).

?????????????????????? ???????????????getMessage();

??????????? SOAPHeader soapHeader = soapMessage.getSOAPHeader();

?

??????????? SOAPBody soapBody = soapMessage.getSOAPBody();

??????????? SOAPBodyElement soapBodyElement = (SOAPBodyElement) soapBody.

??????????????????????????? ??????????????????getChildElements().next();

??????????? String rpcName = soapBodyElement.getElementName().getLocalName();

?

??????????????? SOAPFactory soapFactory = SOAPFactory.newInstance();

??????????????? Name headerName = soapFactory.createName("headerMsg", "ns","http://handler");

??????????????? SOAPHeaderElement she = soapHeader.addHeaderElement(headerName);

??????????????? she.setValue("return header message");

?

??????? } catch (SOAPException e) {

??????????? throw new JAXRPCException(e);

??????? }

?

??????? return true;

??? }

?

?

}

用于生成布署描述符的WSTOOLS工具的配置文件:

<configuration xmlns="http://www.jboss.org/jbossws-tools"

?? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

?? xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd">

? <java-wsdl>

??? <service name="TestService" style="rpc" endpoint="handler.HandlerServiceInterface1">

?

????? <operation name="testInOutHeader">

??????? <parameter type="java.lang.String"/>

??????? <parameter type="java.lang.String"/>

????? </operation>

?

??? </service>

??? <namespaces target-namespace="http://handler" type-namespace="http://handler"/>

??? <mapping file="HandlerServiceInterface1.xml"/>

??? <webservices servlet-link="HandlerServiceInterface1"/>

? </java-wsdl>

</configuration>

關于wstools工具的使用見j2ee web service開發().

在生成的webservice描述符文件中手工加入以下代碼:

???? <handler>

????? <handler-name>CutomerHandler</handler-name>

????? <handler-class>handler.CutomerHandler</handler-class>

??? </handler> 用以配置處理soap消息頭的類.

?

客戶端代碼:利用j2ee web serive開發()介紹的api不難寫出saaj客戶端代碼就不再重復勞動了。這里只介紹JBOss ws利用DII實現soap消息頭的處理,它擴展了標準jax-rpc api.

package handler;

import javax.xml.namespace.QName;

import javax.xml.rpc.Call;

import javax.xml.rpc.ParameterMode;

import javax.xml.rpc.Service;

import org.jboss.ws.Constants;

import org.jboss.ws.jaxrpc.CallImpl;

import javax.xml.rpc.ServiceFactory;

import java.util.*;

public class HandlerClient {

??? public HandlerClient() {

??? }

?

??? public static void main(String[] args) throws Exception{

??????? HandlerClient handlerclient = new HandlerClient();

??????? handlerclient.testUnboundInOutHeader();

??? }

??? public void testUnboundInOutHeader() throws Exception{

??????? Service service = ServiceFactory.newInstance().createService(new QName("TestService"));

????? ??CallImpl call = (CallImpl)service.createCall();

??????? call.setOperationName(new QName("http://handler", "testInOutHeader"));

??????? call.addParameter("String_1", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);

??????? call.addParameter("String_2", Constants.TYPE_LITERAL_STRING, ParameterMode.IN);

??????? call.setTargetEndpointAddress("http://hechang:8082/customer-handler/services/HandlerServiceInterface1");

??????? QName xmlName = new QName("http://handler", "headerMsg");

??????? // xmlName = new QName("http://otherns", "HeaderValue");

?

??????? call.addUnboundHeader(xmlName, Constants.TYPE_LITERAL_STRING, String.class, ParameterMode.IN);

??????? call.setUnboundHeaderValue(xmlName, " IN header message");

// 設置消息頭 可以設定多組

??????? Object retObj = call.invoke(new Object[]{"Hello world!", "IN header message"});

???????

??????? String unboundRet = (String)call.getUnboundHeaderValue(xmlName);

?????? // 處理返回的消息頭的值

??????? System.out.println(" unboundReturn: "+unboundRet);

}

?

}
打包的war文件

歡迎加入QQ群:30406099






傻 瓜 2006-11-13 15:28 發表評論
]]>
j2ee web service開發(三) SAAJ 帶附件的soap消息http://m.tkk7.com/fool/archive/2006/11/09/80033.html傻 瓜傻 瓜Thu, 09 Nov 2006 02:05:00 GMThttp://m.tkk7.com/fool/archive/2006/11/09/80033.htmlhttp://m.tkk7.com/fool/comments/80033.htmlhttp://m.tkk7.com/fool/archive/2006/11/09/80033.html#Feedback0http://m.tkk7.com/fool/comments/commentRss/80033.htmlhttp://m.tkk7.com/fool/services/trackbacks/80033.html? 帶附件的soap消息api,其內容很豐富,它是一個允許用soap消息而不是用jax-rpc來調用web service的API .它通過直接創建XML消息來完成web serivce的調用.SOAP API 簡化了創建XML的工作.?取自j2ee文檔的soap消息的結構圖.
saaj-noAttach.gif?
完整的SAAJ客戶端程序. 服務器端的程序在j2ee web service開發(一) 里可以找到.沒有詳細介紹saaj的一些類
的使用.好在它們都有很好的自解釋性.
package array;

import javax.xml.soap.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class SaajClient {
??? public SaajClient() {
??? }

??? public static void main(String[] args) throws Exception {
??????? SaajClient client = new SaajClient();
??????? User[] user = new User[2];
??????? user[0] = new User("張三", "027-88888888", new Date());
??????? user[1] = new User("lisi", null, new Date());
??????? saajTest(user);

??? }

??? private static void saajTest(User[] user) throws MalformedURLException,
??????????? IOException,
??????????? UnsupportedOperationException, SOAPException {
??????? MessageFactory factory = MessageFactory.newInstance();//SAAJ的根工廠類
??????? SOAPMessage message = factory.createMessage();
??????? //SOAPMessage 對象需要一些元素,包括SOAPPart,SOAPEnvelope,SOAPHeader,SOAPBody對象
??????? //SAAJ通過返回一個新的已經包括這些元素的SOAPMessage對象來簡化操作

??????? SOAPFactory s = SOAPFactory.newInstance();//通用工廠類,創建Name,SOAPElement對象

??????? Name countUser = s.createName("countUser", "mh", "http://array");
??????? //Name對象表示一個XML限定名稱
??????? Name arrayOfUser_1 = s.createName("arrayOfUser_1");
??????? Name xsi = s.createName("xmlns:xsi");
??????? Name nullAttribute = s.createName("xsi:nil");

??????? //下面的代碼創建soap對象
??????? SOAPBody body = message.getSOAPBody();
??????? SOAPBodyElement bodyChildElement = body.addBodyElement(countUser);
??????? SOAPElement arrayOfUser = bodyChildElement.addChildElement(
??????????????? arrayOfUser_1);
????? //? arrayOfUser.addAttribute(xsi, "??????? arrayOfUser.addNamespaceDeclaration("xsi","??????? //定義arrayOfUser的 xmlns:xsi屬性? 該名稱空間是XML模式實例命名空間,由XML模式規范定義,它定義了
??????? //可以在XML文檔中使用的屬于該命名空間的一些特性.

??????? for (int i = 0; i < user.length; i++) {
??????????? //需要注意順序,也就是和復雜類型的sequence元素的順序對應
??????????? Name valueName = s.createName("value");
??????????? SOAPElement value = arrayOfUser.addChildElement(valueName);
??????????? Name birthday = s.createName("birthDay");
??????????? SOAPElement birthdayElement = value.addChildElement(birthday);

??????????? if (user[i].getBirthDay() == null) {
??????????????? birthdayElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? //日期類型必須進行格式化
??????????????? SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
??????????????? birthdayElement.addTextNode(format.format(user[i].getBirthDay()));
??????????? }
??????????? Name name = s.createName("name");
??????????? SOAPElement nameElement = value.addChildElement(name);
??????????? if (user[i].getName() == null) {
??????????????? //傳送空值
??????????????? nameElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? nameElement.addTextNode(user[i].getName());
??????????? }
??????????? Name phone = s.createName("phone");
??????????? SOAPElement phoneElement = value.addChildElement(phone);
??????????? if (user[i].getPhone() == null) {
??????????????? phoneElement.addAttribute(nullAttribute, "1");
??????????? } else {
??????????????? phoneElement.addTextNode(user[i].getPhone());
??????????? }

??????? }

??????? //發送soap消息
??????? SOAPConnectionFactory f = SOAPConnectionFactory.newInstance();
??????? SOAPConnection conn = f.createConnection();
??????? URL url = new URL("
http://localhost:8082/complexType-array/services/CountUser");
??????? SOAPMessage response = conn.call(message, url);

??????? SOAPBody soapBody = response.getSOAPBody();
??????? Iterator it = soapBody.getChildElements();
??????? while (it.hasNext()) {
??????????? SOAPBodyElement bodyElement = (SOAPBodyElement) it.next();
??????????? String returnValue = bodyElement.getValue();
??????????? System.out.println(bodyElement.getElementName().getLocalName() +
?????????????????????????????? "????? " + returnValue);
??????? }


??????? response.writeTo(System.out);
??? }
}

程序向服務器端傳送的數據:

POST /complexType-array/services/CountUser HTTP/1.1
SOAPAction: ""
Content-Type: text/xml; charset=UTF-8
User-Agent: Java/1.5.0_03
Host: localhost:8082
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
Content-Length: 448

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
?? <env:Header/>
?? <env:Body>
????? <mh:countUser xmlns:mh='http://array'>
???????? <arrayOfUser_1 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
??????????? <value>
?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
?????????????? <name>張三</name>
?????????????? <phone>027-88888888</phone>
??????????? </value>
??????????? <value>
?????????????? <birthDay>2006-11-08T22:36:13</birthDay>
?????????????? <name>lisi</name>
?????????????? <phone xsi:nil='1'/>
??????????? </value>
???????? </arrayOfUser_1>
????? </mh:countUser>
?? </env:Body></env:Envelope>
從傳送的數據來看,就是一個符合soap規范的xml文檔.既然是xml文檔,也就是說可以用jdom api 來操作它
事實上就是這樣,soap api 可以跟 jdom api混合使用.
如果你想賜教或者討論,歡迎加入QQ群:30406099



傻 瓜 2006-11-09 10:05 發表評論
]]>
j2ee web service開發(二) 動態代理與動態調用http://m.tkk7.com/fool/archive/2006/11/07/79538.html傻 瓜傻 瓜Tue, 07 Nov 2006 02:40:00 GMThttp://m.tkk7.com/fool/archive/2006/11/07/79538.htmlhttp://m.tkk7.com/fool/comments/79538.htmlhttp://m.tkk7.com/fool/archive/2006/11/07/79538.html#Feedback0http://m.tkk7.com/fool/comments/commentRss/79538.htmlhttp://m.tkk7.com/fool/services/trackbacks/79538.html ?j2ee web service 客戶端的三種調用方式: (一)占位程序:該種調用方式需要服務端生成所謂的占位程序,也是性能最好的一種方式,據有的文檔介紹說用占位程序實現的web服務不能實現各種編程語言比如C#之是互相調用就是會引起互操作性的問題.而且生成占位程序的web服務的確稍麻煩一點,更重要的是我不喜歡這種方式,也就不作備忘了:)。

(二)動態代理:該種方式需要一個指向WSDL文檔的URL。具體實現:

??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();

// 工廠類,取得service對象,

?

??????? URL wsdlURL = new File(? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").??????????????? ??toURL(); //wsdl 文檔的URL 它可以是一個遠程的URL 但是本例引用本地硬盤上的一個wsdl文件

其好處是提高程序的性能。

??????? URL mappingURL = new File("complexType-array/WEB-INF/CountUser.xml").???????????????????????? toURL(); // 映射文件的URL 需要著重說明的就是這個映射文件了,標準的j2ee web service API實現中可不需要這玩意,但是在Jboss的實現中不要這個就會報錯cannot obtain java mapping type...,在jboss下開發的web 服務客戶端移植時需要特別注意,麻煩!

??????? QName qname = new QName("http://array", "CountUserService");

??????? Service service = factory.createService(wsdlURL, qname, mappingURL);// 通過工廠方法得到一個Service對象,但createService(wsdlURL, qname, mappingURL)方法是jboss的具體實現增加一的一個方法,標準API可沒有這玩意,對于數組類型的傳遞只能用這個方法了,奇怪的是客戶端居然需要部署在服務器端的映射文件,沒勁!???????

??????? CountUser port = (CountUser) service.getPort(CountUser.class); // 取得服務器端的接口。

( 三)動態調用。

?

??????? URL wsdlURL = new File(

??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").

????????????????????? toURL();

??????? URL mappingURL = new File(

??????????????? "complexType-array/WEB-INF/CountUser.xml").

???????????????????????? toURL();

??????? QName qname = new QName("http://array", "CountUserService");// 表示服務名QName對象。

??????? Service service = factory.createService(wsdlURL, qname, mappingURL);

??????? Call call = service.createCall();

??? // 沒什么好說的,依然要用到wsdl文檔文件,映射文件。

??????? call.setOperationName(new QName(TARGET_NAMESPACE, "countUser"));// 指定方法名

??????? call.setPortTypeName(new QName("CountUser"));// 指定端口名

("value",Constants.TYPE_LITERAL_ANYSIMPLETYPE,ParameterMode.IN);

??????? call.setReturnType(Constants.TYPE_LITERAL_INT);

??????? Object retObj = call.invoke(new Object[] {user});

?

?

?

服務器端的實現參見j2ee web service()完整的客戶端代碼如下:

package array;

?

import java.net.URL;

import javax.xml.rpc.*;

import javax.xml.namespace.QName;

import java.util.*;

import java.io.File;

import org.jboss.ws.jaxrpc.ServiceFactoryImpl;

import org.jboss.ws.Constants;

?

public class ArrayExample {

? ?? public ArrayExample() {

??? }

?

??? private static final String TARGET_NAMESPACE =

??????????? "http://array";

?

??? private CountUser getPort() throws Exception {

?

??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();

?

??????? URL wsdlURL = new File(

??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").

????????????????????? toURL();

??????? URL mappingURL = new File(

??????????????? "complexType-array/WEB-INF/CountUser.xml").

???????????????????????? toURL();

??????? QName qname = new QName("http://array", "CountUserService");

??????? Service service = factory.createService(wsdlURL, qname, mappingURL);

?

??????? CountUser port = (CountUser) service.getPort(CountUser.class);

?

??????? return port;

??? }

?

??? public void testComplexUserArray(User[] user) throws

??????????? Exception {

??????? CountUser port = getPort();

?

??????? try {

??????????? int returnValue = port.countUser(user);

??????????? System.out.print(returnValue);

??????? } catch (Exception e) {

??????????? throw e;

??????? }

??? }

?

??? public void DIIClient(User[] user) throws Exception {

?

??????? ServiceFactoryImpl factory = new ServiceFactoryImpl();

?

??????? URL wsdlURL = new File(

??????????????? "complexType-array/WEB-INF/wsdl/CountUser.wsdl").

????????????????????? toURL();

??????? URL mappingURL = new File(

??????????????? "complexType-array/WEB-INF/CountUser.xml").

???????????????????????? toURL();

??????? QName qname = new QName("http://array", "CountUserService");

??????? Service service = factory.createService(wsdlURL, qname, mappingURL);

??????? Call call = service.createCall();

??????? call.setOperationName(new QName(TARGET_NAMESPACE, "countUser"));

??????? call.setPortTypeName(new QName("CountUser"));

?

??????? call.setReturnType(Constants.TYPE_LITERAL_INT);

?

????? ??Object retObj = call.invoke(new Object[] {user});

?

??????? System.out.println(retObj.toString());

??? }

?

??? public static void main(String[] args) throws Exception {

??????? ArrayExample arrayexample = new ArrayExample();

??????? User[] user = new User[2];

??????? user[0] = new User(" 張三", "027-88888888", new Date());

??????? user[1] = new User("lisi", null, new Date());

??????? //arrayexample.testComplexUserArray(user);

??????? arrayexample.DIIClient(user);

??? }

}

?

?

?至此好象一個可以應用的web service服務就完成了,然而這才僅僅只是開始~~~~~~~~~
如果你想賜教或者討論,歡迎加入QQ群:30406099



傻 瓜 2006-11-07 10:40 發表評論
]]>
j2ee web service開發(一) 映射數組復雜類型http://m.tkk7.com/fool/archive/2006/11/06/79319.html傻 瓜傻 瓜Mon, 06 Nov 2006 01:33:00 GMThttp://m.tkk7.com/fool/archive/2006/11/06/79319.htmlhttp://m.tkk7.com/fool/comments/79319.htmlhttp://m.tkk7.com/fool/archive/2006/11/06/79319.html#Feedback0http://m.tkk7.com/fool/comments/commentRss/79319.htmlhttp://m.tkk7.com/fool/services/trackbacks/79319.html ?之所以把數組類型在調用web service中作為參數的實現鄭重的記錄下來,實在是因為數組在j2ee web service的實現不是一件容易的問題。至少用Jbossj2ee web service實現時是這樣. 好象網上關于web service的比較深入一點的資料比較少,關于j2ee web service的資料就更少了. 這里只記錄了符合WS I BP 標準的SOAP四種消息傳遞模式中的RPC/Literal消息傳遞模式。這個請參考書籍《j2ee web service 高級編程》一書。該書也只能是參考了,只是介紹了web service的理論實現及一點jax-rpc API,并且還有蠻多印刷錯字。雖然jax-rpc API的目標之一就是為了在各種java web service實現技術中提供一個便攜的手段,然而各種j2ee服務器的web service技術還是有些差別的,這個還是造成了程序不能直接在各種j2ee服務器之間毫無修改的移植。在 apacheaxis實現中,數組作為參數傳遞根本不值一提,借助工具很方面的就可以實現。

但是在jboss中的ws實現中確不是一件便利的事情。因為郁悶了很久,發點牢騷:)具體實現:

??? 作為web service服務實現的類必須實現java.rmi.Remote的接口:

package array;

?

import java.rmi.Remote;

import java.rmi.RemoteException;

?

public interface CountUser extends Remote {

? ?? public int countUser(User[] user) throws RemoteException;

}

?

??? 具體實現遠程接口的類:

package array;

?

public class CountUserImpl implements CountUser {

??? public int countUser(User[] user){

??????? for(int i=0;i<user.length;i++){

??????????? System.out.println("name "+user[i].getName()+"? phone? "+

?????????????????????????????? user[i].getPhone()+ " birthday "+user[i].getBirthDay());

??????? }

??????? return user.length;

??? }

?

}

?

? 作為數組參數傳遞的類:

?

package array;

?

import java.util.Date;

?

public class User {

??? private String name;

??? private String phone;

??? private Date birthDay;

?

??? public User() {

?

??? }

??? public User(String name,String phone,Date birthDay){

??????? this.name=name;

??????? this.phone=phone;

??????? this.birthDay=birthDay;

??? }

?

??? public void setName(String name) {

??????? this.name = name;

??? }

?

??? public void setPhone(String phone) {

??????? this.phone = phone;

??? }

?

??? public void setBirthDay(Date birthDay) {

??????? this.birthDay = birthDay;

??? }

?

??? public String getName() {

? ??????return name;

??? }

?

??? public String getPhone() {

??????? return phone;

??? }

?

??? public Date getBirthDay() {

??????? return birthDay;

??? }

?

}

?

使用Jboss_Home/bin 下的wstools工具生成布署j2ee web service 必須的三個文件,jax-rpc映射文件,web服務描述器文件,以及wsdl文檔用于wstools工具的配置文件jboss-config.xml類容如下:

<?xml version="1.0" encoding="UTF-8"?>

<configuration xmlns="http://www.jboss.org/jbossws-tools"

?? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

?? xsi:schemaLocation="http://www.jboss.org/jbossws-tools http://www.jboss.org/jbossws-tools/schema/jbossws-tool_1_0.xsd"

? <java-wsdl>

? <service? name="ServiceBeanInterface1" style="rpc"?? endpoint="array.ServiceBeanInterface1"/>

????? <namespaces target-namespace="http://array" type-namespace="http://array"/>

???? <mapping file="ServiceBeanInterface1.xml"/>

???? <webservices servlet-link="ServiceBeanInterface1"/>?????

?

</java-wsdl>

</configuration>

使用 wstools -cp array.CountUser -config jboss-config.xml 命令可以生成布署web服務所需的三個文件。另外還得在web.xml文件中把CountUser接口作為servlet發布

? <servlet>

??? <display-name>CountUser Servlet</display-name>

??? <servlet-name>CountUser</servlet-name>

??? <servlet-class>array.CountUserImpl</servlet-class>

? </servlet>

? <servlet-mapping>

??? <servlet-name>CountUser</servlet-name>

??? <url-pattern>/CountUser</url-pattern>

? </servlet-mapping>

? <servlet-mapping>

??? <servlet-name>CountUser</servlet-name>

??? <url-pattern>/services/*</url-pattern>

? </servlet-mapping>

僅僅是這樣倒也算很容易了,但是wstools工具并不能在映射文件中正確實現User[]的映射。因此還需要手工添加如下代碼以實現User[] xml之間的映射。???

??? <java-xml-type-mapping>

??? <java-type>array.User[]</java-type>

??? <root-type-qname xmlns:typeNS='http://array'>typeNS:User.Array</root-type-ame>

??? <qname-scope>complexType</qname-scope>

??? </java-xml-type-mapping>

打包成war文件,并且布署。服務端的實現就完成了。打包的war文件下載 ?使用的Jboss版本4.04
因為篇幅或許還有分類的原因,客戶端的實現將記錄在下一篇隨筆里 如果你想賜教或者討論,歡迎加入QQ群:30406099



傻 瓜 2006-11-06 09:33 發表評論
]]>
主站蜘蛛池模板: free哆拍拍免费永久视频| 免费黄色网址网站| 久久亚洲私人国产精品vA| 毛片A级毛片免费播放| 精品熟女少妇aⅴ免费久久| 亚洲欧洲自拍拍偷午夜色| 国产yw855.c免费视频| 一级毛片不卡片免费观看| 亚洲AV无码成人精品区狼人影院| 四虎影在线永久免费观看| 在线播放免费人成毛片乱码| 亚洲av无码一区二区三区观看| 亚洲麻豆精品国偷自产在线91| xxxxwww免费| 好猛好深好爽好硬免费视频| 亚洲一级毛片免观看| 中文亚洲成a人片在线观看| 成人性生交大片免费看无遮挡| 本免费AV无码专区一区| 亚洲午夜福利在线视频| 久久久久免费看黄A片APP| 2022国内精品免费福利视频| 亚洲一卡二卡三卡四卡无卡麻豆| 亚洲成aⅴ人片久青草影院| 亚洲免费视频网址| 免费国产污网站在线观看| 青青免费在线视频| 亚洲五月综合网色九月色| 亚洲AV无码成人精品区在线观看| 又黄又大又爽免费视频| 无码国产精品一区二区免费式影视 | 亚洲av无码一区二区三区网站| 免费久久精品国产片香蕉| 精品免费久久久久久久| 青青青国产手机频在线免费观看| 亚洲欧洲第一a在线观看| 亚洲乱码中文字幕手机在线| 精品免费国产一区二区| 日本一区二区三区免费高清| 久久国产色AV免费观看| 国产高清不卡免费视频|