ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲二区在线观看,一区二区三区视频在线观看,国产精品久久久久久模特http://www.aygfsteel.com/WshmAndLily/category/29851.htmlzh-cnMon, 10 Mar 2008 10:08:21 GMTMon, 10 Mar 2008 10:08:21 GMT60myeclipse下用XFire开发webservicehttp://www.aygfsteel.com/WshmAndLily/articles/184708.htmlsemovysemovySat, 08 Mar 2008 09:07:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/184708.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/184708.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/184708.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/184708.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/184708.html
1.new->other->MyEcplise->Web Services->Web Services


自动在classpath:META-INF/xfire

下徏立services.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">

 <service>
  <name>UserService</name>
  <serviceClass>com.semovy.service.IUserService</serviceClass>
  <implementationClass>
   com.semovy.service.impl.UserServiceImpl
  </implementationClass>
  <style>wrapped</style>
  <use>literal</use>
  <scope>application</scope>
 </service>
</beans>

2.在WEB-INF下的web.xml下添加servlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
</web-app>

 3.com.semovy.beans下徏立测试类User

User.java

package com.semovy.beans;

public class User {

 private String id = "";

 private String name = "";

 private String remark = "";

 public User() {
 }

 public User(String id, String name, String remark) {
  this.id = id;
  this.name = name;
  this.remark = remark;
 }

 public String getId() {
  return id;
 }

 public void setId(String id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getRemark() {
  return remark;
 }

 public void setRemark(String remark) {
  this.remark = remark;
 }

 public String toString() {
  return "Id: " + id + " , name: " + name + " , remark: " + remark + "\n";
 }

 @Override
 public int hashCode() {
  final int PRIME = 31;
  int result = 1;
  result = PRIME * result + ((id == null) ? 0 : id.hashCode());
  result = PRIME * result + ((name == null) ? 0 : name.hashCode());
  result = PRIME * result + ((remark == null) ? 0 : remark.hashCode());
  return result;
 }

 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  final User other = (User) obj;
  if (id == null) {
   if (other.id != null)
    return false;
  } else if (!id.equals(other.id))
   return false;
  if (name == null) {
   if (other.name != null)
    return false;
  } else if (!name.equals(other.name))
   return false;
  if (remark == null) {
   if (other.remark != null)
    return false;
  } else if (!remark.equals(other.remark))
   return false;
  return true;
 }
 
}


在com.semovy.service包下建立服务接口IUserService

IUserService.java


package com.semovy.service;

import java.util.List;

import com.semovy.beans.User;

public interface IUserService {
 public abstract String getStringTest(String msg1,String msg2);
 public abstract List getStringList();
 public abstract List getUsersList();
 public abstract User[] getUsersArray();
 public abstract String[] getUsersStringArray();
 public abstract User getUserById(String id);
 public abstract void addUser(User user);
}
˜q™åœ¨æŽ¥å£åŒ…下建立.与服务接口相同名¿U°çš„IUserService.aegis.xml


<?xml version="1.0" encoding="UTF-8"?>
<mappings>
  <mapping><!-- ˜q”回¾cÕdž‹æ˜¯String ,String[]çš?参数是String¾cÕdž‹çš„æ–¹æ³•不用定ä¹?-->
    <method name="getStringList">
       <return-type  componentType="java.lang.String" /><!-- ˜q”回¾cÕdž‹å¯¹åº”集合Collection,数组中的元素的类åž?-->
    </method>
    <method name="getUsersList">
     <return-type componentType="com.semovy.beans.User"/>
    </method>
    <method name="getUsersArray">
     <return-type componentType="com.semovy.beans.User"/>
    </method>
    <method name="getUserById">
     <return-type componentType="com.semovy.beans.User"/>
    </method> 
   </mapping>
</mappings>

在com.semovy.service.impl包下

UserServiceImpl.java

package com.semovy.service.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.semovy.beans.User;
import com.semovy.service.IUserService;

/**
 *
 * @author semovy
 * @version 1.0
 * the user service class implemente the IUserService implementation for testing
 */
public class UserServiceImpl implements IUserService {

