用maven定制一个车联网的天气预报解析项目

用maven定制一个车联网的天气预报解析项目

1:首先我们要根据之前的学习先创建一个maven项目

    本实例以Gao这个项目来介绍,我们要做的功能是把车联网返回的内容解析并格式化后显示出来。车联网天气查询api地址http://developer.baidu.com/map/carapi-7.htm

在此我们需要一个开发者密钥即访问接口中的参数ak。我已经申请好,没有直接使用了,没有的童鞋可以去申请一个。

2:添加新的依赖

  由于我们要解析接口默认返回的xml格式的数据,所以我们要用到一些解析xml的jar包,本例子中用到了dom4j和jaxen相关的jar包来解析xml所需添加的依赖如下
<dependency>

   <groupId>commons-beanutils</groupId>

   <artifactId>commons-beanutils</artifactId>

   <version>1.8.0</version>

  </dependency>

  <dependency>

   <groupId>commons-collections</groupId>

   <artifactId>commons-collections</artifactId>

   <version>3.2.1</version>

  </dependency>

  <dependency>

   <groupId>commons-lang</groupId>

   <artifactId>commons-lang</artifactId>

   <version>2.5</version>

  </dependency>

  <dependency>

   <groupId>commons-logging</groupId>

   <artifactId>commons-logging</artifactId>

   <version>1.1.1</version>

  </dependency>

  <dependency>

   <groupId>commons-logging</groupId>

   <artifactId>commons-logging-api</artifactId>

   <version>1.1</version>

  </dependency>

  <dependency>

   <groupId>net.sf.ezmorph</groupId>

   <artifactId>ezmorph</artifactId>

   <version>1.0.6</version>

  </dependency>

  <dependency>

   <groupId>jaxen</groupId>

   <artifactId>jaxen</artifactId>

   <version>1.1.6</version>

  </dependency>

  <dependency>

   <groupId>net.sf.json-lib</groupId>

   <artifactId>json-lib</artifactId>

   <version>2.4</version>

   <classifier>jdk13</classifier>

  </dependency>

  <dependency>

   <groupId>xalan</groupId>

   <artifactId>xalan</artifactId>

   <version>2.6.0</version>

  </dependency>

  <dependency>

   <groupId>xerces</groupId>

   <artifactId>xercesImpl</artifactId>

   <version>2.9.1</version>

  </dependency>

  <dependency>

   <groupId>xom</groupId>

   <artifactId>xom</artifactId>

   <version>1.2.5</version>

  </dependency>

  <dependency>

   <groupId>velocity</groupId>

   <artifactId>velocity-dep</artifactId>

   <version>1.4</version>

  </dependency>

  <dependency>

   <groupId>org.slf4j</groupId>

   <artifactId>slf4j-log4j12</artifactId>

   <version>1.6.1</version>

  </dependency>

  <dependency>

   <groupId>log4j</groupId>

   <artifactId>log4j</artifactId>

   <version>1.2.17</version>

  </dependency>

  <dependency>

   <groupId>dom4j</groupId>

   <artifactId>dom4j</artifactId>

   <version>1.6.1</version>

  </dependency>

  <dependency>

   <groupId>org.slf4j</groupId>

   <artifactId>slf4j-api</artifactId>

   <version>1.6.1</version>

  </dependency>

 <dependency>

   <groupId>com.alibaba</groupId>

   <artifactId>fastjson</artifactId>

   <version>1.1.23</version>

  </dependency>

3:由于代码比较多,实体类就不展示了,下面看主体代码 项目主程序MyWeather

package com.test.xml;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.apache.log4j.PropertyConfigurator;

import com.test.util.Constants;
import com.test.util.VelocityTemplate;
import com.test.xml.entity.CityWeatherResponse;

/**
 * 主程序
 * @author Administrator
 */
public class MyWeather {
 public static void main(String[] args) throws Exception {
  // 初始化 Log4J
  PropertyConfigurator.configure(MyWeather.class.getClassLoader()
  .getResource("log4j.properties"));//maven项目的src/main/resources下
  BaiduRetriever baidu = new BaiduRetriever();
  //随机选取一个城市来查询天气
  String city = BaiduRetriever.citys.get(new Random().nextInt(953)).getName();
  InputStream ins = baidu.retrieve(city);
  new MyWeather().start(ins);
 }
 public void start(InputStream dataIn) throws Exception {
  // 解析数据
  CityWeatherResponse response = new WeatherParser().parseWether(dataIn);
  //返回正确的状态码进行解析
  if(Constants.ERROR_SUCCESS.equals(response.getError())
    &&Constants.STATUS_SUCCESS.equals(response.getStatus())){
   // 用Velocity格式化输出数据
   Map<String, Object> templateParam = new HashMap<String, Object>();
   templateParam.put("curdate", response.getDate());
   templateParam.put("pm25", response.getResults().getPm25());
   templateParam.put("currentCity", response.getResults().getCurrentCity());
         templateParam.put("weatherList", response.getResults().getWeatherData());
         templateParam.put("indexList", response.getResults().getIndexList());
         VelocityTemplate.parseVMTemplateToFile("weather.vm", templateParam);
        /* String text = VelocityTemplate.parseVMTemplate("weather.vm", templateParam);
   System.out.print(text);*/
  }else{
   System.err.println("返回结果中有错误信息");
  }
 }
}

