当前位置: 代码迷 >> Web前端 >> 制作自己的天气预报Function-Web版
  详细解决方案

制作自己的天气预报Function-Web版

热度:246   发布时间:2012-11-17 11:14:15.0
打造自己的天气预报Function----Web版

题外话:
本程序利用网络上发布的公共webservice endpoint

www.webxml.com.cn/WebServices/WeatherWebService.asmx


大致步骤是
1? 利用soap向webservice endpoint进行请求,取回请求结果
2? 把结果显示在web界面上,web界面采用Java+Jsp(呵呵,有点丑陋,篇幅所迫)
好,废话少说,直接进入核心程序讲解。

一? WeatherReport类??
??? 方法 1? 构造soap请求(请求格式请见上面的链接),用用户输入的城市名称镶在此请求里面

java 代码
  1. /** ?
  2. ?????*?获取SOAP的请求头,并替换其中的标志符号为用户输入的城市 ?
  3. ?????*? ?
  4. ?????*?编写者:王景辉 ?
  5. ?????*? ?
  6. ?????*?@param?city ?
  7. ?????*????????????用户输入的城市名称 ?
  8. ?????*?@return?客户将要发送给服务器的SOAP请求 ?
  9. ?????*/??
  10. ????private?static?String?getSoapRequest(String?city)?{ ??
  11. ????????StringBuilder?sb?=?new?StringBuilder(); ??
  12. ????????sb ??
  13. ????????????????.append("<?xml?version=\"1.0\"?encoding=\"utf-8\"?>"??
  14. ????????????????????????+?"<soap:Envelope?xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"?"??
  15. ????????????????????????+?"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"?"??
  16. ????????????????????????+?"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"??
  17. ????????????????????????+?"<soap:Body>????<getWeatherbyCityName?xmlns=\"http://WebXml.com.cn/\">"??
  18. ????????????????????????+?"<theCityName>"?+?city ??
  19. ????????????????????????+?"</theCityName>????</getWeatherbyCityName>"??
  20. ????????????????????????+?"</soap:Body></soap:Envelope>"); ??
  21. ????????return?sb.toString(); ??
  22. ????}??

?

方法 2? 向endpoint发送上述SOAP请求,并设置一些请求属性,返回一个服务器端的InputStream(XML文档流)

java 代码
  1. /** ?
  2. ?????*?用户把SOAP请求发送给服务器端,并返回服务器点返回的输入流 ?
  3. ?????*? ?
  4. ?????*?编写者:王景辉 ?
  5. ?????*? ?
  6. ?????*?@param?city ?
  7. ?????*????????????用户输入的城市名称 ?
  8. ?????*?@return?服务器端返回的输入流,供客户端读取 ?
  9. ?????*?@throws?Exception ?
  10. ?????*/??
  11. ????private?static?InputStream?getSoapInputStream(String?city)?throws?Exception?{ ??
  12. ????????try?{ ??
  13. ????????????String?soap?=?getSoapRequest(city); ??
  14. ????????????if?(soap?==?null)?{ ??
  15. ????????????????return?null; ??
  16. ????????????} ??
  17. ????????????URL?url?=?new?URL( ??
  18. ????????????????????"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"); ??
  19. ????????????URLConnection?conn?=?url.openConnection(); ??
  20. ????????????conn.setUseCaches(false); ??
  21. ????????????conn.setDoInput(true); ??
  22. ????????????conn.setDoOutput(true); ??
  23. ??
  24. ????????????conn.setRequestProperty("Content-Length",?Integer.toString(soap ??
  25. ????????????????????.length())); ??
  26. ????????????conn.setRequestProperty("Content-Type",?"text/xml;?charset=utf-8"); ??
  27. ????????????conn.setRequestProperty("SOAPAction", ??
  28. ????????????????????"http://WebXml.com.cn/getWeatherbyCityName"); ??
  29. ??
  30. ????????????OutputStream?os?=?conn.getOutputStream(); ??
  31. ????????????OutputStreamWriter?osw?=?new?OutputStreamWriter(os,?"utf-8"); ??
  32. ????????????osw.write(soap); ??
  33. ????????????osw.flush(); ??
  34. ????????????osw.close(); ??
  35. ??
  36. ????????????InputStream?is?=?conn.getInputStream(); ??
  37. ????????????return?is; ??
  38. ????????}?catch?(Exception?e)?{ ??
  39. ????????????e.printStackTrace(); ??
  40. ????????????return?null; ??
  41. ????????} ??
  42. ????}??

