WebService初学-web_service

前些天去南京参加中国软件杯比赛的时候看到有些队伍在获取学校的数据时用到了WebService,感觉挺实用,自己趁着周末也入门了一下。

首先自己先创建一个WebService工程。这里我使用了Web项目来发布WebService。

下面是项目源码的结构:

其中WebServiceAction是一个servlet类,用来发布WebService。util包有两个工具类,BusQueryService是WebService的主要类,这里提供的是公交信息查询的服务。

要成为WebService,需要再类上加入@WebService注解,注解的参数看个人喜欢设置(也可以不设置)。

下面是BusQueryService的源码:

 1 package itc10.ws;
 2
 3 import java.util.List;
 4
 5 import javax.jws.WebParam;
 6 import javax.jws.WebResult;
 7 import javax.jws.WebService;
 8
 9 import org.dom4j.Document;
10 import org.dom4j.Element;
11
12 import itc10.util.HttpUtil;
13 import itc10.util.StringUtil;
14 /**
15  * 公交信息WebService.包含公交线信息查询和公交站信息查询
16  * @author ITC10
17  */
18 @WebService(  serviceName = "busQueryWS",   portName = "busQueryPort",   name = "busQuery",   targetNamespace = "itc10.ws")
19 public class BusQueryService {
20
21     private static final String LINE_URL = "http://openapi.aibang.com/bus/lines";
22     private static final String STATE_URL = "";
23     private static final String KEY = "7d3dbe746b8673****84ddb6a3da27f1";
24
25     // 公交线查询
26     public @WebResult(name = "lineInfo") String queryLine(
27             @WebParam(name = "city") String city,
28             @WebParam(name = "line") String line) {
29
30         if (city == null || "".equals(city)) {
31             return "--参数city不能为空--";
32         }
33         if (line == null || "".equals(line)) {
34             return "--参数line不能为空--";
35         }
36
37         StringBuffer url = new StringBuffer();
38         url.append(LINE_URL).append("?app_key=").append(KEY)
39             .append("&city=").append(HttpUtil.encodeURL(city))
40             .append("&q=").append(HttpUtil.encodeURL(line));
41         // 发送HTTP请求查询
42         System.out.println(this.getClass().toString()             + "---URL---"+ url.toString() + "---");
43         String result = HttpUtil.get(url.toString());
44         Document doc = StringUtil.string2Doc(result);
45
46         // 解析请求
47         Element root = doc.getRootElement();
48         Element lines = root.element("lines");
49         // 获取所有线路
50         @SuppressWarnings("unchecked")
51         List<Element> lineList = lines.elements("line");
52         StringBuffer sb = new StringBuffer();
53         // 获取前面两条线路
54         for (int i = 0; i < 2; i++) {
55             sb.append(lineList.get(i).element("name")          .getText() + "<br><br>")
56               .append(lineList.get(i).element("info").getText()          .replace("|", "<br>").replace(";", "<br>") + "<br><br>")
57               .append(lineList.get(i).element("stats").getText()          .replace(";", " --> "));
58         }
59         // 截掉最后的 "-->"
60         sb = new StringBuffer(sb.subSequence(0, sb.toString().length() - 2));
61         return sb.toString();
62     }
63
64     // 公交站查询
65     public String queryState(String city, String state) {
66         return "";
67     }
68 }

这里的公交信息查询用的是爱帮的接口,KEY是在爱帮申请的,这里我将其部分隐藏了。

LINE_URL 是查询公交线的接口,该接口需要3个参数。

第一个参数是key,是爱帮提供给开发者的,第二个参数是city,是城市的名称,第三个参数是q,是公交的名称。

这个类用到了2个工具类,HttpUtil (发送Http请求),StringUtil(将String转成Document对象)

下面是HttpUtil的源码(这里用到的Apache的httpclient):

 1 package itc10.util;
 2
 3 import java.net.URLEncoder;
 4
 5 import org.apache.commons.httpclient.HttpClient;
 6 import org.apache.commons.httpclient.methods.GetMethod;
 7
 8 public class HttpUtil {
 9
10     private HttpUtil(){}
11
12     public static String get(String url) {
13         String result = null;
14         try {
15             HttpClient http = new HttpClient();
16             GetMethod method = new GetMethod(url);
17             http.executeMethod(method);
18             result = method.getResponseBodyAsString();
19             method.releaseConnection();
20         } catch (Exception e) {
21             throw new RuntimeException(e);
22         }
23         return result;
24     }
25
26     public static String encodeURL (String url) {
27         try {
28             url = URLEncoder.encode(url, "utf-8");
29         } catch (Exception e) {
30             throw new RuntimeException(e);
31         }
32         return url;
33     }
34 }

StringUtil.java

package itc10.util;

import java.io.StringReader;

import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.xml.sax.InputSource;

public class StringUtil {

    private StringUtil(){}

    public static Document string2Doc (String src) {
        StringReader sReader = new StringReader(src);
        InputSource is = new InputSource(sReader);
        SAXReader saxReader = new SAXReader();
        Document doc = null;
        try {
            doc = saxReader.read(is);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return doc;
    }
}

WebSerivce功能写完,接下的就是要发布它了。

这里我使用Servlet来发布这个WebService。在Servlet的init()发布WebService。

并在web.xml设置项目启动就启动这个Servlet.

BusQueryAction.java

