URLTool.java
package dsh.bikegis.tool; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; /** * 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 * @author NanGuoCan * */ public class URLTool { public static InputStream getUrl(String city){ String host1="http://www.google.com/ig/api?hl=zh-tw&weather="; StringBuffer host=new StringBuffer(host1); /* String temp=null; try { temp = URLEncoder.encode(city,"utf-8");//把接收過來的中文進行編碼 } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); }*/ host.append(city); try { URL url=new URL(host.toString()); return url.openStream(); } catch (MalformedURLException e) { e.printStackTrace(); return null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } }
SAXParseWeatherServiceImpl.java
package dsh.bikegis.service.impl; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import dsh.bikegis.model.CurrentWeather; import dsh.bikegis.model.ForecastWeather; import dsh.bikegis.tool.URLTool; public class SAXParseWeatherServiceImpl{ private List<ForecastWeather> weathers;// 本周未來幾天天氣信息 private ForecastWeather fw;//本周某天天氣信息 private CurrentWeather currentWeather;// 今天的天氣信息 /** * 解析xml文檔 * * @param city * 需要解析的城市 */ public void parserXml(String city) { SAXParserFactory saxfac = SAXParserFactory.newInstance(); try { SAXParser saxparser = saxfac.newSAXParser(); //InputStream is = new FileInputStream(city); InputStream inputStream=URLTool.getUrl(city); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"big5")); InputSource is = new InputSource(reader); saxparser.parse(is, new MySAXHandler()); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } class MySAXHandler extends DefaultHandler { private boolean current_conditions=false;//當天天氣信息標誌 private boolean forecast_conditions=false;//本周未來幾天預測天氣信息標誌 @Override public void startDocument() throws SAXException { //文檔解析開始時創建一個用於保存當天天氣信息的對象 currentWeather = new CurrentWeather(); // 文檔解析開始時創創建一個用於保存未來幾天天氣信息的list weathers = new ArrayList<ForecastWeather>(); } @Override public void startElement(String uri, String localName, String qName, Attributes att) throws SAXException { //設置預測判斷標誌 if(qName.equals("current_conditions")){ current_conditions=true; } //設置預測判斷標誌 if(qName.equals("forecast_conditions")){ forecast_conditions=true; fw=new ForecastWeather(); } //設置預測城市 if(qName.equals("city")){ currentWeather.setCity(att.getValue(0)); } //設置預測日期 if(qName.equals("forecast_date")){ currentWeather.setForecast_date(att.getValue(0)); } //設置當前預測時間 if(qName.equals("current_date_time")){ currentWeather.setCurrent_date_time(att.getValue(0)); } //根據條件設置當前和未來某天天氣狀況 if(qName.equals("condition")){ if(this.current_conditions==true){ currentWeather.setCondition(att.getValue(0)); } if(this.forecast_conditions==true){ fw.setCondition(att.getValue(0)); } } //根據條件設置當前和未來某天天氣氣象圖標 if(qName.equals("icon")){ if(this.current_conditions==true){ currentWeather.setIcon(att.getValue(0)); } if(this.forecast_conditions==true){ fw.setIcon(att.getValue(0)); } } //設置當前天氣的華氏溫度 if(qName.equals("temp_f")){ currentWeather.setTemp_f(att.getValue(0)); } //設置當前天氣的攝氏溫度 if(qName.equals("temp_c")){ currentWeather.setTemp_c(att.getValue(0)); } //設置當天天氣的濕度 if(qName.equals("humidity")){ String hum=att.getValue(0).substring(3); currentWeather.setHumidity(hum); } //設置當前天氣的風向和風速 if(qName.equals("wind_condition")){ String wind_direction=att.getValue(0).substring(3,5); String wind_speed=att.getValue(0).substring(9); currentWeather.setWind_direction(wind_direction); currentWeather.setWind_speed(wind_speed); } //設置未來某天日期 if(qName.equals("day_of_week")){ fw.setDay_of_week(att.getValue(0)); } //設置未來某天天氣的最低溫度 if(qName.equals("low")){ fw.setLow(att.getValue(0)); } //設置未來某天天氣的最高溫度 if(qName.equals("high")){ fw.setHigh(att.getValue(0)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //current_conditions標籤結束 if(qName.equals("current_conditions")){ this.current_conditions=false; } //forecast_conditions標籤結束 if(qName.equals("forecast_conditions")){ forecast_conditions=false; weathers.add(fw); fw=null; } } } public List<ForecastWeather> getWeathers() { return weathers; } public void setWeathers(List<ForecastWeather> weathers) { this.weathers = weathers; } public ForecastWeather getFw() { return fw; } public void setFw(ForecastWeather fw) { this.fw = fw; } public CurrentWeather getCurrentWeather() { return currentWeather; } public void setCurrentWeather(CurrentWeather currentWeather) { this.currentWeather = currentWeather; } }
SAXParseWeatherActionImpl.java
package dsh.bikegis.action.impl; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import org.apache.struts2.json.annotations.JSON; import com.opensymphony.xwork2.ActionSupport; import dsh.bikegis.action.SAXParseWeatherAction; import dsh.bikegis.model.CurrentWeather; import dsh.bikegis.model.ForecastWeather; import dsh.bikegis.service.impl.SAXParseWeatherServiceImpl; import dsh.bikegis.system.SysAction; import dsh.bikegis.tool.JsonUtil; /** * 解析google weather api傳來的xml * @author NanGuoCan * */ public class SAXParseWeatherActionImpl extends SysAction implements SAXParseWeatherAction { /** * */ private static final long serialVersionUID = 1L; private SAXParseWeatherServiceImpl saxService; private List<ForecastWeather> lists=new ArrayList<ForecastWeather>(); private CurrentWeather currentWeather=new CurrentWeather(); private String city;//接收前臺傳來的城市名稱 private String cWeatherStr=null; private String fWeathersStr=null; /** * 解析google weather api傳來的xml文件 * @return * 成功返回success,失敗返回error */ @Override public String getWeather() { saxService.parserXml(city); lists=saxService.getWeathers(); currentWeather=saxService.getCurrentWeather(); this.cWeatherStr=JsonUtil.beanToJson(currentWeather); this.fWeathersStr=JsonUtil.listToJson(lists); return ActionSupport.SUCCESS; } @JSON(serialize=false) public List<ForecastWeather> getLists() { return lists; } public void setLists(List<ForecastWeather> lists) { this.lists = lists; } @JSON(serialize=false) public CurrentWeather getCurrentWeather() { return currentWeather; } public void setCurrentWeather(CurrentWeather currentWeather) { this.currentWeather = currentWeather; } @JSON(serialize=false) public String getCity() { return city; } public void setCity(String city) { this.city = city; } @JSON(serialize=false) public SAXParseWeatherServiceImpl getSaxService() { return saxService; } public void setSaxService(SAXParseWeatherServiceImpl saxService) { this.saxService = saxService; } @JSON(name="cWeatherStr") public String getcWeatherStr() { return cWeatherStr; } public void setcWeatherStr(String cWeatherStr) { this.cWeatherStr = cWeatherStr; } @JSON(name="fWeathersStr") public String getfWeathersStr() { return fWeathersStr; } public void setfWeathersStr(String fWeathersStr) { this.fWeathersStr = fWeathersStr; } }
$.ajax({ url:"${requestScope.basePath}/main/weather/getWeatherJson.action", data:"city="+encodeURI(encodeURI(karea)), dataType:"json", beforeSend:function(){ $('#weatherstatus').html('正在查詢請稍後....'); }, success: function(data){ showweather(data); }, error:function(){ $('#weatherstatus').html('<span style="background:red;">出錯啦,請稍後再試</span>'); } });