88250

          Java

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            82 隨筆 :: 0 文章 :: 5 評論 :: 0 Trackbacks

          #

          好久沒貼過代碼了,心血來潮。

          /*
           * Copyright (c) 2009, 2010, B3log Team
           *
           * Licensed under the Apache License, Version 2.0 (the "License");
           * you may not use this file except in compliance with the License.
           * You may obtain a copy of the License at
           *
           *     http://www.apache.org/licenses/LICENSE-2.0
           *
           * Unless required by applicable law or agreed to in writing, software
           * distributed under the License is distributed on an "AS IS" BASIS,
           * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
           * See the License for the specific language governing permissions and
           * limitations under the License.
           */
          
          package org.b3log.latke.servlet.filter;
          
          import java.io.IOException;
          import java.io.OutputStreamWriter;
          import java.io.PrintWriter;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import java.util.zip.GZIPOutputStream;
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletOutputStream;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import javax.servlet.http.HttpServletResponseWrapper;
          
          /**
           * Abstract HTTP response GZIP filter.
           *
           * @author Liang Ding
           * @version 1.0.0.1, Dec 16, 2010
           */
          public abstract class AbstractGZIPFilter implements Filter {
          
              /**
               * Logger.
               */
              private static final Logger LOGGER =
                      Logger.getLogger(AbstractGZIPFilter.class.getName());
          
              @Override
              public void init(final FilterConfig cfg) throws ServletException {
              }
          
              /**
               * Wraps the http servlet response with GZIP if could.
               *
               * @param request the specified request
               * @param response the specified response
               * @param chain filter chain
               * @throws IOException io exception
               * @throws ServletException servlet exception
               */
              @Override
              public void doFilter(final ServletRequest request,
                                   final ServletResponse response,
                                   final FilterChain chain) throws IOException,
                                                                   ServletException {
                  final HttpServletRequest httpServletRequest =
                          (HttpServletRequest) request;
                  final String requestURI = httpServletRequest.getRequestURI();
                  if (shouldSkip(requestURI)) {
                      LOGGER.log(Level.FINEST, "Skip GZIP filter request[URI={0}]",
                                 requestURI);
                      chain.doFilter(request, response);
          
                      return;
                  }
          
                  final String acceptEncoding =
                          httpServletRequest.getHeader("Accept-Encoding");
                  boolean supportGZIP = false;
                  if (null != acceptEncoding
                      && 0 <= acceptEncoding.indexOf("gzip")) {
                      supportGZIP = true;
                  }
          
                  if (!supportGZIP) {
                      LOGGER.info("Gzip NOT be supported");
                      chain.doFilter(request, response);
          
                      return;
                  }
          
                  final HttpServletResponse httpServletResponse =
                          (HttpServletResponse) response;
                  httpServletResponse.addHeader("Content-Encoding", "gzip");
                  httpServletResponse.addHeader("Vary", "Accept-Encoding");
                  chain.doFilter(request,
                                 new GZIPServletResponseWrapper(httpServletResponse));
              }
          
              /**
               * Determines whether the specified request URI should be skipped filter.
               *
               * 

          * Note: This method SHOULD be invoked for all filters with pattern * "/*". *

          * * @param requestURI the specified request URI * @return {@code true} if should be skipped, {@code false} otherwise */ public abstract boolean shouldSkip(final String requestURI); @Override public void destroy() { } /** * HTTP response wrapper for GZIP. * * @author Liang Ding * @version 1.0.0.0, Dec 16, 2010 */ private class GZIPServletResponseWrapper extends HttpServletResponseWrapper { /** * GZIP output stream. */ private GZIPOutputStream gzipStream; /** * Servlet output stream. */ private ServletOutputStream servletOutputStream; /** * Print writer. */ private PrintWriter printWriter; /** * Constructs an {@link GZIPServletResponseWrapper} object with the * specified http servlet response. * * @param httpServletResponse the specified http servlet response * @throws IOException io exception */ GZIPServletResponseWrapper(final HttpServletResponse httpServletResponse) throws IOException { super(httpServletResponse); } @Override public ServletOutputStream getOutputStream() throws IOException { if (null == servletOutputStream) { servletOutputStream = createOutputStream(); } return servletOutputStream; } @Override public PrintWriter getWriter() throws IOException { if (null == printWriter) { printWriter = new PrintWriter( new OutputStreamWriter(getOutputStream(), getCharacterEncoding())); } return printWriter; } /** * Creates output stream with GZIP delegation. * * @return servlet output stream * @throws IOException io exception */ private ServletOutputStream createOutputStream() throws IOException { final ServletResponse servletResponse = this.getResponse(); gzipStream = new GZIPOutputStream(servletResponse.getOutputStream()); return new ServletOutputStream() { @Override public void write(final int b) throws IOException { gzipStream.write(b); } @Override public void flush() throws IOException { gzipStream.flush(); } @Override public void close() throws IOException { gzipStream.close(); } /* * These two are not absolutely needed. They are here simply * because they were overriden by GZIPOutputStream. */ @Override public void write(final byte[] b) throws IOException { gzipStream.write(b); } @Override public void write(final byte[] b, final int off, final int len) throws IOException { gzipStream.write(b, off, len); } }; } } }



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/articles/2010/12/16/1292515963081.html
          posted @ 2010-12-17 00:13 88250 閱讀(588) | 評論 (0)編輯 收藏



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/netbeans-chinese-newsletter-129.html
          posted @ 2010-12-14 22:59 88250 閱讀(209) | 評論 (0)編輯 收藏

           



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/netbeans-chinese-newsletter-128.html
          posted @ 2010-12-11 11:33 88250 閱讀(240) | 評論 (0)編輯 收藏

          WebSocket 協議是實現了瀏覽器與服務器全雙工通信的 HTML5 新協議之一。傳統瀏覽器只允許通過 HTTP 與網站互動,然而對于富 Web 應用 如聊天和游戲,HTTP 的效率不太高,因此HTML5 提供了socket API,只需一個握手動作就能在瀏覽器和服務器之間建立快速通道。

          然而在 11 月 26 日,安全研究人員發表一篇研究報告(PDF),他們發現 WebSocket 和透明代理存在嚴重安全問題,他們演示了基于 Upgrade 和 CONNECT 的緩存中毒攻擊,研究人員提議修改握手方式。在 Bugzilla 上,Firefox 開發者討論了該問題,他們最后決定Firefox 4 將默認不啟用 WebSockets,從 Firefox 4 beta 8 開始用戶將需要修改設置才能啟用 WebSockets。未來在解決安全問題后,Firefox 會選擇默認啟用。

          轉自:http://www.oschina.net/news/13668/disabling-websockets-for-firefox-4



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/articles/2010/12/10/1291942973503.html
          posted @ 2010-12-10 09:03 88250 閱讀(167) | 評論 (0)編輯 收藏

          自從發布第一個版本來,大家給了很多建議,謝謝了 :-)

          下個版本 0.2.5 將于明年 2 月 14 日發布,其中加入兩個大的特性:

          • 多用戶
            Solo 不再是單用戶博客了。多人可以一起在一個博客里進行文章撰寫,非常適合團隊博客。另外,如果是情侶博客的話,哼哼....
          • 草稿夾
            想發布再發布吧!當然,發布了也可以再草稿化....

          這個版本的改變比較大(數據存儲、邏輯控制、視圖),除了 Solo 上述兩個大特性的加入,還有 Latke 框架上的增強:

          • 存儲緩存
            本地測試可以提升單一實體按 Key 訪問時速度 400 倍左右。當然,部署到 GAE 后可能沒這么好的效果 - -~

          (廣告:Latke 是 GAE 上的一個應用框架,主要整合了 Guice、FreeMarker、Jabsorb,數據模型從視圖到存儲都以 JSON 貫穿

          下個版本是 B3log Solo 的第一個正式版吧 :-)

          P.S. 情侶博客?兩個人也是多用戶嘛,0.2.5 中將加入一款皮膚,非常適合情侶寫作!謝謝 Lamb 這么給力!

           



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/articles/2010/12/08/1291818048978.html
          posted @ 2010-12-08 22:21 88250 閱讀(184) | 評論 (0)編輯 收藏

          那大爺買西紅柿來著的,挑了三個放到秤盤里,攤主秤了下說:“一斤半,三塊七。”

          大爺說:“我就做個湯,用不著那么多。”說完就去掉了個兒最大的那個西紅柿。

          攤主迅速又瞧一眼秤子,“一斤二兩,三塊。”

          正當我看不過去想提醒大爺注意攤主的秤子時,大爺從容的掏出了七毛錢,拿起剛剛去掉的那個大的西紅柿,扭頭就走了……

          攤主當場就風中凌亂了,我憋成內傷,把頭扭向一邊……

           

          轉自:http://www.douban.com/group/topic/16089209/



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/articles/2010/12/03/1291338840521.html
          posted @ 2010-12-03 09:14 88250 閱讀(197) | 評論 (0)編輯 收藏

           



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/netbeans-chinese-newsletter-127.html
          posted @ 2010-12-01 21:06 88250 閱讀(271) | 評論 (0)編輯 收藏

          B3log LogoGAE 博客 —— B3LOG Solo 0.2.1 正式發布了。

          該版本除了修復 Bugs,還增加了自定義文章/頁面鏈接,改進了緩存,以及加入了新皮膚 favourite。

          在 0.2.1 開發之際,Lamb 童鞋加入了 B3LOG Solo 開發團隊(成員列表),并給我們帶來了新皮膚 favourite。

          新特性

          • 評論表情
          • 自定義文章鏈接
          • 自定義頁面鏈接
          • 新皮膚——favourite
          • 加入了“初始化”功能(/init.do)

          Bug 修復

          • 修復了偏好設定與統計數據丟失
          • 修復了皮膚顯示錯誤
          • 修復了按標簽/存檔查看文章時排序的錯誤
          • 修復了站外相關閱讀顯示站內文章問題

          改進

          • 提交評論/回復后只刷新評論列表
          • ”最新評論“/統計信息使用模板生成
          • 編輯器加入了中文配置
          • 調整一些頁面鏈接后綴為 .html
          • 改進了頁面緩存

          具體改動看這里

          升級

          如果您是 0.2.0 的用戶,那么請在部署完 0.2.1 后登錄后臺,訪問 http://${application-id}.appspot.com/upgrade/v020-v021.do 進行升級。

          該升級程序主要是對頁面自定義鏈接特性進行數據一致性升級。

          項目

          如果在使用、測試中發現任何問題,如果您有任何意見或建議,請告知我們 :-)

          作者博客

          發布歷史

          1. GAE 博客——B3log Solo 0.2.0 發布了!
          2. GAE 博客——B3log Solo 0.1.1 發布了!
          3. B3log Solo 0.1.0 發布了!
          4. B3log Solo 0.1.0-preview2 發布了!
          5. Solo 0.1.0-Preview1 發布了


          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/b3log-solo-release-021.html
          posted @ 2010-12-01 12:34 88250 閱讀(153) | 評論 (0)編輯 收藏

          B3log LogoGAE 博客 ——  B3LOG Solo 下周將發布 0.2.1。

          該版本除了修復 Bugs,還增加了自定義文章/頁面鏈接,改進了緩存,以及加入了新皮膚 favourite。

          在 0.2.1 開發之際,Lamb 童鞋加入了 B3LOG Solo 開發團隊(成員列表),并給我們帶來了新皮膚 favourite。

          0.2.1 具體改動可以看這里,發布日期定為 12 月 1 日。



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/articles/2010/11/28/1290918173803.html
          posted @ 2010-11-28 12:23 88250 閱讀(158) | 評論 (0)編輯 收藏

          隨著 Web2.0 的風靡,JavaScript 已經成為一門被人們重新認識的編程語言,由于大量 JS 開源框架的出現,利用 JavaScript 開發 的項目越來越多,越來越大。同時,也有越來越多JavaScript 開發問題暴露出來,如性能、網頁加載速度等,其中,JavaScript 文檔維護也成 為了開發者亟待解決的一個難題。

          許多現代編程語言都有自己的集成化文檔生成工具,像 Java 有 JavaDoc,.NET有 NDoc,PHP有 PHPDoc,這些自動化文檔工具可以根據代碼中的注釋自動生成代碼文檔。

          JsDoc Toolkit 就是這樣一個自動化文檔工具,它是發布在 Google code 上的一個開源項目,和其他語言的文檔工具一樣,它可以自動從 JavaScript 代碼中提取注釋生成格式化文檔。 

          下載地址

          http://code.google.com/p/jsdoc-toolkit/downloads/list

          運行環境

          JsDoc Toolkit是用Java開發的,運行時需要 Java 1.5+。

          用法

          在運行之前,你需要把當前的工作目錄切換到JsDoc Toolkit目錄,并確保將java.exe所在目錄添加到環境變量中。

          java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js

          mycode.js是需要生成文檔的js代碼,如果mycode.js和JsDoc不在同一目錄,請加上文件的絕對或者相對路徑。如果項目中有多個js, 可以使用通配符*來指定多個js文件(*.js)。-e參數指定文檔編碼,-t參數指定文檔模板位置(可以新建或修改模板文件讓輸出的代碼文件更具特 色),生成的文檔文件在JsDoc目錄下的out目錄中。為了使用方便,我寫了一個批處理文件,你可以將代碼保存為run.bat,放到JsDoc目錄 下:

          ::run.bat
          @echo off
          ::js文件名(換成你的js文件名)
          set jsname=jquery.js
          ::js文件路徑(換成你的js文件路徑)
          set jspath=C:\test\
          echo start...
          java -jar jsrun.jar app\run.js -a -e=GBK -t=templates\jsdoc "%jspath%%jsname%.js"
          ::out\%jsname%\index.html
          echo finished.
          pause

          常用關鍵字

          author 標識代碼作者
          class 標識該函數是一個類的構造函數
          constant 聲明常量
          constructor 同class
          default 默認值
          deprecated 聲明已棄用的對象
          description 對象描述
          event 事件函數
          example 例子代碼
          fileOverview Javascript文件總體描述
          ignore 忽略有這個標記的函數
          link 與其他JsDoc對象關聯
          name 顯示聲明JsDoc不能自動檢測的對象
          namespace 聲明命名空間
          param 參數
          private 聲明私有對象
          property 顯式聲明一個屬性
          public 聲明公開對象
          requires 聲明所依賴的對象或文件
          returns 返回值
          see 聲明可參考的其它對象
          since 聲明對象從指定版本開始生效
          static 顯式聲明一個靜態對象
          throws 聲明函數執行過程中可能拋出的異常
          type 聲明變量類型或者函數返回值類型
          version 版本號

          詳細語法請參閱:JsDoc Toolkit Wiki

          整理自:http://blog.tugai.net/2010/01/08/jsdoc-toolkit-usage/



          本文是使用 B3log Solo簡約設計の藝術 進行同步發布的
          原文地址:http://88250.b3log.org/articles/2010/11/26/jsdoc-toolkit-usage.html
          posted @ 2010-11-26 10:47 88250 閱讀(412) | 評論 (0)編輯 收藏

          僅列出標題
          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
          主站蜘蛛池模板: 辰溪县| 怀化市| 城步| 娄底市| 东兴市| 宁武县| 木里| 当涂县| 汝城县| 梓潼县| 吐鲁番市| 闵行区| 湖州市| 如皋市| 温州市| 凌海市| 屏东市| 磴口县| 新民市| 靖江市| 且末县| 弥勒县| 烟台市| 哈巴河县| 徐闻县| 永清县| 大悟县| 唐海县| 子洲县| 桐城市| 江油市| 新乐市| 始兴县| 武定县| 陵水| 盘锦市| 东港市| 宿迁市| 岳阳县| 阳山县| 芦溪县|