日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 用sevlet实现ip定位以及天气预报的功能

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 用sevlet实现ip定位以及天气预报的功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近兩天想實現一個登陸網站就可以自動顯示該地區的的天氣情況。很是苦惱。慢慢研究然后才其所得。
研究的思路大致是這樣的。ip 定位–>通過位置獲取天氣。首先聲明一下,以前國家氣象局的接口已經被封,以前直接傳一個json數據就有天氣情況,現在需要手動解析下。
所以,這樣的實際思路為:ip獲取地址(操作獲取城市名稱)------百度下載各城市對應編號---------io字符串處理(你方便得到的)------通過城市名獲取編號---------通過編號組成網頁url訪問---------截取你所需要的部分。
1:首先,你要做的事可以通過ip訪問到你的地理位置,百度地圖api免費并且挺好用的。百度api
http://api.map.baidu.com/location/ip //HTTP協議

https://api.map.baidu.com/location/ip //HTTPS
協議你要先申請下才能獲取ak,你要訪問的地址 其實是http://api.map.baidu.com/location/ip?ak=“你的ak”;如果有ip加上:&ip="";他返回的是一個json串,你可以用阿里的fastjson解析他,獲取你想要的東西。
2:有了地址之后,在上中國氣象局官網

你會發現每個城市都有一個編號,你可以百度復制到然后通過io字符串處理例如這樣

通過百度接口獲取的名稱,在通過io按照行讀取遍歷找到這個城市的編號,返回
3:通過返回的號拼接地址,抓取,谷歌瀏覽器先抓包分析要抓去的層次內容:

下面先附上沒涉及web端的測試代碼:爬取分析工具:jsuop fastjson
獲取地址 調用方法主類

import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;import org.jsoup.Jsoup; import org.jsoup.nodes.Document;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;public class 地址 {public static void main(String[] args) throws IOException{Document doc=Jsoup.connect("http://api.map.baidu.com/location/ip?ak=nZFzpfoHLDVD3pEPGaSrGCYebppWx7ge").ignoreContentType(true).get();// System.out.println(doc.text());JSONObject jsonObj = JSON.parseObject(doc.text()); // System.out.println(jsonObj);JSONObject jsonObj1=jsonObj.getJSONObject("content").getJSONObject("address_detail");String jsonObj2=(String) jsonObj1.get("city");System.out.println(jsonObj2);//這就是城市名/** 獲取城市對應編號*/city city=new city();String number= city.getcity(jsonObj2);System.out.println(number);/** 獲取天氣信息*/String weather=new search().weather(number);System.out.println(jsonObj2 ":" weather);} }

返回城市編號

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class city {public city(){}public String getcity(String city) throws IOException{{String citynumber="";File file=new File("E:/bianhao2.txt");FileReader in=new FileReader(file);BufferedReader buf=new BufferedReader(in);String s="";while((s=buf.readLine())!=null){String a[]=s.split(":");//System.out.println(a[0]);if(a[0].equals(city.substring(0, city.length()-1))){citynumber=a[1];}} in.close();buf.close();//System.out.println(citynumber);return citynumber; }} }

返回天氣信息,簡單爬蟲不做過多解釋

import java.io.IOException;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements;public class search {public search() {}public String weather(String bianhao) throws IOException{String url="http://www.weather.com.cn/weather/" bianhao ".shtml";Document doc=Jsoup.connect(url).get();Elements links=doc.getElementsByClass("sky skyid lv3 on");//System.out.println(links.text());return links.text();} }

上述是測試主機。如果整合到web上,有幾點注意的
1:request方法獲取客戶端ip正常事可以的,但是獲取本機會是ipv6。并且這個ip也查不到地理位置,所以就需要判斷是否為本機,如果市本機就默認使用不帶ip(不帶ip是解析本機)。
2:通過session傳遞數據。跳轉到該網頁但url不變。
3:輸入流,這就是很坑的地方,如果正常的字符流在windows上是沒問題的,但是部署到linnux服務器上會亂碼,并且linux的sevlet不好調試還得從新導入。試了很多方法才發現原來是我的字符編碼沒設置好(設置成utf不行你可以試試)。注意流的關閉
4:sesson.jsp網頁自行設計,傳遞的內容只需session.getAttribute(“tf”),即可獲取。注意訪問頁面第一次要訪問sevlet。我也不知道為什么。
sevlet代碼為

import java.io.*;import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;public class weather extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");//防止亂碼response.setCharacterEncoding("UTF-8");String path=this.getServletContext().getRealPath("/");String ip=request.getRemoteAddr();String localip=request.getLocalAddr();//System.out.print(ip " " localip " " ip.equals(localip));String url="http://api.map.baidu.com/location/ip?ak=nZFzpfoHLDVD3pEPGaSrGCYebppWx7ge";if(!ip.equals(localip)){url ="&ip=" ip;}Document doc=Jsoup.connect(url).ignoreContentType(true).get();// System.out.println(doc.text());JSONObject jsonObj = JSON.parseObject(doc.text()); // System.out.println(jsonObj);JSONObject jsonObj1=jsonObj.getJSONObject("content").getJSONObject("address_detail");String jsonObj2=(String) jsonObj1.get("city");//獲取城市名稱// System.out.println(jsonObj2);String number= getcity(request, jsonObj2, path);// System.out.println(number);String weather=jsonObj2 ":" getweather(number);// System.out.println(weather); request.getSession().setAttribute("tf",weather);RequestDispatcher dis= request.getRequestDispatcher("session.jsp");//傳輸數據dis.forward(request,response);// }public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}//解析中國天氣網public String getweather(String bianhao) throws IOException{String url="http://www.weather.com.cn/weather/" bianhao ".shtml";Document doc=Jsoup.connect(url).get();Elements links=doc.getElementsByClass("sky skyid lv3 on");//System.out.println(links.text());return links.text();}//返回城市代碼號public String getcity(HttpServletRequest request,String city,String path) throws IOException{{String citynumber="";File file=new File(path "image/bianhao2.txt");//System.out.print(file.getAbsolutePath());citynumber=file.getAbsolutePath();//FileReader in=new FileReader(file);InputStreamReader isr = new InputStreamReader(new FileInputStream(file),"GB2312");BufferedReader buf=new BufferedReader(isr); String s="";while((s=buf.readLine())!=null){String a[]=s.split(":");//System.out.println(a[0]);if(a[0].equals(city.substring(0, city.length()-1))){ citynumber=a[1];return citynumber; } } isr.close();buf.close();//System.out.println(citynumber);return citynumber; }} }

祝君好運,一起加油。

總結

以上是生活随笔為你收集整理的java 用sevlet实现ip定位以及天气预报的功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。