效果图
WeatherController
package com.wxh.ew.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.wxh.ew.dto.City; import com.wxh.ew.http.Constant; import com.wxh.ew.service.WeatherService; public class WeatherController extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { this.doPost(request,response); } public void doPost(HttpServletRequest request,IOException { request.getSession().setAttribute("imgPath",Constant.BASE_IMG_URI); String flag=request.getParameter("flag"); if("details".equals(flag)){ details(request,response);//显示详情数据 }else{ list(request,response); } } private void details(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { String pyName=request.getParameter("pyName"); String cityName=request.getParameter("cityName"); WeatherService ws=new WeatherService(); City city=ws.getCityWeather(pyName,cityName); request.setAttribute("city",city); request.getRequestDispatcher("details.jsp").forward(request,response); } private void list(HttpServletRequest request,IOException { String pyName=request.getParameter("pyName"); pyName= pyName!=null?pyName:"china"; WeatherService ws=new WeatherService(); List<City> cities=ws.getCitiesWeather(pyName); //继续传递当前查询的城市集合对应的pyName request.setAttribute("pyName",pyName); request.setAttribute("cities",cities); request.getRequestDispatcher("index.jsp").forward(request,response); } }
City
package com.wxh.ew.dto; /** * 描述城市天气详情的javabean * @author Administrator * */ public class City { private String quName;//地区名称 private String pyName;//下一级查询的文件名(下一级地区拼音名) private String cityName;//城市名字 private String state1;//天气状态1(对应的天气图片1) private String state2;//天气状态2(对应的天气图片2) private String stateDetailed;//天气详情 private String windState;//风力情况 private String windDir;//风向 private String windPower;//风力级别 private String humidity;//湿度 private String lastTime; //最近一次更新时间 private int tem1;//最高温度 private int tem2;//最低温度 private int temNow;//当前温度 public City() { } public City(String quName,String pyName,String cityName,String state1,String state2,String stateDetailed,String windState,String windDir,String windPower,String humidity,String lastTime,int tem1,int tem2,int temNow) { this.quName = quName; this.pyName = pyName; this.cityName = cityName; this.state1 = state1; this.state2 = state2; this.stateDetailed = stateDetailed; this.windState = windState; this.windDir = windDir; this.windPower = windPower; this.humidity = humidity; this.lastTime = lastTime; this.tem1 = tem1; this.tem2 = tem2; this.temNow = temNow; } public String getQuName() { return quName; } public void setQuName(String quName) { this.quName = quName; } public String getPyName() { return pyName; } public void setPyName(String pyName) { this.pyName = pyName; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public String getState1() { return state1; } public void setState1(String state1) { this.state1 = state1; } public String getState2() { return state2; } public void setState2(String state2) { this.state2 = state2; } public String getStateDetailed() { return stateDetailed; } public void setStateDetailed(String stateDetailed) { this.stateDetailed = stateDetailed; } public String getWindState() { return windState; } public void setWindState(String windState) { this.windState = windState; } public String getWindDir() { return windDir; } public void setWindDir(String windDir) { this.windDir = windDir; } public String getWindPower() { return windPower; } public void setWindPower(String windPower) { this.windPower = windPower; } public String getHumidity() { return humidity; } public void setHumidity(String humidity) { this.humidity = humidity; } public String getLastTime() { return lastTime; } public void setLastTime(String lastTime) { this.lastTime = lastTime; } public int getTem1() { return tem1; } public void setTem1(int tem1) { this.tem1 = tem1; } public int getTem2() { return tem2; } public void setTem2(int tem2) { this.tem2 = tem2; } public int getTemNow() { return temNow; } public void setTemNow(int temNow) { this.temNow = temNow; } @Override public String toString() { return "City [cityName=" + cityName + ",humidity=" + humidity + ",lastTime=" + lastTime + ",pyName=" + pyName + ",quName=" + quName + ",state1=" + state1 + ",state2=" + state2 + ",stateDetailed=" + stateDetailed + ",tem1=" + tem1 + ",tem2=" + tem2 + ",temNow=" + temNow + ",windDir=" + windDir + ",windPower=" + windPower + ",windState=" + windState + "]"; } }
Constant
package com.wxh.ew.http; public class Constant { /** * * 城市天气详情查询基本地址 * */ public static final String BASE_URI="http://flash.weather.com.cn/wmaps/xml/"; public static final String BASE_IMG_URI="http://m.weather.com.cn/img/"; }HttpRequest
package com.wxh.ew.http; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /* * 用于发起http请求的网络连接类 */ public class HttpRequest { public static InputStream read(String uri) throws IOException{ InputStream is=null; //根据要请求的URL地址构建一个URL对象 URL url=new URL(uri); //打开到指定地址的连接 HttpURLConnection conn=(HttpURLConnection) url.openConnection(); //设置请求方式为get conn.setRequestMethod("GET"); //设置读取的超时时间 conn.setReadTimeout(10000); //设置连接的超时时间 conn.setConnectTimeout(5000); //获取响应码 int stateCode=conn.getResponseCode(); System.out.println("http response code:"+stateCode); if(stateCode==HttpURLConnection.HTTP_OK){ //如果响应成功,则获取服务端响应回来的数据 is=conn.getInputStream(); } return is; } }
WeatherService
package com.wxh.ew.service; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import com.wxh.ew.dto.City; import com.wxh.ew.http.Constant; import com.wxh.ew.http.HttpRequest; import com.wxh.ew.xml.XmlParser; /** * * 处理天气数据的业务逻辑层 * * @author Administrator * */ public class WeatherService { //查询指定城市下所有的天气情况 public List<City> getCitiesWeather(String pyName){ List<City> cities=null; InputStream is=null; try { String uri= Constant.BASE_URI+pyName+".xml"; is=HttpRequest.read(uri); XmlParser parser=new XmlParser(); cities=parser.getCities(is); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); }finally{ try { if(is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } } return cities; } //查询指定某个城市的天气情况 public City getCityWeather(String pyName,String cityName){ List<City> cities=null; InputStream is=null; City city=null; try { String uri= Constant.BASE_URI+pyName+".xml"; is=HttpRequest.read(uri); XmlParser parser=new XmlParser(); cities=parser.getCities(is); for (City c : cities) { if(c.getCityName().equals(cityName)){ //判断当前遍历到的城市名字是否是需要被查询到的名字 city=c; break; } } } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); }finally{ try { if(is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } } return city; } }XmlParser
package com.wxh.ew.xml; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.wxh.ew.dto.City; public class XmlParser { private DocumentBuilder builder; public XmlParser() throws ParserConfigurationException{ builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); } /** * 将指定的输入流解析为对应的JAVA对象 * @param is 包含天气数据输入流 * @return 返回解析获取的所有城市天气对象 * @throws IOException * @throws SAXException */ public List<City> getCities(InputStream is) throws SAXException,IOException{ List<City> cities=new ArrayList<City>(); Document document=builder.parse(is); //获取所有的city元素 NodeList list=document.getElementsByTagName("city"); for (int i = 0; i < list.getLength(); i++) { Element element=(Element)list.item(i); String quName=element.getAttribute("quName"); String pyName=element.getAttribute("pyName"); String cityName=element.getAttribute("cityname"); String state1=element.getAttribute("state1"); String state2=element.getAttribute("state2"); String stateDetailed=element.getAttribute("stateDetailed"); String windState=element.getAttribute("windState"); String windDir=element.getAttribute("windDir"); String windPower=element.getAttribute("windPower"); String humidity=element.getAttribute("humidity"); String lastTime=element.getAttribute("time"); int tem1=Integer.parseInt(element.getAttribute("tem1")); int tem2=Integer.parseInt(element.getAttribute("tem2")); String tn=element.getAttribute("temNow"); //获取当前温度,如果没有当前温度(省级别天气)则使用-10000代表无数据 int temNow= (tn!=null&&!"".equals(tn)&& !"暂无实况".equals(tn))?Integer.parseInt(tn):-10000; //根据获取的数据创建city对象 City city=new City(quName,pyName,cityName,state1,state2,stateDetailed,windState,windDir,windPower,humidity,lastTime,tem1,tem2,temNow); cities.add(city); } return cities; } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>WeatherController</servlet-name> <servlet-class>com.wxh.ew.controller.WeatherController</servlet-class> </servlet> <servlet-mapping> <servlet-name>WeatherController</servlet-name> <url-pattern>/weather</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>weather</welcome-file> </welcome-file-list> </web-app>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <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> <style> .Box_main{ width:50%; min-width:400px; border:1px solid #808080; margin:0 auto; border-radius:5px; } .title{ width:100%; height:50px; background-color:#38B0FF; color:#ffffff; text-align:center; line-height:50px; font-size:25px; } .tab_data table{ width:100%; border:1px solid #8194AA; border-collapse: collapse; } .tab_data table th,.tab_data table td{ border:1px solid #8194AA; } a{ text-decoration: none; color:#000000; } a:HOVER { text-decoration: underline; color:#ff0000; } } </style> <body> <div class="Box_main"> <div class="title"> 实时天气 </div> <div class="tab_data"> <table> <tr> <td colspan="5"><a href="javascript:history.back();"><<返回</a></td> </tr> <tr> <th>城市/地区</th> <th>天气</th> <th>温度</th> <th>风力情况</th> <th>下属地区天气</th> </tr> <c:forEach items="${cities }" var="city"> <tr> <td><a href="weather?flag=details&pyName=${city.pyName}&cityName=${city.cityName }">${city.cityName }</a></td> <td><img src="${imgPath}d${city.state1}.gif"/>${city.stateDetailed }</td> <td>${city.tem2}℃-${city.tem1}℃</td> <td>${city.windState}${city.windDir }${windPower}</td> <td><a href="weather?pyName=${city.pyName}">详情</a></td> </tr> </c:forEach> </table> </div> </div> </body> </html>
details.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <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,.tab_data table td{ border:1px solid #8194AA; } a{ text-decoration: none; color:#000000; } a:HOVER { text-decoration: underline; color:#ff0000; } } </style> <body> <div class="Box_main"> <div class="title"> 实时天气 </div> <div class="tab_data"> <table> <tr> <th> <img src="${imgPath}d${city.state1}.gif"/><br> <c:if test="${city.temNow!=-10000}"> ${city.temNow }℃ </c:if> </th> </tr> <tr> <th style="color:#ff0000;font-size:20pt">${city.stateDetailed}</th> </tr> <tr> <th>${city.tem2}℃-${city.tem1}℃</th> </tr> <tr> <th>${city.windState}</th> </tr> <tr> <th>风向:<c:out value="${city.windDir}"></c:out></th> </tr> <tr> <th>风力:<c:out value="${city.windPower}"></c:out></th> </tr> <tr> <th>湿度:<c:out value="${city.humidity}"></c:out></th> </tr> <tr> <th>更新时间:<c:out value="${city.lastTime}"></c:out></th> </tr> </table> </div> </div> </body> </html>