例如
package com.blogspot.karrysu;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class MyWS {
private int i = 0;
@WebMethod
public void testInstanceMember(){
this.i = this.i + 1;
System.out.println("this.i="+i);
}
}
這個例子是每次呼叫 testInstanceMember(),就會將 i 這個 instance member 加一所以,若是多個 instance,則每個 instance 的 i 都會是從 0 開始
接著我們試著用下面的 Client code 呼叫
MyWSService service = new MyWSService(
new URL("http://localhost:8080/WebServices/services/myws?wsdl")
,new QName("http://karrysu.blogspot.com/", "MyWSService")
);
MyWS port1 = service.getMyWSPort();
port1.testInstanceMember();
port1.testInstanceMember();
MyWS port2 = service.getMyWSPort();
port2.testInstanceMember();
port2.testInstanceMember();
如果每次在 Client 端產生 MyWS 實體,也都能在 Server 端產生一個對應的 MyWS 實體那麼當我們執行上面的 Client code 時,理應在 Server console 會看到
this.i=1 this.i=2 this.i=1 this.i=2但我們看到的結果是
this.i=1 this.i=2 this.i=3 this.i=4這就表示 Server 端實際上只有產生一個 MyWS 實體
如果我們希望每次在 Client 端產生 MyWS 實體時,Server 端也都能產生一個對應的 MyWS 實體
那麼,我們在 MyWS 就要加上 @HttpSessionScope,如下
package com.blogspot.karrysu;
import javax.jws.WebMethod;
import javax.jws.WebService;
import com.sun.xml.ws.developer.servlet.HttpSessionScope;
@HttpSessionScope
@WebService
public class MyWS {
private int i = 0;
@WebMethod
public void testInstanceMember(){
this.i = this.i + 1;
System.out.println("this.i="+i);
}
@WebMethod
public TestVO test(TestVO vo){
if( vo==null ) return null;
vo.setStrValue("Modified by Server side.");
return vo;
}
}
且 Client code 在呼叫時,必須多執行一句((BindingProvider)port).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
如下
MyWSService service = new MyWSService(
new URL("http://localhost:8080/WebServices/services/myws?wsdl")
,new QName("http://karrysu.blogspot.com/", "MyWSService")
);
MyWS port1 = service.getMyWSPort();
((BindingProvider)port1).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
port1.testInstanceMember();
port1.testInstanceMember();
MyWS port2 = service.getMyWSPort();
((BindingProvider)port2).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
port2.testInstanceMember();
port2.testInstanceMember();
如此就能得到我們想要的結果this.i=1 this.i=2 this.i=1 this.i=2這裡要注意的是,如果 Client code 沒有寫這一行
((BindingProvider)port).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
那麼就會變成每呼叫一次 method 就會產生一個 MyWS 實體,執行結果是
this.i=1 this.i=1 this.i=1 this.i=1
參考資料
https://jax-ws-commons.dev.java.net/http-session-scope/
相關文章:
[JAX-WS]簡單實作 WebService
沒有留言:
張貼留言
廣告訊息會被我刪除