根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
方法名:getWeatherbyCityName
有多种请求方式,本文使用的是SOAP1.1
该链接有SOAP1.2、GEY、POST等其它请求方式
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName
1、
package com.lhh.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.lhh.comm.util.WeatherReport; public class WeatherServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置request编码 request.setCharacterEncoding("UTF-8"); //获取查询的城市 String city = request.getParameter("city"); String info = WeatherReport.getWeather(city); request.setAttribute("info", info); request.getRequestDispatcher("/weatherInfo.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }2、
package com.lhh.comm.util; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class WeatherReport { /** * 获取SOAP的请求头,并替换其中的标志符号为用户输入的城市 * * * @param city * 用户输入的城市名称 * @return 客户将要发送给服务器的SOAP请求 */ 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(); } /** * 用户把SOAP请求发送给服务器端,并返回服务器点返回的输入流 * * * @param city * 用户输入的城市名称 * @return 服务器端返回的输入流,供客户端读取 * @throws Exception */ private static InputStream getSoapInputStream(String city) throws Exception { try { String soap = getSoapRequest(city); 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; } catch (Exception e) { e.printStackTrace(); return null; } } /** * 对服务器端返回的XML进行解析 * * * @param city * 用户输入的城市名称 * @return 字符串 用,分割 */ public static String getWeather(String city) { 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(); for (int count = 0; count < nl.getLength(); count++) { Node n = nl.item(count); if(n.getFirstChild().getNodeValue().equals("查询结果为空!")) { sb = new StringBuffer("#") ; break ; } sb.append(n.getFirstChild().getNodeValue() + "# "); } is.close(); return sb.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } public static void main(String[] args) throws Exception { System.out.println(getWeather("福州")); System.out.println("po&oi".split("&").length) ; System.out.println("##".split("#").length) ; } }3、tianqi.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> <!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"> --> </head> <body> <form action="WeatherServlet" method="POST" target="_blank"> <input type="text" id="city" name="city"/> <input type="submit" value="查询"/> </form> </body> </html>
4、weatherInfo.jsp
<pre name="code" class="html"><%@ page language="java" pageEncoding="UTF-8"%> <!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"> --> </head> <body> <% String info = (String) request.getAttribute("info") ; if(info.equals("#")) { %> <h1>该城市暂不被支持天气预报服务</h1> <% } 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"> <% 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> <% } catch(Exception e) { }
%> <% } %>
</body> </html>
天气图片包下载地址http://www.webxml.com.cn/images/weather.zip