做网站的时候有时需要个天气预报的功能。可以利用google的api来获取目标城市的天气预报。。
常用的做法是先获取天气的xml存到本地,再解析出当天的日期显示到页面上。
获取天气的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 // 读取需要的数据
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是用城市名的拼音。
当然,xml的存储路径可以用request获取web应用的根目录,存到应用的根目录上去。毕竟linux系统是没有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"; //天气预报对象——城市名(用拼音)
20 private static final String cityName_ZH = "杭州"; //天气预报对象——城市名(中文)
21 private static final String fileAddr = "C:/" + cityName + ".xml"; //用来存储天气预报的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 //以下关闭输入流!
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页面调用一下这个servlet就好了
<div>
<iframe frameborder="0" src="servletWeather"></iframe>
</div>