然后是访问车联网的封装类,此类中还初始化了中国所有的城市信息,以便主程序中每次随机选择一个城市进行查询

BaiduRetriever

package com.test.xml;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.log4j.Logger;

import com.test.util.BaseTest;
import com.test.util.Constants;
import com.test.util.FastJson;
import com.test.util.SomeUtil;
import com.test.xml.entity.City;
import com.test.xml.entity.Weather;

public class BaiduRetriever extends BaseTest{
 private static Logger log = Logger.getLogger(BaiduRetriever.class);
 public static List<City>  citys = new ArrayList<City>();
 static{
  String path = BaiduRetriever.class.getResource("").getPath().substring(1)+"Citys.json";
  FileInputStream in =null;
     BufferedReader br = null;
     StringBuffer sbuf = new StringBuffer();
     try{
      File jsonFile = new File(path);
   in = new FileInputStream(jsonFile); 

      br = new BufferedReader(new InputStreamReader(in));
      String temp =null;

      while((temp=br.readLine())!=null){
       sbuf.append(temp);
      }
    }catch (Exception e) {
        e.printStackTrace();
        System.err.println("异常...");
    }finally{
    try {
     br.close();
     in.close();
    } catch (IOException e) {
     System.err.println("输入、输出流关闭异常");
     e.printStackTrace();
    }
      }
  try{
   citys = FastJson.jsonToList(sbuf.toString(), City.class);
  }catch (Exception e) {
   System.out.println("json转化异常");
  }
 }

 public InputStream retrieve(String location) throws Exception {
  log.info("Retrieving Weather Data");
  Map<String,Object> paramMap = new HashMap<String,Object>();
  paramMap.put("ak", Constants.AK);
  paramMap.put("location", location);
  return readContentFro

mGet(null, SomeUtil.exChangeMapToParam(paramMap));
 }
 public static void main(String[] args) throws Exception {
  System.out.println(Weather.class.getDeclaredFields().length);
  /*System.out.println(citys.size());
  for (City city:citys) {
   System.out.println(city.toString());
  }
  BaiduRetriever baidu = new BaiduRetriever();
  //随机选取一个城市来查询天气
  baidu.retrieve((citys.get(new Random().nextInt(953))).getName());*/
 }
}

返回消息解析类WeatherParser

package com.test.xml;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import com.test.xml.entity.CityWeatherResponse;
import com.test.xml.entity.Index;
import com.test.xml.entity.Results;
import com.test.xml.entity.Weather;

