??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人亚洲精品蜜芽影院,精品国产_亚洲人成在线高清,亚洲AV日韩精品久久久久久http://m.tkk7.com/WshmAndLily/category/29851.htmlzh-cnMon, 10 Mar 2008 10:08:21 GMTMon, 10 Mar 2008 10:08:21 GMT60myeclipse下用XFire开发webservicehttp://m.tkk7.com/WshmAndLily/articles/184708.htmlsemovysemovySat, 08 Mar 2008 09:07:00 GMThttp://m.tkk7.com/WshmAndLily/articles/184708.htmlhttp://m.tkk7.com/WshmAndLily/comments/184708.htmlhttp://m.tkk7.com/WshmAndLily/articles/184708.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/184708.htmlhttp://m.tkk7.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回cd是String ,String[]?参数是Stringcd的方法不用定?-->
    <method name="getStringList">
       <return-type  componentType="java.lang.String" /><!-- q回cd对应集合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回Listcd值的Ҏ(gu),需要定?List容器中的元素cd为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回Usercd值的Ҏ(gu).Ҏ(gu)参数是字W串.
  User a_user = srvc.getUserById("2");
  System.out.print(a_user.toString());
  
  //调用参数为User的方?没有q回?不用配置Ҏ(gu)
  srvc.addUser(new User("4","d的名U?,"d的备?));
  
  //调用q回Listcd值的Ҏ(gu),需要定?List容器中的元素cd为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 />



semovy 2008-03-08 17:07 发表评论
]]>
Xfireq回Listcd的详l测?/title><link>http://m.tkk7.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://m.tkk7.com/WshmAndLily/articles/183418.html</guid><wfw:comment>http://m.tkk7.com/WshmAndLily/comments/183418.html</wfw:comment><comments>http://m.tkk7.com/WshmAndLily/articles/183418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/WshmAndLily/comments/commentRss/183418.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/WshmAndLily/services/trackbacks/183418.html</trackback:ping><description><![CDATA[工作需要,昨天开始学?fn)XfireQ方便是感到很方便,但是对于他的默认l定配置Q始l有些模p,其是List以及(qing)数组相关的。今天谢了一个关于返回List的具体调用测试,应该比较全了,大家׃n?<br /> <br /> 业务假设是根据billnoQ查询数据库Q得到ResultSetl果Q然后将ResultSet包装成Listq回?<br /> <br /> server端:(x) <br /> public   interface   IgetInfo   { <br /> //每一条记录作Z个String[]Q存放与List?<br /> public   List <String[]>   getListOfStringArrays(String   billno); <br />                   //每一条记录合qؓ(f)一个StringQ存放与List?<br /> public   List <String>   getListOfString(String   billno); <br /> //已String[]的Ş式只q回一条记?<br />                   public   String[]   getStringArrays(String   billno); <br />                   //和第一个方法类|只是String[]Ҏ(gu)List <br />                   public   List <List>   getListOfList(String   billno); <br /> } <br /> 具体实现cd不写了,相应的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类型,均不行,不知道ؓ(f)?<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一UList <String[]> q回cd。感觉上应该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://m.tkk7.com/WshmAndLily/aggbug/183418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:28 <a href="http://m.tkk7.com/WshmAndLily/articles/183418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire传入传出自定义类型和集合cd学习(fn)W记http://m.tkk7.com/WshmAndLily/articles/183417.htmlsemovysemovyMon, 03 Mar 2008 03:27:00 GMThttp://m.tkk7.com/WshmAndLily/articles/183417.htmlhttp://m.tkk7.com/WshmAndLily/comments/183417.htmlhttp://m.tkk7.com/WshmAndLily/articles/183417.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/183417.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/183417.html阅读全文

semovy 2008-03-03 11:27 发表评论
]]>
XFire Web Service验证Ҏ(gu) http://m.tkk7.com/WshmAndLily/articles/183416.htmlsemovysemovyMon, 03 Mar 2008 03:26:00 GMThttp://m.tkk7.com/WshmAndLily/articles/183416.htmlhttp://m.tkk7.com/WshmAndLily/comments/183416.htmlhttp://m.tkk7.com/WshmAndLily/articles/183416.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/183416.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/183416.htmlXFire的文做的真是相当的烂,非常不详l,看得匪夷所思,而且和发行的代码版本相当的不匚wQ里面的CZҎ(gu)无法q行Q看得真?#8230;…相当H火
公司目XFire的服务框架我已经做好Q这两天p加入验证功能Q而且要和整体权限框架Q还没做Q相l合
开始想通过HttpSession验证Q这样可以很方便的和b/s的权限系l相l一Q但实在不知道如何在客户端通过Spring或XFire讉KHttpSessionQXFire里的文档倒是提到了:(x)
HttpServletRequest request = XFireServletController.getRequest();
HttpServletResponse response = XFireServletController.getResponse();

