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

2023-05-16

一、解决思路

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Web小案例:查询城市天气 的相关文章

  • pyinstaller+tkinter打包

    py文件打包主要是使用 pyinstaller F w p vene文件夹下的lib site packages i py同级文件下的ico文件 py文件 F xff1a 主要是生成单个文件 w 主要是打包后 xff0c 点击exe不弹出命
  • windows使用vcpkg下载安装pcl在vs2019中使用

    windows使用vcpkg下载安装pcl 注 xff1a 1 使用vcpkg安装的pcl似乎没有可视化模块 xff0c 即visualization模块 xff0c 如果需要可视化模块仍建议用allinone 方式安装pcl xff1b
  • 20210507字典与集合

    字典与集合20210507 定义一个列表 xff0c 在列表中保存6个学生的信息 学生信息中包括 姓名 年龄 成绩 单科 电话 性别 男 女 不明 list1 span class token operator 61 span span c
  • jquery-validate remote验证,返回不同的消息内容

    参考文档 xff1a http www cnblogs com xiawuyi archive 2013 04 01 2990224 html 原本remote方法 xff0c 后台只会返回true或false xff0c 无法返回错误的信
  • QT界面运行时间一久就崩溃

    最近写程序时出现了一个奇怪现象 xff0c 一个界面程序显示数据 xff0c 下面有TextEdit打印数据信息 xff0c 时间运行一久就出现界面卡死崩溃 xff0c 而且因为处理的东西不复杂只开了单线程 xff0c 无内存泄漏等问题 最
  • 实验5 动态路由协议EIGRP的配置

    一 实验目的 1 掌握动态路由协议EIGRP的配置 2 了解EIGRP协议的工作原理及过程 3 掌握EIGRP协议的验证及排错方法 4 理解无类路由选择协议EIGRP的特点 二 拓扑图 三 实验过程 1 按照拓扑图进行设备连接 xff0c
  • C++ 十六进制字符串转二进制字符串 1的个数

    一 优化版 建立十六进制字符串 字符 0 F 对应二进制中1的个数的映射数组 代码如下 xff1a span class token macro property span class token directive keyword inc
  • 瀑布流,宽度固定,高度根据图片和文字内容自适应

    后台返回的数据不确定 xff0c 特别是图片 xff0c 大小不固定 xff0c 文字描述也可能不一样 xff0c 导致高度不确定 xff0c 但要求只能n列 xff0c 这时就需要采用瀑布流布局 瀑布流布局可以直接用css方法 xff0c
  • Nginx请求体过大报错413,request_body日志频频为空,实战排查全过程

    承接之前文章使用openresty来搭建https代理与日志打印 xff0c 随着时间的流逝 xff0c 我搭建的openresty已经上了公司的生产服务器 xff0c 就在这周五出现了一个新问题 xff0c 于是我开始了探索了历程 xff
  • Ubuntu下go语言开发环境的搭建

    引言 xff1a 本次环境搭建使用的是ubuntu 22 04 xff1b 在Firefox浏览器中打开https golang google cn dl 下载完成后 xff0c 在文件中将下载好的压缩包移动到主目录下 打开终端输入 xff
  • 如何理解和应用心跳包机制

    心跳包机制 一 什么是心跳包 xff1f 心跳包之所以叫心跳包是因为 xff1a 它像心跳一样每隔固定时间发一次 xff0c 以此来告诉服务器 xff0c 这个客户端还活着 事实上这是为了保持长连接 xff0c 至于这个包的内容 xff0c
  • 程序错误信息记录

    将错误信息写到log日志文件中 在工作中发现 xff0c 工程代码在运行的时候都会打印一些信息 我们对设备进行操作的每一步都会形成记录信息到日志文件中 日志文件一般都是一行或者一段来代表某个功能正常或错误运行打印的信息 根据打印信息我们可以
  • apt update升级问题

    sudo apt update 升级问题 我们在对设备软件库进行升级的时候常常会提示我们升级失败 某些软件只有我们在升级了软件库的时候才能下载 为此我们需要解决掉相关升级失败问题 错误 1 http 123 150 8 42 24031 i
  • QT C++ 框体增加滑动效果

    Touch Gesture 一 QScroller 自带的滑动效果 QScroller是qt自带的能够处理触摸手势的库 包括多指手势和惯性滑动 同时还提供了很多接口属性来设置滑动 效果用于触摸屏的一个滑动器 实现用户用手指来滑动视图 有大量
  • Solr索引的修改方式

    Solr索引的修改方式 xff1a 1 使用Solr Data Import的 delta import部分增量导入的功能 xff1a Solr通过数据库导入有两种方式 xff0c full import和delta import xff0
  • RIME中州韵输入法引擎学习

    RIME中州韵输入法引擎 1 中州韵输入法引擎官网 官网 xff1a https rime im 2 源码包介绍 源码库 xff1a https github com rime librimerime配置管理器和输入模式存储库 xff1a
  • debian下的拆包及重新打包命令

    1 debian下的拆包及重新打包命令 如果想要重新修改deb包里面的数据 xff0c 可以使用此方法进行拆包然后重新打包 dpkg deb X openssh client 6 1p1 i386 deb extract Extract a
  • C语言字符串拼接的两种方法

    strcat include lt stdio h gt include lt stdlib h gt include lt string h gt int main char firstName 61 34 Hello 34 char l
  • 安装Anaconda的问题,在cmd中输入conda指令却显示不存在该指令

    安装Anaconda后配好了环境 xff0c 但在cmd中输入conda指令却显示不存在该指令 之前自己安装过几次Anconda xff0c 都比较成功 xff0c 但这次在新买的电脑里安装Anaconda却出现conda指令不存在的错误
  • AGC005 A - STring(括号匹配)

    题意 xff1a 解法 xff1a 将S看作左括号 span class token punctuation span T看作右括号 span class token punctuation span 由于每次都优先消去左边的ST span