 private List<User> users;
 public UserServiceImpl()
 {
  users = new ArrayList<User>();
  users.add(new User("1","semovy","semovy's remark"));
  users.add(new User("2","韦善èŒ?,"韦善茂的备注"));
  users.add(new User("3","superman_wshm","superman_wshm's remark"));
 }
 /**
  * @param msg1 the string msg1
  * @param msg2 the string msg2
  *
  */
 public String getStringTest(String msg1,String msg2) {

  return "Hello :" + msg1 + " : "  + msg2;
 }
 /**
  * @return list the list Collection with some String element
  */
 public List getStringList()
 {
  List<String> list = new ArrayList<String>();
  list.add("string1");
  list.add("字符ä¸?");
  list.add("字符ä¸?");
  list.add("string4");
  return list;
 }
 /**
  * @return all users
  */
 public List getUsersList() {
  return users;
 }
 /**
  * @param id the id of user
  * @return the user by specifical id
  */
 public User getUserById(String id) {
  Iterator it = users.iterator();
  while(it.hasNext())
  {
   User user = (User)it.next();
   if(user.getId().equals(id))
   {
    return user;
   }
  }
  return null;
 }
 /**
  * @return return all users of array form with type User.
  */
 public User[] getUsersArray() {
  
  return users.toArray(new User[]{new User()});
 }
 /**
  * @return return all users of array form with type String
  */
 public String[] getUsersStringArray() {
  
  User[] users_arr = (User[])users.toArray(new User[]{});
  String[] tempUser_arr = new String[users_arr.length];
  for(int i=0;i<users_arr.length;i++)
  {
   tempUser_arr[i] = users_arr[i].toString();
   System.out.println(tempUser_arr[i]);
  }
  return tempUser_arr;
 }
 public void addUser(User user) {
  users.add(user);
 }
 
}


4.在com.semovy.test包下
建立客户调用‹¹‹è¯•¾c?UserServiceWSTest .java

package com.semovy.test;

import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import com.semovy.beans.User;
import com.semovy.service.IUserService;

public class UserServiceWSTest {
 public static void main(String[] args) {
  // 创徏服务实例
  Service srvcModel = new ObjectServiceFactory()
    .create(IUserService.class);
  XFireProxyFactory factory = // 创徏代理工厂实例
  new XFireProxyFactory(XFireFactory.newInstance().getXFire());
  String helloWorldURL = "http://localhost:8000/webServiceTest/services/UserService";
  IUserService srvc = null;
  try { // 获取指定位置的web服务对象
   srvc = (IUserService) factory.create(srvcModel, helloWorldURL);
  } catch (MalformedURLException e) {
   e.printStackTrace();
  }
  
  //调用只返回String的方æ³?在接口名.aegis.xml中不用设¾|®æ–¹æ³•名
  String result = srvc.getStringTest("msg1", "msg2");
  System.out.println(result);
  //调用˜q”回String[]数组的方æ³?在接口名.aegis.xml中不用设¾|®æ–¹æ³•名.
  String[] userInfo_str_arr = srvc.getUsersStringArray();
  for(String aUserInfo:userInfo_str_arr)
   System.out.println(aUserInfo);
  //调用˜q”回List¾cÕdž‹å€¼çš„æ–ÒŽ³•,需要定ä¹?List容器中的元素¾cÕdž‹ä¸ºString
  List strList = srvc.getStringList();
  Iterator str_it = strList.iterator();
  while (str_it.hasNext()) {
   String str = (String) str_it.next();
   System.out.println(str);
  }
  //调用˜q”回User[]数组
  User[] user_arr = srvc.getUsersArray();
  for (User a_user : user_arr)
   System.out.print(a_user.toString());
  
  //调用˜q”回User¾cÕdž‹å€¼çš„æ–ÒŽ³•.æ–ÒŽ³•参数是字½W¦ä¸².
  User a_user = srvc.getUserById("2");
  System.out.print(a_user.toString());
  
  //调用参数为User的方æ³?没有˜q”回å€?不用配置æ–ÒŽ³•
  srvc.addUser(new User("4","æ·ÕdŠ çš„å¿U?,"æ·ÕdŠ çš„å¤‡æ³?));
  
  //调用˜q”回List¾cÕdž‹å€¼çš„æ–ÒŽ³•,需要定ä¹?List容器中的元素¾cÕdž‹ä¸ºUser
  List userList = srvc.getUsersList();
  Iterator userList_it = userList.iterator();
  while (userList_it.hasNext()) {
   User user = (User) userList_it.next();
   System.out.print(user.toString());
  }
 }

}
5.¾l“æžœ:
Hello :msg1 : msg2
Id: 1 , name: semovy , remark: semovy's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 3 , name: superman_wshm , remark: superman_wshm's remark
string1
字符�
字符�
string4
Id: 1 , name: semovy , remark: semovy's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 3 , name: superman_wshm , remark: superman_wshm's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 1 , name: semovy , remark: semovy's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 3 , name: superman_wshm , remark: superman_wshm's remark
Id: 4 , name: æ·ÕdŠ çš„å¿U?, remark: æ·ÕdŠ çš„å¤‡æ³?br />



]]>
Xfire˜q”回List¾cÕdž‹çš„详¾l†æµ‹è¯?/title><link>http://www.aygfsteel.com/WshmAndLily/articles/183418.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 03 Mar 2008 03:28:00 GMT</pubDate><guid>http://www.aygfsteel.com/WshmAndLily/articles/183418.html</guid><wfw:comment>http://www.aygfsteel.com/WshmAndLily/comments/183418.html</wfw:comment><comments>http://www.aygfsteel.com/WshmAndLily/articles/183418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/WshmAndLily/comments/commentRss/183418.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/WshmAndLily/services/trackbacks/183418.html</trackback:ping><description><![CDATA[工作需要,昨天开始学习XfireåQŒæ–¹ä¾¿æ˜¯æ„Ÿåˆ°å¾ˆæ–¹ä¾¿ï¼Œä½†æ˜¯å¯¹äºŽä»–的默认¾l‘定配置åQŒå§‹¾lˆæœ‰äº›æ¨¡¾pŠï¼Œž®¤å…¶æ˜¯List以及数组相关的。今天谢了一个关于返回List的具体调用测试,应该½Ž—比较全了,大家å…׃ínã€?<br /> <br /> 业务假设是根据billnoåQŒæŸ¥è¯¢æ•°æ®åº“åQŒå¾—到ResultSet¾l“æžœåQŒç„¶åŽå°†ResultSet包装成List˜q”回ã€?<br /> <br /> server端: <br /> public   interface   IgetInfo   { <br /> //每一条记录作ä¸ÞZ¸€ä¸ªString[]åQŒå­˜æ”¾ä¸ŽListä¸?<br /> public   List <String[]>   getListOfStringArrays(String   billno); <br />                   //每一条记录合òq¶äؓ一个StringåQŒå­˜æ”¾ä¸ŽListä¸?<br /> public   List <String>   getListOfString(String   billno); <br /> //å·²String[]çš„åŞ式只˜q”回一条记å½?<br />                   public   String[]   getStringArrays(String   billno); <br />                   //和第一个方法类ä¼û|¼Œåªæ˜¯ž®†String[]æ”ÒŽˆList <br />                   public   List <List>   getListOfList(String   billno); <br /> } <br /> 具体实现¾cÕd°±ä¸å†™äº†ï¼Œç›¸åº”çš„IgetInfo.aegis.xml如下åQ?<br /> <?xml   version= "1.0 "   encoding= "UTF-8 "?>             <br /> <mappings>             <br />     <mapping   >             <br />         <method   name= "getListOfStringArrays "> <br />             <!--注意åQŒæ­¤å¤„çš„componentType我试˜q‡å„¿Uç±»åž‹ï¼Œå‡ä¸è¡Œï¼Œä¸çŸ¥é“䨓ä½?<br />               用String报造型错误--> <br />             <return-type   componentType= "java.lang.String "/> <br />         </method>       <br />         <method   name= "getListOfString ">             <br />             <return-type   componentType= "java.lang.String "/> <br />         </method>       <br />         <method   name= "getStringArrays ">             <br />             <return-type   componentType= "java.lang.String "/> <br />         </method>       <br />         <method   name= "getListOfList ">             <br />             <return-type   componentType= "#someArrays "/> <br />         </method>             <br />         <component   name=   "someArrays "   <br />         class=   "java.util.List "   <br />         componentType=   "java.lang.String "   /> <br />     </mapping>             <br /> </mappings> <br /> <br /> client调用ž®×ƒ¸å†™äº†åQŒä¹Ÿå¾ˆç®€å•。奇怪的ž®±æ˜¯½W¬ä¸€¿UList <String[]> ˜q”回¾cÕdž‹ã€‚感觉上应该˜q™ä¹ˆå†?<br /> <method   name= "XXX ">             <br />             <return-type   componentType= "#YYY "/> <br />         </method>             <br />         <component   name=   "YYY "   <br />         class=   "java.util.Arrays "   <br />         componentType=   "java.lang.String "   /> <br /> 但仍然出错。谁¾l™æŒ‡æ•™ä¸€ä¸‹ï¼Ÿ <img src ="http://www.aygfsteel.com/WshmAndLily/aggbug/183418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:28 <a href="http://www.aygfsteel.com/WshmAndLily/articles/183418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire传入传出自定义类型和集合¾cÕdž‹å­¦ä¹ ½W”è®°http://www.aygfsteel.com/WshmAndLily/articles/183417.htmlsemovysemovyMon, 03 Mar 2008 03:27:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/183417.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/183417.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/183417.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/183417.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/183417.html阅读全文

]]>
XFire Web Service验证æ–ÒŽ¡ˆ http://www.aygfsteel.com/WshmAndLily/articles/183416.htmlsemovysemovyMon, 03 Mar 2008 03:26:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/183416.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/183416.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/183416.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/183416.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/183416.htmlXFire的文档做的真是相当的烂,非常不详¾l†ï¼Œçœ‹å¾—匪夷所思,而且和发行的代码版本相当的不匚w…åQŒé‡Œé¢çš„½CÞZ¾‹æ ÒŽœ¬æ— æ³•˜qè¡ŒåQŒçœ‹å¾—真æ˜?#8230;…相当½Hç«
公司™å¹ç›®XFire的服务框架我已经做好åQŒè¿™ä¸¤å¤©ž®Þp¦åŠ å…¥éªŒè¯åŠŸèƒ½åQŒè€Œä¸”要和整体权限框架åQˆè¿˜æ²¡åšåQ‰ç›¸¾l“合
开始想通过HttpSession验证åQŒè¿™æ ·å¯ä»¥å¾ˆæ–¹ä¾¿çš„å’Œb/s的权限系¾lŸç›¸¾lŸä¸€åQŒä½†å®žåœ¨ä¸çŸ¥é“如何在客户端通过Spring或XFire讉K—®HttpSessionåQŒXFire里的文档倒是提到了:
HttpServletRequest request = XFireServletController.getRequest();
HttpServletResponse response = XFireServletController.getResponse();

