题外话:
本程序利用网络上发布的公共webservice endpoint
www.webxml.com.cn/WebServices/WeatherWebService.asmx
大致步骤是
1 利用soap向webservice endpoint进行请求,取回请求结果
2 把结果显示在web界面上,web界面采用Java+Jsp(呵呵,有点丑陋,篇幅所迫)
好,废话少说,直接进入核心程序讲解。
一 WeatherReport类
方法 1 构造soap请求(请求格式请见上面的链接),用用户输入的城市名称镶在此请求里面
java 代码
/** */
/**
* 获取SOAP的请求头,并替换其中的标志符号为用户输入的城市
*
* 编写者:王景辉
*
* @param city
* 用户输入的城市名称
* @return 客户将要发送给服务器的SOAP请求
*/
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
private
static
String getSoapRequest(String city)
{
StringBuilder sb = new StringBuilder();
sb
.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
+ "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soap:Body> <getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">"
+ "<theCityName>" + city
+ "</theCityName> </getWeatherbyCityName>"
+ "</soap:Body></soap:Envelope>");
return sb.toString();
}
方法 2 向endpoint发送上述SOAP请求,并设置一些请求属性,返回一个服务器端的InputStream(XML文档流)
java 代码
/** */
/**
* 用户把SOAP请求发送给服务器端,并返回服务器点返回的输入流
*
* 编写者:王景辉
*
* @param city
* 用户输入的城市名称
* @return 服务器端返回的输入流,供客户端读取
* @throws Exception
*/
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
private
static
InputStream getSoapInputStream(String city)
throws
Exception
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try {
String soap = getSoapRequest(city);
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (soap == null) {
return null;
}
URL url = new URL(
"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");
URLConnection conn = url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Length", Integer.toString(soap
.length()));
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestProperty("SOAPAction",
"http://WebXml.com.cn/getWeatherbyCityName");
OutputStream os = conn.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
osw.write(soap);
osw.flush();
osw.close();
InputStream is = conn.getInputStream();
return is;
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
方法 3 解析方法2返回的XML文档流,并用特定的符号分隔,以便我们在Jsp页面进行结果分析
java 代码
/** */
/**
* 对服务器端返回的XML进行解析
*
* 编写者:王景辉
*
* @param city
* 用户输入的城市名称
* @return 字符串 用,分割
*/
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public
static
String getWeather(String city)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try {
Document doc;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream is = getSoapInputStream(city);
doc = db.parse(is);
NodeList nl = doc.getElementsByTagName("string");
StringBuffer sb = new StringBuffer();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int count = 0; count < nl.getLength(); count++) {
Node n = nl.item(count);
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(n.getFirstChild().getNodeValue().equals("查询结果为空!")) {
sb = new StringBuffer("#") ;
break ;
}
sb.append(n.getFirstChild().getNodeValue() + "#\n");
}
is.close();
return sb.toString();
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
二 weatherInfo.jsp页面
<%
@ page language="java" pageEncoding="UTF-8"
%>
![](/Images/OutliningIndicators/None.gif)
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
>
<
html
>
<
head
>
<
title
>
城市天气信息
</
title
>
<
meta
http-equiv
="pragma"
content
="no-cache"
>
<
meta
http-equiv
="cache-control"
content
="no-cache"
>
<
meta
http-equiv
="expires"
content
="0"
>
<
meta
http-equiv
="keywords"
content
="keyword1,keyword2,keyword3"
>
<
meta
http-equiv
="description"
content
="This is my page"
>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
![](/Images/OutliningIndicators/None.gif)
</
head
>
<
body
>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
String info = (String) request.getAttribute("info") ;
if(info.equals("#")) {
%>
<
h1
>
该城市暂不被支持天气预报服务
</
h1
>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
} else {
String[] infos = info.split("#") ;
%>
<
table
border
="1"
>
<
tr
>
<
td
colspan
="3"
>
<
strong
><
font
color
="blue"
>
72小时天气预报
</
font
>
---
<
font
color
="red"
>
<!--
城市名称
-->
<%
=
infos[
0
]
%>
<%
=
infos[
1
]
%>
</
font
>
<
font
size
="-1"
>
<%
=
infos[
4
]
%>
发布
</
font
>
</
strong
>
</
td
>
</
tr
>
<
tr
align
="center"
>
<
td
>
<
table
>
<
tr
align
="center"
>
<!--
日期
-->
<
td
>
<
font
size
="-1"
>
<%
=
infos[
6
]
%>
</
font
>
</
td
>
</
tr
>
<
tr
align
="center"
>
<!--
天气图标
-->
<
td
>
<
img
src
="tqimgs/a_<%=infos[8]%>"
/>
<
img
src
="tqimgs/a_<%=infos[9]%>"
/>
</
td
>
</
tr
>
<
tr
align
="center"
>
<!--
天气细则
-->
<
td
>
<
font
size
="-1"
>
<%
=
infos[
5
]
%>
<
br
>
<%
=
infos[
7
]
%>
<
br
>
</
font
>
</
td
>
</
tr
>
</
table
>
</
td
>
<
td
>
<
table
align
="center"
>
<
tr
align
="center"
>
<
td
>
<!--
第二天的时间
-->
<
font
size
="-1"
>
<%
=
infos[
13
]
%>
</
font
>
</
td
>
</
tr
>
<
tr
align
="center"
>
<
td
>
<!--
第二天的天气图标
-->
<
img
src
="tqimgs/a_<%=infos[15]%>"
>
<
img
src
="tqimgs/a_<%=infos[16]%>"
>
</
td
>
</
tr
>
<
tr
align
="center"
>
<
td
>
<!--
第二天的天气细则
-->
<
font
size
="-1"
>
<%
=
infos[
12
]
%>
<
br
>
<%
=
infos[
14
]
%>
<
br
>
</
font
>
</
td
>
</
tr
>
</
table
>
</
td
>
<
td
>
<
table
align
="center"
>
<
tr
align
="center"
>
<
td
>
<!--
第三天的天气时间
-->
<
font
size
="-1"
>
<%
=
infos[
18
]
%>
</
font
>
</
td
>
</
tr
>
<
tr
align
="center"
>
<
td
>
<!--
第三天的天气图标
-->
<
img
src
="tqimgs/a_<%=infos[20]%>"
/>
<
img
src
="tqimgs/a_<%=infos[21]%>"
/>
</
td
>
</
tr
>
<
tr
align
="center"
>
<
td
>
<!--
第三天的天气细则
-->
<
font
size
="-1"
>
<%
=
infos[
17
]
%>
<
br
>
<%
=
infos[
19
]
%>
<
br
>
</
font
>
</
td
>
</
tr
>
</
table
>
</
td
>
</
tr
>
<
tr
>
<
td
colspan
="3"
>
<!--
居家指数
-->
<
strong
><
font
color
="blue"
>
温馨提醒
</
font
></
strong
>
</
td
>
</
tr
>
<
tr
>
<
td
colspan
="3"
>
<
table
>
<
tr
>
<
td
>
<
img
src
="tqimgs/sun.gif"
/>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
infos[
10
]
%>
</
font
>
</
td
>
</
tr
>
</
table
>
</
td
>
</
tr
>
<
tr
>
<
td
colspan
="3"
>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
String str = "" ;
String s1 = "" ;
String s1Content = "" ;
String s2 = "" ;
String s2Content = "" ;
String s3 = "" ;
String s3Content = "" ;
String s4 = "" ;
String s4Content = "" ;
String s5 = "" ;
String s5Content = "" ;
String s6 = "" ;
String s6Content = "" ;
String s7 = "" ;
String s7Content = "" ;
try {
//这里开始进行具体详细测试
str = infos[11] ;
//穿衣指数
s1 = str.substring(str.indexOf("穿衣指数:"),str.indexOf("穿衣指数:")+4) ;
s1Content = str.substring(str.indexOf("穿衣指数:")+5,str.indexOf("感冒指数:")) ;
//感冒指数
s2 = str.substring(str.indexOf("感冒指数:"),str.indexOf("感冒指数:")+4) ;
s2Content = str.substring(str.indexOf("感冒指数:")+5,str.indexOf("晨练指数:")) ;
//晨练指数
s3 = str.substring(str.indexOf("晨练指数:"),str.indexOf("晨练指数:")+4) ;
s3Content = str.substring(str.indexOf("晨练指数:")+5,str.indexOf("交通指数:")) ;
//交通指数
s7 = str.substring(str.indexOf("交通指数:"),str.indexOf("交通指数:")+4) ;
s7Content = str.substring(str.indexOf("交通指数:")+5,str.indexOf("中暑指数:")) ;
//中暑指数
s4 = str.substring(str.indexOf("中暑指数:"),str.indexOf("中暑指数:")+4) ;
s4Content = str.substring(str.indexOf("中暑指数:")+5,str.indexOf("防晒指数:")) ;
//防晒指数
s5 = str.substring(str.indexOf("防晒指数:"),str.indexOf("防晒指数:")+4) ;
s5Content = str.substring(str.indexOf("防晒指数:")+5,str.indexOf("旅行指数:")) ;
//旅行指数
s6 = str.substring(str.indexOf("旅行指数:"),str.indexOf("旅行指数:")+4) ;
s6Content = str.substring(str.indexOf("旅行指数:")+5) ;
%>
<
table
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_01.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s1
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s1Content
%>
</
font
>
</
td
>
</
tr
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_20.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s2
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s2Content
%>
</
font
>
</
td
>
</
tr
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_03.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s3
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s3Content
%>
</
font
>
</
td
>
</
tr
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_22.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s4
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s4Content
%>
</
font
>
</
td
>
</
tr
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_07.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s5
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s5Content
%>
</
font
>
</
td
>
</
tr
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_31.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s6
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s6Content
%>
</
font
>
</
td
>
</
tr
>
<
tr
>
<
td
width
="50"
>
<
img
src
="tqimgs/zhishu_11.gif"
/>
</
td
>
<
td
>
<
strong
>
<
font
size
="-1"
>
<%
=
s7
%>
</
font
>
</
strong
>
</
td
>
<
td
>
<
font
size
="-1"
>
<%
=
s7Content
%>
</
font
>
</
td
>
</
tr
>
</
table
>
</
td
>
</
tr
>
</
table
>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
} catch(Exception e) {
}
%>
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
}
%>
</
body
>
</
html
>
![点击查看原始大小图片 D9e075b4-57ec-47c4-be33-de8914f5e307-thumb](http://www.javaeye.com/upload/attachment/11257/d9e075b4-57ec-47c4-be33-de8914f5e307-thumb.bmp?1199174585)
描述: 天气预报效果图 大小: 1.6 MB