随机推荐

  • 云计算学习之路——Nginx流量控制

    Nginx流量控制 文章目录 Nginx流量控制一 流量控制概念二 Nginx流量限制实战1 普通的nginx流量限制2 基于代理的nginx流量限制 三 Nginx流量限制实战 xff08 基于代理的白名单的流量限制 xff09 一 流量
  • 一键批量将mathtype公式转换成word自带公式-vba/vbnet

    文章目录 实现效果一 mathtype与word自带公式omaths1 mathtype在word中的表现形式2 实现原理3 为什么要将mathtype转换成word自带公式 xff1f 二 代码实现方式1 word自带vba实现2 vbn
  • 二进制字节码的左移、右移、逻辑右移运算

    目录 1 机器码2 lt lt 左移运算符3 gt gt 右移运算符4 gt gt gt 无符号右移 xff08 逻辑右移 xff09 运算符 1 机器码 机器码就是cpu能够直接读取并运行的代码 xff0c 用二进制编码表示 xff0c
  • 1.Ansible的安装及部署

    一 Ansible安装 1 使用epel源 软件仓库配置好官方拓展的epel源后直接安装 dnf span class token function install span ansible y ansible viersion span
  • python输入语句

    python输入语句 python2 python2当中有两种常见的输入语句方法 input 和raw input 1 xff0c input 函数 可以接收不同类型的参数 xff0c 并且返回输入的参数的类型 比如 你输入的数据是int类
  • JS 跨域设置和取Cookie

    Cookie 每当用户计算机通过浏览器请求某个页面时 xff0c 服务器端通过response进行返回 xff0c 客户端将cookie的值保存下来 xff0c Cookie不设定时间的话 xff0c 默认他的生命周期为浏览器会话的期间 x
  • python + selenium 爬取携程飞机航班

    python 43 selenium 驱动谷歌浏览器 实现模拟人工爬取航班数据 xff0c 特别注意 谷歌版本和驱动器版本 驱动获取地址 xff1a https blog csdn net weixin 44186072 article d
  • node app.js 需要注意的启动方式

    很久之前就整过node xff0c 但是后来由于各种原因又给搁置了 xff0c 但是vue和react开发项目都得用到node xff0c 所以还是决定给它从头来一遍学完 首先能搜索出来的文章也好 xff0c 官网也好 xff0c 提到 n
  • 搭建 Prometheus+Grafana 的云平台监控系统

    1 1 1 Prometheus 概述 Prometheus xff08 普罗米修斯 xff09 是一套开源的监控 amp 报警 amp 时间序列数据库的组合 xff0c 起始是由 SoundCloud 公司开发的 现在最常见的 Docke
  • 阿里巴巴矢量图标库踩坑

    今天在写一个login html的网页的时候 xff0c 图标无法显示 代码 xff1a 解决 xff1a 1 将你的项目图标下载到本地 2 在你的编辑器中 xff0c 引用就行了 效果 xff1a 这样就显示出来了 第二种方法 xff1a
  • etcd重启

    k8s启动etcd数据库 在这个主机上面 systemctl stop etcd k8s lib systemd system etcd k8s service 修改配置new修改为existing xff0c 其他不改动并保存清理数据 r
  • harbor搭建与使用

    二 harbor基础操作 1 创建用户 如下 系统管理 gt 用户管理 点击创建用户按钮 点击确定 查看用户已经创建完成 如下 可以设置该用户为管理员 如下 选中用户 点击设置为管理员 再次查看该用户 角色已经变为管理员 修改用户密码 如下
  • Docker 镜像构建入门实战指南

    Docker 镜像构建入门实战指南 一 概述 Dockerfile 是一个用来构建镜像的文本文件 文本内容包含了一条条构建镜像所需的指令和说明 官方文档 https docs docker com engine reference buil
  • 系统优化脚本支持Ubuntu和CentOS

    系统优化脚本支持Ubuntu和CentOS span class token shebang important bin bash span span class token assign left variable os span spa
  • K3S 部署

    K3S 部署 1 ubuntu安装docker span class token comment 更新系统 span span class token function sudo span span class token function
  • 运维常用系统工作命令

    1 xff0e echo命令 echo命令用于在终端输出字符串或变量提取后的值 xff0c 格式为 echo 字符串 变量 例如 xff0c 使用 变量的方式提取变量SHELL的值 xff0c 并将其输出到屏幕上 xff1a root 64
  • OSGI的含义

    OSGI的定义为 xff1a The Dynamic Module System For Java xff0c 主要责任就是为了让开发者能够建立动态化 xff0c 模块化的java系统 使用OSGI后 xff0c 应用就可以像搭积木一样完成
  • CentOS7.4使用yum安装MariaDB

    一 创建MariaDB repo文件 root 64 localhost vi etc yum repos d MariaDB repo MariaDB 10 2 4 CentOS repository list created 2017
  • latex 字符上一横,箭头等显示方式

    a bar a a 横线 a
  • Java Web小案例:查询城市天气

    一 解决思路 1 首先获取泸州的城市代码 在返回的数据里 xff0c 第一项的ref值就是泸州的城市代码 xff1a 101271001 2 利用国家气象局提供的接口访问泸州的天气信息 二 准备工作 学会如何在Java程序里解析json 准