public class WeatherParser {
 /**
  * 天气信息解析类
  *
  * @param in
  * @return
  */
 public CityWeatherResponse parseWether(InputStream in) {
  CityWeatherResponse weatherRes = new CityWeatherResponse();
  Results results = new Results();
  List<Weather> weatherList = new ArrayList<Weather>();
  List<Index> indexList = new ArrayList<Index>();
  SAXReader xmlReader = createXmlReader();
  try {
   Document doc = xmlReader.read(in);
   weatherList = assembleWeather(doc);
   indexList = assembleIndex(doc);
   results = assembleResults(doc, indexList, weatherList);
   weatherRes = assembleResponse(doc, results);

  } catch (DocumentException e) {
   e.printStackTrace();
  }
  return weatherRes;
 }
 /**
  * 组合天气信息
  * @param doc
  * @return
  */
 @SuppressWarnings("unchecked")
 private List<Weather> assembleWeather(Document doc){
  List<Weather> weatherList = new ArrayList<Weather>();
  List<Node> weather = doc.selectNodes("//CityWeatherResponse/results/weather_data/*");
  for(int i=0;i<weather.size();){
   Weather temp = new Weather();
   temp.setDate(weather.get(i++).getText());
   temp.setDayPictureUrl(weather.get(i++).getText());
   temp.setNightPictureUrl(weather.get(i++).getText());
   temp.setWeather(weather.get(i++).getText());
   temp.setWind(weather.get(i++).getText());
   temp.setTemperature(weather.get(i++).getText());
   weatherList.add(temp);
  }

  return CollectionUtils.isNotEmpty(weatherList)?weatherList:null;
 }
 /**
  * 组合小贴士信息
  * @param doc
  * @return
  */
 @SuppressWarnings("unchecked")
 private List<Index> assembleIndex(Document doc){
  List<Index> indexList = new ArrayList<Index>();
  List<Node> index = doc.selectNodes("//CityWeatherResponse/results/index/*");
  for(int i=0;i<index.size();){
   Index temp = new Index();
   temp.setTitle(index.get(i++).getText());
   temp.setZs(index.get(i++).getText());
   temp.setTipt(index.get(i++).getText());
   temp.setDes(index.get(i++).getText());
   indexList.add(temp);
  }

  return CollectionUtils.isNotEmpty(indexList)?indexList:null;
 }
 /**
  * 组合Results
  * @param doc
  * @return
  */
 @SuppressWarnings("unused" )
 private Results assembleResults(Document doc,List<Index> indexList,List<Weather> weatherData){
  Results results = new Results();
  String curCity = doc.selectSingleNode("//CityWeatherResponse/results/currentCity").getText();
  String pm25 = doc.selectSingleNode("//CityWeatherResponse/results/pm25").getText();
  results.setCurrentCity(StringUtils.isNotEmpty(curCity)?curCity:"不存在");
  results.setPm25(StringUtils.isNotEmpty(pm25)?pm25:"不存在");
  results.setWeatherData(weatherData);
  results.setIndexList(indexList);

  return results;
 }
 /**
  * 组合CityWeatherResponse
  * @param doc
  * @return
  */
 @SuppressWarnings("unused" )
 private CityWeatherResponse assembleResponse(Document doc,Results results){
  CityWeatherResponse cityWeatherResponse = new CityWeatherResponse();
  String error = doc.selectSingleNode("//CityWeatherResponse/error").getText();
  String status = doc.selectSingleNode("//CityWeatherResponse/status").getText();
  String rsDate = doc.selectSingleNode("//CityWeatherResponse/date").getText();
  cityWeatherResponse.setError(StringUtils.isNotEmpty(error)?error:"不存在");
  cityWeatherResponse.setStatus(StringUtils.isNotEmpty(status)?status:"不存在");
  cityWeatherResponse.setDate(StringUtils.isNotEmpty(rsDate)?rsDate:"不存在");
  cityWeatherResponse.setResults(results);
  return cityWeatherResponse;
 }
 private SAXReader createXmlReader()
  SAXReader xmlReader = new SAXReader();
  return xmlReader;
 }
}

接着是生成html的Velocity模板文件weather.vm

#**
@author Relieved
@version 1.0
*#
##============================================
#*
首先显示天气信息,然后显示各种小生活小贴士
*#
##List遍历显示天气信息
<!DOCTYPE html>
<html class=" "style="">
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> 天气预报 </title>
</head>

<body>
<div>今天是<span style="color:#8470FF;font-weight:bold;">${curdate}</span></div>
<div><span style="color:#8470FF;font-weight:bold;">${currentCity}:</span>实时天气情况如下:</div>
<div>pm25指数为:<span style="color:#8470FF;font-weight:bold;">${pm25}</span></div>
<table border="1">
#foreach($weather in ${weatherList})
<tr style="background-color:#8470FF;" align="center">
 <td>${weather.date}</td>
 <td>${weather.weather}</td>
 <td>白天:<img src="${weather.dayPictureUrl}"/></td>
 <td>晚上:<img src="${weather.nightPictureUrl}"/></td>
 <td>${weather.temperature}</td>
 <td>${weather.wind}</td>
</tr>
#end
<tr style="background-color:#32cd32;"><td colspan="6">爱心小贴士:</td></tr>
#foreach($index in ${indexList})
<tr style="background-color:#32cd32;">
 <td align="center">${index.title}</td>
 <td align="center">${index.zs}</td>
 <td align="center">${index.tipt}</td>
 <td colspan="3">${index.des}</td>
</tr>
#end
</table>
##============================================
</body>
</html>

4:最后是运行我们的项目

mvn install

mvn exec:java -Dexec.mainClass=com.test.xml.MyWeather.Main

最后打开生成的weather.html效果如下图

至此本项目的功能展示完毕,项目稍后会上传,欢迎交流

时间: 2024-10-12 10:44:13

用maven定制一个车联网的天气预报解析项目的相关文章

使用maven定制原型项目

