跨越訪問(wèn)

一.要求在網(wǎng)頁(yè)上顯示輸入框,根據(jù)用戶(hù)輸入的城市獲取該城市的天氣預(yù)報(bào)拔鹰,然后顯示在該網(wǎng)頁(yè)上贵涵。
二.遇到的問(wèn)題
當(dāng)要讀取的天氣情況的文檔位于本地計(jì)算機(jī)時(shí),可以回顯天氣情況例书,但是當(dāng)動(dòng)態(tài)的從網(wǎng)上獲取并回顯時(shí)刻炒,由于無(wú)法跨域訪問(wèn)數(shù)據(jù)自沧,不能回顯在網(wǎng)頁(yè)上。
三.解決辦法(兩種)
1.使用雅虎推出的一種類(lèi)似 SQL 的查詢(xún)語(yǔ)言YQL來(lái)查詢(xún)天氣情況爱谁,它的原理就是目前在Web上面已經(jīng)有很多結(jié)構(gòu)化數(shù)據(jù)可以供開(kāi)發(fā)人員來(lái)使用孝偎。但是使用這些數(shù)據(jù),要求對(duì)數(shù)據(jù)的請(qǐng)求和響應(yīng)格式有一定的了解寺旺。不同服務(wù)提供者所采用的數(shù)據(jù)格式是不同的势决。YQL 是雅虎提供的一種類(lèi)似 SQL 的查詢(xún)語(yǔ)言,通過(guò)它可以把數(shù)據(jù)服務(wù)作為數(shù)據(jù)庫(kù)表來(lái)查詢(xún)陈莽,并獲得結(jié)果虽抄。YQL 服務(wù)的輸入是使用者提供的 YQL 語(yǔ)句。YQL 服務(wù)解析 YQL 語(yǔ)句私植,然后調(diào)用后臺(tái)真實(shí)的 Web 服務(wù)并獲取結(jié)果菠隆。后臺(tái) Web 服務(wù)的結(jié)果以 XML 或是 JSON 的格式返回給 YQL 服務(wù)的使用者(具體見(jiàn)下圖)狂秘,然后我們將所得的結(jié)果轉(zhuǎn)換為xml對(duì)象躯肌,通過(guò)解析xml對(duì)象將天氣情況回顯在網(wǎng)頁(yè)上。


image.png

2.通過(guò)java中mvc框架來(lái)解決钱烟,可以在后臺(tái)建立控制類(lèi)拴袭,通過(guò)控制類(lèi)去抓取目標(biāo)網(wǎng)頁(yè)上的內(nèi)容曙博,然后將它返回前端,前段將后臺(tái)返回的內(nèi)容轉(zhuǎn)換為xml對(duì)象般哼,通過(guò)解析xml對(duì)象回顯目標(biāo)城市的天氣情況惠窄,原理如下:


image.png

四.具體實(shí)現(xiàn)
1.YQL查詢(xún)語(yǔ)言實(shí)現(xiàn)

<html>
<meta http-equiv="Access-Control-Allow-Origin" content="*" />
<script src="js/jquery-1.4.2.min.js"></script>
<body>
<label>城市</label>
<input id="city" type="text">
<input type="submit" value="查詢(xún)" onclick="fun()">
<h1>W3School.com.cn Internal Note</h1>
<p><b>city:</b> <span id="to"></span><br />
<b>time:</b> <span id="from"></span><br />
<b>wendu:</b> <span id="message"></span><br />
<b>suggest:</b> <span id="suggest"></span><br />
</body>
 <script type="text/javascript">
    function fun(){
        var city=document.getElementById("city").value;
        var site = 'http://www.sojson.com/open/api/weather/xml.shtml?city='+city;
        var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + site + '"') + '&format=xml&callback=?';
        
        $.getJSON(yql, function (data) {
            console.log(data);
            var xmlDoc = (new DOMParser()).parseFromString(data.results[0],"text/xml");
            document.getElementById("to").innerHTML=
                xmlDoc.getElementsByTagName("city")[0].childNodes[0].nodeValue;

                document.getElementById("from").innerHTML=
                xmlDoc.getElementsByTagName("updatetime")[0].childNodes[0].nodeValue;

                document.getElementById("message").innerHTML=
                xmlDoc.getElementsByTagName("wendu")[0].childNodes[0].nodeValue;
                document.getElementById("suggest").innerHTML=
                xmlDoc.getElementsByTagName("environment")[0].getElementsByTagName("suggest")[0].childNodes[0].nodeValue;
        });
    }
</script>
</html>

2.java中mvc框架實(shí)現(xiàn)
①前端視圖

 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<label>城市</label>
