Java學(xué)習(xí)

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經(jīng)搬家了,新的地址是 http://www.javaly.cn 如果有對(duì)文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會(huì)盡力幫助解決。一起進(jìn)步

           

          根據(jù)IP獲取當(dāng)?shù)靥鞖忸A(yù)報(bào)的實(shí)現(xiàn)

          (zhuan)http://bbs.99081.com/viewthread.php?tid=346101根據(jù)IP獲取當(dāng)?shù)靥鞖忸A(yù)報(bào)的實(shí)現(xiàn)



          訪問www.163.com, 首頁(yè)的欄目里有當(dāng)?shù)氐奶鞖忸A(yù)報(bào)。可以猜想,這里的天氣預(yù)報(bào),應(yīng)該是根據(jù)來訪者的ip判斷其所在地給出當(dāng)?shù)氐奶鞖馇闆r。問了一些朋友,也證實(shí)了這一點(diǎn)。項(xiàng)目 里也需要天氣預(yù)報(bào)這個(gè)小欄目,同事做過一個(gè)(從其他站點(diǎn)抓取的),不過實(shí)現(xiàn)不了根據(jù)IP顯示當(dāng)?shù)氐奶鞖馇闆r,需要用戶自行選擇,而且抓取的站點(diǎn)屬于小 站….其可靠性值得懷疑。。所以就萌生了抓取網(wǎng)易的天氣預(yù)報(bào)的想法。。。對(duì)頁(yè)面進(jìn)行分析。。發(fā)現(xiàn)顯示天氣預(yù)報(bào)的區(qū)域是一個(gè)IFrame,IFrame里嵌 入了如下鏈接http: //news.163.com/util/position1.html,對(duì)這個(gè)地址訪問直接跳轉(zhuǎn)到另外一個(gè)鏈接http://news.163.com/weather/news/qx1/56294.html,此鏈接顯示了天氣情況,如圖:



          由此可以推測(cè)http://news.163.com/util/position1.html, 是在根據(jù)來訪者的IP判斷所屬區(qū)域,然后返回一個(gè)該地區(qū)所對(duì)應(yīng)的區(qū)位碼,如: 56294代表成都。如何讓網(wǎng)易來幫我們的站點(diǎn)來訪者判斷所屬區(qū)域,并給出天氣情況,并顯示在自己的站點(diǎn)頁(yè)面上呢?還得繼續(xù)分析。。因?yàn)閔ttp: //news.163.com/util/position1.html,此鏈接一訪問就轉(zhuǎn)向到天氣情況的鏈接,而無(wú)法查看源碼。便猜想。。此頁(yè)面肯定有 些東西。。無(wú)奈之下。。WebRequest一下,出現(xiàn)了如下代碼:


          以下是引用片段:
          1<script language="Javascript">  
          2var city = new Array("安徽","黑龍江","山東","北京","湖北","山西","福建","湖南","陜西","甘肅","吉林","上海","廣 東","江蘇","四川","廣西","江西","天津","貴州","遼寧","西藏","海南","內(nèi)蒙古","新疆","河北","寧夏","云 南","河南","青海","浙江","重慶";  
          3var weaths = new Array('58321','50953','54823','54511','57494','53772','59134','57679','57036','52889','54172','58367','59287','58238','56294','59431','58606','54527','57816','54342','55591','52856','53463','51463','53698','53614','56778','57083','52866','58457','57516');  
          4  
          5function getCookieVal (offset) {  
          6  var endstr = document.cookie.indexOf (";", offset);  
          7  if (endstr == -1)  
          8  endstr = document.cookie.length;  
          9  return unescape(document.cookie.substring(offset, endstr));  
          10}  
          11function GetCookie (name) {  
          12  var arg = name + "=";  
          13  var alen = arg.length;  
          14  var clen = document.cookie.length;  
          15  var i = 0;  
          16  while (i < clen) {  
          17    var j = i + alen;  
          18    if (document.cookie.substring(i, j) == arg)  
          19      return getCookieVal (j);  
          20    i = document.cookie.indexOf(" ", i) + 1;  
          21    if (i == 0)  
          22       break;  
          23  }  
          24  return "";  
          25}  
          26function SetCookie(cookieName,cookieValue,nDays) {  
          27 var today = new Date();  
          28 var expire = new Date();  
          29 if (nDays==null || nDays==0) nDays=1;  
          30 expire.setTime(today.getTime() + 3600000*24*nDays);  
          31 document.cookie = cookieName+"="+escape(cookieValue) + ";path=/;domain=.163.com;expires="+expire.toGMTString();  
          32}  
          33function getCityWeatherID(cityname){  
          34    for(i=0;i<city.length;i++){  
          35    if(city==cityname){  
          36        return weaths;  
          37        }  
          38    }  
          39    return "54511";  
          40}  
          41  
          42var NTES_WeatherAddr = GetCookie("NTES_WeatherAddr";  
          43if (!NTES_WeatherAddr){  
          44    var loc = GetCookie("theaddr";  
          45    if(!loc){  
          46        document.write("<script type='text/javascript' src='http://202.108.39.152/ipquery'><" + "/script>");  
          47    }  
          48}  
          49</script>  
          50<script>  
          51if (!NTES_WeatherAddr){  
          52    NTES_WeatherAddr=getCityWeatherID(loc);  
          53}  
          54window.location.;  
          55</script>  
          56  
          57

          上面的這段js實(shí)現(xiàn)了對(duì)來訪者IP判斷并給出了天氣預(yù)報(bào)結(jié)果的鏈接。Js里的此鏈接: http://202.108.39.152/ipquery,起到的是判斷用戶所在地的作用,返回的是來訪者所在地省份。分析到此,想要的結(jié)果差不多就出來了…

          在客戶端調(diào)用這段js獲得天氣預(yù)報(bào)結(jié)果的鏈接地址,然后交給服務(wù)端來處理。(為什么要交給后臺(tái)處理,而不是直接顯示呢?)因?yàn)橹苯拥贸龅逆溄禹?yè)面上, 有多余的鏈接,還應(yīng)用了樣式(如圖一),不便為自己所用,所以得處理掉。客戶端調(diào)用服務(wù)端的方法很多,最初使用了Ajax框架Anthem,實(shí)現(xiàn)了過后, 覺得有點(diǎn)殺雞用牛刀的感覺。。無(wú)聊之余。。就又用CallBack實(shí)現(xiàn)了一次。。感覺恰到好處。。后來又發(fā)現(xiàn)。。__doPostBack也可以實(shí)現(xiàn)客戶 端調(diào)用服務(wù)端方法。。看來實(shí)現(xiàn)這么一個(gè)功能還真是簡(jiǎn)單。。。

          前臺(tái)頁(yè)面代碼Defaul.aspx:

          以下是引用片段:
            1<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"  ResponseEncoding="GB2312" %>
            2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
            3<html xmlns="http://www.w3.org/1999/xhtml">
            4<head runat="server">
            5<title></title>
            6<script>
            7var city = new Array("安徽","黑龍江","山東","北京","湖北","山西","福建","湖南","陜西","甘肅","吉林","上海","廣 東","江蘇","四川","廣西","江西","天津","貴州","遼寧","西藏","海南","內(nèi)蒙古","新疆","河北","寧夏","云 南","河南","青海","浙江","重慶");
            8var weaths = new Array('58321','50953','54823','54511','57494','53772','59134','57679','57036','52889','54172','58367','59287','58238','56294','59431','58606','54527','57816','54342','55591','52856','53463','51463','53698','53614','56778','57083','52866','58457','57516');
            9
          10var NTES_WeatherAddr = GetCookie("NTES_WeatherAddr");
          11if (!NTES_WeatherAddr){
          12    var loc = GetCookie("theaddr");
          13    if(!loc){
          14        document.write("<script type='text/javascript' src='http://202.108.39.152/ipquery'><" + "/script>");
          15    }
          16}  
          17
          18function getCookieVal (offset) {
          19  var endstr = document.cookie.indexOf (";", offset);
          20  if (endstr == -1)
          21  endstr = document.cookie.length;
          22  return unescape(document.cookie.substring(offset, endstr));
          23}
          24
          25function GetCookie (name) {
          26  var arg = name + "=";
          27  var alen = arg.length;
          28  var clen = document.cookie.length;
          29  var i = 0;
          30  while (i < clen) {
          31    var j = i + alen;
          32    if (document.cookie.substring(i, j) == arg)
          33      return getCookieVal (j);
          34    i = document.cookie.indexOf(" ", i) + 1;
          35    if (i == 0)
          36       break;
          37  }
          38  return "";
          39}
          40
          41function SetCookie(cookieName,cookieValue,nDays) {
          42 var today = new Date();
          43 var expire = new Date();
          44 if (nDays==null || nDays==0) nDays=1;
          45 expire.setTime(today.getTime() + 3600000*24*nDays);
          46 document.cookie = cookieName+"="+escape(cookieValue) + ";path=/;domain=.163.com;expires="+expire.toGMTString();
          47}
          48
          49//根據(jù)Ip服務(wù)器返回的省份名稱獲取對(duì)應(yīng)的編號(hào)
          50function getCityWeatherID(cityname){
          51    for(i=0;i<city.length;i++){
          52    if(city==cityname){
          53        return weaths;
          54        }
          55    }
          56    return "57816";
          57}
          58
          59//獲取所在地天氣預(yù)報(bào)結(jié)果的鏈接
          60function getWeatherUrl(){
          61if (!NTES_WeatherAddr){
          62    NTES_WeatherAddr=getCityWeatherID(loc);
          63     
          64}
          65var addr="http://news.163.com/weather/news/qx1/"+NTES_WeatherAddr+".html";
          66document.form1.Text1.value=addr;
          67}
          68
          69//客戶端調(diào)用服務(wù)端方法實(shí)現(xiàn)對(duì)天氣預(yù)報(bào)結(jié)果鏈接的頁(yè)面內(nèi)容進(jìn)行解析,Anthem實(shí)現(xiàn)方式
          70function showWeatherByAnthem() {
          71    Anthem_InvokePageMethod("ShowWeatherByAnthem", [], getServerResult);
          72}
          73
          74function getServerResult(result) {
          75    document.getElementById("result").innerHTML = result.value;
          76}
          77
          78//客戶端調(diào)用服務(wù)端方法實(shí)現(xiàn)對(duì)天氣預(yù)報(bào)結(jié)果鏈接的頁(yè)面內(nèi)容進(jìn)行解析,_doPostBack實(shí)現(xiàn)方式
          79function showWeatherBylink()
          80{
          81    __doPostBack('LinkButton1','');
          82}
          83
          84//客戶端調(diào)用服務(wù)端方法實(shí)現(xiàn)對(duì)天氣預(yù)報(bào)結(jié)果鏈接的頁(yè)面內(nèi)容進(jìn)行解析,CallBack實(shí)現(xiàn)方式
          85function showWeatherByCallBack()
          86{
          87    var context=document.getElementById("result");
          88    var weatherUrl=document.getElementById("Text1");
          89    var arg="ShowWeatherByCall|" + weatherUrl.value;
          90    <%= ClientScript.GetCallbackEventReference(this,"arg","outPutResult","context")%>;
          91}
          92function outPutResult(result)
          93{      
          94   document.getElementById("result").innerHTML = result;
          95         
          96}
          97</script>
          98</head>
          99<body onload="getWeatherUrl(),showWeatherByCallBack()">
          100    <form id="form1" runat="server">
          101        <span id="result"></span>
          102        <input id="Text1" type="hidden" runat="server" />
          103    </form>
          104</body>
          105</html>
          106


          后臺(tái)代碼Default.cs:

          以下是引用片段:
          1using System;
          2using System.Data;
          3using System.Configuration;
          4using System.Web;
          5using System.Web.Security;
          6using System.Web.UI;
          7using System.Web.UI.WebControls;
          8using System.IO;
          9using System.Net;
          10using Anthem;
          11
          12public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
          13{
          14    protected void Page_Load(object sender, EventArgs e)
          15    {
          16        Anthem.Manager.Register(this);
          17
          18    }
          19
          20    回調(diào)的固定格式#region 回調(diào)的固定格式
          21    public string str_content;
          22   
          23    public void RaiseCallbackEvent(string the_string)
          24    {
          25        str_content = the_string;
          26    }
          27
          28    /**//// <summary>
          29    /// 回調(diào),解析客戶端的參數(shù)
          30    /// </summary>
          31    /// <returns></returns>
          32    public string GetCallbackResult()
          33    {
          34         
          35        string[] parts = str_content.Split('|');
          36        object[] theArgList = new object[parts.Length - 1];
          37        for (int int_index = 1; int_index < parts.Length; int_index++)
          38            theArgList[int_index - 1] = parts[int_index];
          39        return (string)GetType().GetMethod(parts[0]).Invoke(this, theArgList);
          40    }
          41    #endregion
          42
          43    解析url的頁(yè)面內(nèi)容的方法體#region 解析url的頁(yè)面內(nèi)容的方法體
          44    /**//// <summary>
          45    /// Anthem方式,解析獲取的url的頁(yè)面內(nèi)容
          46    /// </summary>
          47    /// <param name="url">url</param>
          48    /// <returns>解析結(jié)果</returns>
          49    [Anthem.Method]
          50    public string ShowWeatherByAnthem()
          51    {
          52
          53        WebRequest request = WebRequest.Create(Text1.Value);
          54        request.Credentials = CredentialCache.DefaultCredentials;
          55        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          56        Stream dataStream = response.GetResponseStream();
          57        StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default);
          58        string str = reader.ReadToEnd();
          59        return str.Substring(220);
          60
          61    }
          62     //<summary>
          63     //回調(diào)方式,解析獲取的url的頁(yè)面內(nèi)容
          64     //</summary>
          65     //<param name="url"></param>
          66     //<returns></returns>
          67    public string ShowWeatherByCall(string url)
          68    {
          69        WebRequest request = WebRequest.Create(url);
          70        request.Credentials = CredentialCache.DefaultCredentials;
          71        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          72        Stream dataStream = response.GetResponseStream();
          73        StreamReader reader = new StreamReader(dataStream, System.Text.Encoding.Default);
          74        string str = reader.ReadToEnd();
          75        return str.Substring(220);
          76
          77    }
          78    #endregion
          79}
          80

          posted on 2009-03-27 17:04 找個(gè)美女做老婆 閱讀(1214) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 吉首市| 漳州市| 汝州市| 沭阳县| 天峻县| 榆中县| 安阳市| 博乐市| 泗阳县| 从江县| 龙泉市| 天气| 新田县| 襄垣县| 通城县| 五大连池市| 综艺| 孟连| 牡丹江市| 溆浦县| 新蔡县| 湘潭县| 郓城县| 鹿邑县| 商都县| 金门县| 乳源| 阿拉尔市| 永清县| 化隆| 舞阳县| 朔州市| 连山| 京山县| 碌曲县| 浦东新区| 什邡市| 桃源县| 乌恰县| 舒城县| 温宿县|