在此半年以前,曾经用maven定制过原型项目,步骤不是很复杂,而且比较实用.今天突然想起来,想重新定制一个,后来发现忘记了很多,结果还鼓捣了大半个小时.现在我把这个步骤介绍给大家,希望对大家有用.我这里用的工具是myeclipse2014,就不像别人讲的了用命令行操作了. 第一步:我们之所以会想要做一个原型项目,那都是因为想在以后的开发中能够节约一定的时间,把自己之前封装好的东西能够用到以后的项目中,所以我们首先得建一个maven项目,然后进行自己想要的封装.如下图: 第二步:建好了项目之后,我

利用maven构建一个spring mvc的helloworld实例

刚开始学习maven和spring mvc,学的云里雾里的 这里提供一个hello world实例,记录自己的学习之路 首先看maven官网的介绍 Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and do

Maven创建一个Web项目

我们可以通过命令行或者直接使用Eclipse创建一个maven webapp项目:通过命令行创建在命令行中输入如下格式的命令将会创建一个新的maven webapp项目:mvn archetype:generate -DgroupId=moonlit-group -DartifactId=test-wepapp -DarchetypeArtifactId=maven-archetype-webapp这里的:groupId对应的是maven项目的组名:artifactId对应的是项目名:arche

使用Maven创建一个Spring MVC Web 项目

使用Maven创建java web 项目(Spring MVC)用到如下工具: 1.Maven 3.2 2.IntelliJ IDEA 13 3.JDK 1.7 4.Spring 4.1.1 released 5.Tomcat7 6.Logback 1.0.13 日志输出组件 接下来开始演示如何用Maven模板创建web项目 1.使用maven-archetype-webapp模板快速创建web项目的骨架结构 打开控制台,进入到你想要创建web项目的目录,然后运行如下命令: 1 $ mvn ar

基于nginx + dwz定制一个网站

前言 原创文章欢迎转载,请保留出处. 若有任何疑问建议,欢迎回复. 邮箱:[email protected] 稍微花了点时间定制了一个简单的dwz网站,主要利用框架制作了主界面和简单地调用了jQuery.ajax查询json. 利用dwz框架模板 之前已经搭建好dwz了,由于之前搭建的dwz后来使用的时候出现了bug,所以这里我使用新版的dwz 1.4.6,可以到https://code.google.com/p/dwz/downloads/list下载.这里我们只是使用dwz框架而已,所以暂时

定制一个FlatBuffers编译器

个人并不喜欢FlatBuffers编译器生成的代码,原因是我已经习惯了unix风格的代码. 不喜欢之处大致有以下: 1 命名法使用了Pascal命名法,而我个人习惯了小写字母加下划线式的unix式命名法: 2 Create类的函数参数列表的所有参数都堆在一行,非常惨不忍睹,我自己习惯于每行一个参数式的风格: 3 生成的头文件连个预防文件被重复引用的宏都没有: 4 同一个struct或table的所有函数都在一起放着,不同函数之间没有一个空行分割,而且几乎所有的函数都只占用了一行,如果你要进行代码

用maven建一个Hello World项目,maven初使用,maven如何使用

大牛都说maven好用,自己就配置了maven的环境变量,用eclipse建了一个maven项目,但是很遗憾,运行时报错了! 下面就一步步的用maven建一个简单的web项目来讲解一下:(环境配置百度上有,我也忘了,JDK我都不记得怎么配了) 我用了一个新的eclipse来建项目(因为使用maven除了要配置环境变量之外,在eclipse中也是需要配置一些东西的!---我的eclipse用的是jee-mars,其实jee-neon2是最新的,但是这个版本老是无响应,我就换了一个,可能是我的电脑太

如何用Maven创建一个普通Java项目

一下内容包括:用Maven创建一个普通Java项目,并把该项目转成IDEA项目,导入到IDEA,最后把这个项目打包成一个jar文件. 有时候运行mvn命令失败,重复运行几次就OK了,无解. 1.用Maven模板创建一个项目 打开控制台,进入到想要创建项目的目录,然后运行如下命令,参数自由填写: 1 mvn archetype:generate -DgroupId={project-packaging} 2 -DartifactId={project-name} 3 -DarchetypeArti

如何使用maven建一个web3.0的项目

使用eclipse手动建一个maven的web project可能会有版本不合适的情况,例如使用spring的websocket需要web3.0什么的,不全面的修改可能会出现各种红叉,甚是苦恼.我从我的使用经验出发,从建立一个maven项目开始,记录我用maven建一个web3.0的项目. 建立一个maven的web项目 1.首先要安装配置好maven,具体怎么配置就不说了. 2.eclipse->new project->maven project->next->选择maven-