?

方法 3? 解析方法2返回的XML文档流,并用特定的符号分隔,以便我们在Jsp页面进行结果分析

java 代码
  1. /** ?
  2. ?????*?对服务器端返回的XML进行解析 ?
  3. ?????*? ?
  4. ?????*?编写者:王景辉 ?
  5. ?????*? ?
  6. ?????*?@param?city ?
  7. ?????*????????????用户输入的城市名称 ?
  8. ?????*?@return?字符串?用,分割 ?
  9. ?????*/??
  10. ????public?static?String?getWeather(String?city)?{ ??
  11. ????????try?{ ??
  12. ????????????Document?doc; ??
  13. ????????????DocumentBuilderFactory?dbf?=?DocumentBuilderFactory.newInstance(); ??
  14. ????????????dbf.setNamespaceAware(true); ??
  15. ????????????DocumentBuilder?db?=?dbf.newDocumentBuilder(); ??
  16. ????????????InputStream?is?=?getSoapInputStream(city); ??
  17. ????????????doc?=?db.parse(is); ??
  18. ????????????NodeList?nl?=?doc.getElementsByTagName("string"); ??
  19. ????????????StringBuffer?sb?=?new?StringBuffer(); ??
  20. ????????????for?(int?count?=?0;?count?<?nl.getLength();?count++)?{ ??
  21. ????????????????Node?n?=?nl.item(count); ??
  22. ????????????????if(n.getFirstChild().getNodeValue().equals("查询结果为空!"))?{ ??
  23. ????????????????????sb?=?new?StringBuffer("#")?; ??
  24. ????????????????????break?; ??
  25. ????????????????} ??
  26. ????????????????sb.append(n.getFirstChild().getNodeValue()?+?"#\n"); ??
  27. ????????????} ??
  28. ????????????is.close(); ??
  29. ????????????return?sb.toString(); ??
  30. ????????}?catch?(Exception?e)?{ ??
  31. ????????????e.printStackTrace(); ??
  32. ????????????return?null; ??
  33. ????????} ??
  34. ????}??

?

二?? weatherInfo.jsp页面

?????? 核心功能是解析 方法3 所返回的字符串,向endpoint进行请求时,一个XML文档片段是

xml 代码
  1. <?xml?version="1.0"?encoding="utf-8"??>? ??
  2. <ArrayOfString?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"?xmlns="http://WebXml.com.cn/">??
  3. <string>湖南</string>? ??
  4. <string>长沙</string>? ??
  5. <string>57687</string>? ??
  6. <string>57687.jpg</string>? ??
  7. <string>2007-12-26?14:35:26</string>? ??
  8. <string>7℃?/?6℃</string>? ??
  9. <string>12月26日?小雨</string>? ??
  10. <string>西北风<=3级</string>? ??
  11. <string>7.gif</string>? ??
  12. <string>7.gif</string>? ??
  13. <string>今日天气实况:多云;7.4℃;风向/风力:西北风2级;空气质量:较差;紫外线强度:最弱</string>? ??
  14. <string>穿衣指数:感冒指数:温度较低,较易发生感冒,请适当增加衣服。体质较弱的朋友尤其应该注意防护。晨练指数:早晨天气阴沉,气温极低,请尽量避免户外晨练,若坚持户外晨练请注意保暖防冻。交通指数:中暑指数:温度不高,其他各项气象条件适宜,中暑机率极低。公园指数:天气不好,不适宜放风筝。防晒指数:属弱紫外辐射天气,长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。旅行指数:阴天,缺少阳光的陪伴,加上过低的温度会给出行带来些不便,旅游指数一般,请您在旅游时注意增加衣物。</string>? ??
  15. <string>8℃?/?5℃</string>? ??
  16. <string>12月27日?小雨</string>? ??
  17. <string>西北风<=3级</string>? ??
  18. <string>7.gif</string>? ??
  19. <string>7.gif</string>? ??
  20. <string>10℃?/?4℃</string>? ??
  21. <string>12月28日?小雨</string>? ??
  22. <string>西北风<=3级</string>? ??
  23. <string>7.gif</string>? ??
  24. <string>7.gif</string>? ??
  25. <string>长沙市位于湖南省东部偏北,湘江下游和长浏盆地西缘。其地域范围为东经111°53′-114°15′,北纬27°51′-28°41′。东邻江西省宜春地区和萍乡市,南接株洲、湘潭两市,西连娄底、益阳两市,北抵岳阳、益阳两市。东西长约230公里,南北宽约88公里。全市土地面积11819.5平方公里,其中城区面积556平方公里。长沙是一座有2000余年悠久文化历史的古城,早在春秋时期,就是楚国雄踞南方的战略要地之一。汉朝的刘邦立国之后,于公元前206年改临江为长沙,并设立汉朝的属国----长沙国,自此之后,长沙开始筑建城墙,并逐渐成为兵家必争之地。长沙属亚热带季风性湿润气候。气候特征是:气候温和,降水充沛,雨热同期,四季分明。长沙市区年平均气温17.2℃,各县16.8℃-17.3℃,年积温为5457℃,市区年均降水量1361.6毫米。景观:岳麓山、桔子洲、天心阁、烈士公园、月亮岛等。</string>? ??
  26. </ArrayOfString>??

