Java Web小案例:查询城市天气

mac2024-06-21  50

一、解决思路

1、首先获取泸州的城市代码 在返回的数据里,第一项的ref值就是泸州的城市代码:101271001 2、利用国家气象局提供的接口访问泸州的天气信息

二、准备工作

学会如何在Java程序里解析json。 准备jar包 连接:链接: 点击这里 提取码: 3nqw 1、创建Java项目JsonDemo ParseJsonString

package net.qing.json; import org.json.JSONObject; /** * 功能:将json字符串解析成json对象 * 将json数组字符串解析成json数组 * 日期:2019:10:31 */ public class ParseJsonString { public static void main(String[] args) { //定义一个json字符串 String strJson = "{'id':1,'name':'qing','age':100}"; //基于json字符串创建json对象 try { //基于json字符串创建json对象 JSONObject jsonObject = new JSONObject(strJson); //打印输出json对象 System.out.println(jsonObject); //遍历json对象 System.out.println("id:"+jsonObject.get("id")); System.out.println("name:"+jsonObject.get("name")); System.out.println("age:"+jsonObject.get("age")); } catch (Exception e) { e.printStackTrace(); } } }

ParseJsonString02

package net.qing.json; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class ParseJsonString02 { public static void main(String[] args) { //定义json数组字符串 String strJsonArr = "[{'id':1,'name':'qing','age':100}," + "{'id':2,'name':'peng','age':10},"+ "{'id':3,'name':'lzb','age':190}]"; try { //基于json数组字符串创建数组 JSONArray jsonArray = new JSONArray(strJsonArr); //遍历json数组 for (int i = 0; i<jsonArray.length();i++){ System.out.println(jsonArray.get(i)); } } catch (JSONException e) { e.printStackTrace(); } } }

三、功能实现

1、创建web项目并准备jar包 2、修改项目首页文件index.jsp 3、在web目录里创建查询天气页面query_weather.jsp

4、在web目录里创建处理查询天气页面do_query_weather.jsp (1)显示表单提交的城市名数据 3)编写通过城市名查询天气信息的方法

<%! …… /** * 通过城市名获取天气信息 * * @param cityName * @return 天气信息 */ public HashMap<String, String> getWeatherInfo(String cityName) throws JSONException { // 定义天气信息哈希映射 HashMap<String, String> weather = new HashMap<>(); try { // 获取城市代码 String cityCode = getCityCode(cityName); // 定义url字符串 String strUrl = "http://t.weather.sojson.com/api/weather/city/" + cityCode; // 创建URL对象 URL url = new URL(strUrl); // 创建http连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 建立连接 connection.connect(); // 获取响应码 int code = connection.getResponseCode(); // 判断是否连接成功 if (code == 200) { // 获取字节输入流 InputStream is = connection.getInputStream(); // 创建字节数组用于保存响应信息 byte[] buffer = new byte[is.available()]; // 读取字节输入流全部信息 is.read(buffer); // 获取响应信息字符串 String response = new String(buffer, "utf-8"); // 将json字符串转换成json对象 JSONObject weatherInfoJsonObj = new JSONObject(response); System.out.println(weatherInfoJsonObj); JSONObject cityInfoJsonObj = new JSONObject(weatherInfoJsonObj.getString("cityInfo")); weather.put("城市:", cityInfoJsonObj.getString("parent") + " " + cityInfoJsonObj.getString("city") + "[" + cityCode + "]"); JSONArray forcastJsonArr = new JSONArray(new JSONObject(weatherInfoJsonObj.getString("data")).getString("forecast")); weather.put("时间:", weatherInfoJsonObj.getString("time") + " " + forcastJsonArr.getJSONObject(0).getString("week")); weather.put("温度:", forcastJsonArr.getJSONObject(0).getString("high") + " " + forcastJsonArr.getJSONObject(0).getString("low")); weather.put("天气:", forcastJsonArr.getJSONObject(0).getString("type")); } else { weather.put("错误:", "[" + cityName + "]不存在!"); } } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } // 返回天气信息哈希映射 return weather; } %>

do_query_weather.jsp页面完整代码

<%@ page import="java.net.URL" %> <%@ page import="java.net.HttpURLConnection" %> <%@ page import="java.io.IOException" %> <%@ page import="java.io.InputStream" %> <%@ page import="java.net.URLEncoder" %> <%@ page import="org.json.JSONObject" %> <%@ page import="org.json.JSONArray" %> <%@ page import="org.json.JSONException" %> <%@ page import="java.util.HashMap" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>显示城市天气信息</title> </head> <body> <%! /** * 获取城市代码 * * @param cityName * @return 城市代码 */ public String getCityCode(String cityName) { // 定义城市代码 String cityCode = ""; try { // 定义url字符串 String strUrl = "http://toy1.weather.com.cn/search?cityname=" + URLEncoder.encode(cityName, "utf-8"); // 创建URL对象 URL url = new URL(strUrl); // 利用URL对象获取HTTP连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 建立物理连接 conn.connect(); // 获取响应码 int responseCode = conn.getResponseCode(); // 判断连接是否成功 if (responseCode == HttpURLConnection.HTTP_OK) { // 200 // 获取字节输入流 InputStream is = conn.getInputStream(); // 定义字节数组用于保存字节输入流的全部内容 byte[] buffer = new byte[is.available()]; // 判断城市是否存在 if (is.available() > 4) { // 读取字节输入流全部信息,保存到buffer is.read(buffer); // 获取响应信息字符串 String response = new String(buffer, "utf-8"); // 截取出城市代码 cityCode = response.substring(10, 19); } } } catch (IOException e) { e.printStackTrace(); } // 返回城市代码 return cityCode; } /** * 通过城市名获取天气信息 * * @param cityName * @return 天气信息 */ public HashMap<String, String> getWeatherInfo(String cityName) throws JSONException { // 定义天气信息哈希映射 HashMap<String, String> weather = new HashMap<>(); try { // 获取城市代码 String cityCode = getCityCode(cityName); // 定义url字符串 String strUrl = "http://t.weather.sojson.com/api/weather/city/" + cityCode; // 创建URL对象 URL url = new URL(strUrl); // 创建http连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 建立连接 connection.connect(); // 获取响应码 int code = connection.getResponseCode(); // 判断是否连接成功 if (code == 200) { // 获取字节输入流 InputStream is = connection.getInputStream(); // 创建字节数组用于保存响应信息 byte[] buffer = new byte[is.available()]; // 读取字节输入流全部信息 is.read(buffer); // 获取响应信息字符串 String response = new String(buffer, "utf-8"); // 将json字符串转换成json对象 JSONObject weatherInfoJsonObj = new JSONObject(response); System.out.println(weatherInfoJsonObj); JSONObject cityInfoJsonObj = new JSONObject(weatherInfoJsonObj.getString("cityInfo")); weather.put("城市:", cityInfoJsonObj.getString("parent") + " " + cityInfoJsonObj.getString("city") + "[" + cityCode + "]"); JSONArray forcastJsonArr = new JSONArray(new JSONObject(weatherInfoJsonObj.getString("data")).getString("forecast")); weather.put("时间:", weatherInfoJsonObj.getString("time") + " " + forcastJsonArr.getJSONObject(0).getString("week")); weather.put("温度:", forcastJsonArr.getJSONObject(0).getString("high") + " " + forcastJsonArr.getJSONObject(0).getString("low")); weather.put("天气:", forcastJsonArr.getJSONObject(0).getString("type")); } else { weather.put("错误:", "[" + cityName + "]不存在!"); } } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } // 返回天气信息哈希映射 return weather; } %> <% // 设置请求对象字符编码 request.setCharacterEncoding("utf-8"); // 获取表单提交的数据(城市名) String cityName = request.getParameter("city_name"); // 输出天气信息 HashMap<String, String> weather = getWeatherInfo(cityName); for (String key: weather.keySet()) { out.print(key + weather.get(key) + "<br/>"); } %> </body> </html>
最新回复(0)