q且说只要在web.xml里配|XFireSpringServlet可以,可是按照配了Q结果还是不?/div>
注:(x)axis好像是有MessageContext可以很方便的讉K刎ͼxfire里也有MessageContextQ可是getSession()出来的是null
如果有高手知道如何做q望ȝ(ch)告知

此条路不通只好去查XFire的文档关于authentication部分Q大概有以下几种Ҏ(gu)Q?/div>
  1. HTTP Authentication
  2. SOAP Header authentication with JSR181
  3. SOAP authentication with handlers
  4. WS-Security
其中W一条HTTP Authentication的文档写的相当匪h思,文写到如何在客L(fng)指定用户名和密码
// 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 JSR181Q看h倒是很简?/p>

但是在Service的代码中每个Ҏ(gu)里都要写一个UserToken验证的参敎ͼ虽然g权限_度能控制得很细Q但是这严重污染了业务逻辑的代码,非常的不优雅Q放弃!


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

// do your normal request here
}

再看WS-SecurityQ这是webservice的安全标准,但实在太复杂了,q且需要配|Service.xmlQ我们项目是Java1.5QService.xmlҎ(gu)没有写Q是自动生成的,我是实在找不到Service.xml该在那配|?只好作Ş


现在只剩下SOAP authentication with handlersQ根据文来看这是能够满x的要求的Q不侵入业务逻辑Q能够和整体权限pȝ相结合,q且配置比较?/div>
把例子里的代码拷q来Q发现根本不能用Q少了yomq个包,在网上找了很久也没找刎ͼ后来发现yom其实是yet(another) document object modelQ原来和dom是一回事嘛,用jdom替换Q编译通过?br />
文里遗漏了很重要的一点,是关于如何在xfire-servlet里配|,D很多人看了文档也q行不下去,我查了很久才在老外的一blog里找C点tipsQ下面是配置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需要修改一下,其他不用变:(x)

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和passwordQ那验证它吧(可以交给acegi来验证)(j)
            }

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

客户端代码:(x)

            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"));
            // 执行下面代码?x)进行验?br />             service.someOperation();


semovy 2008-03-03 11:26 发表评论
]]>[webservices开发]XFire在SpringSide中的应用 http://m.tkk7.com/WshmAndLily/articles/183415.htmlsemovysemovyMon, 03 Mar 2008 03:25:00 GMThttp://m.tkk7.com/WshmAndLily/articles/183415.htmlhttp://m.tkk7.com/WshmAndLily/comments/183415.htmlhttp://m.tkk7.com/WshmAndLily/articles/183415.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/183415.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/183415.htmlSpringSide开源项目是国内的开发h员所做的一个以Spring为核心的开源项?目的?/span>提供一?/span>Pragmatic的企业应用开发基和最?jng)_践展C。ؓ(f)使用Spring框架的开发者提供一个非Demo版的复杂、正式而体现最佳用实늚参照pȝ。ؓ(f)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-M3Q?.18节中有介l,3.19节介l了在web.xml配置bean定义文g的方法,是上一节用的Ҏ(gu)?/span>

W二步,处理映射Q将/BookService URL和bookServiceq个bean联系h。当?dng)q里bookService又承了baseWebServiceQ这样做挺y妙,q样如果有多个Web服务beanQ就l承baseWebService可以了Q这U面向对象的概念q是值得我们提倡的QSpring参考手?.5节介l了相关的知识?/span>

在bookService的定义中QserviceBean也就是接口实现类为bookManager beanQ这个bean实际是在WEB-INF/classes/applicationContext-manager.xml文g中所定义Q类名ؓ(f)org.springside.bookstore.service.logic.BookManagerQ?/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.BookServiceQ?/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服务的beanQ?/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定义为BookServiceClientQ它是采用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回值的cdQ?/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>



semovy 2008-03-03 11:25 发表评论
]]>
Xfire的aegisl定方式配置结http://m.tkk7.com/WshmAndLily/articles/183413.htmlsemovysemovyMon, 03 Mar 2008 03:23:00 GMThttp://m.tkk7.com/WshmAndLily/articles/183413.htmlhttp://m.tkk7.com/WshmAndLily/comments/183413.htmlhttp://m.tkk7.com/WshmAndLily/articles/183413.html#Feedback0http://m.tkk7.com/WshmAndLily/comments/commentRss/183413.htmlhttp://m.tkk7.com/WshmAndLily/services/trackbacks/183413.html首先说明Qaegis为XFire默认的绑定方式,何时需要绑定?

