lizongbo 的 編程學習

          http://618119.com

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            23 Posts :: 1 Stories :: 78 Comments :: 0 Trackbacks

          #

          1.首先擴展一個IQ:
          源代碼來自:
          java代碼為:
          http://cvs.codehaus.org/viewrep/groovy/groovy/modules/xmlrpc/src/main...

          import org.jivesoftware.smack.packet.IQ;

          /**
          ?* @author John Wilson
          ?*
          ?*/

          public class JabberRPC extends IQ {

          ? ? ? ? private final String xml;

          ? ? ? ? public JabberRPC(final String xml) {
          ? ? ? ? ? ? ? ? this.xml = "<query xmlns='jabber:iq:rpc'>\n" + xml + "\n</query>";
          ? ? ? ? }

          ? ? ? ? public String getChildElementXML() {
          ? ? ? ? ? ? ? ? return this.xml;
          ? ? ? ? }

          }

          2.擴展一個IQProvider.
          源代碼來自:
          http://cvs.codehaus.org/viewrep/groovy/groovy/modules/xmlrpc/src/main...
          java代碼為:
          import org.jivesoftware.smack.packet.IQ;
          import org.jivesoftware.smack.provider.IQProvider;
          import org.jivesoftware.smack.util.StringUtils;
          import org.xmlpull.v1.XmlPullParser;

          /**
          ?* @author John Wilson
          ?*
          ?*/

          public class JabberRPCProvider implements IQProvider {

          ? ? ? ? public IQ parseIQ(final XmlPullParser parser) throws Exception {
          ? ? ? ? ? ? ? ? final StringBuffer buffer = new StringBuffer();

          ? ? ? ? ? ? ? ? // skip the <query> tag by calling parser.next()
          ? ? ? ? ? ? ? ? while (true) {
          ? ? ? ? ? ? ? ? ? ? ? ? switch (parser.next()) {
          ? ? ? ? ? ? ? ? ? ? ? ? case XmlPullParser.TEXT:
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // We need to escape characters like & and <
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer.append(StringUtils.escapeForXML(parser.getText()));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

          ? ? ? ? ? ? ? ? ? ? ? ? case XmlPullParser.START_TAG:
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer.append('<' + parser.getName() + '>');
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

          ? ? ? ? ? ? ? ? ? ? ? ? case XmlPullParser.END_TAG:
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ("query".equals(parser.getName())) {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // don't save the </query> end tag
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return new JabberRPC(buffer.toString().trim());
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer.append("</" + parser.getName() + '>');
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? default:
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? }
          ? ? ? ? }

          }

          3.在smack中注冊IQProvider .
          java代碼為:
          org.jivesoftware.smack.provider.ProviderManager.addIQProvider("query",
          "jabber:iq:rpc", new JabberRPCProvider());

          4.smack客戶端例子:

          try {
          ? ? ? ? ? ? ? ? ? ? ? ? XMPPConnection con = new XMPPConnection("127.0.0.1", 5222);
          ? ? ? ? ? ? ? ? ? ? ? ? con.login("username", "password");
          ? ? ? ? ? ? ? ? ? ? ? ? //注冊IQProvider
          ? ? ? ? ? ? ? ? ? ? ? ? org.jivesoftware.smack.provider.ProviderManager.addIQProvider(
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "query", "jabber:iq:rpc", new JabberRPCProvider());
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 監聽所有的包
          ? ? ? ? ? ? ? ? ? ? ? ? con.addPacketListener(new PacketListener() {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public void processPacket(Packet packet) {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (packet instanceof org.jivesoftware.smack.packet.IQ) {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? org.jivesoftware.smack.packet.IQ iq =
          (org.jivesoftware.smack.packet.IQ) packet;
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("rpc內容為 " + iq.getChildElementXML());
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

          ? ? ? ? ? ? ? ? ? ? ? ? }, new org.jivesoftware.smack.filter.PacketFilter() {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? public boolean accept(Packet arg0) {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return true;
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

          ? ? ? ? ? ? ? ? ? ? ? ? });
          ? ? ? ? ? ? ? ? ? ? ? ? con.createChat("xmlrpc.lizongbo.im").sendMessage("測試發送!");
          ? ? ? ? ? ? ? ? ? ? ? ? JabberRPC jp = new JabberRPC("xmlrpc");
          ? ? ? ? ? ? ? ? ? ? ? ? jp.setType(org.jivesoftware.smack.packet.IQ.Type.SET);
          ? ? ? ? ? ? ? ? ? ? ? ? jp.setTo("xmlrpc.lizongbo.im");
          ? ? ? ? ? ? ? ? ? ? ? ? con.sendPacket(jp);
          ? ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(25000);
          ? ? ? ? ? ? ? ? ? ? ? ? con.close();
          ? ? ? ? ? ? ? ? } catch (Exception e) {
          ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
          ? ? ? ? ? ? ? ? }

          5.服務端回應一個xmlrpc包:
          wildfire中通過插件進行響應:
          public void processPacket(Packet p) {
          ? ? ? ? ? ? ? ? if (p instanceof IQ) {
          ? ? ? ? ? ? ? ? ? ? ? ? IQ iq =(IQ)p;
          ? ? ? ? ? ? ? ? ? ? ? ? IQ niq=IQ.createResultIQ(iq);
          ? ? ? ? ? ? ? ? ? ? ? ? ? Element responseElement=niq.setChildElement("query",
          "jabber:iq:rpc");
          ? ? ? ? ? ? ? ? ? ? ? ? try {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? java.util.Vector v=new ?java.util.Vector();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? v.add("lizongbo ?xmpp");
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? v.add("jabber-rpc lizongbo");
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? v.add("xep-0009 lizongbo");
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? XmlRpcResponseProcessor xrrp=new XmlRpcResponseProcessor();
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String rs= new String( xrrp.encodeResponse(v, "UTF-8"));
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? org.dom4j.Document re=org.dom4j.DocumentHelper.parseText(rs);
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? responseElement.add(re.getRootElement());
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? componentManager.sendPacket(this, niq);
          ? ? ? ? ? ? ? ? ? ? ? ? } catch (Exception e) {
          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
          ? ? ? ? ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? ? ? }
          ? ? ? ? }

          6.客戶端輸出結果為:

          rpc內容為 <query xmlns='jabber:iq:rpc'>
          <methodResponse><params><param><value><array><data><value>lizongbo
          xmpp</value><value>jabber-rpc lizongbo</value><value>xep-0009
          lizongbo</value></data></array></value></param></params></methodResponse>
          </query>

          posted @ 2006-12-04 18:16 lizongbo 的編程學習| 編輯 收藏

               摘要: wildfire是支持標準即時通訊協議xmpp的服務端,而linq則是支持xmpp的客戶端,通過wildfire和linq可以將Gtalk,MSN,QQ,在一個客戶端中聯合起來,正文是我的操作步驟,有詳細抓圖過程。  閱讀全文
          posted @ 2006-11-29 10:17 lizongbo 的編程學習| 編輯 收藏

          在javaeye上看到關于sna的一些討論,于是對sna很有好奇心,但是google了半天也沒有搜索到java webapp中關于sna的開源項目。
          于是結合和同學交流之后,動手寫了幾個java文件,通過過濾器對HttpSession的包裝,實現java web應用的sna架構。
          使用 snafilter之后,即使web服務器掛了,只要用戶還能訪問其它web服務器,則可以照常維持session。
          代碼很簡單,但是想到sf上面沒有相關的東西,于是昨晚快睡覺的時候就去申請了一個項目,
          剛才登錄sf的時候,沒想到今天就已經被批準了:)

          我把代碼整理一下之后,就把它傳到sf上來:)

          這個項目的名稱是:snafilter。
          英文簡介是:?snafilter is a J2EE servlet filter which wraped HttpSession to supports share nothing architecture 。
          這句說明是仿照另外一個開源過濾器(http://pjl-comp-filter.sourceforge.net/)改寫的。
          項目的地址是:
          http://sourceforge.net/projects/snafilter

          目前實現的snafilter是,sna會話id基于cookie,使用Memcached Server存放sna信息。
          通過snafilter可以避免session復制的消耗,而且不需要黏性會話的配置,就可以使得多個servlet容器(可以同時包含不同的servlet容器,比如tomcat和resin同時使用)可以結合在一起實現類似failover的效果。
          基本上可以隨時重起tomcat而不影響客戶端用戶:)

          在發布第一個版本之后,打算再加入其它的一些特性,歡迎大家交流意見。
          ps1:我不太會使用sf的一些功能,歡迎大家分享經驗。
          ps2:前段時間向tomcat反映的一個小意見,被新版本的tomcat采納了,很開心:)
          http://tomcat.apache.org/tomcat-5.5-doc/changelog.html
          39674: Support JRockit JVM in service.bat script, as suggested by lizongbo. (yoavs)
          http://issues.apache.org/bugzilla/show_bug.cgi?id=39674

          現在深刻體會到我的英語真爛,以后得多鍛煉英語了:)

          posted @ 2006-10-26 00:54 lizongbo 的編程學習| 編輯 收藏

               摘要: 當在同一個網頁里引入10多個js文件之后,
          各js中的同名函數就很容易沖突了。
          比如xxx庫里寫了個addCssStyle方法,
          yyy類庫里也寫了個addCssStyle方法,
          而這兩個方法的具體實現又有一定差別。
          那么同時引用這兩個組件的時候,函數沖突之后導致頁面效果發生變化,
          調試和修改都是非常痛苦的,如果為了避免沖突,
          而放棄引用一些優秀的組件,那更是讓人郁悶的事情。

          為此,在封裝javascript組件庫的時候,請使用命名空間來避免沖突。
          將所有的方法和變量都要按包名類名的方式來寫。
          (這個時候寫代碼的感覺和封裝java的util方法一樣方便,呵呵) (詳細示例代碼見文章具體內容)  閱讀全文
          posted @ 2006-06-19 15:39 lizongbo 的編程學習| 編輯 收藏

          ?? Spring BeanDoc 使用

          ?? Spring BeanDoc 是一個根據spring的bean配置文件生成文檔的工具。

          1.下載:
          spring-beandoc-0.7.0:
          http://opensource.atlassian.com/confluence/spring/download/attachments/993/spring-beandoc-0.7.0.tgz?version=1

          參考: http://opensource.atlassian.com/confluence/spring/display/BDOC/Home
          graphviz-2.8:

          http://www.graphviz.org/pub/graphviz/ARCHIVE/graphviz-2.8.exe
          參考: http://www.graphviz.org/Download_windows.php
          apache-ant-1.6.5:
          http://www.eu.apache.org/dist/ant/binaries/apache-ant-1.6.5-bin.zip

          2.安裝,解壓spring-beandoc-0.7.0.tgz和apache-ant-1.6.5-bin.zip到d:/Java/
          設置環境變量:
          ANT_HOME=D:\java\apache-ant-1.6.5
          Path=D:\jdk1.5.0_06\bin;D:\java\apache-ant-1.6.5\bin;........
          運行graphviz-2.8.exe,安裝到D:\Programs\ATT。

          3.到D:\java\spring-beandoc-0.7.0\src\org\springframework\beandoc\output\i18n下
          增加中文資源文件labels_zh.properties ,然后對照翻譯,
          #-----------------------------------------
          # @since 1.0

          i18n-generated=beandoc \u751F\u6210\u4E86
          i18n-filelist=files making up this application context
          i18n-description=\u63CF\u8FF0
          i18n-attributes=\u5C5E\u6027
          i18n-constructorargs=\u6784\u9020\u53C2\u6570
          i18n-allTitle=\u6240\u6709 Beans
          i18n-summaryTitle=beans\u6458\u8981
          i18n-detailTitle=beans\u8BE6\u60C5
          i18n-innerbean=\u533F\u540D\u5185\u90E8bean
          i18n-home=\u9996\u9875
          i18n-summary=\u6458\u8981
          i18n-detail=\u8BE6\u60C5
          i18n-abstractbean=\u62BD\u8C61 bean
          i18n-deps=\u4F9D\u8D56, \u5C5E\u6027\u503C \u548C \u65B9\u6CD5 \u6CE8\u5165
          i18n-backtotop=\u9000\u56DE\u5230\u9876\u90E8
          i18n-name=\u540D\u5B57
          i18n-bean=bean
          i18n-argtypes=\u53C2\u6570\u7C7B\u578B

          #-----------------------------------------

          再到D:\java\spring-beandoc-0.7.0\下運行build.bat。

          4.到D:\java\spring-beandoc-0.7.0\samples\
          編輯beandoc.properties,

          第50行改為:i18n.locale=zh
          第60行改為:compiler.dotExe=d:/Programs/ATT/GraphViz/bin/dot.exe

          5.清空 D:\java\spring-beandoc-0.7.0\samples\jpetstore和 D:\java\spring-beandoc-0.7.0\samples\petclinic,復制spring配置文件
          到D:\java\spring-beandoc-0.7.0\samples\jpetstore

          6.然后運行D:\java\spring-beandoc-0.7.0\samples\runbeandoc-cli.bat
          需要帶參數:
          D:\java\SPRING~1.0\samples>runbeandoc-cli.bat beandoc.properties

          7.然后打開D:\java\spring-beandoc-0.7.0\target\sample-output\index.html.
          就可以看到生成好的文檔了。

          posted @ 2006-06-13 22:50 lizongbo 的編程學習| 編輯 收藏

          由于項目中有需求要一個blog功能,在大致看了下dlog4j和roller之后。

          通過使用blogjava和codelphi的blog的體會。
          參考的.text的樣子,決定照虎畫貓自己寫一個。
          目前已經完成大部分功能。

          通過http://222.66.24.243/webblog/debug/init.jsp這個地址自動登錄,然后進行blog管理。

          http://222.66.24.243/webblog/u/demouser 察看效果。

          前臺界面使用了jstl和oscache標簽。開發時間大約一個星期
          后臺界面,采用的ajax的方式。開發時間大約兩個星期。
          頁面風格樣式主題照搬的codelphi的blog。

          由于現在數據量小,現在執行一個頁面的時間大約是200毫秒,在oscache緩存之后是20毫秒。
          暫時還推斷不了數據量大了之后會不會出現csdn和donews那樣的性能問題。
          由于對頁面緩存的時間是一個小時,只在回復文章的時候做了即時刷新緩存。
          因此其它地方的修改,需要過段時間才能夠看到效果。


          歡迎大家幫忙測試,并歡迎在此發表意見。





          posted @ 2006-05-10 10:16 lizongbo 的編程學習| 編輯 收藏

               摘要: 受 charon@xxx 的回復的提示,結合myeclipse生成 pojo的思路,對我的代碼生成器進行改進,作以下處理。
          謝謝 charon@xxx 。  閱讀全文
          posted @ 2006-04-26 14:08 lizongbo 的編程學習| 編輯 收藏

               摘要: 在此寫一下我自己的代碼生成器的設計和一點體會。
            閱讀全文
          posted @ 2006-04-25 22:47 lizongbo 的編程學習| 編輯 收藏

          很奇怪,很多人都說proxool很好,
          但是搜索spring中配置proxool作 數據源連接池的資料卻幾乎找不到詳細點的。

          因此自己整理如下:

          ? 先下載:
          ?
          ? http://surfnet.dl.sourceforge.net/sourceforge/proxool/proxool-0.9.0RC2.zip


          ? web.xml

          -------------------------


          ? <servlet>
          ??? <servlet-name>proxoolServletConfigurator</servlet-name>
          ??? <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
          ??? <init-param>
          ????? <param-name>xmlFile</param-name>
          ????? <param-value>WEB-INF/proxool.xml</param-value>
          ??? </init-param>
          ??? <load-on-startup>1</load-on-startup>
          ? </servlet>
          ? <servlet>
          ??? <servlet-name>proxooladmin</servlet-name>
          ??? <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
          ? </servlet>
          ? <servlet-mapping>
          ??? <servlet-name>proxooladmin</servlet-name>
          ??? <url-pattern>/proxooladmin</url-pattern>
          ? </servlet-mapping>


          -------------------------

          ? proxool.xml

          -------------------------
          <?xml version="1.0" encoding="UTF-8"?>
          <proxool-config>
          ? <proxool>
          ??? <alias>blogdb</alias>
          ??? <driver-url>jdbc:oracle:thin:@127.0.0.1:1521:ORADB</driver-url>
          ??? <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
          ??? <driver-properties>
          ????? <property name="user" value="lizongbo"/>
          ????? <property name="password" value="password"/>
          ??? </driver-properties>
          ??? <maximum-connection-count>10</maximum-connection-count>
          ??? <house-keeping-test-sql>select 1 from dual</house-keeping-test-sql>
          ? </proxool>
          </proxool-config>

          spring里:
          兩種配置:
          a:? <!-- 與上面的proxool以及web.xml里結合使用-->
          ??? <bean id="mainDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          ??? <property name="driverClassName">
          ??? <value>org.logicalcobwebs.proxool.ProxoolDriver</value>
          ??? </property>
          ??? <property name="url">
          ??? <value>proxool.blogdb</value>
          ??? </property>
          ??? </bean>

          b:<!-- 單獨的類似dbcp的使用-->
          ? <bean id="mainDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
          ??? <property name="driver">
          ????? <value>oracle.jdbc.driver.OracleDriver</value>
          ??? </property>
          ??? <property name="driverUrl">
          ????? <value>jdbc:oracle:thin:lizongbo/password@127.0.0.1:1521:ORADB</value>????
          ?<!--用戶名和密碼寫在一起才調用成功,不然會報 調用無效的參數 錯誤,下面設置用戶名和密碼的property好像是無效的,其它數據庫也是這樣
          ?比如mysql的也要把用戶名和密碼寫在url里:<property name="driverUrl" value="jdbc:mysql://localhost:3306/blogdb?user=lizongbo&amp;password=lizongbo" />
          ?-->
          ??? </property>
          ??? <property name="user"> <!-- 必須在這里也設置,但是 proxool卻不使用它,或許是個bug-->
          ????? <value>lizongbo</value>
          ??? </property>
          ??? <property name="password"> <!-- 必須在這里也設置,但是 proxool卻不使用它,或許是個bug-->
          ????? <value>lizongbo</value>
          ??? </property>
          ??? <property name="alias">
          ????? <value>lizongbo</value>
          ??? </property>
          ??? <property name="houseKeepingSleepTime">
          ????? <value>90000</value>
          ??? </property>
          ??? <property name="prototypeCount">
          ????? <value>5</value>
          ??? </property>
          ??? <property name="maximumConnectionCount">
          ????? <value>100</value>
          ??? </property>
          ??? <property name="minimumConnectionCount">
          ????? <value>10</value>
          ??? </property>
          ??? <property name="trace">
          ????? <value>true</value>
          ??? </property>
          ??? <property name="verbose">
          ????? <value>true</value>
          ??? </property>
          ? </bean>


          ???
          posted @ 2006-04-07 14:17 lizongbo 的編程學習| 編輯 收藏

          有同事討論到關于url編碼的問題。
          因此總結以下幾點方法供大家參考。
          首先,對于post請求的時候,通過過濾器就可以搞定,以下的方法主要是針對get方式的亂碼處理。

          1. 手工對字符串編碼解碼的方法為:
          java.net.URLEncoder.encode("測試","UTF-8");
          java.net.URLDecoder.decode("%E6%B5%8B%E8%AF%95%26%3Faaa","UTF-8");
          這個方法適用于自己從原始字符串中進行解碼處理。

          2. tomcat服務器的處理url編碼的方法:

          修改tomcat的server.xml增加指定的編碼,以代替tomcat默認的ISO-8859-1。
          需要增加的參數為:URIEncoding,
          比如下面的例子是制定解碼使用UTF-8,
          <Connector port="8080"
          maxThreads="800" minSpareThreads="25" maxSpareThreads="100"
          enableLookups="false" redirectPort="8443" acceptCount="0"
          debug="0" connectionTimeout="20000" URIEncoding="UTF-8"
          disableUploadTimeout="true" />
          如果用到了apache與tomcat 的整合,則還需要:
          <Connector port="8009" URIEncoding="UTF-8"
          enableLookups="false" redirectPort="8443" debug="0"
          protocol="AJP/1.3" maxThreads="1100" minSpareThreads="25" maxSpareThreads="100" acceptCount="0"/>
          (這個方法最簡單方便,但是使用這種的方法之后,代碼中就不需要也能有new String(strvalue.getBytes("ISO8859-1","GBK"); 這樣的處理方式)

          3.對于已經部署的系統,可能已經有其他同事對編碼使用了
          new String(strvalue.getBytes("ISO8859-1","GBK");
          這樣的方法作了處理,這個時候使用第二種方法就可能會影響到其它模塊的正常使用,

          因此,我們可以自己重新解析queryString我封裝了幾個方法。使用重新封裝的方法可以在不影響原來系統的情況下,正確的獲得參數。

          封裝的代碼如下,供大家參考:



          /**
          * 從請求的url字符串中解析參數,當request.getParameterValues()取得的參數值編碼值不正確的時候可以使用該方法
          * @param request HttpServletRequest
          * @param paramName String
          * @return String[] 返回多個同參數名的值
          */
          public static String[] getParamsFromQueryString(HttpServletRequest request,
          String paramName) {
          return getParamsFromQueryString(request.getQueryString(), paramName);
          }

          /**
          * 從請求的url字符串中解析參數,當request.getParameterValues()取得的參數值編碼值不正確的時候可以使用該方法
          * @param request HttpServletRequest
          * @param paramName String
          * @return String[]
          */
          public static String getParameterFromQueryString(HttpServletRequest request,
          String paramName) {
          return getParameterFromQueryString(request.getQueryString(), paramName);
          }

          /**
          * 從請求的url字符串中解析參數,當request.getParameter()取得的參數值編碼值不正確的時候可以使用該方法
          * @param queryString String
          * @param paramName String
          * @return String 只返回一個值
          */
          public static String getParameterFromQueryString(String queryString,
          String paramName) {
          String[] s = getParamsFromQueryString(queryString, paramName);
          if (s != null && s.length >= 1) {
          return s[0];
          }
          return null;
          }

          /**
          * 從請求的url字符串中解析參數,當request.getParameter()取得的參數值編碼值不正確的時候可以使用該方法
          * @param queryString String
          * @param paramName String
          * @return String[] 返回多個同參數名的值
          */
          public static String[] getParamsFromQueryString(String queryString,
          String paramName) {
          if (paramName == null || paramName.length() < 1 || paramName == null ||
          paramName.length() < 1) {
          return new String[0];
          }
          List rsl = new ArrayList();
          String params[] = queryString.split("&");
          for (int i = 0; i < params.length; i++) {
          // System.out.println(params[i]);
          if (params[i] != null && params[i].startsWith(paramName + "=")) {
          try {
          rsl.add(java.net.URLDecoder.decode(params[i].substring(paramName.
          length() +
          1), "UTF-8")); //根據需要修改自己要使用的編碼。
          }
          catch (UnsupportedEncodingException ex) {
          }
          }
          }
          return (String[]) rsl.toArray(new String[0]);
          }

          public static void main(String[] args) {
          //該例子演示解碼。
          //jsp和servlet中調用
          // System.out.println(getParameterFromQueryString(request.getQueryString(), "q"));
          //該例子示意的是gogole的url中的queryString。
          System.out.println(getParameterFromQueryString(
          "hl=zh-CN&newwindow=1&q=%E6%B5%8B%E8%AF%95%26%3Faaa&meta=", "q"));
          }


          posted @ 2006-04-07 14:10 lizongbo 的編程學習| 編輯 收藏

          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 
          主站蜘蛛池模板: 双辽市| 偏关县| 新建县| 时尚| 浪卡子县| 井陉县| 田阳县| 翁源县| 大姚县| 云南省| 兴业县| 思茅市| 水城县| 连平县| 南城县| 海伦市| 吐鲁番市| 江门市| 高雄县| 永平县| 饶河县| 天祝| 三台县| 灯塔市| 雷波县| 鹰潭市| 永登县| 通辽市| 沾化县| 尼木县| 台中县| 当涂县| 兴宁市| 丰都县| 昌江| 喀喇| 青龙| 巫山县| 分宜县| 汉川市| 郎溪县|