返回小于给定数的所有素数!
<!----><!---->activaton-1.1.jar
jaxen-1.1-beta-9.jar
jdom.jar
spring-beans.jar
spring-context.jar
spring-core.jar
spring-web.jar
stax-api-1.0.1.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.0.jar
xbean-2.2.0.jar
xbean-spring-2.8.jar
下载地址:
http://www.fs2you.com/files/773351f0-caf4-11dc-938c-0014221b798a/
<!----><!---->工程根目录
|
|-src
| |
| -cn.com.xinli.lmss.ws.impl
| | |
| | -MathService.java
| |
| -cn.com.xinli.lmss.ws.interfaces
| | |
| | -MathServiceIF.java
| |
| -META-INF
| |
| -xfire
| |
| -services.xml
|
|-webroot
| |
| -WEB-INF
| |
| -web.xml
<!---->
MathServiceIF类
package cn.com.xinli.lmss.ws.interfaces;
import java.util.List;
public interface MathServiceIF {
/**
* @param num
* @return 返回小于给定数的所有素数的集合
*/
public int[] getPrimeNumberArray(int num);
/**
* @param num
* @return 返回小于给定数的所有素数的集合,以List形式返回
*/
public List getPrimeNumberList(Integer num);
}
实际上完成这个需求只需要方法getPrimeNumberArray就可以了,但是为了说明XFire的aegis绑定,所以提供了getPrimeNumberList方法。
MathService类
package cn.com.xinli.lmss.ws.impl;
import java.util.ArrayList;
import java.util.List;
import cn.com.xinli.lmss.ws.interfaces.MathServiceIF;
public class MathService implements MathServiceIF {
public int[] getPrimeNumberArray(int num) {
System.out.println("调用了");
List<Integer> list = getPrimeNumberList(new Integer(num));
int a[] = new int[list.size()];
for (int i=0;i<list.size();i++) {
Integer temp = list.get(i);
a[i] = temp.intValue();
}
return a;
}
public List<Integer> getPrimeNumberList(Integer num) {
List<Integer> list = new ArrayList<Integer>();
for(int i=1;i<=num;i++)
{
if(isPrimeNumber(i))
{
list.add(new Integer(i));
}
}
return list;
}
/**
* @param num
* @return 如果这个数是素数,返回true,否则返回false
*/
public boolean isPrimeNumber(int number){
if(number<2)
return false;
for(int i=2;i<=Math.sqrt(number);i++){
if(number%i==0&&number!=2)
return false;
}
return true;
}
}
方法实现了,现在来把它发布成一个web服务。
在src下边创建一个文件夹META-INF,在META-INF下边在创建一个目录xfire,在xfire目录里边创建一个xml文件,services.xml,内容如下:
<beans>
<service xmlns="http://xfire.codehaus.org/config/1.0">
<name>MathService</name>
<namespace>http://lmss.xinli.com.cn</namespace>
<serviceClass>cn.com.xinli.lmss.ws.interfaces.MathServiceIF</serviceClass>
<implementationClass>cn.com.xinli.lmss.ws.impl.MathService</implementationClass>
</service>
</beans>
然后把webroot目录发布到tomcat上边去,我发布名称是xfire
先看看web.xml的配置
<?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">
<display-name>素数计算</display-name>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
启动tomcat,我的访问地址是,http://localhost:8080/xfire/services访问后,结果令人沮丧,挂了。有一个错误如下:<!----><!---->
<!---->
大致意思是在MathServiceIF类中没有指明getPrimeNumberList返回值的List中的类型。
首先说明,Aegis为XFire默认的绑定方式,何时需要绑定?
1.基本类型:int,double,float,long,byte[],short,String,decimal
2.数组(Array)
3.集合类型(Collection)
4.日期类型:java.util.Date, java.util.Calendar, java.sql.Timestamp, java.sql.Date, java.sql.Time
5.XML:org.w3c.dom.Docmument, org.jdom.Element, XMLStreamReader,XML文本
6.包含以上类型的自定义类型
1.集合类型(Collection)
2.包含集合类型的自定义类型
当使用JDK1.4时,或者是使用了JDK1.5及以上版本但是没有使用泛型的时候、当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时,需要进行绑定,此时aegis的绑定为建立.aegis.xml的文件。
例如,需要将以下接口封装
public interface UserService {
public User findUserById(String id);
public String test();
public Collection findRolesByUserId(String id);
}
观察此接口,首先我们看findRolesByUserId方法,此方法传入String,返回类型为Collection,此时,我们即需要配置findRolesByUserId方法。
配置步骤,在接口类的同一包下建立和接口名相同的aegis.xml文件,即UserService.aegis.xml文件。
UserService.aegis.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<method name="findRolesByUserId">
<return-type
componentType="cn.com.xinli.lmss.entity.Role" />
</method>
</mapping>
</mappings>
其中,method代表需要配置的方法名,由于XFire可以支持基本类型,针对集合类型时,需要配置,返回类型或参数类型为基本类型时不需要特殊配置。<return-type/>节点是用来配置返回的Collection中的对象类型,componentType属性代表返回的集合中所包含的类,此类可以是自定义的对象,也可以是基本类型,当然,如果这个类也是包含需要绑定的类型时,需要对这个类也进行aegis说明,详细见下边的例子。
到此,findRolesByUserId方法配置完毕
这里需要注意,参数如果也是需要绑定的类型时,也需要aegis说明,使用的是<parameter index="0" componentType="java.lang.String"/>。另外如果方法有两个参数,一个比如为String,一个为集合,那么只需要配置集合参数即可。注意index的值要是集合参数的位置。
晕,字太多了,看附件好了,另外附上工程源码的下载地址
http://www.fs2you.com/files/82779ceb-cb28-11dc-81e5-0014221f3995/