òq¶ä¸”说只要在web.xml里配¾|®XFireSpringServletž®±å¯ä»¥ï¼Œå¯æ˜¯æŒ‰ç…§é…äº†åQŒç»“果还是不è¡?/div>
注:axis好像是有MessageContext可以很方便的讉K—®åˆŽÍ¼Œxfire里也有MessageContextåQŒå¯æ˜¯getSession()出来的是null
如果有高手知道如何做˜q˜æœ›éºÈƒ¦å‘ŠçŸ¥

此条路不通只好去查XFire的文档关于authentication部分åQŒå¤§æ¦‚有以下几种æ–ÒŽ¡ˆåQ?/div>
  1. HTTP Authentication
  2. SOAP Header authentication with JSR181
  3. SOAP authentication with handlers
  4. WS-Security
其中½W¬ä¸€æ¡HTTP Authentication的文档写的相当匪å¤äh‰€æ€ï¼Œæ–‡æ¡£å†™åˆ°å¦‚何在客æˆïL«¯æŒ‡å®šç”¨æˆ·åå’Œå¯†ç 
// Create your client
Client client = ....;

// Or get it from your proxy
Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient();

client.setProperty(Channel.USERNAME, "username");
client.setProperty(Channel.PASSWORD, "pass");

åŽÕd¿˜äº†å†™æœåŠ¡ç«¯åº”è¯¥æ€Žä¹ˆåšï¼Œ˜q™ä¸ªusernameå’Œpassword该在那里验证呢?åQŸæˆ‘¾˜»éäº†æ–‡æ¡£ä¹Ÿæ²¡æ‰¾ç€