 1 package itc10.servlet;
 2
 3 import java.io.IOException;
 4 import java.util.Date;
 5
 6 import javax.servlet.ServletConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import javax.xml.ws.Endpoint;
12
13 import itc10.ws.BusQueryService;
14
15 /**
16  * Servlet implementation class WebServiceAction
17  */
18 public class WebServiceAction extends HttpServlet {
19     private static final long serialVersionUID = 1L;
20
21     @Override
22     public void init(ServletConfig config) throws ServletException {
23         System.out.println("--- start BusQueryService at " + new Date().toString() + " ---");
24         StringBuffer url = new StringBuffer();
25         url = url.append(config.getInitParameter("prefix"))
26             .append(":")
27             .append(config.getInitParameter("port"))
28             .append(config.getInitParameter("ctx"))
29             .append("/ws");
30         System.out.println("---" + url + " ---");
31         Endpoint.publish(url.toString(), new BusQueryService());
32     }
33
34     /**
35      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
36      *      response)
37      */
38     protected void doGet(HttpServletRequest request, HttpServletResponse response)
39             throws ServletException, IOException {
40     }
41
42     /**
43      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
44      *      response)
45      */
46     protected void doPost(HttpServletRequest request, HttpServletResponse response)
47             throws ServletException, IOException {
48     }
49
50 }

web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 5     id="WebApp_ID" version="2.5">
 6     <display-name>web_service</display-name>
 7     <welcome-file-list>
 8         <welcome-file>index.jsp</welcome-file>
 9     </welcome-file-list>
10
11     <servlet>
12         <servlet-name>WebServiceAction</servlet-name>
13         <servlet-class>itc10.servlet.WebServiceAction</servlet-class>
14         <init-param>
15             <param-name>prefix</param-name>
16             <param-value>http://192.168.1.103</param-value>
17         </init-param>
18         <init-param>
19             <param-name>port</param-name>
20             <param-value>8090</param-value>
21         </init-param>
22         <init-param>
23             <param-name>ctx</param-name>
24             <param-value>/web_service</param-value>
25         </init-param>
26         <load-on-startup>0</load-on-startup>
27     </servlet>
28
29 </web-app>

这里使用servlet参数来设置webService的各个参数。

最后拼凑成的URL为:http://192.168.1.103:8090/web_service/ws

最后把项目发布到Tomcat,访问:http://192.168.1.103:8090/web_service/ws?wsdl 就可以看到webService的WSDL信息了。

时间: 2024-10-11 16:55:19

WebService初学-web_service的相关文章

WebService初学

作为一个初学者,在遇到新的知识点的时候,搞清这个知识点的名称含义,是有必要的.那什么是WebService呢? 顾名思义,它是一个运行在web上的服务.这个服务通过网络为我们的程序提供服务方法.类似一个远程的服务提供者.比如,一个提供天气预报的网站需要随时更新天气情况,在WEB上挂上一个随时问讯最新天气情况的服务.我们的程序就可以从这个服务上获取到当前最新的天气信息.说的简单点就是远程信息访问,专业点就是基于XML并利用SOAP协议(简单对象访问协议)实现跨平台信息传递的一种技术. WebSer

WebService初学-web_client

上一篇创建了WebService,这里我创建了另一个Web项目web_client来调用这个WebService. 项目代码结构如下: 其中itc10.client包下的java文件是通过WebService的WSDL生成的. 利用JDK自带的wsimport 命令可以利用WSDL文件生成Java代码. wsimport -s . -p itc10.client http://192.168.1.103:8090/web_service/ws?wsdl 其中 “-s” 是生成源码,“.”是表示源

C#调用WebService实例和开发

一.基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册.简单的理解就是:webservice就是放在服务器上的函数,所有人都可以调用,然后返回信息. 比如google就有一个web service ,你调用它就可以很容易的做一个搜索网站. 就像调用函数一样,传入若干

myeclipse 10 + Axis2-1.6.2 开发WebService

由于要与外部机构对接扫描支付需求,不得不用java来开发一个webservice+axis,java webservice还是8年前初学java时有过接触,工作后就没有使用过. 此文借助myeclipse10+axis2插件完成webservice的开发. 开发工具:myeclipse10 myeclipse插件: 1:axis2-eclipse-codegen-wizard-1.4.zip 2:axis2-eclipse-service-archiver-wizard-1.4.zip 首先 配

关于安卓调用C#的WebService上传图片问题(不使用ksoap2)

============问题描述============ 小弟初学安卓开发.最近需要做一个图片上传的功能. 我是用java开发安卓,调用C#的WebService.在网上找到一大堆资料,几乎全部是用ksoap2包的. 请注意,我想做的是不用ksoap包的. 我现在的方法是从android端用读取到要上传的图片,用Base64编码成字节流的字符串,通过调用webservice把该字符串作为参数传到服务器端,服务端解码该字符串,最后保存到相应的路径下.整个上传过程的关键就是以字节流的字符串进行数据传

flex入门--初学笔记1

环境:flashBuilder + eclipse 4.2 基本控件: 1 <mx:Script> 2 <![CDATA[ 3 import mx.controls.Alert; 4 public function showMsg(msg:String):void{ 5 mx.controls.Alert.show(msg); 6 } 7 ]]> 8 </mx:Script> 9 <mx:Panel title="常用控件" width=&qu

Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

webservice入门之CXF教程

1.CXF简介 Apache CXF是一个开源的Service框架,可以用于简化用户的service开发,基于CXF开发的应用可提供SOAP.XML/HTTP.RESTFUL HTTP或CORBA等服务.CXF底层页可以使用不同的传输协议,包括HTTP.JMS或JBI等. 根据CXF官方的说明,CXF包含以下特性: 支持大量的Web Service标准,包括SOAP.WS-I Basic Profile.WSDL.WS-Addressing.WS-Policy.WS-ReliableMessag

C#程序员学习Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动