做網(wǎng)站的時候有時需要個天氣預(yù)報的功能??梢岳胓oogle的api來獲取目標城市的天氣預(yù)報。。
常用的做法是先獲取天氣的xml存到本地,再解析出當(dāng)天的日期顯示到頁面上。
獲取天氣的bean
1 package com.company.utils;
2
3 import java.io.BufferedReader;
4 import java.io.BufferedWriter;
5 import java.io.File;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.InputStreamReader;
10 import java.io.OutputStreamWriter;
11 import java.io.Writer;
12 import java.net.URL;
13
14 import javax.xml.parsers.DocumentBuilder;
15 import javax.xml.parsers.DocumentBuilderFactory;
16
17 import org.w3c.dom.Document;
18 import org.w3c.dom.NodeList;
19
20 public class GetWeather {
21
22 /**
23 * 傳入選入的城市
24 */
25 public String getWeather(String cityName, String fileAddr) {
26 // 獲取google上的天氣情況,寫入文件
27 try {
28 URL url = new URL("http://www.google.com/ig/api?hl=zh_cn&weather="
29 + cityName);
30 InputStream inputstream = url.openStream();
31 String s, str;
32 BufferedReader in = new BufferedReader(new InputStreamReader(inputstream));
33 StringBuffer stringbuffer = new StringBuffer();
34 Writer out = new BufferedWriter(new OutputStreamWriter(
35 new FileOutputStream(fileAddr), "utf-8"));
36 while ((s = in.readLine()) != null) {
37 stringbuffer.append(s);
38 }
39 str = new String(stringbuffer);
40 out.write(str);
41 out.close();
42 in.close();
43 } catch (IOException e) {
44 e.printStackTrace();
45 }
46
47 // 讀取需要的數(shù)據(jù)
48 File file = new File(fileAddr);
49 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
50 String str = null;
51 try {
52 DocumentBuilder builder = factory.newDocumentBuilder();
53 Document doc = builder.parse(file);
54 NodeList nodelist1 = (NodeList) doc.getElementsByTagName("forecast_conditions");
55 NodeList nodelist2 = nodelist1.item(0).getChildNodes();
56 str = nodelist2.item(4).getAttributes().item(0).getNodeValue()
57 + ",溫度:"
58 + nodelist2.item(1).getAttributes().item(0).getNodeValue()
59 + "℃-"
60 + nodelist2.item(2).getAttributes().item(0).getNodeValue()
61 + "℃";
62 } catch (Exception e) {
63 e.printStackTrace();
64 }
65 return str;
66 }
67
68 }
69
利用servlet來獲取目標城市的天氣。google的天氣api是用城市名的拼音。
當(dāng)然,xml的存儲路徑可以用request獲取web應(yīng)用的根目錄,存到應(yīng)用的根目錄上去。畢竟linux系統(tǒng)是沒有C盤的……
1 package com.company.servlet;
2
3 import java.io.IOException;
4 import java.io.PrintWriter;
5 import java.text.DateFormat;
6
7 import javax.servlet.ServletException;
8 import javax.servlet.ServletOutputStream;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 import com.company.utils.GetWeather;
14
15 public class servletWeather extends HttpServlet {
16
17
18 private static final String APP_TODAY_WEATHER = "app_today_weather"; //applcation中的天氣屬性名
19 private static final String cityName = "hangzhou"; //天氣預(yù)報對象——城市名(用拼音)
20 private static final String cityName_ZH = "杭州"; //天氣預(yù)報對象——城市名(中文)
21 private static final String fileAddr = "C:/" + cityName + ".xml"; //用來存儲天氣預(yù)報的xml文件的路徑名
22
23 protected void processRequest(HttpServletRequest request,
24 HttpServletResponse response) throws
25 ServletException, IOException {
26 response.setContentType("text/html;charset=utf-8");
27
28 //獲取今天的日期
29 java.util.Date nowDate = new java.util.Date();
30 DateFormat dateformat = DateFormat.getDateInstance();
31 String todayDate = dateformat.format(nowDate);
32
33
34 // 獲取application中存儲的天氣
35 String today_weather = (String)request.getSession().getServletContext().getAttribute(APP_TODAY_WEATHER);
36
37 // 如果application中存儲的天氣為空,則重新獲取一下;并存到application中
38 if(today_weather == null || "".equals(today_weather))
39 {
40 today_weather = getTodayWeather();
41 today_weather = todayDate + " " + cityName_ZH + " " + today_weather;
42 request.getSession().getServletContext().setAttribute(APP_TODAY_WEATHER, today_weather);
43 }
44 else
45 { // 如果application中存儲的天氣不是今天的,則重新獲取一下;并存到application中
46 int flag = today_weather.indexOf(todayDate);
47 if(flag < 0)
48 {
49 today_weather = getTodayWeather();
50 today_weather = todayDate + " " + cityName_ZH + " " + today_weather;
51 request.getSession().getServletContext().setAttribute(APP_TODAY_WEATHER, today_weather);
52 }
53 }
54
55 PrintWriter responsePrintWriter = response.getWriter();
56
57 // 輸出天氣(字符串)到頁面
58 responsePrintWriter.write(today_weather);
59
60 //以下關(guān)閉輸入流!
61 responsePrintWriter.flush();
62 responsePrintWriter.close();
63 }
64
65 /**
66 * 獲取今天的天氣
67 * @return String
68 */
69 public String getTodayWeather()
70 {
71 GetWeather ggw = new GetWeather();
72 return ggw.getWeather(cityName, fileAddr);
73 }
74
75 protected void doGet(HttpServletRequest request,
76 HttpServletResponse response) throws ServletException,
77 IOException {
78 processRequest(request, response);
79 }
80
81 protected void doPost(HttpServletRequest request,
82 HttpServletResponse response) throws ServletException,
83 IOException {
84 processRequest(request, response);
85 }
86
87 }
88
web.xml中需要配置一下servlet
<servlet>
<servlet-name>servletWeather</servlet-name>
<servlet-class>com.company.servlet.servletWeather</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletWeather</servlet-name>
<url-pattern>/servletWeather</url-pattern>
</servlet-mapping>
ok,只要在jsp頁面調(diào)用一下這個servlet就好了
<div>
<iframe frameborder="0" src="servletWeather"></iframe>
</div>