来看½W¬äºŒæ¡SOAP header authentication with JSR181åQŒçœ‹èµäh¥å€’是很简å?/p>

但是在Service的代码中每个æ–ÒŽ³•里都要写一个UserToken验证的参敎ͼŒè™½ç„¶ä¼ég¹Žæƒé™¾_’度能控制得很细åQŒä½†æ˜¯è¿™ä¸¥é‡æ±¡æŸ“了业务逻辑的代码,非常的不优雅åQŒæ”¾å¼ƒï¼


public void someOperation(String data, @WebParam(header=true) UserToken token) {
authenticate(token)

// do your normal request here
}

再看WS-SecurityåQŒè¿™æ˜¯webservice的安全标准,但实在太复杂了,òq¶ä¸”需要配¾|®Service.xmlåQŒæˆ‘们项目是Java1.5åQŒService.xmlæ ÒŽœ¬ž®±æ²¡æœ‰å†™åQŒæ˜¯è‡ªåŠ¨ç”Ÿæˆçš„ï¼Œæˆ‘æ˜¯å®žåœ¨æ‰¾ä¸åˆ°Service.xml该在那配¾|®ï¼Ÿåªå¥½ä½œçÅž


现在只剩下SOAP authentication with handlersåQŒæ ¹æ®æ–‡æ¡£æ¥çœ‹è¿™æ˜¯èƒ½å¤Ÿæ»¡­‘Ïxˆ‘的要求的åQŒä¸ä¾µå…¥ä¸šåŠ¡é€»è¾‘åQŒèƒ½å¤Ÿå’Œæ•´ä½“权限¾pȝ»Ÿç›¸ç»“合,òq¶ä¸”配置比较½Ž€å?/div>
把例子里的代码拷˜q‡æ¥åQŒå‘现根本不能用åQŒå°‘了yom˜q™ä¸ªåŒ…,在网上找了很久也没找刎ͼŒåŽæ¥å‘现yom其实ž®±æ˜¯yet(another) document object modelåQŒåŽŸæ¥å’Œdom是一回事嘛,用jdom替换åQŒç¼–译通过ã€?br />
文档里遗漏了很重要的一点,ž®±æ˜¯å…³äºŽå¦‚何在xfire-servlet里配¾|®ï¼Œå¯ÆD‡´å¾ˆå¤šäººçœ‹äº†æ–‡æ¡£ä¹Ÿ˜q›è¡Œä¸ä¸‹åŽ»ï¼Œæˆ‘æŸ¥äº†å¾ˆä¹…æ‰åœ¨è€å¤–çš„ä¸€½‹‡blog里找åˆîC¸€ç‚¹tipsåQŒä¸‹é¢æ˜¯é…ç½®åQ?br />     <!-- WebService base, do not modify it -->
    <bean id="webService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
        <property name="serviceFactory">
            <ref bean="xfire.serviceFactory" />
        </property>
        <property name="xfire">
            <ref bean="xfire" />
        </property>
    </bean>

    <bean id="yourWebService" parent="webService">
        <property name="serviceBean">
            <ref bean="yourService" />
        </property>
        <property name="serviceClass">
            <value>your.package.YourServiceInterface</value>
        </property>
        <property name="inHandlers">
            <ref bean="authenticationHandler"/>
        </property>
    </bean>

AuthenticationHandler需要修改一下,其他不用变:

AuthenticationHandler.java

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.fault.*;
import org.jdom.*;

public class AuthenticationHandler extends AbstractHandler {
    private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
   