当用JDK1.4Ӟ或者对JDK1.5的范型和注释不是很熟(zhn)的情况下,当遇到需要映POJO或配|WebService接口Ҏ(gu)q回cd(如集合类?Ӟ需要进行绑定,此时aegis的绑定ؓ(f)建立.aegis.xml的文件?/p>

1.当封装的接口cMQ某Ҏ(gu)q回集合cdӞaegis的绑定方式:(x)

例如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Ҏ(gu)Q此Ҏ(gu)传入String,q回cd为CollectionQ此Ӟ我们即需要配|findRoleInfosByUserIDҎ(gu)?

配置步骤Q在接口cȝ同一包下建立和接口名相同的aegis.xml文gQ即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.   

 

其中Qmethod代表需要配|的Ҏ(gu)名,׃XFire可以支持基本cdQ针寚w合类型时Q需要配|,q回cd或参数类型ؓ(f)基本cd时不需要特D配|?

<return-type/>为配|返回类型,componentType属性代表返回的集合中所包含的类Q此cd以是自定义的对象Q也可以是基本类?例如java.lang.String

此时QfindRoleInfosByUserIDҎ(gu)配置完毕

PSQ还拿此接口举例Q如接口中,findRoleInfosByUserID接受的参C为集合类型,那么需要在<method></method>之间再加入以下代?

代码

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

 

index="0"代表Ҏ(gu)的参数的序号Q?即第一个参数?

componentType代表集合参数内包含的cdQ也可以定义对象Q例如User

注意Q如果findRoleInfosByUserIDҎ(gu)有两个参敎ͼ一个比如ؓ(f)StringQ一个ؓ(f)集合Q那么只需要配|集合参数即可?

二。映POJO

比如q是上面的UserInfo接口Q第一个方?

public User findUserInfosByUserID(String userUniqueID);

此时Q返回类型ؓ(f)User

如果User中仅为基本类型,例如StringQint{基本类型,无需配置User

但如果User中还包含有其他类型,比如包含有SetQListQ那么需要对其进行配|?

比如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的对象,以及(qing)SUserDepts{Set集合

q种情况主要可能?x)出现在使用HibernateQ映一对一Q一对多表时

q里要特别注?

那么此时我们需要对Userq行aegisl定Q控制POJO和XML的映?

配置Ҏ(gu)Q?

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

׃User中包含SetQ那么只需要对集合做设|即可,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集合QcomponentType明确定义了Set集合内包含的内容

此时QDicSystemAuth即便是自定义的对象类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何时会(x)遇到cM于User中Set集合Q不被序列化呢?

当客L(fng)讉K本地代理Ӟ如果User表内包含有其他表的关联时Q如果基于hibernate的持久层Q由于hibernate的惰性加载机Ӟ加蝲User时仅?x)将User中的属性值加载而不?x)加载关联表中的|比如set和SDicSystemAuth对象{,当客L(fng)讉K本地代理Q序列化User对象Ӟ如果没有讄兌字段是否序列化,那么它会(x)其全部序列化,但当序列化时Q由于hibernate的惰性加载,此时Session已经关闭Q那么在序列化关联字D늚时候,׃(x)出现session was close的异常。因此解军_法是在aegisl定时制定关联字D늚ignore属性设|ؓ(f)true?/p>

q有一U解军_法,是仍然按照W一U配|方式,明确指明兌的Set集合内的对象Q但在执行序列化前,session关闭之前Q提前将兌字段内的值初始化?

用Hibernate.initialize初始?/p>

最后补充一句

XFire对于自定义的对象可以聪明的找刎ͼ前提是它不包含集?

例如你的Ҏ(gu)q回一个User对象

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

但如果你不希望加载user时序列化Dept出问题,׃乖把dept初始化或dept的ignore属性设|ؓ(f)true



semovy 2008-03-03 11:23 发表评论
]]>
վ֩ģ壺 þþ뾫Ʒպ| ҹպһ| ۺۺͼ| AVרһ| Ļһ| պۺϾƷ| ˬýôƵ| 㽶þþƷ| wŷs| ƷŮþþ| ƷþþþóѶ | 1000ƬƵѿ| þ޾ƷAVӣ| 91˳վɫwww| ޳˸| þùƷһ| ޾ƷƷɫ| ҹƷ߹ۿ| ˾Ʒ˳| ĻѴƬa| պaëƬѹۿ| ŮͰˬ30| ɫٸŮ11p| ҹϼӰԺ| ۺɫ߹ۿ| ɫþƷƵ| ŮڵƵ| ޾Ʒ2345| Ļ߳վ| ޹Ʒþþþ| ƵƷ| Ƶ| רȷӰ| ССӰձۿ| Ʒhdѹۿ| ޾Ʒ| ޾ƷƵþþ| 69Ƶ߹ۿ| ɫƵ߹ۿ| ۺϼƵ| JIZZJIZZйٸ|