服务器端:CXF 开发 webservice,实现输入用户id,返回用户信息:主要是webservice标签的使用。
先写接口:
package com.webservice.users;
import javax.jws.*;
import com.ready.dto.*;
//注意这里不是serviceName,而是name,在wsdl文件中显示为:xxx.wsdl
//targetNamespace对应wsdl中的namespace
@WebService(name = "userService",targetNamespace = UserInfo.NS)
public interface UserInfo {
?public static final String NS = "http://localhost:8080/WebServicePractice1";
?//这里的name体现在返回的xml文件中
?@WebResult(name = "getUsersInfo")
?public GetUserDto getUser(
???@WebParam(name = "userId") int userId);
?}
?
实现类:
package com.webservice.users;
import com.ready.dto.*;
import com.ready.users.*;
import javax.jws.WebService;
//实现的接口名称
@WebService(endpointInterface="com.webservice.users.UserInfo")
public class UserInfoImpl implements UserInfo {
?
? UserBeanCl ubc = new UserBeanCl();
???? public GetUserDto getUser(int userId) {
??return ubc.getUserInfoById(userId);
?}}
?
UserBean类
package com.ready.users;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
//propOrder指定java中的各个属性在xml中显示的位置
@XmlType(name="User",propOrder={"userId","userName","userAge","userSex"})
@XmlAccessorType(XmlAccessType.FIELD)
public class UserBean {
?private int userId;
?private String userName;
?private int userAge;
?private String userSex;
?public int getUserId() {
??return userId;
?}
?public void setUserId(int userId) {
??this.userId = userId;
?}
?public String getUserName() {
??return userName;
?}
?public void setUserName(String string) {
??this.userName = string;
?}
?public int getUserAge() {
??return userAge;
?}
?public void setUserAge(int i) {
??this.userAge = i;
?}
?public String getUserSex() {
??return userSex;
?}
?public void setUserSex(String userSex) {
??this.userSex = userSex;
?}
}
?
GetWordDto类
package com.ready.dto;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlType;
import com.webservice.users.UserInfo;
import com.ready.users.*;
//将类映射为xml模型
@XmlType(name = "",namespace = UserInfo.NS)
public class GetUserDto {
?
?private ArrayList<UserBean> userList;
?private int length;
?//这两行不加,程序也能正常运行,这两句的作用相当于给元素穿个外套
?//给user加一层包裹,而且必须加在get、set方法上
?@XmlElementWrapper(name = "users")
?@XmlElements(@XmlElement(name = "user",type = UserBean.class))
?public ArrayList<UserBean> getUserList() {
??return userList;
?}
?public void setUserList(ArrayList<UserBean> userList) {
??this.userList = userList;
?}
?public int getLength() {
??return length;
?}
?public void setLength(int length) {
??this.length = length;
?}
}
以上是web工程的主要类(没有写全)
配置文件,网上很多,这里不再赘述。
主要讲一下android客户端的WebService类:用到第三方软件:Ksoap2.
package com.webservice;
import java.lang.String;
import java.util.*;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.ksoap2.transport.HttpTransportSE;
import com.datatype.*;
public class Webservice{
?private static final String NAMESPACE = "http://192.168.6.245:8080/WebServicePractice1";
?private static String URL = "http://192.168.6.245:8080/WebServicePractice1/Info";
?private static final String GETMETHOD_NAME = "getUser";
?private static String SOAP_GETACTION = "http://192.168.6.245:8080/WebServicePractice1/Info/getUser";
?private static ArrayList<UserBean> usersList;
??? public static ArrayList<UserBean> getUsers() {
??try {
???SoapObject rpc = new SoapObject(NAMESPACE,GETMETHOD_NAME);
???rpc.addProperty("userId",1);
???SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
???envelope.bodyOut = rpc;
???envelope.setOutputSoapObject(rpc);
???
???HttpTransportSE ht = new HttpTransportSE(URL);
???ht.debug = true;//允许调试
???ht.call(SOAP_GETACTION,envelope);
???System.out.println("call==");
???SoapObject detail = (SoapObject)envelope.getResponse();
???SoapObject result = (SoapObject)detail.getProperty("users");
???
???int userNumber = result.getPropertyCount();
???System.out.println("用户的个数为:"+userNumber);
???usersList = new ArrayList<UserBean>();
???for (int i = 0; i < userNumber; i++)
???{
????SoapObject tempObject = null;
????UserBean ub = new UserBean();
????tempObject = (SoapObject)result.getProperty(i);
????ub.setUserId(Integer.parseInt(tempObject.getProperty("userId").toString()));
????ub.setUserName(tempObject.getProperty("userName").toString());
????ub.setUserAge(Integer.parseInt(tempObject.getProperty("userAge").toString()));
????System.out.println("年龄为:"+ub.getUserAge());
????ub.setUserSex(tempObject.getProperty("userSex").toString());
????System.out.println("性别为:"+ub.getUserSex());
????usersList.add(ub);
???}??????
???????????
??} catch (Exception e) {
???System.out.println("意外发生!");
???e.printStackTrace();
??}
??return usersList;
?}
?
}
?
用android访问本地服务,网址不能为:http://localhost:8080/xxx,而应该是你的IP地址,或者是:http://10.0.2.2。而且wsdl地址http://192.168.6.245:8080/WebServicePractice1/Info,这里不能有“?wsdl”(访问公网需要)。我就是在这里花费了很长时间调试,希望路过的朋友们不要走弯路!