    public void invoke(MessageContext context) throws Exception {
        log.info("authentication handler is invoked");
        if (context.getInMessage().getHeader() == null)
        {
            throw new XFireFault("Request must include company authentication token.",
                                 XFireFault.SENDER);
        }
        Element header = context.getInMessage().getHeader();
        Element token = header.getChild("AuthenticationToken");
       
        if (token == null)
        {
            throw new XFireFault("Request must include authentication token.",
                                 XFireFault.SENDER);
        }

        String username = token.getChild("Username").getText();
        String password = token.getChild("Password").getText();

        try {
            // 现在你已¾lå¾—åˆîCº†å®¢æˆ·ç«¯ä¼ æ¥çš„usernameå’ŒpasswordåQŒé‚£ž®±éªŒè¯å®ƒå§ï¼ˆå¯ä»¥äº¤ç»™acegi来验证)
            }

        }catch(Exception e) {
            log.warn(e);
            throw new XFireFault("Authentication Failed.",
                    XFireFault.SENDER);
        }
    }
}

客户端代码:

            Service serviceModel = new ObjectServiceFactory().create(YourService.class);
            YourService service = (YourService) new XFireProxyFactory().create(serviceModel,
                 "http://localhost:8080/YourProject/service/YourService");
            XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
            Client client = proxy.getClient();
            client.addOutHandler(new ClientAuthHandler("jeffrey", "killjava"));
            // 执行下面代码会进行验è¯?br />             service.someOperation();


]]>[webservices开发]XFire在SpringSide中的应用 http://www.aygfsteel.com/WshmAndLily/articles/183415.htmlsemovysemovyMon, 03 Mar 2008 03:25:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/183415.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/183415.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/183415.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/183415.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/183415.htmlSpringSide开源项目是国内的开发äh员所做的一个以Spring为核心的开源项ç›?目的æ˜?/span>提供一ä¸?/span>Pragmatic的企业应用开发基¼‹€å’Œæœ€ä½›_®žè·µå±•½Cºã€‚äØ“ä½¿ç”¨Spring框架的开发者提供一个非Demo版的复杂、正式而体现最佳ä‹É用实è·ëŠš„参照¾pȝ»Ÿã€‚䨓JavaEEer必须面对的所有问题提供合理的、合ä¹?/span>Pragmatic原则的解å†Ïx–¹æ¡ˆã€‚采ç”?/span>Plugins形式¾l„织åQŒä‹Éå¼€å‘è€…å¯å¿«é€Ÿå®šä½æ‰€éœ€çš„å‚è€ƒæ–¹æ¡ˆåÆˆåšåŠ æ³•åˆ°è‡ªå·±çš„ç³»¾lŸã€?/span>

SpringSide中关于Web服务的配¾|®æ˜¯åœ?/span>

WEB-IBF/classesæ–‡äšg下的applicationContext-webservice.xml中配¾|®çš„åQ?/span>

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

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

       <property name="mappings">

            <value>/BookService=bookService</value>

        </property>

    </bean>

    <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">

        <property name="serviceFactory" ref="xfire.serviceFactory"/>

        <property name="xfire" ref="xfire"/>

    </bean>

   

    <bean id="bookService" parent="baseWebService">

        <property name="serviceBean" ref="bookManager"/>

        <property name="serviceClass" value="org.springside.bookstore.service.webservice.BookService"/>

    </bean>

</beans>

½W¬ä¸€æ­¥ï¼Œå¼•å…¥xfire.xmlæ–‡äšg

