總結得不錯。

          1、按鈕為button,可在js中調用formName.submit()顯性提交。若是submit按鈕,則不能再這樣加提交語句,否則會提交兩次。

          2、一個input域中回車,會默認第一個submit屬性的按鈕提交。若都是butoon屬性,則回車不會提交表單。

          3、有時提交表單后不能刷新頁面,即沒有action=""的情況,<form name="hand" method="post" onSubmit="javascript:return handle();">(此時在handle()中進行處理后會返回一個false)或者<form name="hand" method="post" onSubmit="javascript:handle();return false">或者<input type="button" id="addbt" name="addbt" value="增加關聯" onClick="javascript:subList();return false;" />。這樣做了后能保證只執行js代碼后,本頁面不刷新,也不提交到另一個頁面。

          //一般提交 
          function del(myform) 

          myform.target="_blank" //也可以是_self,_top,_parent,默認為_self 
          myform.action="trade_delete.asp"; 
          myform.submit();  


          //提交后對窗口的限制 
          function del(creator) 

          creator.target="preview"; 
          creator.action="register_check.asp"; 
          var win = window.open("about:blank","preview","toolbar=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=250,height=25,top=250,left=300"); 
          win.focus(); 
          creator.submit(); 

           

           

           

        1. 總結下這么幾種的方法:   
        2. 1,通過type=submit 或者圖片的submti來提交(圖片的這種方法很不錯)   
        3. 2,通過在imput里面加onclick來寫個方法來做提交前的驗證.type可以是button.,反正多個瀏覽器  
        4.    做的時候,試驗一下.   
        5. 3,還有可以通過在form里面加onsubmit來驗證.   
        6. 4,通過在javascript的方法里頭,用submit()方法來提交   
        7.   具體得到這個form的方法有:   
        8. oForm = document.getElementById("form1");   
        9. oForm = document.forms("form1");   
        10. oForm = document.forms[0];   
        11. //通過上面的幾種可以得到form   
        12. oForm.submit(); 
        13. xml 代碼
          1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
          2. <html>  
          3. <script type="text/javascript">  
          4.     function dosubmit() {   
          5.         alert("heihei");   
          6.     }   
          7. script>  
          8. <head>javascript測試head>  
          9. <body>  
          10.        
          11. <hr>  
          12.     <form action="print.jsp" method="post">  
          13.          <input type="text" name="hello"/>  
          14.          <input type="submit" name="sub" value="提交" onclick="dosubmit()"/>  
          15.            
          16.     form>  
          17. body>  
          18. html>  

          可以在函數里面做出驗證.

          這個要用onclick 來觸發事件,onchange,試了下不行其他不行.

          這里是用按鈕.這里type用了submit

          xml 代碼
          1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
          2. <html>  
          3. <script type="text/javascript">  
          4.     function dosubmit() {   
          5.         document.forms[0].submit();   
          6.         alert("^_^提交成功!");   
          7.     }   
          8. script>  
          9. <head>javascript測試head>  
          10. <body>  
          11.        
          12. <hr>  
          13.     <form action="print.jsp" method="post">  
          14.          <input type="text" name="hello"/>  
          15.          <input type="button" name="sub" value="提交" onclick="dosubmit()"/>  
          16.            
          17.     form>  
          18. body>  
          19. html>  

           這里type用button,用document.forms[0].submit()來提交.

          xml 代碼
          1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
          2. <html>  
          3. <script type="text/javascript">  
          4.     function dosubmit() {   
          5.         //document.forms[0].submit();   
          6.         alert("1111提交成功!");   
          7.     }   
          8. script>  
          9. <head>javascript測試head>  
          10. <body>  
          11.        
          12. <hr>  
          13.     <form action="print.jsp" method="post">  
          14.          <input type="text" name="hello"/>  z
          15.          <input type="image"  src="submit.bmp" name="sub" onclick="dosubmit()"/>  
          16.            
          17.     form>  
          18. body>  
          19. html>  
          20. <form name="form1" method="post" action="<%=request.getContextPath()%>/news/NewsTypeAddAction.sh"

            onSubmit="return actionCheck();">


            <table>
            <tr>
            <td>新聞類型編號</td>
            <td>
            <input type="text" name="typeid" onBlur="isDigit(this.value)"> </td>
            </tr>
            <tr>
            <td>新聞類型名稱</td>
            <td>
            <input type="text" name="typename"> </td>
            </tr>
            <tr>
            <td>新聞存放目錄名稱</td>
            <td>
            <input type="text" name="dir"> </td>
            </tr>
            <tr>
            <td>使用模版名稱</td>
            <td>
            <input type="text" name="templatename"> </td>
            </tr>
            <tr>
            <td colspan="2">
            <div align="center">
            <input type="submit" name="Submit" value="Submit">
            <input type="reset" value="Reset"> 
            </div></td>
            </tr>
            </table>
            </form>
            <script type="text/javascript">
            function isDigit(s)
            {
            var patrn=/^[0-9]{1,20}$/;
            if (!patrn.exec(s)&&s!=""){
            alert("請您輸入數字!");
            document.form1.typeid.value="";
            document.form1.typeid.focus();
            return false;
            }
            }

            function actionCheck()
          21. {
                 if(document.form1.typeid.value=="")
          22.      {
                       alert("新聞類型編號不能為空!");
                       document.form1.typeid.value="";
                        document.form1.typeid.focus();
                        return false;
            }
            }
            </script>
          posted @ 2011-11-23 19:32 小馬歌 閱讀(2131) | 評論 (0)編輯 收藏
           
          posted @ 2011-11-19 12:58 小馬歌 閱讀(365) | 評論 (0)編輯 收藏
           

          簡介

            一般使用源應用的API接口,或者是一些rss輸出(含atom)作為內容源,合并的web應用用什么技術,則沒有什么限制。mashup在geek群體和互聯網玩家之中獲得了極大的歡迎,mashup未必需要很高的編程技能,只需要熟悉api和網絡服務工作方式,都能進行開發,所以很快成為一個流行的網絡現象。很多公司例如yahoo/google都為此提供開放接口,以吸引這個群體。
            Mashup 是一個非常cool的新的應用程序種類。如果你想真正的了解它們,我們需要回過頭來看看你現在的計算機,其實它就是一個非常好的幫助你理解Mashup的模型。計算機運行著操作系統,例如Windows。現在開源的操作系統無疑是一個非常好的APIs 的集合或者一個應用程序編程接口,幫助開發者去構建他們的應用程序。計算機本身也是一個很好的為用戶提供接口的例子,鍵盤和鼠標可以被理解為你通過計算機的接口而使用的不同的應用程序。
            

          Mashup

          一個API可能是幫助電腦接入網絡又或者用來提供顯示功能。總之,這些APIs 幫助開發者更加容易的去構建他們的應用程序。在過去開發者需要描繪每一個點顯示的位置,而現在僅僅需要給出對稱坐標,就可以完成一個窗口的繪制。
            APIs做的事情是這樣的。假如你訪問文件系統,那么你所需得到APIs,這是計算機工作的途徑。然后你就可以在一個窗口里運行一個應用程序。人們開發一個應用程序通常需要3或4個不同的APIs,或許更多。

          編輯本段運行方式

            這是一個計算機傳統的運行方式。現在,我們將Windows,操作系統替換成網絡。那么同樣的,就會有許多公司來提供哪些APIs。比如yahoo,google.例如一個叫EVDB的公司,它是一個事件日歷的數據庫,可以提醒你什么時間到哪里做什么事情。也包括像 Amazon 和 eBay,又比如Technorati ,所有這些不同的公司把APIs放到網上使開發者可以訪問。
            現在假如你是一個Web開發者,你通過一個API 找到你附近哪些地方會有犯罪。然后你訪問Google 地圖API,把這兩個內容整合在一起,那么你就得到了一個標有犯罪紀錄的地圖。這個新的地圖就叫Mashup。因為開發者通過來自多個網站的APIs,把他們合并在一起,成為了一個新的很cool的應用程序。

          編輯本段目前

            越來越多的APIs被開放,這是一個比較明確的方向,每天都會有大概2.5個Mashup產生,預計到2007年每天Mashup的產生數量會增加到10個。
            之所以,一天會有10個Mashup產生是因為,開發將會變得越來越容易,你不用再必須變成一個C語言程序員去展示你的創造力,你可以開發很Cool的應用,例如哪里有停車空位的地圖,就像在California得Bay 地區的 ParkingCarma 所做的那樣。又或者你開發一個地圖標記出你的鄰居和你想去會見某人,這其實也已經是一個事實存在的應用了,FrozenBear公司正在做這方面的開發。
            我們展示這些Mashup的同時,又有新的APIs隨時發布到網上,這就形成了一個生態系統,而且這個生態系統比目前現存的所有生態系統都會增長的更快。Windows,你必須成為一個程序員才可以開發應用程序,Linux,Macintosh也同樣是如此,但是Mashup卻不必, 它將會是今天增長速度最快的一個生態體統。

          編輯本段發展

            
            

          Windows

          Mashup 不僅僅是發展的很快,更好的一個地方是你不再需通過某人才可以發布一個新API到網上。以前你必須要通過微軟才可以發布一個新的API加入到Windows,這種情況同樣出現在Macintosh。另,盡管你也許可以添加一個API直接到Linux,因為它是開源的,但是這對大多開發者來說并不具備這樣的權利。
            另外,你在發布了一個API到網上之后,不需要再通過誰去批準它,它會自動對所有開發者有效。所有的不同的APIs都會成為更多Mashup的燃料。
            越來越多的Mashup出現在網上,越來越多的網絡用戶去使用這些新的Mashup應用程序。越來越多的開發者加入到開發Mashup這個生態系統當中。在未來兩年,你將可以聽到關于Mashup的信息。

          編輯本段典型應用

          地圖 Mashup

            在這個階段的信息技術中,人們搜集大量有關事物和行為的數據,二者都常常具有位置注釋信息。所有這些包含位置數據的不同數據集均可利用地圖通過令人驚奇的圖形化方式呈現出來。mashup 蓬勃發展的一種主要動力就是 Google 公開了自己的 Google Maps API。這仿佛打開了一道大門,讓 Web 開發人員(包括愛好者、修補程序開發人員和其他一些人)可以在地圖中包含所有類型的數據(從原子彈災難到波士頓的 CowParade 奶牛都可以)。為了不落于人后,Microsoft(Virtual Earth)、Yahoo(Yahoo Maps)和 AOL(MapQuest)也很快相繼公開了自己的 API。

          視頻和圖象 Mashup

            圖像主機和社交網絡站點(例如 Flickr 使用自己的 API 來共享圖像)的興起導致出現了很多有趣的 mashup。由于內容提供者擁有與其保存的圖像相關的元數據(例如誰拍的照片,照片的內容是什么,在何時何地拍攝的等等),mashup 的設計者可以將這些照片和其他與元數據相關的信息放到一起。例如,mashup 可以對歌曲或詩詞進行分析,從而將相關照片拼接在一起,或者基于相同的照片元數據(標題、時間戳或其他元數據)顯示社交網絡圖。另外一個例子可能以一個 Web 站點(例如 CNN 之類的新聞站點)作為輸入,并在新聞中通過照片匹配而將照片中的內容以文字的形式呈現出來。

          搜索和購物 Mashup

            搜索和購物 mashup 在 mashup 這個術語出現之前就已經存在很長時間了。在 Web API 出現之前,有相當多的購物工具,例如 BizRate、PriceGrabber、MySimon 和 Google 的 Froogle,都使用了 B2B 技術或屏幕抓取的方式來累計相關的價格數據。為了促進 mashup 和其他有趣的 Web 應用程序的發展,諸如 eBay 和 Amazon 之類的消費網站已經為通過編程訪問自己的內容而發布了自己的 API。

          新聞 Mashup

            新聞源(例如紐約時報、BBC 或路透社)已從 2002 年起使用 RSS 和 Atom 之類的聯合技術來發布各個主題的新聞提要。以聯合技術為基礎的 mashup 可以聚集一名用戶的提要,并將其通過 Web 呈現出來,創建個性化的報紙,從而滿足讀者獨特的興趣。

          微博 Mashup

            將多個微博在一個平臺上進行聚合顯示, 在一個平臺上可以同時綁定多個微博(騰訊微博、新浪微博、搜狐微博、網易微博、人人網、豆瓣、飯否、嘀咕、Follow5、天涯微博、人間網、做啥、9911、同學網、開心網等),從而滿足用戶同步多個平臺的要求,提供了微博信息匯總表,讓用戶方便查看自己所有平臺的粉絲,關注和微博數,輕松實現在不同微博間自由切換。并且提供多微博評論列表讀取,跨平臺分享,聚合收藏等功能。使用戶可在同一屏幕中同步收發信息,實現了真正意義上的社交網站雙向聚合。類似網站功能的有瑪撒網,微博通等。
          posted @ 2011-11-19 12:41 小馬歌 閱讀(278) | 評論 (0)編輯 收藏
           
          由 yangyi 于 2009-05-31 22:28:36 提供


          2009 年 5 月 25 日

          隨著公開提供的 Web 服務 API 不斷增加,現在可以輕松地從不同 Web 源獲取資源并構建 mashup —— 只要您能訪問正確的 API 和工具。探究如何能夠結合高深的跨域調用技術(JSONP)和靈活的 JavaScript 庫(jQuery),以快速構建強大的 mashup。

          簡介

          Asynchronous JavaScript and XML (Ajax) 是驅動新一代 Web 站點(流行術語為 Web 2.0 站點)的關鍵技術。Ajax 允許在不干擾 Web 應用程序的顯示和行為的情況下在后臺進行數據檢索。使用 XMLHttpRequest 函數獲取數據,它是一種 API,允許客戶端 JavaScript 通過 HTTP 連接到遠程服務器。Ajax 也是許多 mashup 的驅動力,它可將來自多個地方的內容集成為單一 Web 應用程序。

          不過,由于受到瀏覽器的限制,該方法不允許跨域通信。如果嘗試從不同的域請求數據,會出現安全錯誤。如果能控制數據駐留的遠程服務器并且每個請求都前往同一域,就可以避免這些安全錯誤。但是,如果僅停留在自己的服務器上,Web 應用程序還有什么用處呢?如果需要從多個第三方服務器收集數據時,又該怎么辦?

          理解同源策略限制

          同源策略阻止從一個域上加載的腳本獲取或操作另一個域上的文檔屬性。也就是說,受到請求的 URL 的域必須與當前 Web 頁面的域相同。這意味著瀏覽器隔離來自不同源的內容,以防止它們之間的操作。這個瀏覽器策略很舊,從 Netscape Navigator 2.0 版本開始就存在。

          克服該限制的一個相對簡單的方法是讓 Web 頁面向它源自的 Web 服務器請求數據,并且讓 Web 服務器像代理一樣將請求轉發給真正的第三方服務器。盡管該技術獲得了普遍使用,但它是不可伸縮的。另一種方式是使用框架要素在當前 Web 頁面中創建新區域,并且使用 GET 請求獲取任何第三方資源。不過,獲取資源后,框架中的內容會受到同源策略的限制。

          克服該限制更理想方法是在 Web 頁面中插入動態腳本元素,該頁面源指向其他域中的服務 URL 并且在自身腳本中獲取數據。腳本加載時它開始執行。該方法是可行的,因為同源策略不阻止動態腳本插入,并且將腳本看作是從提供 Web 頁面的域上加載的。但如果該腳本嘗試從另一個域上加載文檔,就不會成功。幸運的是,通過添加 JavaScript Object Notation (JSON) 可以改進該技術。

          JSON 和 JSONP

          JSON 是用于在瀏覽器和服務器之間交換信息的輕量級數據格式(與 XML 相比)。JOSON 依賴于 JavaScript 開發人員,因為它是 JavaScript 對象的字符串表示。例如,假設有一個含兩個屬性的 ticker 對象:symbol 和 price。這是在 JavaScript 中定義 ticker 對象的方式:

          var ticker = {symbol: 'IBM', price: 91.42};

          并且這是它的 JSON 表示方式:

          {symbol: 'IBM', price: 91.42}

          從 參考資料 查找更多有關 JSON 和將其作為數據內部交換格式的信息。清單 1 定義了一個 JavaScript 函數,調用該函數時會顯示 IBM 的股價。(我們沒有詳細介紹如何將該函數添加到 Web 頁面)。


          清單 1. 定義 showPrice 函數
          function showPrice(data) {     alert("Symbol: " + data.symbol + ", Price: " + data.price); }                 

          可以將 JSON 數據作為參數傳遞,以調用該函數:

          showPrice({symbol: 'IBM', price: 91.42}); // alerts: Symbol: IBM, Price: 91.42                 

          現在準備將這兩個步驟包含到 Web 頁面,如清單 2 所示。


          清單 2. 在 Web 頁面中包含 showPrice 函數和參數
          <script type="text/javascript"> function showPrice(data) {     alert("Symbol: " + data.symbol + ", Price: " + data.price); } </script> <script type="text/javascript">showPrice({symbol: 'IBM', price: 91.42});</script> 

          加載頁面后,應該看如圖 1 所示的警告。


          圖 1. IBM ticker
          IBM ticker 

          至此,本文已展示了如何將靜態 JSON 數據作為參數調用 JavaScript 函數。不過,通過在函數調用中動態包裝 JSON 數據可以用動態數據調用函數,這是一種動態 JavaScript 插入的技術。要查看其效果,將下面一行放入名為 ticker.js 的獨立 JavaScript 文件中。

          showPrice({symbol: 'IBM', price: 91.42});

          現在改變 Web 頁面中的腳本,使其和清單 3 一樣。


          清單 3. 動態 JavaScript 插入代碼
          <script type="text/javascript"> // This is our function to be called with JSON data function showPrice(data) {     alert("Symbol: " + data.symbol + ", Price: " + data.price); } var url = “ticker.js”; // URL of the external script // this shows dynamic script insertion var script = document.createElement('script'); script.setAttribute('src', url);  // load the script document.getElementsByTagName('head')[0].appendChild(script);  </script> 				

          在清單 3 所示的例子中,動態插入的 JavaScript 代碼位于 ticker.js 文件中,它將真正的 JSON 數據作為參數調用showPrice()函數。

          前面已經提到,同源策略不阻止將動態腳本元素插入文檔中。也就是說,可以動態插入來自不同域的 JavaScript,并且這些域都攜帶 JSON 數據。這其實是真正的 JSONP(JSON with Padding):打包在函數調用中的 JSON 數據。注意,為了完成該操作,Web 頁面必須在插入時具有已經定義好的回調函數,也就是我們例子中的 showPrice()

          不過,所謂的 JSONP 服務(或 Remote JSON Service)是一種帶有附加功能的 Web 服務,該功能支持在特定于用戶的函數調用中打包返回的 JSON 數據。這種方法依賴于接受回調函數名作為請求參數的遠程服務。然后該服務生成對該函數的調用,將 JSON 數據作為參數傳遞,在到達客戶端時將其插入 Web 頁面并開始執行。





          回頁首


          jQuery 的 JSONP 支持

          從 1.2 版本開始,jQuery 擁有對 JSONP 回調的本地支持。如果指定了 JSONP 回調,就可以加載位于另一個域的 JSON 數據,回調的語法為:url?callback=?

          jQuery 自動將 ? 替換為要調用的生成函數名。清單 4 顯示了該代碼。


          清單 4. 使用 JSONP 回調
          jQuery.getJSON(url+"&callback=?", function(data) {     alert("Symbol: " + data.symbol + ", Price: " + data.price); }); 

          為此,jQuery 將一個全局函數附加到插入腳本時需要調用的窗口對象。另外,jQuery 也能優化非跨域調用。如果向同一個域發出請求,jQuery 就將其轉化為普通 Ajax 請求。

          使用 JSONP 支持的示例服務

          在上一個例子中,使用了靜態文件(ticker.js)將 JavaScript 動態插入到 Web 頁面中。盡管返回了 JSONP 回復,但它不允許您在 URL 中定義回調函數名。這不是 JSONP 服務。因此,如何才能將其轉換為真正的 JSONP 服務呢?可使用的方法很多。這里我們將分別使用 PHP 和 Java 展示兩個示例。

          首先,假設您的服務在所請求的 URL 中接受了一個名為 callback 的參數。(參數名不重要,但是客戶和服務器必須都同意該名稱)。另外假設向服務發送的請求是這樣的:

          http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=showPrice

          在這種情況下,symbol 是表示請求 ticker symbol 的請求參數,而 callback 是 Web 應用程序的回調函數的名稱。使用清單 5 所示的代碼可以通過 jQuery 的 JSONP 支持調用該服務。


          清單 5. 調用回調服務
          jQuery.getJSON("http://www.yourdomain.com/jsonp/ticker?symbol=IBM&callback=?",  function(data) {     alert("Symbol: " + data.symbol + ", Price: " + data.price); }); 

          注意,我們使用 ? 作為回調函數名,而非真實的函數名。因為 jQuery 會用生成的函數名替換 ?。所以您不用定義類似于showPrice() 的函數。

          清單 6 顯示了用 PHP 實現的 JSONP 服務的一段代碼。


          清單 6. 用 PHP 實現的 JSONP 服務的代碼片段
          $jsonData = getDataAsJson($_GET['symbol']); echo $_GET['callback'] . '(' . $jsonData . ');'; // prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"}); 

          清單 7 顯示了具有同樣功能的 Java™ Servlet 方法。


          清單 7. 用 Java servlet 實現的 JSONP 服務
          @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)    throws ServletException, IOException { 	String jsonData = getDataAsJson(req.getParameter("symbol")); 	String output = req.getParameter("callback") + "(" + jsonData + ");";  	resp.setContentType("text/javascript");            	PrintWriter out = resp.getWriter(); 	out.println(output); 	// prints: jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"}); } 

          那么,如果要構建 mashup 應該怎么辦,是從第三方服務器收集內容,并在單一的 Web 頁面中顯示它們嗎?答案很簡單:您必須使用第三方 JSONP 服務。這種服務并不少。

          現成的 JSONP 服務

          知道如何使用 JSONP 之后,可以開始使用一些現成的 JSONP Web 服務來構建應用程序和 mashup。下面為接下來的開發項目做準備。(提示:您可以復制特定的 URL 并將其粘貼到瀏覽器的地址欄,以檢查生成的 JSONP 響應)。

          Digg API:來自 Digg 的頭條新聞:

          http://services.digg.com/stories/top?appkey=http%3A%2F%2Fmashup.com&type=javascript &callback=? 

          Geonames API:郵編的位置信息:

          http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?

          Flickr API:來自 Flickr 的最新貓圖片:

          http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any &format=json&jsoncallback=?                 

          Yahoo Local Search API:在郵編為 10504 的地區搜索比薩:

          http://local.yahooapis.com/LocalSearchService/V3/localSearch?appid=YahooDemo&query=pizza &zip=10504&results=2&output=json&callback=? 





          回頁首


          重要提示

          JSONP 是構建 mashup 的強大技術,但不幸的是,它并不是所有跨域通信需求的萬靈藥。它有一些缺陷,在提交開發資源之前必須認真考慮它們。第一,也是最重要的一點,沒有關于 JSONP 調用的錯誤處理。如果動態腳本插入有效,就執行調用;如果無效,就靜默失敗。失敗是沒有任何提示的。例如,不能從服務器捕捉到 404 錯誤,也不能取消或重新開始請求。不過,等待一段時間還沒有響應的話,就不用理它了。(未來的 jQuery 版本可能有終止 JSONP 請求的特性)。

          JSONP 的另一個主要缺陷是被不信任的服務使用時會很危險。因為 JSONP 服務返回打包在函數調用中的 JSON 響應,而函數調用是由瀏覽器執行的,這使宿主 Web 應用程序更容易受到各類攻擊。如果打算使用 JSONP 服務,了解它能造成的威脅非常重要。(參見 參考資料 了解更多信息)。





          回頁首


          結束語

          在該系列的第一篇文章中,我們講解了如何結合使用 JSONP 和 jQuery 快速構建強大的 mashup。主要主題包括:

          • 瀏覽器同源策略的限制以及解決辦法
          • 作為一種有效的跨域通信技術,JSONP 能夠繞過當前瀏覽器的同源策略限制
          • JSONP 使 Web 應用程序開發人員能夠快速構建 mashup
          • 示例 JSONP 服務及其使用:Ticker 服務

          本系列的下一篇文章將介紹 Yahoo! 查詢語言(YQL),這種單端點 JSONP 服務允許您跨 Web 查詢、過濾和合并數據。最后還使用 YQL 和 jQuery 構建 mashup 應用程序。



          參考資料

          posted @ 2011-11-19 12:40 小馬歌 閱讀(276) | 評論 (0)編輯 收藏
           
          當不能預先確定報文體的長度時,不可能在頭中包含Content-Length域來指明報文體長度,此時就需要通過Transfer-Encoding域來確定報文體長度。
              通常情況下,Transfer-Encoding域的值應當為chunked,表明采用chunked編碼方式來進行報文體的傳輸。chunked編碼是HTTP/1.1 RFC里定義的一種編碼方式,因此所有的HTTP/1.1應用都應當支持此方式。
              chunked編碼的基本方法是將大塊數據分解成多塊小數據,每塊都可以自指定長度,其具體格式如下(BNF文法):
              Chunked-Body   = *chunk            //0至多個chunk
                               last-chunk         //最后一個chunk 
                               trailer            //尾部
                               CRLF               //結束標記符

             chunk          = chunk-size [ chunk-extension ] CRLF   
                                  chunk-data CRLF
             chunk-size     = 1*HEX
             last-chunk     = 1*("0") [ chunk-extension ] CRLF

             chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
             chunk-ext-name = token
             chunk-ext-val  = token | quoted-string
             chunk-data     = chunk-size(OCTET)
             trailer        = *(entity-header CRLF)      
              
              解釋:
              Chunked-Body表示經過chunked編碼后的報文體。報文體可以分為chunk, last-chunk,trailer和結束符四部分。chunk的數量在報文體中最少可以為0,無上限;每個chunk的長度是自指定的,即,起始的數據必然是16進制數字的字符串,代表后面chunk-data的長度(字節數)。這個16進制的字符串第一個字符如果是“0”,則表示chunk-size為0,該chunk為last-chunk,無chunk-data部分。可選的chunk-extension由通信雙方自行確定,如果接收者不理解它的意義,可以忽略。
              trailer是附加的在尾部的額外頭域,通常包含一些元數據(metadata, meta means "about information"),這些頭域可以在解碼后附加在現有頭域之后。
              實例分析:
              下面分析用ethereal抓包使用Firefox與某網站通信的結果(從頭域結束符后開始):
          Address  0..........................  f
          000c0                                31
          000d0    66 66 63 0d 0a ...............   // ASCII碼:1ffc/r/n, chunk-data數據起始地址為000d5
                   很明顯,“1ffc”為第一個chunk的chunk-size,轉換為int為8188.由于1ffc后馬上就是
                   CRLF,因此沒有chunk-extension.chunk-data的起始地址為000d5, 計算可知下一塊chunk的起始
                   地址為000d5+1ffc + 2=020d3,如下:
          020d0    .. 0d 0a 31 66 66 63 0d 0a .... // ASCII碼:/r/n1ffc/r/n
                   前一個0d0a是上一個chunk的結束標記符,后一個0d0a則是chunk-size和chunk-data的分隔符。
                   此塊chunk的長度同樣為8188, 依次類推,直到最后一塊
          100e0                          0d 0a 31
          100f0    65 61 39 0d 0a......            //ASII碼:/r/n/1ea9/r/n
                   此塊長度為0x1ea9 = 7849, 下一塊起始為100f5 + 1ea9 + 2 = 11fa0,如下:
          100a0    30 0d 0a 0d 0a                  //ASCII碼:0/r/n/r/n
                   “0”說明當前chunk為last-chunk, 第一個0d 0a為chunk結束符。第二個0d0a說明沒有trailer部分,整個Chunk-body結束。
              解碼流程:
              對chunked編碼進行解碼的目的是將分塊的chunk-data整合恢復成一塊作為報文體,同時記錄此塊體的長度。
              RFC2616中附帶的解碼流程如下:(偽代碼)
              length := 0         //長度計數器置0
              read chunk-size, chunk-extension (if any) and CRLF      //讀取chunk-size, chunk-extension
                                                                    //和CRLF
              while(chunk-size > 0 )   {            //表明不是last-chunk
                    read chunk-data and CRLF            //讀chunk-size大小的chunk-data,skip CRLF
                    append chunk-data to entity-body     //將此塊chunk-data追加到entity-body后
                    read chunk-size and CRLF          //讀取新chunk的chunk-size 和 CRLF
              }
              read entity-header      //entity-header的格式為name:valueCRLF,如果為空即只有CRLF
              while (entity-header not empty)   //即,不是只有CRLF的空行
              {
                 append entity-header to existing header fields
                 read entity-header
              }
              Content-Length:=length      //將整個解碼流程結束后計算得到的新報文體length
                                           //作為Content-Length域的值寫入報文中
              Remove "chunked" from Transfer-Encoding  //同時從Transfer-Encoding中域值去除chunked這個標記
              length最后的值實際為所有chunk的chunk-size之和,在上面的抓包實例中,一共有八塊chunk-size為0x1ffc(8188)的chunk,剩下一塊為0x1ea9(7849),加起來一共73353字節。
              注:對于上面例子中前幾個chunk的大小都是8188,可能是因為:"1ffc" 4字節,"/r/n"2字節,加上塊尾一個"/r/n"2字節一共8字節,因此一個chunk整體為8196,正好可能是發送端一次TCP發送的緩存大小。
           
          posted @ 2011-11-17 15:02 小馬歌 閱讀(479) | 評論 (0)編輯 收藏
           
          經測試,nginx +fpm,nginx無法探知 php輸出內容長度,默認用Tranfer-Encoding:chunked編碼 輸出。

          對于一些客戶端,需要自己解析http協議的,一般不支持chunked解碼,這時,可以在php輸出里 加一個header('Content-Length: length' ) 

          可以覆蓋nginx的默認行為,計算內容長度可以用php自帶的strlen 方法。
          posted @ 2011-11-17 14:59 小馬歌 閱讀(904) | 評論 (2)編輯 收藏
           
          RPM是Redhat Package Manage的縮寫。透過RPM的管理,使用者可以把Source Code包裝成一種Source和Binary的檔案形式。利用它,我們可以用Binary的檔案進行安裝,用 Source 的檔案形式重新整理包裝。許多Linux愛好者對安裝RPM包比較熟悉,但對如何在Linux下制作RPM包不甚了解,因此,我將通過實例,講解如何在Linux下制作RPM包。 


          1. 最初要求 
          為了創建RPM,你需要RPM要編譯的源代碼、一個rpmrc文件(設置一些RPM的缺省值并控制它的行為),以及一個spec文件(控制包的建立過程)。這里假定已有其它的開發環境(gcc、make、install、vi等),而且你的源代碼已經編譯成功。 

          2. 制作流程 
          1)確定/etc/rpmrc(也可能是/usr/lib/rpm/rpmrc)已經正確設定。rpmrc文件控制幾乎所有RPM的行為。如果你 想重載一個或多個全局設置,可以在~/.rpmrc文件中包含你的定制。可以使用rpm--showrc來顯示RPM的當前設置。大多數情況下, rpmrc 文件的設置不需要改變。 

          2)取回所建造的源代碼并放入正確的目錄中。 

          3)編寫spec文件。 

          4)使用rpm -ba 來構造整個程式套件。 

          3.應用舉例 
          現在以Lynx實用程序來介紹構造RPM包的整個過程。Lynx是在文本方式下的Web瀏覽器,可以從ftp://www.slcc.edu/pub/lynx/取得。 

          1)得到lynx源代碼。 

          2)lynx-2.8.spec文件的詳細編寫方法略。 

          3)使用RPM來構造包。 

          按照rpmrc文件的缺省設置,應該把lynx-2.8.spec文件放入SPECS/目錄下,然后執行: 

          rpm -ba lynx-2.8.spec 

          其中-b 表示prep、compile、install,并build出一份binary RPM包。-a 表示執行所有的build動作,即還要build 出一份source code RPM包。 

          如果一切順利的話,可以在RPMS/目錄下找到lynx-2.8-4.i386.rpm文件。可以執行: 

          rpm -qpl lynx-2.8-4.i386.rpm 

          來觀察RPM 包中是否包含了要求的所有文件。 

          為了測試它的正確性,可以拷貝此文件到另一臺機器上,并執行: 

          rpm -ivh lynx-2.8-4.i386.rpm 

          進行安裝測試。 

          一旦測試成功,就可以上載你的大作,享受成功的喜悅。 

          小結 

               制作RPM包需要開發人員做很多工作。比如不僅要懂得c/c++編程,而且還要能熟練掌握像make、autoconf、diff、 patch、tar、install等工具的使用并能編寫spec文件。但從長遠來看,應用RPM,在軟件包的維護和方便性方面使得開發者受益。

          原文:http://www.host01.com/article/server/00070002/0542417260388231.htm
          posted @ 2011-11-15 14:51 小馬歌 閱讀(162) | 評論 (0)編輯 收藏
           

          最近公司要開發新的產品,在本地搭建了一下服務端的開發環境,安裝centos5.5,安裝了一些編譯php需要的庫文件gd,libxml,zlib等等,n多操作后,再使用yum時發現如下錯誤:

          [root@home ~]# yum update
          Setting up Update Process
          Setting up repositories
          Segmentation fault

           

          [root@home ~]# strace yum update

          last lines of strace :

          _llseek(6, 0, [0], SEEK_CUR) = 0
          read(6, "<?xml version=\"1.0\" ?><repomd xm"..., 8192) = 3846
          read(6, "", 4346) = 0
          --- SIGSEGV (Segmentation fault) @ 0 (0) ---
          +++ killed by SIGSEGV +++

           

          google大神和百度大神了n次,基本都是一樣的解決方案(1、yum clean all 2、修改源 3、修改yum.conf),照此執行,但并不能解決我的問題,有點絕望,但上天不負有心人,找到了這個 http://bugs.centos.org/view.php?id=4702&nbn=1

          給了我們(我和我的同事)一些啟發,原來是我們安裝的zlib1.2.5時指定了安裝目錄(./configure -prefix=/usr)對yum產生了影響,所以總結如下:

          1、安裝完系統后,運行一次#yum update(yum產生了緩存) ,然后再安裝zlib1.2.5,之后如果不執行#yum clean all,則一直可以使用yum,不會報段錯誤

          2、如果在執行yum前已經安裝了zlib1.2.5,則需要做如下處理

          #cd /usr/lib

          #ln -sf libz.so.1.2.3 libz.so

          #ln -sf libz.so.1.2.3 libz.so.1

          但此后zlib就使用了舊版本,在成功執行了yum后,還需要將軟連接更改

          #cd /usr/lib

          #ln -sf libz.so.1.2.5 libz.so

          #ln -sf libz.so.1.2.5 libz.so.1

          至此,問題解決了!

          posted @ 2011-11-15 14:08 小馬歌 閱讀(1045) | 評論 (0)編輯 收藏
           

          以前在Debian下安裝軟件都是使用軟件源安裝的,雖然步驟較少,但仍不能理解Linux下安裝軟件的具體細節,于是決定手動編譯安裝各種軟件,以解心中困惑
          由于國內租用虛擬主機或VPS 價格都較高,而虛擬主機雖價格適中,但不利于學習各種系統,綜上考慮還是從網上購買國外VPS,試用了幾天,測試效果還是比較滿意. 在使用時沒有寫下編譯安裝Nginx-1.0.5 + MySQL-5.5.15 +PHP-5.3.8,現在決定寫下此過程,以供今后參考。

          由于提供的VPS系統中沒有Debian 6.0 ,只能選擇使用5.0或4.0的版本,沒法只好安裝5.0的Debian,以下為安裝步驟。

          首先下載本文要用到的相關軟件:

          下載在Linux公社的1號FTP服務器里,下載地址:

          FTP地址:ftp://www.linuxidc.com

          用戶名:www.linuxidc.com

          密碼:www.muu.cc

          在 2011年LinuxIDC.com\9月\Debian下Nginx-1.0.5 + MySQL-5.5.15 +PHP-5.3.8編譯安裝相關文件

          下載方法見 http://www.linuxidc.net/thread-1187-1-1.html

          一. 檢查系統環境

          1. netstat -ntlp 查看系統中運行哪些網絡服務,不需要用的都可以關掉,比如exim4(郵件服務程序), aptitude purge exim4-base exim4-config exim4-daemon-light .

          2. 安裝編譯環境,debian 5系統發行版默認沒有安裝gcc等工具。需安裝一下

          aptitude install build-essential

          二. 編譯安裝相關組件

          1.安裝zlib,openssl等組件


          unzip -x zlib125.zip
          cd zlib-1.2.5
          ./configure --prefix=/usr
          make && make install

          tar zxvf openssl-0.9.8r.tar.gz
          cd openssl-0.9.8r
          make && make install

          2.安裝 nginx
          tar zxvf pcre-8.13.tar.gz
          tar zxvf nginx-1.0.5.tar.gz
          cd nginx-1.0.5
          ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin --with-http_ssl_module --with-http_sub_module --with-http_flv_module --with-http_stub_status_module --with-zlib=../zlib-1.2.5 --with-openssl=../openssl-0.9.8r --with-pcre=../pcre-8.13make && make install

          配置開機啟動

          cp nginx.txt /etc/init.d/nginx
          chmod + x /etc/init.d/nginx
          chkconfig nginx on
              
          3.安裝 mysql ,安裝mysql-5.5.15需安裝cmake ,
          tar zxvf cmake-2.8.5.tar.gz
          cd cmake-2.8.5
          ./bootstrap
          make
          make install 
          在安裝最后一步時可能會出錯,解決辦法是指定安裝位置make install DESTDIR=/usr/local.

          建立mysql安裝目錄及數據目錄
          mkdir -p /usr/local/mysql
          mkdir -p /data/mysql

          建立mysql用戶及組
          groupadd mysql
          useradd -d /usr/local/mysql -g mysql -s /usr/sbin/nologin mysql

          設定目錄mysql目錄屬主及權限
          chown mysql.mysql /usr/local/mysql
          chown -R mysql.mysql /data/mysql
          chmod 755 /usr/local/mysql
          chmod -R 755 /data/mysql

          用cmake編譯安裝mysql
          cd mysql-5.5.15
          cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
          -DMYSQL_DATADIR=/data/mysql/ \
          -DWITH_INNOBASE_STORAGE_ENGINE=1 \
          -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
          -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
          -DWITH_FEDERATED_STORAGE_ENGINE=1 \
          -DWITH_PARTITION_STORAGE_ENGINE=1 \
          -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
          -DMYSQL_TCP_PORT=3306 \
          -DENABLED_LOCAL_INFILE=1 \
          -DEXTRA_CHARSETS=all \
          -DDEFAULT_CHARSET=utf8 \
          -DDEFAULT_COLLATION=utf8_general_ci \
          -DMYSQL_USER=mysql
          編譯過程中可能會出錯,需安裝libncurses5-dev及bison
          aptitude install libncurses5-dev bison
          然后刪除CMakeCache.txt
          rm CMakeCache.txt
          繼續編譯通過
          make
          make install

          復制配置文件my.cnf
          cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
          chown mysql.mysql /etc/my.cnf
          chmod 755 /etc/my.cnf

          配置開機啟動
          cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
          chmod +x /etc/init.d/mysqld
          chkconfig mysqld on

          啟動mysql并設置密碼
          /etc/init.d/mysqld start
          /usr/local/mysql/bin/mysqladmin -u root password '新密碼'

          OK,mysql配置完成。

          4.安裝php
          編譯gd庫,這個在搭建discuz論壇時需用到

          (1)安裝libpng

          tar zxvf libpng-1.5.4.tar.gz
          cd libpng-1.5.4
          ./configure
          make 
          make install

          備注: libpng默認安裝位置/usr/local,若指定安裝在/usr/local/png,則編譯gd時會提示找不到png.h等文件.

          (2)安裝freetype

          tar zxvf freetype-2.4.6.tar.gz
          cd freetype-2.4.6
          ./configure --prefix=/usr/local/freetype
          make
          make install

          (3)安裝jpeg

          tar zxvf jpegsrc.v8c-tar.gz
          cd jpeg-8c
          ./configure --prefix=/usr/local/jpeg
          make
          make install

          (4) 安裝libxml2

          tar zxvf libxml2-2.7.8.tar.gz
          cd libxml2-2.7.8
          ./configure --prefix=/usr/local/libxml2
          make
          make install

          (5)安裝GD

          tar zxvf pierrejoye-gd-libgd-GD_2_0_33.tar.gz
          cd pierrejoye-gd-libgd-GD_2_0_33
          ./configure --prefix=/usr/local/gd --with-png=/usr/local --with-freetype=/usr/local/freetype --with-jpeg=/usr/local/jpeg
          make
          make install

          (6)編譯PHP

          ./configure \
          --prefix=/usr/local/new_php \
          --with-config-file-path=/usr/local/new_php/etc \
          --enable-fpm \
          --with-fpm-user=nobody \
          --with-fpm-group=nobody \
          --with-libxml-dir \
          --with-openssl \
          --with-zlib \
          --with-gd \
          --with-jpeg-dir \
          --with-png-dir \
          --with-freetype-dir \
          --enable-gd-native-ttf \
          --enable-gd-jis-conv \
          --with-mhash \
          --enable-mbstring \
          --with-mcrypt \
          --with-mysql \
          --with-mysql-sock=/tmp/mysqld.sock \
          --with-mysqli=/usr/bin/mysql_config \
          --enable-sockets \
          --enable-sysvmsg \
          --enable-sysvsem \
          --enable-sysvshm


          make
          make test
          make install

          復制php.ini到配置文件目錄及php-fpm 開機啟動
          cp php.ini-production /usr/local/php/etc/php.ini
          cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
          chmod +x /etc/init.d/php-fpm
          這時候還不能使用/etc/init.d/php-fpm start啟動,需修改一下php-fpm配置文件才可以,配置文件位置php安裝目錄 etc 目錄下,默認有個參考文件.
          cp php-fpm.conf.default php-fpm.conf
          nano php-fpm.conf
          ,pm.start_servers = 20
          ,pm.min_spare_servers = 5
          ,pm.max_spare_servers = 35
          去掉以上三項前面的逗號,這時再使用/etc/init.d/php-fpm start 即可啟動。
          Memcahed構建與安裝php memcache

          1.memcached需用到libevent這個庫

          tar zxvf libevent-2.0.12-stable.tar.gz
          cd libevent-2.0.12-stable
          ./confiugre --prefix=/usr
          make && make install

          2.安裝memcached

          tar zxvf memcached-1.4.6.tar.gz
          cd memcached-1.4.6
          ./configure --with-libevent=/usr
          make && make install
          在make install這步時出錯了,竟不能安裝,查看了錯誤原因,原來是/usr/local/man目錄中已存在一個man1,于是改名man2,再次make install成功.

          3.安裝 php memcache擴展

          tar xvf memcache-3.0.6.tgz
          cd memcache-3.0.6
          /usr/local/php/bin/phpize
          ./configure --enable-memcache --with-php-conf=/usr/local/php/bin/php-config --with-zlib-dir=/usr
          make
          make test
          make install
          安裝完成后,提示
          Installing shared extensions:  /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626

          配置php.ini文件
          在文件最后添加
          extension_dir="/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626"
          extension=memcache.so


          查看php是否成功加載memcache.so
          /usr/local/php/bin/php -m


          [PHP Modules]
          Core
          ctype
          date
          dom
          ereg
          fileinfo
          filter
          gd
          hash
          iconv
          json
          libxml
          mbstring
          mcrypt
          memcache
          mhash
          mysql
          mysqli
          openssl
          pcre
          PDO
          pdo_sqlite
          Phar
          posix
          Reflection
          session
          SimpleXML
          sockets
          SPL
          SQLite
          sqlite3
          standard
          sysvmsg
          sysvsem
          sysvshm
          tokenizer
          xml
          xmlreader
          xmlwriter
          zlib


          [Zend Modules]

          在15行看到了memcache,已成功加載

          啟動memcached服務端程序
          memcached -d -m 64 -u www-data -l localhost -p 11211 -c 640 -P /tmp/Memcached.pid

          各個參數的意義
          -d選項是啟動一個守護進程,
          -m是分配給Memcached使用的內存數量,單位是MB,
          -u是運行Memcache的用戶,我這里是root,
          -l是監聽的服務器IP地址,
          -p是設置Memcache監聽的端口,最好是1024以上的端口,
          -c選項是最大運行的并發連接數,默認是1024,按照你服務器的負載量來設定,
          -P是設置保存Memcache的pid文件

          配置memcached開機啟動

          cp memcached.txt /etc/init.d/memcached
          chmod + x /etc/init.d/memcached
          chkconfig memcached on





          posted @ 2011-11-15 14:02 小馬歌 閱讀(655) | 評論 (0)編輯 收藏
           

          一、Nginx安裝
          安裝的時候需要注意加上 –with-http_ssl_module,因為http_ssl_module不屬于Nginx的基本模塊。
          Nginx安裝方法:

          ./configure –user=username –group=groupname –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module
          make && make install

          二、生成證書(略)
          可以使用openssl或ca.ssl生成,結果生成如下兩個文件:

          server.crt
          server.key

          如果是apache,直接將這兩個文件引入到httpd.conf中,而Nginx需要的是.pem文件。.pem的生成方法很簡單,就是合并server.crt、server.key的內容。

          三、修改Nginx配置:

          server
          {
          listen 443;
          server_name test.sina.com.cn;
          ssl on;
          ssl_certificate /tmp/server.pem;
          ssl_certificate_key /tmp/server.key;
          ssl_session_timeout 5m;
          ssl_protocols SSLv2 SSLv3 TLSv1;
          ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
          ssl_prefer_server_ciphers on;
          }

          posted @ 2011-11-15 11:28 小馬歌 閱讀(439) | 評論 (0)編輯 收藏
          僅列出標題
          共95頁: First 上一頁 46 47 48 49 50 51 52 53 54 下一頁 Last 
           
          主站蜘蛛池模板: 潞西市| 巧家县| 望谟县| 景洪市| 靖安县| 镇原县| 卓尼县| 徐州市| 屏东县| 墨竹工卡县| 卢龙县| 临汾市| 淄博市| 靖宇县| 定兴县| 沙雅县| 二连浩特市| 江华| 东乌珠穆沁旗| 乌兰浩特市| 兴山县| 法库县| 遂溪县| 四子王旗| 积石山| 小金县| 全南县| 军事| 鹤壁市| 丁青县| 奉贤区| 临邑县| 那曲县| 东乡| 阿荣旗| 阿巴嘎旗| 高安市| 合肥市| 南丰县| 全南县| 东台市|