<input id="city" type="text">
<input type="submit" value="查詢(xún)" onclick="fun()">
<h1>W3School.com.cn Internal Note</h1>
<p><b>city:</b> <span id="to"></span><br />
<b>time:</b> <span id="from"></span><br />
<b>wendu:</b> <span id="message"></span><br />
<b>suggest:</b> <span id="suggest"></span><br />
</body>
 <script type="text/javascript">
    function fun(){
        var city=document.getElementById("city").value;
        window.location.href="<%=request.getContextPath()%>/WeatherServlet?city="+city;
    }
        
            
            var xmlDoc = (new DOMParser()).parseFromString('<%=request.getAttribute("weather") %>',"text/xml");
            alert('<%=request.getAttribute("weather")%>');
            document.getElementById("to").innerHTML=
                xmlDoc.getElementsByTagName("city")[0].childNodes[0].nodeValue;

                document.getElementById("from").innerHTML=
                xmlDoc.getElementsByTagName("updatetime")[0].childNodes[0].nodeValue;

                document.getElementById("message").innerHTML=
                xmlDoc.getElementsByTagName("wendu")[0].childNodes[0].nodeValue;
                document.getElementById("suggest").innerHTML=
                xmlDoc.getElementsByTagName("environment")[0].getElementsByTagName("suggest")[0].childNodes[0].nodeValue;
        
    
</script> 

</html>

②后臺(tái)控制類(lèi)

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class WeatherServlet
 */
@WebServlet("/WeatherServlet")
public class WeatherServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        String city = request.getParameter("city");
        //參數(shù)url化
        city = java.net.URLEncoder.encode(city, "utf-8");
        String apiUrl = String.format("http://www.sojson.com/open/api/weather/xml.shtml?city=%s",city);
                //開(kāi)始請(qǐng)求
                URL url= new URL(apiUrl);
                URLConnection open = url.openConnection();
                InputStream input = open.getInputStream();
                //這里轉(zhuǎn)換為String,帶上包名蒋腮,怕你們引錯(cuò)包
                Scanner scan=new Scanner(input,"utf-8");
                String result=scan.useDelimiter("\\A").next();
                //輸出
                request.setAttribute("weather", result);
                System.out.println(result);
            
    request.getRequestDispatcher("/1.jsp").forward(request, response);

    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        doGet(request, response);
    }

}

五.運(yùn)行截圖

image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徽惋,一起剝皮案震驚了整個(gè)濱河市险绘,隨后出現(xiàn)的幾起案子誉碴,更是在濱河造成了極大的恐慌,老刑警劉巖黔帕,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件成黄,死亡現(xiàn)場(chǎng)離奇詭異逻杖,居然都是意外死亡思瘟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)够话,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)光绕,“玉大人,你說(shuō)我怎么就攤上這事诞帐。” “怎么了媒至?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵谷徙,是天一觀的道長(zhǎng)驯绎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)屈尼,這世上最難降的妖魔是什么拴孤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任演熟,我火速辦了婚禮,結(jié)果婚禮上芒粹,老公的妹妹穿的比我還像新娘。我一直安慰自己估脆,他們只是感情好座云,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布付材。 她就那樣靜靜地躺著圃阳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葵诈。 梳的紋絲不亂的頭發(fā)上祟同,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音泞坦,去河邊找鬼砖顷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滤蝠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锣险,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼览闰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了崖咨?” 一聲冷哼從身側(cè)響起油吭,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎际邻,沒(méi)想到半個(gè)月后芍阎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轮听,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年血巍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片述寡。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲫凶,死狀恐怖禀崖,靈堂內(nèi)的尸體忽然破棺而出螟炫,到底是詐尸還是另有隱情,我是刑警寧澤掸屡,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布然评,位于F島的核電站,受9級(jí)特大地震影響满着,放射性物質(zhì)發(fā)生泄漏贯莺。R本人自食惡果不足惜宁改,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爹耗。 院中可真熱鬧谜喊,春花似錦、人聲如沸斗遏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肮雨,卻和暖如春箱玷,著一層夾襖步出監(jiān)牢的瞬間怨规,已是汗流浹背锡足。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工舱污, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扩灯。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓珠插,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捻撑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理番捂,服務(wù)發(fā)現(xiàn)江解,斷路器,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)鳖枕、插件桨螺、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 晚上一輛汽車(chē)行駛在州際公路上灭翔,在快速行駛過(guò)程中,一只鹿突然跳出來(lái),司機(jī)猛地踩下剎車(chē)考润,但是還是撞死了這只鹿,后面的車(chē)...
    張?zhí)硌?/span>閱讀 234評(píng)論 1 1
  • 花臉姑娘不是像人們說(shuō)的小花貓的樣子糊治,第一次見(jiàn)面就被她的妝容嚇得夠嗆罚舱,面如重棗,丹鳳眼粥脚,臥蠶眉,五綹長(zhǎng)髯刷允”棠遥活脫脫一個(gè)...
    西北小藥王閱讀 787評(píng)論 0 2
  • 如果你還剛開(kāi)始跑步 那么很多錯(cuò)誤是有的會(huì)犯得 最關(guān)鍵的是 可能你犯了錯(cuò)后 還不知道自己已經(jīng)進(jìn)入了誤區(qū) 下面我們來(lái)看...
    心理測(cè)試控閱讀 318評(píng)論 0 0