<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>ã€‚è¿™æ øP¼Œæˆ‘们ž®×ƒ¸å¿…在web.xml中配¾|®äº†,˜q™ç§è¯­æ³•在Spring参考手册(2.0-M3åQ?.18节中有介¾lï¼Œ3.19节介¾läº†åœ¨web.xml配置bean定义文äšg的方法,ž®±æ˜¯ä¸Šä¸€èŠ‚ä‹É用的æ–ÒŽ³•ã€?/span>

½W¬äºŒæ­¥ï¼Œå¤„理映射åQŒå°†/BookService URLå’ŒbookService˜q™ä¸ªbean联系èµäh¥ã€‚当ç„Óž¼Œ˜q™é‡ŒbookService又ç‘ô承了baseWebServiceåQŒè¿™æ ·åšæŒºåéy妙,˜q™æ ·å¦‚果有多个Web服务beanåQŒå°±¾l§æ‰¿baseWebServicež®±å¯ä»¥äº†åQŒè¿™¿Ué¢å‘对象的概念˜q˜æ˜¯å€¼å¾—我们提倡的åQŒSpring参考手å†?.5节介¾läº†ç›¸å…³çš„知识ã€?/span>

在bookService的定义中åQŒserviceBean也就是接口实现类为bookManager beanåQŒè¿™ä¸ªbean实际是在WEB-INF/classes/applicationContext-manager.xmlæ–‡äšg中所定义åQŒç±»åäØ“org.springside.bookstore.service.logic.BookManageråQ?/span>

package org.springside.bookstore.service.logic;

import … …

public class BookManager extends BaseHibernateDao implements BookService {

    private CategoryManager categoryManager;

    public void setCategoryManager(CategoryManager categoryManager) {

        this.categoryManager = categoryManager;

    }

    protected Class getEntityClass() {

        … …

    }

    public Book get(Integer id) {

        … …

    }

    public void save(Book book) {

       … …

    }

    public void remove(Integer id) {

       … …

    }

    public List getAllCategorys() {

        … …

    }

    public Category getCategory(Integer id) {

        … …

    }

 

    public List findBooksByName(String name) {

        … …

    }

  

    public List getNewBooks() {

        … …

    }

 

    public List findAllLowStock(Integer stockHint) {

       … …

    }

    public List findBooksByCategory(String category_id) {

       … …

    }

 

    protected void filterCriteria(Criteria criteria, Map filter) {

       … …

    }

}

serviceClass也就是接口类�/span>

org.springside.bookstore.service.webservice.BookServiceåQ?/span>

package org.springside.bookstore.service.webservice;

import java.util.List;

public interface BookService {

    List findBooksByName(String name);

  

    List findBooksByCategory(String category);

    List getAllCategorys();

}

事实上,SpringSide既是一个Web服务的提供者,又是一个Web服务的消费者。它在WEB-INF/classes/applicationContext-webservice-client.xmlæ–‡äšg中定义了消费˜q™ä¸ªWeb服务的beanåQ?/span>

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

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <!-- 一分钟åˆäh–°ä¸€‹Æ¡sciprtæ–‡äšg-->

    <bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor">

          <property name="refreshCheckDelay" value="60" />

    </bean>

    <bean id="BookServiceClient" class="org.springframework.scripting.groovy.GroovyScriptFactory">

         <constructor-arg value="classpath:org/springside/bookstore/service/webservice/BookServiceClient.groovy"/>

         <property name="serviceUrl" value="http://localhost:8080/springside/service/BookService" />

    </bean>

</beans>

˜q™ä¸ªæ¶ˆè´¹Web服务的bean定义为BookServiceClientåQŒå®ƒæ˜¯é‡‡ç”¨Groovy脚本语言定义了。在Spring参考手å†?2.0-M3)中的½W?5章专门介¾låœ¨Spring中脚本语­a€çš„ä‹É用,脚本语言支持是Spring 2.0新增的内å®?目前可以支持Groovy、BeanShell、Jruby三种脚本语言ã€?/span>

˜q™ä¸ªBookServiceClient最¾lˆæ˜¯åœ¨dwr中ä‹É用,可以

plugins"org.springside.ajax.dwr"webapp"WEB-INF"dwr.xml中的定义�/span>

在SpringSide,采用Aegisçš„binding方式åQŒåœ¨

plugins"org.springside.webservice.xfire"src"org"springside"bookstore"service"webservice"BookService.aegis.xml中定义了˜q”回值的¾cÕdž‹åQ?/span>

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

<mappings>

    <mapping>

        <method name="findBooksByName">

            <return-type componentType="org.springside.bookstore.domain.Book"/>

        </method>

        <method name="findBooksByCategory">

            <return-type componentType="org.springside.bookstore.domain.Book"/>

        </method>

        <method name="getAllCategorys">

            <return-type componentType="org.springside.bookstore.domain.Category"/>

        </method>

    </mapping>

</mappings>

XFire在SpringSide中的应用ž®×ƒ»‹¾låˆ°˜q™é‡Œä¸ºæ­¢ã€?/span>



]]>
Xfireçš„aegis¾l‘定方式配置ž®ç»“http://www.aygfsteel.com/WshmAndLily/articles/183413.htmlsemovysemovyMon, 03 Mar 2008 03:23:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/183413.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/183413.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/183413.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/183413.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/183413.html首先说明åQŒaegis为XFire默认的绑定方式,何时需要绑定?