在Jsp中解析的代码如下,基本上是对字符串的操作,截取及截取长度的控制

java 代码
  1. //穿衣指数 ??
  2. ??????????s1?=?str.substring(str.indexOf("穿衣指数:"),str.indexOf("穿衣指数:")+4)?; ??
  3. ??????????s1Content?=?str.substring(str.indexOf("穿衣指数:")+5,str.indexOf("感冒指数:"))?; ??
  4. ??????????//感冒指数 ??
  5. ??????????s2?=?str.substring(str.indexOf("感冒指数:"),str.indexOf("感冒指数:")+4)?; ??
  6. ??????????s2Content?=?str.substring(str.indexOf("感冒指数:")+5,str.indexOf("晨练指数:"))?; ??
  7. ?????????? ??
  8. ??????????//晨练指数 ??
  9. ??????????s3?=?str.substring(str.indexOf("晨练指数:"),str.indexOf("晨练指数:")+4)?; ??
  10. ??????????s3Content?=?str.substring(str.indexOf("晨练指数:")+5,str.indexOf("交通指数:"))?; ??
  11. ??????????//交通指数 ??
  12. ??????????s7?=?str.substring(str.indexOf("交通指数:"),str.indexOf("交通指数:")+4)?; ??
  13. ??????????s7Content?=?str.substring(str.indexOf("交通指数:")+5,str.indexOf("中暑指数:"))?; ??
  14. ??????????//中暑指数 ??
  15. ??????????s4?=?str.substring(str.indexOf("中暑指数:"),str.indexOf("中暑指数:")+4)?; ??
  16. ??????????s4Content?=?str.substring(str.indexOf("中暑指数:")+5,str.indexOf("防晒指数:"))?; ??
  17. ??????????//防晒指数 ??
  18. ??????????s5?=?str.substring(str.indexOf("防晒指数:"),str.indexOf("防晒指数:")+4)?; ??
  19. ??????????s5Content?=?str.substring(str.indexOf("防晒指数:")+5,str.indexOf("旅行指数:"))?; ??
  20. ??????????//旅行指数 ??
  21. ??????????s6?=?str.substring(str.indexOf("旅行指数:"),str.indexOf("旅行指数:")+4)?; ??
  22. ??????????s6Content?=?str.substring(str.indexOf("旅行指数:")+5)?;??

程序运行效果见附件上的截图!!!运行附件:http://localhost:8080/yourProject/tianqi.jsp

好了,基本上核心代码就是上边那些了!不仅如此,加入我们想要在自己的系统里加入飞机票,火车票,股票信息等等之类的功能,只要有相应的webservice,我们都可以实现(呵呵,好像免费的少哦),各位有什么疑问,留言吧!!!

1 楼 jnn 2007-12-28  
为什么还要自己生成解析 SOAP 消息包?
现在服务简单你种方式可以处理,如果服务复杂,再需要SOAP Header认证,哪你这个程序就不好办了。
2 楼 rEloaD_cn 2007-12-28  
最好还是用现成的SOAP引擎来解析,不然太麻烦了。
另外,免费的WetherWebService还是有不少的,国外一些网站就提供,只是都是英文
3 楼 jeasony 2008-11-04  
非常感谢,学习中,测试过,可以,先收藏着 ,哈哈
4 楼 ipanel420 2011-12-08  
我先收着了,多谢 啊
  相关解决方案