当ä‹É用JDK1.4æ—Óž¼Œæˆ–者对JDK1.5的范型和注释不是很熟悉的情况下,当遇到需要映ž®„POJO或配¾|®WebService接口æ–ÒŽ³•˜q”回¾cÕdž‹(如集合类åž?æ—Óž¼Œéœ€è¦è¿›è¡Œç»‘定,此时aegisçš„ç»‘å®šäØ“å»ºç«‹.aegis.xml的文件ã€?/p>

1.当封装的接口¾cÖM¸­åQŒæŸæ–ÒŽ³•˜q”回集合¾cÕdž‹æ—Óž¼Œaegis的绑定方式:

例如åQŒéœ€è¦å°†ä»¥ä¸‹æŽ¥å£ž®è£…

代码

  1. public interface UserInfo {   
  2.   
  3.     public User findUserInfosByUserID(String userUniqueID);   
  4.     public String test();   
  5.     public Collection findRoleInfosByUserID(String userUniqueID);   
  6.     }   
  7.   

 

观察此接口,受限我们看findRoleInfosByUserIDæ–ÒŽ³•åQŒæ­¤æ–ÒŽ³•ä¼ å…¥String,˜q”回¾cÕdž‹ä¸ºCollectionåQŒæ­¤æ—Óž¼Œæˆ‘们即需要配¾|®findRoleInfosByUserIDæ–ÒŽ³•ã€?

配置步骤åQŒåœ¨æŽ¥å£¾cȝš„同一包下建立和接口名相同的aegis.xmlæ–‡äšgåQŒå³UserInfo.aegis.xmlæ–‡äšgã€?

UserInfo.aegis.xml

代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <mappings>  
  3.     <mapping>  
  4.         <method name="findRoleInfosByUserID">  
  5.             <return-type  
  6.                 componentType="com.tongtech.bjvsp.sysmng.entity.Role" />  
  7.         </method>  
  8.     </mapping>  
  9. </mappings>  
  10.   

 

其中åQŒmethod代表需要配¾|®çš„æ–ÒŽ³•名,ç”׃ºŽXFire可以支持基本¾cÕdž‹åQŒé’ˆå¯šw›†åˆç±»åž‹æ—¶åQŒéœ€è¦é…¾|®ï¼Œ˜q”回¾cÕdž‹æˆ–å‚æ•°ç±»åž‹äØ“åŸºæœ¬¾cÕdž‹æ—¶ä¸éœ€è¦ç‰¹ŒDŠé…¾|®ã€?

<return-type/>为配¾|®è¿”回类型,componentType属性代表返回的集合中所包含的类åQŒæ­¤¾cÕd¯ä»¥æ˜¯è‡ªå®šä¹‰çš„对象åQŒä¹Ÿå¯ä»¥æ˜¯åŸºæœ¬ç±»åž?例如java.lang.String

此时åQŒfindRoleInfosByUserIDæ–ÒŽ³•配置完毕

PSåQŒè¿˜æ‹¿æ­¤æŽ¥å£ä¸¾ä¾‹åQŒå¦‚接口中,findRoleInfosByUserID接受的参æ•îC¹Ÿä¸ºé›†åˆç±»åž‹ï¼Œé‚£ä¹ˆéœ€è¦åœ¨<method></method>之间再加入以下代ç ?

代码

  1. <parameter index="0" componentType="java.lang.String"/>   

 

index="0"代表æ–ÒŽ³•的参数的序号åQ?即第一个参数ã€?

componentType代表集合参数内包含的¾cÕdž‹åQŒä¹Ÿå¯ä»¥ä¸ø™‡ªå®šä¹‰å¯¹è±¡åQŒä¾‹å¦‚User

注意åQŒå¦‚æžœfindRoleInfosByUserIDæ–ÒŽ³•有两个参敎ͼŒä¸€ä¸ªæ¯”如䨓StringåQŒä¸€ä¸ªäؓ集合åQŒé‚£ä¹ˆåªéœ€è¦é…¾|®é›†åˆå‚数即可ã€?

二。映ž®„POJO

比如˜q˜æ˜¯ä¸Šé¢çš„UserInfo接口åQŒç¬¬ä¸€ä¸ªæ–¹æ³?

public User findUserInfosByUserID(String userUniqueID);

此时åQŒè¿”å›žç±»åž‹äØ“User

如果User中仅为基本类型,例如StringåQŒint½{‰åŸºæœ¬ç±»åž‹ï¼Œæ— éœ€é…ç½®User

但如果User中还包含有其他类型,比如包含有SetåQŒListåQŒé‚£ä¹ˆéœ€è¦å¯¹å…¶è¿›è¡Œé…¾|?

比如User代码如下åQ?

代码

  1. public class User  implements java.io.Serializable {   
  2.   
  3.     // Fields       
  4.   
  5.      private Integer userId;   
  6.      private String loginName;   
  7.      private String userPassword;   
  8.      private Integer SOrder;   
  9.      private String userCa;   
  10.      private String userName;   
  11.      private String userTel;   
  12.      private String userEmail;   
  13.      private String ZNote;   
  14.      private String userCode;   
  15.      private DicSystemAuth SDicSystemAuth;   
  16.      private Set SGroupUsers = new HashSet(0);   
  17.      private Set SUserDepts = new HashSet(0);   
  18. }   

 

此时User中还包含有SDicSystemAuth的对象,以及SUserDepts½{‰Set集合

˜q™ç§æƒ…况主要可能会出现在使用HibernateåQŒæ˜ ž®„一对一åQŒä¸€å¯¹å¤šè¡¨æ—¶

˜q™é‡Œè¦ç‰¹åˆ«æ³¨æ„?

那么此时我们需要对User˜q›è¡Œaegis¾l‘定åQŒæŽ§åˆ¶POJOå’ŒXML的映ž®?

配置æ–ÒŽ³•åQ?

在User对象所在包内徏立User.aegis.xml

ç”׃ºŽUser中包含SetåQŒé‚£ä¹ˆåªéœ€è¦å¯¹é›†åˆåšè®¾¾|®å³å¯ï¼ŒDicSystemAuth下面单独讨论

我们可以分两‹Æ¡æ¥é…ç½®åQŒåˆ†åˆ«è®²è§?

1,

代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <mappings xmlns:my="http://my.bjvsp.tongtech.com">  
  3. <mapping name="my:User">  
  4. <property name="SGroupUsers" componentType="com.tongtech.bjvsp.sysmng.entity.GroupUser"/>  
  5. <property name="SUserDepts" componentType="com.tongtech.bjvsp.sysmng.entity.UserDept"/>  
  6. </mapping>  
  7. </mappings>  

 

此时åQŒé…¾|®æ–‡ä»¶ä¸­é…ç½®äº†ä¸¤ä¸ªSet集合åQŒcomponentType明确定义了Set集合内包含的内容

此时åQŒDicSystemAuth即便是自定义的对象类åQŒç”±äºŽä¸æ˜¯é›†åˆï¼ŒXFire也可以对其正¼‹®æ˜ ž®„ã€?

2

代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <mappings xmlns:my="http://my.bjvsp.tongtech.com">  
  3. <mapping name="my:User">  
  4.   
  5. <property name="SGroupUsers" ignore="true"/>  
  6. <property name="SUserDepts" ignore="true"/>  
  7. <property name="SDicSystemAuth" ignore="true"/>  
  8. </mapping>  
  9. </mappings>  

 

½W¬äºŒ¿Uæ–¹å¼ï¼Œå®šä¹‰äº†ä¸‰ä¸ªå­—ŒDµï¼Œòq¶ä‹É用了ignore属性,表示˜q™ä¸‰ä¸ªå±žæ€§ä¸èƒ½è¢«åºåˆ—化ã€?

那么åQŒä½•时会遇到¾cÖM¼¼äºŽUser中Set集合åQŒä¸è¢«åºåˆ—化呢?

当客æˆïL«¯è®‰K—®æœ¬åœ°ä»£ç†æ—Óž¼Œå¦‚æžœUser表内包含有其他表的关联时åQŒå¦‚果基于hibernate的持久层åQŒç”±äºŽhibernate的惰性加载机åˆÓž¼ŒåŠ è²User时仅会将User中的属性值加载而不会加载关联表中的å€û|¼Œæ¯”如setå’ŒSDicSystemAuth对象½{‰ï¼Œå½“客æˆïL«¯è®‰K—®æœ¬åœ°ä»£ç†åQŒåºåˆ—化User对象æ—Óž¼Œå¦‚果没有讄¡½®å…Œ™”字段是否序列化,那么它会ž®†å…¶å…¨éƒ¨åºåˆ—化,但当序列化时åQŒç”±äºŽhibernate的惰性加载,此时Session已经关闭åQŒé‚£ä¹ˆåœ¨åºåˆ—化关联字ŒD늚„时候,ž®×ƒ¼šå‡ºçްsession was close的异常。因此解军_Šžæ³•æ˜¯åœ¨aegis¾l‘定时制定关联字ŒD늚„ignore属性设¾|®äØ“trueã€?/p>

˜q˜æœ‰ä¸€¿Uè§£å†›_Šžæ³•ï¼Œž®±æ˜¯ä»ç„¶æŒ‰ç…§½W¬ä¸€¿Ué…¾|®æ–¹å¼ï¼Œæ˜Žç¡®æŒ‡æ˜Žå…Œ™”çš„Set集合内的对象åQŒä½†åœ¨æ‰§è¡Œåºåˆ—化前,session关闭之前åQŒæå‰å°†å…Œ™”字段内的值初始化ã€?

用Hibernate.initialize初始�/p>

最后补充一ž®å¥

XFire对于自定义的对象可以聪明的找刎ͼŒå‰ææ˜¯å®ƒä¸åŒ…含集å?

例如你的æ–ÒŽ³•˜q”回一个User对象

User中都是基本类型,或者User中包含有Dept对象的引用,都没有问题�

但如果你不希望加载user时序列化Dept出问题,ž®×ƒ¹–乖把dept初始化或ž®†deptçš„ignore属性设¾|®äØ“true



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÁøÁÖÏØ| ÆëÆë¹þ¶ûÊÐ| ¸ßÇàÏØ| ºôͼ±ÚÏØ| ǧÑôÏØ| Ö麣ÊÐ| ¸Õ²ìÏØ| ÌÚ³åÏØ| ËÄ×ÓÍõÆì| ƽÓßÏØ| Î÷Æ½ÏØ| ̨ɽÊÐ| ·áÔ­ÊÐ| ÅæÏØ| ºé¶´ÏØ| ÒÁ½ð»ôÂåÆì| Ì«²ÖÊÐ| »Æ´óÏÉÇø| ¹ðÑôÏØ| ¾¸°²ÏØ| ¼¦Î÷ÊÐ| °¢ÍßÌáÏØ| кÍÏØ| Õû¯ÊÐ| ÄþÄÏÏØ| »ôÉ½ÏØ| ÊÓÆµ| °×ºÓÏØ| ÜìÄÏÏØ| ºÍÌïÊÐ| ½´¨ÏØ| ¶«¹âÏØ| ÏæÏçÊÐ| »ù¡ÊÐ| »ÆÆ½ÏØ| ºÏ×÷ÊÐ| ¸ßÇå| ¶õÍÐ¿ËÆì| ÑîÆÖÇø| ¹Å½»ÊÐ| º¼ÖÝÊÐ|