2013年3月13日

          試了N多方法,貌似在終端執(zhí)行命令:
          export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312是最有效的。
          =======================
          1.不管用那種ssh客戶端,字體設(shè)定一定要設(shè)為可以顯示中文的字體。

          2.遠(yuǎn)程的locale一定要設(shè)置為L(zhǎng)ANG=zh_CN.UTF-8

          ========================================
          修改/etc/profile

          增加這一行
          export LC_ALL=zh_CN.GBK

          ========================================

          SSH顯示中文亂碼問題
          (1) 打開/etc/sysconfig/i18n
          設(shè)置為:
          LANG="zh_CN.GB2312"
          LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
          SUPPORTED="zh_CN.GB18030:zh_CN.GB2312:zh_CN.UTF-8:zh:en_US.UTF-8:en_US:en:ja_JP.UTF-8:ja_JP:ja"
          SYSFONT="lat0-sun16"
          SYSFONTACM="8859-15"

          其中LANG="zh_CN.GB2312" 是必須的(如果你不想讓中文亂碼的話!!!)
          其它的可以按照自已的需求來改變。
          (2) 打開smb.conf
          添加:

             display charset=cp936
              unix charset=cp936
              doc  charset=cp936
          ========================
          posted @ 2013-09-12 17:23 姚先進(jìn) 閱讀(260) | 評(píng)論 (0)編輯 收藏
           
           與association一樣,collection元素也有兩種形式,現(xiàn)介紹如下:
          一、嵌套的resultMap

                實(shí)際上以前的示例使用的就是這種方法,今天介紹它的另一種寫法。還是以教師映射為例,修改映射文件TeacherMapper.xml如下(點(diǎn)擊此處進(jìn)入嵌套resultMap形式的示例源碼下載頁(yè)面。注:本示例代碼是在修改本系列的上篇博文示例代碼的基礎(chǔ)上完成的,用到了MapperScannerConfigurer和注解等知識(shí)。對(duì)這些知識(shí)不熟悉的讀者,可參考上篇博文:http://legend2011.blog.51cto.com/3018495/980150):

          1. <?xmlversion="1.0"encoding="utf8"?>

          2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

          3. <!--與以前一樣,namespace的值是對(duì)應(yīng)的映射器接口的完整名稱-->

          4. <mappernamespace="com.abc.mapper.TeacherMapper">

          5.          <!--TeacherMapper接口中g(shù)etById方法對(duì)應(yīng)的SQL語(yǔ)句。  

          6.          查詢教師及其指導(dǎo)的學(xué)生的信息。由于教師、學(xué)生都有  

          7.          id、name、gender等屬性,因此給教師的字段都起了別名-->

          8. <selectid="getById"parameterType="int"resultMap="supervisorResultMap">

          9.           select t.id t_id, t.name t_name, t.gender t_gender,  

          10.           t.research_area t_research_area, t.title t_title,  

          11.           s.id,s.name, s.gender,s.major,s.grade  

          12.           from teacher t,student s where t.id=#{id}  

          13.           and s.supervisor_id = t.id  

          14. </select>

          15. <!--教師實(shí)體映射-->

          16. <resultMapid="supervisorResultMap"type="Teacher">

          17. <idproperty="id"column="t_id"/>

          18. <resultproperty="name"column="t_name"/>

          19. <resultproperty="gender"column="t_gender"/>

          20. <resultproperty="researchArea"column="t_research_area"/>

          21. <resultproperty="title"column="t_title"/>

          22.             <!--需要注意的是,上面的select語(yǔ)句中學(xué)生的字段名/別名應(yīng)與  

          23.             下面的column屬性一致。ofType指collection包含的元素的類型,  

          24.             此屬性不可少-->

          25. <collectionproperty="supStudents"ofType="Student">

          26. <idproperty="id"column="id"/>

          27. <resultproperty="name"column="name"/>

          28. <resultproperty="gender"column="gender"/>

          29. <resultproperty="major"column="major"/>

          30. <resultproperty="grade"column="grade"/>

          31.                <!--映射學(xué)生的指導(dǎo)教師屬性,用到了  

          32.                supervisorResultMap本身-->

          33. <associationproperty="supervisor"

          34. resultMap="supervisorResultMap"/>

          35. </collection>

          36. </resultMap>

          37. </mapper>

                運(yùn)行程序結(jié)果如下: 

                 與以前的寫法相比,這種寫法的缺點(diǎn)是學(xué)生實(shí)體映射被嵌入到教師實(shí)體映射中,因此學(xué)生實(shí)體映射不能被重用。

          二、嵌套的select語(yǔ)句

                這種方式是使用一條單獨(dú)的select語(yǔ)句來加載關(guān)聯(lián)的實(shí)體(在本例中就是學(xué)生實(shí)體),然后在collection元素中引用此select語(yǔ)句(注:此方法會(huì)產(chǎn)生N+1問題,關(guān)于這個(gè)問題可參考本系列博客中的“MyBatis中的N+1問題”)。首先修改TeacherMapper.xml如下(點(diǎn)擊此處進(jìn)入嵌套select語(yǔ)句形式示例源碼下載頁(yè)面):

          1. <?xmlversion="1.0"encoding="utf8"?>

          2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

          3. <!--與以前一樣,namespace的值是對(duì)應(yīng)的映射器接口的完整名稱-->

          4. <mappernamespace="com.abc.mapper.TeacherMapper">

          5.          <!--TeacherMapper接口中g(shù)etById方法對(duì)應(yīng)的SQL語(yǔ)句。  

          6.          查詢教師的信息。-->

          7. <selectid="getById"parameterType="int"resultMap="supervisorResultMap">

          8.           select * from teacher where id=#{id}  

          9. </select>

          10. <!--教師實(shí)體映射-->

          11. <resultMapid="supervisorResultMap"type="Teacher">

          12. <idproperty="id"column="id"/>

          13. <resultproperty="name"column="name"/>

          14. <resultproperty="gender"column="gender"/>

          15. <resultproperty="researchArea"column="research_area"/>

          16. <resultproperty="title"column="title"/>

          17.             <!--ofType指collection包含的元素的類型,此屬性不可少。  

          18.             column屬性指把上述的getById的select語(yǔ)句中的教師id列的值作為參數(shù)  

          19.             傳遞給將要引用到的下述的getStudents的select語(yǔ)句,此屬性不可少。  

          20.             引用的形式為:命名空間.select語(yǔ)句id-->

          21. <collectionproperty="supStudents"column="id"ofType="Student"

          22. select="com.abc.mapper.StudentMapper.getStudents"/>

          23. </resultMap>

          24. </mapper>

                 在這里把根據(jù)指導(dǎo)教師id查詢學(xué)生信息的SQL語(yǔ)句寫在StudentMapper.xml中,并引用其中的學(xué)生實(shí)體映射studentResultMap。修改StudentMapper.xml如下:

          1. <?xmlversion="1.0"encoding="utf8"?>

          2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

          3. <mappernamespace="com.abc.mapper.StudentMapper">

          4. <resultMapid="studentResultMap"type="Student">

          5. <idproperty="id"column="id"/>

          6. <resultproperty="name"column="name"/>

          7. <resultproperty="gender"column="gender"/>

          8. <resultproperty="major"column="major"/>

          9. <resultproperty="grade"column="grade"/>

          10.           <!--在這里引用supervisorResultMap和getById,亦采用  

          11.           命名空間名.相關(guān)元素id的形式。column="supervisor_id"

          12.           屬性不可少-->

          13. <associationproperty="supervisor"

          14. resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"

          15. select="com.abc.mapper.TeacherMapper.getById"column="supervisor_id"/>

          16. </resultMap>

          17. <!--根據(jù)指導(dǎo)教師id查詢學(xué)生信息-->

          18. <selectid="getStudents"parameterType="int"

          19. resultMap="studentResultMap">

          20.             select * from student where supervisor_id = #{id}  

          21. </select>

          22. </mapper>

                執(zhí)行結(jié)果如下:

          posted @ 2013-09-11 13:44 姚先進(jìn) 閱讀(419) | 評(píng)論 (0)編輯 收藏
           

          最近在工作中遇到了一個(gè)需求

          在執(zhí)行數(shù)據(jù)庫(kù)操作時(shí)需要先判斷指定的數(shù)據(jù)是否存在,如果不存在則插入,存在則更新

          最開始使用的是三條SQL語(yǔ)句:

          1. SELECT bl_count,bl_src,bl_date,bl_topic FROM temp_table WHERE bl_topic=? AND bl_src=? AND bl_date=?;  
          2.   
          3. UPDATE temp_table SET bl_count=? WHERE bl_topic=? AND bl_src=? AND bl_date=?;  
          4.   
          5. INSERT INTO temp_table (bl_src,bl_date,bl_count,bl_topic) values(?,?,?,?)  
          邏輯是:
          1. if(SELECT!= null){  
          2.     UPDATE  
          3. }else{  
          4.     INSERT  
          5. }  

          后來leader提示還有新的方法,一條SQL語(yǔ)句就能搞定:

          1. INSERT INTO temp_table(bl_src,bl_date,bl_count,bl_topic) VALUES(?,?,?,?) ON DUPLICATE KEY UPDATE bl_count=bl_count+?;  

          但是有個(gè)前提就是:什么時(shí)候會(huì)執(zhí)行update語(yǔ)句?在SQL語(yǔ)句中并沒有條件。

          后來在網(wǎng)上看到的,執(zhí)行update語(yǔ)句的條件是insert語(yǔ)句的執(zhí)行會(huì)造成唯一鍵的重復(fù)。

          所以,在創(chuàng)建表的時(shí)候還要加上唯一鍵的約束

          1. ALTER TABLE temp_table ADD CONSTRAINT c_topic_src_date UNIQUE(bl_topic,bl_src,bl_date);  

          這樣就能達(dá)到目的。

          posted @ 2013-09-10 18:56 姚先進(jìn) 閱讀(925) | 評(píng)論 (0)編輯 收藏
           

          JSP:include的flush屬性的作用

          分類: 其他 2012-04-06 10:51 2572人閱讀 評(píng)論(2) 收藏 舉報(bào)
          includejspservlet服務(wù)器瀏覽器
          JSPinclude 另一個(gè)文件時(shí)有個(gè)很偏的屬性,叫flush,默認(rèn)為 false。

          在同一個(gè) JSP 中,如果不斷 include 自己(源文件),在邏輯上會(huì)形成死循環(huán)。若默認(rèn)情況下,服務(wù)器會(huì)等待該文件被讀到底端,然后才輸出到客戶端,并且銷毀該次訪問的 request 和 response。而當(dāng)把flush 屬性賦為真值時(shí),在緩存累積了一定數(shù)據(jù)時(shí),服務(wù)器會(huì)先提供一部分?jǐn)?shù)據(jù)給瀏覽器,并等待后續(xù)內(nèi)容。

          由此可以得出結(jié)論,在簡(jiǎn)單頁(yè)面中,該屬性不納入考慮,而在頁(yè)面包含大量數(shù)據(jù)時(shí),為縮短客戶端延遲,可將一部分內(nèi)容先行輸出。該屬性在 Servlet 中也有對(duì)應(yīng)的應(yīng)用。
          posted @ 2013-07-29 20:54 姚先進(jìn) 閱讀(495) | 評(píng)論 (1)編輯 收藏
           

           大家都在為項(xiàng)目開發(fā)成功而喜悅,但可不知成功的路上是會(huì)經(jīng)常出錯(cuò)的,下面是我碰到的一些錯(cuò)誤集合!

          【錯(cuò)誤信息】

          01-16 17:16:18.945: I/magh(979): org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1:8080 refused

          在android模擬器連接本機(jī)訪問web時(shí)報(bào)這錯(cuò),把127.0.0.1改成localhost也是一樣的

          原因:
           在向本機(jī)發(fā)送HTTP請(qǐng)求時(shí),有一點(diǎn)必須注意,就是在android 虛擬機(jī)中,127.0.0.1為android 虛擬機(jī)的IP地址,如果要訪問本機(jī),IP地址應(yīng)該改為10.0.2.2。否則肯定會(huì)導(dǎo)致訪問不成功!
          ==========================================================================
          【錯(cuò)誤信息】
          [2011-01-19 16:39:10 - ApiDemos] WARNING: Application does not specify an API level requirement!
          [2011-01-19 16:39:10 - ApiDemos] Device API version is 8 (Android 2.2)
          原因:
          不影響正常運(yùn)行。在AndroidManifest.xml文件中沒有加API的版本號(hào),在<manifest> </manifest> 之間加<uses-sdk android:minSdkVersion="3"></uses-sdk>
          [2011-01-19 16:55:04 - ApiDemos] Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
          [2011-01-19 16:55:04 - ApiDemos] Please check logcat output for more details.
          [2011-01-19 16:55:05 - ApiDemos] Launch canceled!
          該設(shè)備沒有足夠的存儲(chǔ)空間來安裝應(yīng)用程序,


          【錯(cuò)誤信息】
          [2011-02-18 11:46:53] Failed to push selection: Is a directory
          原因:
          原先目錄已經(jīng)有pkg_3.apk的文件夾,再copy一個(gè)pkg_3.apk安裝文件時(shí)出現(xiàn)問題,解決辦法,先刪除掉pkg_3.apk的文件夾
          [2011-03-04 09:25:12 - ActivityMain]: Dx
          UNEXPECTED TOP-LEVEL EXCEPTION:
          java.lang.IllegalArgumentException: already added: Lorg1/apache/commons/codec/net/RFC1522Codec;
          [2011-03-04 09:25:12 - ActivityMain]: Dx at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
          [2011-03-04 09:25:12 - ActivityMain]: Dx at com.android.dx.dex.file.DexFile.add(DexFile.java:143)
          .....
          [2011-03-04 09:25:12 - ActivityMain]: Dx1 error; aborting
          [2011-03-04 09:25:12 - ActivityMain] Conversion to Dalvik format failed with error 1
          原因:


          【錯(cuò)誤信息】
          啟動(dòng)Eclipse時(shí)出現(xiàn):
          this android sdk requires android developer toolkit version 10.0.0 or above.
          current version is 8.0.1.v201012062107-82219.
          please update adt to the latest version

          原因:
          Eclipse的android開發(fā)插件版本過低,應(yīng)該下載ADT-10.0.0,并且
          1. 啟動(dòng) Eclipse, 然后進(jìn)入 Help > Install New Software.
          2. 在 Available Software 對(duì)話框里,點(diǎn)擊 Add....


          【錯(cuò)誤信息】
          [2011-03-09 15:21:34 - Info] Failed to install Info.apk on device '?': Unable to open sync connection!
          [2011-03-09 15:21:34 - Info] java.io.IOException: Unable to open sync connection!
          [2011-03-09 15:21:34 - Info] Launch canceled!
          原因:
          關(guān)閉模擬器和eclipse,執(zhí)行adb kill-server命令,然后重試一下


          【錯(cuò)誤信息】
          調(diào)用Webservice時(shí)出現(xiàn)
          java.net.SocketException: Permission denied (maybe missing INTERNET permission)
          原因:
          需要訪問到網(wǎng)絡(luò),所以,在AndroidManifest.xml中,需要進(jìn)行如下配置:
          <uses-permission android:name="android.permission.INTERNET" />


          【錯(cuò)誤信息】
          org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <{http://schemas.xmlsoap.org/wsdl/}wsdl:definitions targetNamespace='http://bo.webservice.nqbx.nq.com'>@2:603 injava.io.InputStreamReader@44a3a7b0)
          原因有可能是以下2個(gè)之一:
          1)Webservice服務(wù)器的Soap版本為1.0,所以客戶端指定
          SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
          VER11改為VER10
          2)String serviceUrl = "http://200.200.200.11:10000/nqbx/service/InqBxWebService?wsdl";
          Url指的是你的webservice的地址.一般都是以***.wsdl或者***.?wsdl結(jié)束的...但是.需要注意的是..要去掉后面的.wsdl或者.?wsdl


          【錯(cuò)誤信息】
          在新的線程中 public class HttpThread extends Thread {...}
          增加一個(gè)彈出窗體:
          new AlertDialog.Builder(this).setTitle("數(shù)據(jù)加載失敗").setMessage("請(qǐng)檢查網(wǎng)絡(luò)連接情況")           .setPositiveButton("OK", new DialogInterface.OnClickListener(){            public void onClick(DialogInterface dialoginterface, int i)            {            }            }).show();     
            原因及解決辦法:
          //不能在線程中操作UI界面
          java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

          修改后:
          new AlertDialog.Builder(com.nantsing.infoquery.chuanbo_detail.this).setTitle(" 數(shù)據(jù)加載失敗").setMessage("請(qǐng)檢查網(wǎng)絡(luò)連接情況")           .setPositiveButton("OK", new DialogInterface.OnClickListener(){            public void onClick(DialogInterface dialoginterface, int i)            {            }


          【錯(cuò)誤信息】
          The constructor AlertDialog.Builder(chuanbo_detail.HttpThread) is undefined
          原因及解決辦法:
          在UI主線程之外是無(wú)法對(duì)UI組件進(jìn)行控制的。因?yàn)槟惚仨氃谛戮€程任務(wù)完成之后利用各種方法先UI主線程發(fā)送消息通知任務(wù)完成從而來顯示各種提示消息。
          線程間通信方法有多種,常用的是用handler來傳遞消息。
          如下:
          線程中構(gòu)造消息:
          //構(gòu)造消息Message message = handle.obtainMessage();Bundle b = new Bundle();b.putString("tag", "1");message.setData(b);handle.sendMessage(message);
          另外自定義消息:
                  /** * 捕獲消息隊(duì)列 fubin.pan 2011-04-02 */Handler handler = new Handler() {public void handleMessage(Message m) {if (!m.getData().getString("tag").equals("1")){                            ...}else{new AlertDialog.Builder(chuanbo_detail.this).setTitle("數(shù)據(jù)加載失敗").setMessage(" 請(qǐng)檢查網(wǎng)絡(luò)連接情況!")                .setPositiveButton("OK", new DialogInterface.OnClickListener(){                        public void onClick(DialogInterface dialoginterface, int i)                        {                        }          }).show();}}};


          【錯(cuò)誤信息】
          android低版本工程(如1.5)放到高版本環(huán)境中(如2.2)可能會(huì)上述錯(cuò)誤,解決方法如下:
          1。 如果不修改android sdk版本,則使用project clean 命令作用于某工程即可。
                 (該處理方式只是在高版本中兼容了低版本工程,未真正意義上的升級(jí))
          2。 如果修改android sdk版本,則需要以下幾個(gè)步驟:
                 1)修改SDK
                       選擇工程,build path --> configure build path ---> library 刪除引用的低版本SDK,
                       然后add External JARs,選擇高版本SDK,OK,保存
                  2)修改classpath文件
                       該文件可能存在該項(xiàng): <classpathentry kind="lib"   path ="你所指定的高版本的地址"
                       把她修改成<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" />
                  3) 修改AndroidManifest.xml
                       在AndroidManifest.xml文件中,application標(biāo)簽后添加<uses-sdk android:minSdkVersion="3"></uses-sdk>
                  4) 修改default.properties(很重要)
                        該文件最后一行(前面沒用#的)target=android-3 該成target=android-8,保存。
                  再看看你的工程和新建的android 2.2的工程結(jié)構(gòu)就一樣了。


          【錯(cuò)誤信息】
          在線程debug(運(yùn)行沒有問題)時(shí)調(diào)用Webservice時(shí)出現(xiàn):
          'JDI thread evaluations' has encountered a problem
          Exception processing async thread queue


          Exception processing async thread queue
          JDI thread evaluations


          原因及解決辦法:
          與運(yùn)行無(wú)關(guān)的錯(cuò)誤,關(guān)掉'expressions'視圖就可以了


          【錯(cuò)誤信息】
          打開開源項(xiàng)目JavaEye Android client時(shí)出錯(cuò)
          http://javaeye-android-client.googlecode.com/svn/trunk/
          這是 JavaEye 網(wǎng)站基于 Android 平臺(tái)的客戶端軟件,可用以閱讀動(dòng)靜、帖子、閑談, 收躲, RSS 等功用。

          [2011-04-19 10:55:11 - JavaEye Android Client] Project has no default.properties file! Edit the project properties to set one.


          原因及解決辦法:
          遇到這種情況,可以創(chuàng)建一個(gè)default.properties文件,如果創(chuàng)建之后還是有錯(cuò)誤,那么delete這個(gè)project,重新import。
          編輯default.properties 之后,一般會(huì)自動(dòng)創(chuàng)建 gen 目錄, 如果沒有,也可嘗試手工創(chuàng)建。

          ?Adroid Adapter ADB Interface 嚴(yán)重錯(cuò)誤
          今天在配置完Eclipse和Android SDK開發(fā)環(huán)境之后,想用華為C8500手機(jī)通過USB連接電腦,并在手機(jī)上去調(diào)試,但莫名其妙出現(xiàn)Adroid Adapter ADB Interface 安裝嚴(yán)重錯(cuò)誤,在豌豆莢手機(jī)精靈安裝驅(qū)動(dòng)的時(shí)候,也出現(xiàn)這個(gè)錯(cuò)誤,后面也莫名奇妙的多裝幾次就好了,還沒找到什么原因。


          【錯(cuò)誤信息】
          用手機(jī)調(diào)試運(yùn)行出現(xiàn):
          ActivityManager: Warning: Activity not started, its current task has been brought to the front
          原因及解決辦法:
          該手機(jī)已經(jīng)啟動(dòng)了相同名字的應(yīng)用,關(guān)閉之后再試!


          【錯(cuò)誤信息】
          最近(2012-04-05)在打開SDK Manager.exe,更新SDK時(shí),會(huì)出現(xiàn)如下錯(cuò)誤:

          Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml,
          reason: Connection timed out: connect
          原因及解決辦法:
          dl-ssl.google.com在大陸封掉了
          解決方法就是修改C:\Windows\System32\drivers\etc\hosts文件。添加一行:
          74.125.237.1       dl-ssl.google.com
          保存,重新啟動(dòng)SDK Manager.exe


          【錯(cuò)誤信息】
          [2012-04-08 17:42:24 - JavaEye Android Client] ------------------------------
          [2012-04-08 17:42:24 - JavaEye Android Client] Android Launch!
          [2012-04-08 17:42:24 - JavaEye Android Client] The connection to adb is down, and a severe error has occured.
          [2012-04-08 17:42:24 - JavaEye Android Client] You must restart adb and Eclipse.
          [2012-04-08 17:42:24 - JavaEye Android Client] Please ensure that adb is correctly located at 'C:\android\android-sdk-windows\platform-tools\adb.exe' and can be executed.
          原因及解決辦法:
          查看任務(wù)管理器,關(guān)閉所有adb.exe
          重啟eclipse即可


          【錯(cuò)誤信息】
          更新SDK時(shí)錯(cuò)誤信息:
          Site Authentication
          Please login to the following ......

          原因及解決辦法:
          Cancel跳過提示


          【錯(cuò)誤信息】
          打開Eclipse 提示安裝ADT 17

          原因及解決辦法:
          最新的Android SDK只能安裝ADT 17.0.0
          可用的下載地址:http://download.csdn.net/detail/merrido/4169460,
          這里可不能用常規(guī)方法安裝這個(gè) ADT 17.0.0.zip 文件, 首先得解壓這個(gè)文件,將里面的文件夾覆蓋掉Eclipse安裝目錄下的文件夾。
          然后再用Help-> install new software->Add -> Name: ADT   Archive:選擇ADT 17.0.0.zip


          【錯(cuò)誤信息】
          安裝ADT 17.0.0時(shí),提示:
          Your original request has been modified.
            "Android DDMS" is already installed, so an update will be performed instead.
            "Android Development Tools" is already installed, so an update will be performed instead.
            "Android Hierarchy Viewer" is already installed, so an update will be performed instead.
            "Android Traceview" is already installed, so an update will be performed instead.
          Cannot complete the install because one or more required items could not be found.
            Software being installed: Android Development Tools 17.0.0.v201203161636-291853 (com.android.ide.eclipse.adt.feature.group 17.0.0.v201203161636-291853)
            Missing requirement: Android Development Tools 17.0.0.v201203161636-291853 (com.android.ide.eclipse.adt.feature.group 17.0.0.v201203161636-291853) requires 'org.eclipse.core.runtime 3.6.0' but it could not be found
          原因及解決辦法:


          【錯(cuò)誤信息】
          Updates ADT 17.0.0時(shí)提示:
          Cannot complete the install because one or more required items could not be found.
            Software being installed: Android Development Tools 17.0.0.v201203161636-291853 (com.android.ide.eclipse.adt.feature.group 17.0.0.v201203161636-291853)
            Missing requirement: Android Development Tools 17.0.0.v201203161636-291853 (com.android.ide.eclipse.adt.feature.group 17.0.0.v201203161636-291853) requires 'org.eclipse.core.runtime 3.6.0' but it could not be found
          原因及解決辦法:
          requires 'org.eclipse.core.runtime 3.6.0' but it could not be found
          requires 'org.eclipse.ui 3.6.0' but it could not be found
          eclipse需要升級(jí)到3.6.0,我的版本是3.5.2


          【錯(cuò)誤信息】
          [2012-04-09 17:14:49 - Info] ------------------------------
          [2012-04-09 17:14:49 - Info] Android Launch!
          [2012-04-09 17:14:49 - Info] Connection with adb was interrupted.
          [2012-04-09 17:14:49 - Info] 0 attempts have been made to reconnect.
          [2012-04-09 17:14:49 - Info] You may want to manually restart adb from the Devices view.
          原因及解決辦法:
          重新啟動(dòng)eclipse


          【錯(cuò)誤信息】
          [2012-04-10 09:45:49 - adb] ADB server didn't ACK
          [2012-04-10 09:45:49 - adb] * failed to start daemon *
          原因及解決辦法:
          查看任務(wù)管理器,關(guān)閉所有adb.exe
          重啟eclipse


          【錯(cuò)誤信息】
          [2012-04-10 09:53:50 - ApiDemos] ------------------------------
          [2012-04-10 09:53:50 - ApiDemos] Android Launch!
          [2012-04-10 09:53:50 - ApiDemos] The connection to adb is down, and a severe error has occured.
          [2012-04-10 09:53:50 - ApiDemos] You must restart adb and Eclipse.
          [2012-04-10 09:53:50 - ApiDemos] Please ensure that adb is correctly located at 'C:\android\android-sdk-windows\platform-tools\adb.exe' and can be executed.
          原因及解決辦法:
          重啟eclipse


          【錯(cuò)誤信息】
          安裝android sdk時(shí):
          -= warning! =- A folder failed to be renamed or moved. On Windows this typically means that a program Is using that Folder (for example Windows Explorer or your anti-virus software.) Please momentarily deactivate your anti-virus software. Please also close any running programs that may be accessing the directory 'C:\android\android-sdk-windows/android-sdk-windows/too!s'. When ready, press YES to try again.

          原因及解決辦法:
          1, 復(fù)制 tools目錄
          為一個(gè)新的目錄 tools-copy ,此時(shí)在android-sdk-windows 目錄下有兩個(gè)目錄 tools 和 tools-copy
          2, 在tools-copy目錄以管理員身份運(yùn)行 android.bat ,這樣就可以正常 update all 了
          3.重新運(yùn)行SDK Manager.exe.問題解決!


          【錯(cuò)誤信息】
          “正在啟動(dòng)JavaEyeApiAccessor“遇到問題。
          不能連接至VM

          原因及解決辦法:
          連接不到手機(jī)虛擬機(jī)
          重啟拔插手機(jī)連接線


          【錯(cuò)誤信息】
          調(diào)試的時(shí)候:
          [2012-04-13 17:46:27 - IpsosAutoAndroid] Failed to install IpsosAutoAndroid.apk on device '?': timeout
          [2012-04-13 17:46:27 - IpsosAutoAndroid] Launch canceled!
          原因及解決辦法:
          連接真機(jī)調(diào)試的時(shí)候如果連接太久沒響應(yīng)就會(huì)出現(xiàn)timeout
          1.在window-》prensent....-》android-》設(shè)置ddms的timeout時(shí)間。這種是就最有效、最簡(jiǎn)潔的。
          2.delete android里面的 apk,保證速度。不過試過一次后,真機(jī)好像變“聰明了”,也出現(xiàn)timeout。
          3.Cleaning the project (Project->Clean),不行就重啟eclipse或者android,很郁悶的是,重啟后運(yùn)行第一次可以。第二次就開始變慢了,也就是出現(xiàn)timeout

          4.關(guān)閉eclipse ,然后再重啟,就ok


          【錯(cuò)誤信息】
          調(diào)用org.ksoap2.*訪問webservice時(shí)
          04-13 10:09:49.565: E/dalvikvm(354): Could not find class 'org.ksoap2.serialization.SoapObject', referenced from method......
          04-13 10:09:49.585: E/dalvikvm(354): Could not find class 'org.ksoap2.transport.HttpTransportSE', referenced from method......
          【錯(cuò)誤信息】
          Unable to open stack trace file '/data/anr/traces.txt': Permission denied
          原因及解決辦法:
          Unable to open stack trace file '/data/anr/traces.txt': Permission 多見于這個(gè)Activity你沒有在AndroidManifest.xml中注冊(cè),就會(huì)報(bào)這樣的錯(cuò)誤。


          【錯(cuò)誤信息】
          source not found
          找不到源
          原因及解決辦法:
          android目錄下沒有對(duì)應(yīng)的sources文件

          如下圖,不知道為什么,最新的SDK更新API 14/15中有Sources for Android SDK,而之前的版本的源碼就不更新,氣憤!

          下載對(duì)應(yīng)的SDK Sources后,放到\android-sdk-windows\sources 目錄下就OK了!


          【錯(cuò)誤信息】
          Android使用KSOAP2調(diào)用WebService時(shí):
          java.lang.NoClassDefFoundError: org.ksoap2.serialization.SoapObject
          原因及解決辦法:
          雖然標(biāo)明上 Java Build Path->Libraries中已經(jīng)引用了ksoap2-android 包,但是需要order and export中也把該包勾選上


          【錯(cuò)誤信息】

          error: Error: No resource found that matches the given name (at 'layout_toLeftOf' with value'@id/top_send_btn').
          header_questionitemlist.xml /IpsosAutoAndroid/res/layout 第 27 行 Android AAPT Problem
          原因及解決辦法:


          【錯(cuò)誤信息】
          無(wú)法解析導(dǎo)入 com.renren.api.connect.android.R
          原因及解決辦法:
          導(dǎo)入android源碼有錯(cuò),R.java文件不能自動(dòng)生成解決方法

          【錯(cuò)誤信息】
          Eclipse中的DDMS無(wú)法打開data文件夾下的內(nèi)容,也不能往里面寫東西
          原因及解決辦法:
          通過軟件獲取ROOT權(quán)限

          【錯(cuò)誤信息】
          Fri May 04 16:27:46 CST 2012
          Internal error logged from JDI Debug:
          org.eclipse.jdi.TimeoutException: 等待包 8 時(shí)發(fā)生超時(shí)。
          at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:171)
          at org.eclipse.jdi.internal.connect.PacketReceiveManager.getReply(PacketReceiveManager.java:180)
          ......
          原因及解決辦法:
          重新啟動(dòng)eclipse,不行的話重啟機(jī)器

          【錯(cuò)誤信息】
          java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
          原因及解決辦法:

          如下是有問題的代碼:
                          Thread t = new Thread() {@Overridepublic void run() {super.run();try {QuestionItemlist = quesHandler.getData();if (QuestionItemlist.size() == 0) {Toast.makeText(questionitemlist2.this,"問卷題目為 空",Toast.LENGTH_LONG).show();} else {Toast.makeText(questionitemlist2.this,"問卷題目已經(jīng)獲 取",Toast.LENGTH_LONG).show();}} catch (Exception e) {e.printStackTrace();}}};t.start();

          【錯(cuò)誤信息】
          java.lang.IllegalArgumentException: The key must be an application-specific resource id.
          原因及解決辦法:
          mRadioButton.setTag(1,sQuestionItem.get(i).getToNext());//設(shè)置監(jiān)聽  ToNext:下 一題目mRadioButton.setTag(2,sQuestionItem.get(i).getToEnd());//設(shè)置監(jiān)聽  ToEnd: 是否終止 拋出IllegalArgumentException的原因就在于key不唯一,正確代碼如下:
          mRadioButton.setTag(R.id.tag_tonext,sQuestionItem.get(i).getToNext());// 設(shè)置監(jiān)聽  ToNext:下一題目 mRadioButton.setTag(R.id.tag_toend,sQuestionItem.get(i).getToEnd());//設(shè)置 監(jiān)聽  ToEnd:是否終止
          【錯(cuò)誤信息】
          點(diǎn)擊Debug 運(yùn)行 結(jié)果模擬器總是會(huì)彈出Waiting for Debugger 然后程序又可以正常運(yùn)行
          如果你想調(diào)試的時(shí)候去掉 Waiting for Debugger 提示
          原因及解決辦法:
          重啟啟動(dòng)機(jī)器就OK

          本文出自 “java之路” 博客,請(qǐng)務(wù)必保留此出處http://2402766.blog.51cto.com/2392766/1102373

          posted @ 2013-05-17 16:57 姚先進(jìn) 閱讀(277) | 評(píng)論 (0)編輯 收藏
           

          Fedora12下搭建Qt Creator的ARM開發(fā)環(huán)境 并 移植Qt4.6.2到Micro2440(一)

          管理提醒: 本帖被 kasim 執(zhí)行置頂操作(2010-04-11)
          Fedora12下搭建Qt Creator的ARM開發(fā)環(huán)境 并 移植Qt4.6.2到Micro2440(一)
          參考:
          環(huán)境:虛擬機(jī)Fedora12(建議安裝Vmware Tools,詳細(xì)安裝方法參照Vmware幫助文檔),USB串口,minicom終端。(minicom經(jīng)常打不開ttyUSB0設(shè)備,我的解決方法是,打不開時(shí)就將USB串口移除,運(yùn)行minicom,然后再接上USB串口,此時(shí)運(yùn)行minicom一般都能打開設(shè)備)
          軟件準(zhǔn)備:
          到http://qt.nokia.com/downloads-cn下載最新版的軟件包,當(dāng)前是:
          用于 Linux/X11 32位 的 Qt Creator 1.3.1 二進(jìn)制軟件包qt-creator-linux-x86-opensource-1.3.1.bin(http://qt.nokia.com/downloads/qt-creator-binary-for-linux-x11-32-bit)
          用于嵌入式 Linux 的 Qt 庫(kù) 4.6.2包qt-everywhere-opensource-src-4.6.2.tar.gz(http://qt.nokia.com/downloads/embedded-linux-cpp)
          到http://hi.baidu.com/jiyeqian/blog/item/f46d26a2ff3f7da6caefd0d6.html下載arm920t-eabi.tgz(即arm-linux-gcc-4.1.2)(http://qtextended.org/downloads/toolchains/arm920t-eabi.tgz)
          到http://www.arm9.net/download.asp下載Root_Qtopia,我用的是友善光盤里的root_qtopia-20100108.tar.gz(http://www.arm123.com.cn/linux/root_qtopia-20100108.tar.gz)
          下載tslib1.4,這個(gè)忘了在哪下載的了,網(wǎng)上有很多,有些不能用,大家自己找個(gè)能用的吧。
          將 qt-everywhere-opensource-src-4.6.2.tar.gz 壓縮包解壓為3份,分別編譯 PC ,嵌入式 x86 和 arm 三個(gè)版本。
          我在root目錄下建立tmp文件夾,將qt-everywhere-opensource-src-4.6.2.tar.gz直接解壓后復(fù)制2分,分別命名為pc、x86、arm。
          1. 編譯 PC 版:
          進(jìn)入pc目錄
          #./configure
          # gmake
          # gmake install
          安裝過程比較長(zhǎng),沒有碰到過錯(cuò)誤。
          2. 編譯嵌入式x86版:
          進(jìn)入x86目錄
          # ./configure -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
          # gmake
          # gmake install
          安裝過程比較長(zhǎng),沒有碰到過錯(cuò)誤。
          編譯安裝PC版中的 qvfb:
          進(jìn)入pc/tools/qvfb/目錄
          #make
          編譯完畢,將pc/bin目錄下的qvfb文件復(fù)制到/usr/local/Trolltech/QtEmbedded-4.6.2/bin目錄。
          3. 編譯嵌入式arm版(需要 arm-linux-gcc 的支持):
          使用友善自帶的ARM-Linux GCC 4.3.2編譯完了,程序移植到開發(fā)板上后,出現(xiàn)Segmentation Fault錯(cuò)誤,按原文,使用4.1.2正常。
          直接將arm920t-eabi.tgz解壓縮到根目錄,不可以像文章中說的那樣“我把它放在:/usr/local/arm/4.1.2/ ”,最起碼我放過去后出錯(cuò)了。
          把編譯器路徑加入系統(tǒng)環(huán)境變量,運(yùn)行命令:
          #gedit /root/.bashrc
          編輯/root/.bashrc文件,在最后一行加上 export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH

          編譯tslib對(duì)觸摸屏支持:
          下載,tslib1.4.tar.gz,解壓后:
          # ./configure --prefix=/usr/local/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
          # make
          # make install
          我下載的包解壓后沒有configure文件,需要運(yùn)行autogen.sh后才能生成。
          設(shè)置環(huán)境變量,以便編譯時(shí)找到相關(guān)的庫(kù):
          # export CPLUS_INCLUDE_PATH=/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++:/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/include/c++/arm-none-linux-gnueabi
          # export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH

          修改qt-everywhere-opensource-src-4.6.2/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts參數(shù)):
          QMAKE_CC                = arm-linux-gcc -lts
          QMAKE_CXX               = arm-linux-g++ -lts
          QMAKE_LINK              = arm-linux-g++ -lts
          QMAKE_LINK_SHLIB        = arm-linux-g++ -lts
          這一步必須有,不然肯定出錯(cuò)。
          配置:
          必須加上“-prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm ”參數(shù), 不然安裝后不在QtEmbedded-4.6.2-arm文件夾下,而是覆蓋了QtEmbedded-4.6.2。
          # ./configure \
          -prefix /usr/local/Trolltech/QtEmbedded-4.6.2-arm \
          -opensource \
          -confirm-license \
          -release -shared \
          -embedded arm \
          -xplatform qws/linux-arm-g++ \
          -depths 16,18,24 \
          -fast \
          -optimized-qmake \
          -pch \
          -qt-sql-sqlite \
          -qt-libjpeg \
          -qt-zlib \
          -qt-libpng \
          -qt-freetype \
          -little-endian -host-little-endian \
          -no-qt3support \
          -no-libtiff -no-libmng \
          -no-opengl \
          -no-mmx -no-sse -no-sse2 \
          -no-3dnow \
          -no-openssl \
          -no-webkit \
          -no-qvfb \
          -no-phonon \
          -no-nis \
          -no-opengl \
          -no-cups \
          -no-glib \
          -no-xcursor -no-xfixes -no-xrandr -no-xrender \
          -no-separate-debug-info \
          -nomake examples -nomake tools -nomake docs \
          -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib

          上面劃掉的藍(lán)色內(nèi)容,可以不要的,這樣編輯也不會(huì)出錯(cuò)(虛擬機(jī)搞壞了,不得已重裝,配置參數(shù)時(shí)忘了干上面的工作了,結(jié)果發(fā)現(xiàn)沒出錯(cuò))。

          關(guān)于配置參數(shù),參照一下這篇文章吧,可以用configure -embedded –help查看。

          http://www.cuteqt.com/blog/?p=582
          如果你放棄配置,則使用命令:# gmake confclean
          編譯:# gmake
          安裝:# gmake install
          安裝完成后,在 /usr/local/Trolltech 目錄中有三個(gè)文件夾:Qt-4.6.2、QtEmbedded-4.6.2、QtEmbedded-4.6.2-arm。
          4、移植
          我是通過NFS啟動(dòng)的系統(tǒng),具體操作可以參照友善的手冊(cè),在http://www.arm9.net/download.asp有下載,在第5.5.3節(jié)通過NFS啟動(dòng)系統(tǒng)。
          將Fedora12上  /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib 中的所有文件復(fù)制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib目錄中(對(duì)應(yīng)目錄復(fù)制,相當(dāng)于復(fù)制到了開發(fā)板對(duì)應(yīng)目錄中),其實(shí)需要的時(shí)候可以裁剪,看原文吧。
          將Fedora12上  /usr/local/tslib 中的庫(kù)復(fù)制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local中。即將/usr/local/tslib下的所有文件復(fù)制到/opt/FriendlyARM/mini2440/root_qtopia/usr/local文件夾下。
          如果運(yùn)行時(shí)還缺少其他的庫(kù),復(fù)制方法相同。也可以使用arm-angstrom-linux-gnueabi-readelf -a 程序名 | grep "Share",命令查看需要哪些共享庫(kù),一起復(fù)制過去。
          為支持觸摸屏,開機(jī)自動(dòng)設(shè)置環(huán)境變量,在2440的 /etc/profile中追加:
          export LD_LIBRARY_PATH=/usr/local/lib:$QTDIR/lib:$LD_LIBRARY_PATH                                                  
          export TSLIB_ROOT=/usr/local/lib    
          export TSLIB_TSDEVICE=/dev/input/event0
          export TSLIB_FBDEVICE=/dev/fb0 
          export TSLIB_PLUGINDIR=/usr/local/lib/ts
          export TSLIB_CONSOLEDEVICE=none
          export TSLIB_CONFFILE=/usr/local/etc/ts.conf
          export POINTERCAL_FILE=/etc/pointercal
          export TSLIB_CALIBFILE=/etc/pointercal
          export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
          取消/usr/local/etc/ts.conf中的第一個(gè)注釋:
          # module_raw input (去掉#,并且該行頂格)
          我編輯時(shí)沒有“#”
          啟動(dòng)Micro2440運(yùn)行 /usr/local/bin/ts_calibrate 校正觸摸屏。
          到此Qt4.6.2的移植暫告一段落,移植還沒有完,此時(shí)如果在開發(fā)板上運(yùn)行Qt4.6.2-arm編譯的程序,則會(huì)出現(xiàn)“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”錯(cuò)誤。
          今天晚了,明天繼續(xù)奉上……
          tslib-1.4.part1.rar (900 K) 下載次數(shù):1066 tslib-1.4.part2.rar (223 K) 下載次數(shù):936


           Fedora12下搭建Qt Creator的ARM開發(fā)環(huán)境 并 移植Qt4.6.2到Micro2440(二)

          管理提醒: 本帖被 kasim 執(zhí)行加亮操作(2010-04-11)
          Fedora12下搭建Qt Creator的ARM開發(fā)環(huán)境 并 移植Qt4.6.2到Micro2440(二)
          繼續(xù)……
          5、安裝Qt-creator-1.3.1
          把下載的qt-creator-linux-x86-opensource-1.3.1.bin文件拷到一個(gè)目錄(如前面的/root/tmp目錄),進(jìn)入目錄:
          設(shè)置qt-creator-linux-x86-opensource-1.3.1.bin文件為可執(zhí)行
          #chmod +x qt-creator-linux-x86-opensource-1.3.1.bin
          安裝:
          # ./ qt-creator-linux-x86-opensource-1.3.1.bin
          啟動(dòng)安裝界面,默認(rèn)一路Next即可。
          *如果我們下載的是Qt的SDK(qt-sdk-linux-x86-opensource-2010.02.bin),這里可以選擇安裝Qt的開發(fā)環(huán)境,這樣,在前面安裝pc版Qt那步就可以省了,關(guān)鍵是可以省出很多時(shí)間的。
          6、Qt-creator開發(fā)環(huán)境的配置
          啟動(dòng)Qt-creator。
          在Qt-creator菜單欄Tools—〉Options…打開Options窗口。
          在Options界面左側(cè),點(diǎn)擊Qt4—〉Qt Versions右側(cè)顯示Qt Versions設(shè)置界面。
          在Qt Versions界面中點(diǎn)擊那個(gè)藍(lán)色的大“”號(hào)圖標(biāo)
          在下方Version Name:文本框內(nèi)輸入Qt的版本名,可以隨便填,能區(qū)分各個(gè)版本即可(如pc版取Qt4.6.2-pc、x86版取QtE4.6.2-x86、arm版取QtE4.6.2-arm)。
          單擊Qmake Location:右側(cè)Browse…按鈕,在彈出的“Select QMake Executable”窗口中找到對(duì)應(yīng)版本的qmake程序(按照我們前面安轉(zhuǎn)的,pc版路徑:/usr/local/Trolltech/Qt-4.6.2/bin/qmake,x86版路徑:/usr/local/Trolltech/QtEmbedded-4.6.2/bin/qmake,arm版路徑:/usr/local/Trolltech/QtEmbedded-4.6.2-arm/bin/qmake),單擊打開,回到Qt Versions界面。
          回到Qt Versions界面,單擊Debugging Helper:右側(cè)Rebuild按鈕,等待片刻,看到Debugging Helper:后出現(xiàn)一個(gè)綠色的“”即可。
          同理完成其他版本的添加。
          添加完畢,單擊OK按鈕關(guān)閉Options窗口。
          到此,Qt-creator配置完畢(我暫時(shí)就配置了這些)。
          7、一個(gè)例子
          從usr/local/Trolltech/QtEmbedded-4.6.2/demos下復(fù)制books例程到root/tmp文件夾下。
          啟動(dòng)Qt-creator,F(xiàn)ile—〉Open File or Project…,打開root/tmp/books/books.pro。
          這里我們分兩部分,首先編譯x86下的,并運(yùn)行在qvfb下,再編譯arm下的,移到開發(fā)板下運(yùn)行。
          7.1、x86下的編譯與調(diào)試
          在Qt-creator界面左側(cè)點(diǎn)擊Projects圖標(biāo),打開工程設(shè)置界面。
          從上往下,
          在Edit Project Settings for Project books——〉Build Settings——〉Edit Build Configuration:?jiǎn)螕鬉dd,在下拉列表中選擇Using Qt Version “QtE4.6.2-x86”彈出對(duì)話框單擊Ok按鈕,在Edit Build Configuration:下會(huì)出現(xiàn)藍(lán)色的Make QtE4.6.3-x86 Release active.字符,單擊激活QtE4.6.3-x86 Release。
          在Run Settings——〉Edit run configuration:右側(cè)單擊Show Details按鈕,在打開的下拉列表中Arguments:文本框中添加參數(shù)“-qws”。
          設(shè)置完畢,點(diǎn)擊Edit圖標(biāo),回到編輯界面。
          編譯:在Build菜單下,先Clean Project “books”,然后Build Project “books”,在右下角Compile Output窗口能看到編譯信息(按我們上面這樣走來,到此編譯不會(huì)出問題的)。
          運(yùn)行:
          啟動(dòng)終端,# /usr/local/Trolltech/QtEmbedded-4.6.2/bin/qvfb -width 800 -height 480 &,啟動(dòng)Qvfb。
          回到Qt-creator,Build——〉Run,運(yùn)行程序。
          切換我們的Qvfb窗口中,是不是看到Books運(yùn)行的界面了。
          調(diào)試:Debug——〉Start Debugging——〉Start Debugging,即可啟動(dòng)調(diào)試(請(qǐng)保證books路徑中沒有中文名,即不要把books工程放在了某個(gè)含有中文字符的文件夾下,不然無(wú)法啟動(dòng)調(diào)試)。
          此時(shí)感覺如果前面編譯選項(xiàng)Edit Project Settings for Project books——〉Build Settings——〉Edit Build Configuration:選擇Debug項(xiàng),則調(diào)試啟動(dòng)速度比Release時(shí)的要快很多。
          7.2、arm編譯并移植
          編譯:在Projects設(shè)置界面下,選擇Using Qt Version “QtE4.6.2-arm”項(xiàng),余下參數(shù)不變,build。
          復(fù)制編譯好的文件(也許還有images文件夾)到2440的NFS文件系統(tǒng)的某個(gè)目錄下,我直接把books文件夾復(fù)制過去了(在Fedora12 文件系統(tǒng)下是/opt/FriendlyARM/mini2440/root_qtopia/home/plg文件夾下)。
          運(yùn)行及錯(cuò)誤處理:
          在minicom下面,ps一下,找到qpe進(jìn)程對(duì)應(yīng)的PID,比如1234,然后通過kill 1234殺死Qtopia。
          進(jìn)入books目錄,執(zhí)行./books –qws,此時(shí)就會(huì)出現(xiàn)前面講到的“relocation error: /usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtGui.so.4: symbol powf, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference”錯(cuò)誤。
          我的解決辦法是進(jìn)入主機(jī)/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib目錄下找到libstdc++.so.6鏈接的文件libstdc++.so.6.0.8(通過右鍵屬性——〉基本,可以看到鏈接的文件),復(fù)制并重命名為libstdc++.so.6到/opt/FriendlyARM/mini2440/root_qtopia/lib文件夾下,之前別忘了將該文件夾下的libstdc++.so.6移到其它地方或重命名,如libstdc++.so.6.old。
          *重命名其實(shí)是比較野蠻的方法,可以用ln命令的,參照下面這篇文章……
          http://hi.baidu.com/a263238386/blog/item/362f01ce7b11a10a93457eae.html
          然后再運(yùn)行./books –qws,看問題是不是解決了!
          這里有個(gè)新的問題還沒解決,就是在開發(fā)版上運(yùn)行時(shí)字非常小,留著以后處理吧。
          OK!至此,F(xiàn)edora12下搭建Qt Creator的ARM開發(fā)環(huán)境 并 移植Qt4.6.2到Micro2440算告一段落了,留下兩個(gè)問題:字體非常小的問題、開發(fā)板上的遠(yuǎn)程調(diào)試,留待下次解決。
          posted @ 2013-05-13 16:19 姚先進(jìn) 閱讀(480) | 評(píng)論 (0)編輯 收藏
           
              像風(fēng)一樣沐浴自由,等待木棉花開

          離別多時(shí),猛然看到他的文字,迎面而來的是清新和灑脫,放飛了自己,開闊了心境。從心里面為他高興,又隱隱的疼惜自己,因?yàn)橐粋€(gè)人還沒有放下。
          多傷感,多惆悵,多很多的是逃避。

          有時(shí)候突然豪言壯語(yǔ),突然壯志凌云,突然覺得一切都可能。但是有時(shí)又發(fā)現(xiàn)那些東西可有可無(wú),無(wú)非是名利,是物質(zhì)滿足,是填補(bǔ)欲望,
          沒有真正的追求
          posted @ 2013-05-10 10:02 姚先進(jìn) 閱讀(241) | 評(píng)論 (0)編輯 收藏
           
            package com.example.hoteltest;
              import java.io.ByteArrayOutputStream;  
          import java.io.InputStream;  
          import java.net.*;  
          import java.util.ArrayList;  
          import java.util.HashMap;  
          import java.util.List;  
          import java.util.Map;  
          import org.json.JSONArray;  
          import org.json.JSONObject;  
          import android.util.Log;  
                
              public class JSON {  
                
                    
                  /**
                   * 獲取"數(shù)組形式"的JSON數(shù)據(jù),
                   * 數(shù)據(jù)形式:[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]
                   * @param path  網(wǎng)頁(yè)路徑
                   * @return  返回List
                   * @throws Exception
                   */  
                  public static List<Map<String, String>> getJSONArray(String path) throws Exception {  
                      String json = null;  
                      List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
                      Map<String, String> map = null;  
                      URL url = new URL(path);  
                      HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對(duì)象,我們可以從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù).  
                      conn.setConnectTimeout(5 * 1000);   // 單位是毫秒,設(shè)置超時(shí)時(shí)間為5秒  
                      conn.setRequestMethod("GET");       // HttpURLConnection是通過HTTP協(xié)議請(qǐng)求path路徑的,所以需要設(shè)置請(qǐng)求方式,可以不設(shè)置,因?yàn)槟J(rèn)為GET  
                      if (conn.getResponseCode() == 200) {// 判斷請(qǐng)求碼是否是200碼,否則失敗  
                          InputStream is = conn.getInputStream(); // 獲取輸入流  
                          byte[] data = readStream(is);   // 把輸入流轉(zhuǎn)換成字符數(shù)組  
                          json = new String(data);        // 把字符數(shù)組轉(zhuǎn)換成字符串  
                            
                          //數(shù)據(jù)形式:[{"id":1,"name":"小豬","age":22},{"id":2,"name":"小貓","age":23}]  
                          JSONArray jsonArray = new JSONArray(json); //數(shù)據(jù)直接為一個(gè)數(shù)組形式,所以可以直接 用android提供的框架JSONArray讀取JSON數(shù)據(jù),轉(zhuǎn)換成Array  
                
                          for (int i = 0; i < jsonArray.length(); i++) {  
                              JSONObject item = jsonArray.getJSONObject(i); //每條記錄又由幾個(gè)Object對(duì)象組成  
                              int id = item.getInt("id");     // 獲取對(duì)象對(duì)應(yīng)的值  
                              String name = item.getString("name");  
                
                              map = new HashMap<String, String>(); // 存放到MAP里面  
                              map.put("id", id + "");  
                              map.put("name", name);  
                              list.add(map);  
                          }  
                      }  
                
                      // ***********測(cè)試數(shù)據(jù)******************  
                      for (Map<String, String> list2 : list) {  
                          String id = list2.get("id");  
                          String name = list2.get("name");  
                          Log.i("abc", "id:" + id + " | name:" + name);  
                      }  
                
                      return list;  
                  }  
                
                  /**
                   * 獲取"對(duì)象形式"的JSON數(shù)據(jù),
                   * 數(shù)據(jù)形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]}
                   * @param path  網(wǎng)頁(yè)路徑
                   * @return  返回List
                   * @throws Exception
                   */  
                  public static List<Map<String, String>> getJSONObject(String path) throws Exception {  
                      List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
                      Map<String, String> map = null;  
                      URL url = new URL(path);  
                      HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對(duì)象,我們可以從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù).  
                      conn.setConnectTimeout(5 * 1000);   // 單位是毫秒,設(shè)置超時(shí)時(shí)間為5秒  
                      conn.setRequestMethod("GET");       // HttpURLConnection是通過HTTP協(xié)議請(qǐng)求path路徑的,所以需要設(shè)置請(qǐng)求方式,可以不設(shè)置,因?yàn)槟J(rèn)為GET  
                      if (conn.getResponseCode() == 200) {// 判斷請(qǐng)求碼是否是200碼,否則失敗  
                          InputStream is = conn.getInputStream(); // 獲取輸入流  
                          byte[] data = readStream(is);   // 把輸入流轉(zhuǎn)換成字符數(shù)組  
                          String json = new String(data); // 把字符數(shù)組轉(zhuǎn)換成字符串  
                            
                            
                          //數(shù)據(jù)形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]}  
                          JSONObject jsonObject=new JSONObject(json);     //返回的數(shù)據(jù)形式是一個(gè)Object類型,所以可以直接轉(zhuǎn)換成一個(gè)Object  
                          int page=jsonObject.getInt("page");  
                          String type=jsonObject.getString("type");  
                          Log.i("abc", "type:" + type + " |page:" + page);   //測(cè)試數(shù)據(jù)  
                            
                          JSONArray jsonArray = jsonObject.getJSONArray("hotels");//里面有一個(gè)數(shù)組數(shù)據(jù),可以用getJSONArray獲取數(shù)組  
                          for (int i = 0; i < jsonArray.length(); i++) {  
                              
                              JSONObject item = jsonArray.getJSONObject(i); // 得到每個(gè)對(duì)象
                              
                              double distance=item.getDouble("distance");
                              String direction=item.getString("direction");
                              int star_rating=item.getInt("star_rating");
                              String name=item.getString("name");
                              double nightly_rate=item.getDouble("nightly_rate");
                              double promoted_nightly_rate=item.getDouble("promoted_nightly_rate");
                              double total_rate=item.getDouble("total_rate");
                              double longitude=item.getDouble("longitude");
                              String key=item.getString("key");
                              double promoted_total_rate=item.getDouble("promoted_total_rate");
                              String latitude=item.getString("latitude");
                              long master_id=item.getLong("master_id");
                              String thumbnail=item.getString("thumbnail");
                              String street_address=item.getString("street_address");
                              double review_score=item.getDouble("review_score");
                     
                              map = new HashMap<String, String>(); // 存放到MAP里面  
                              map.put("distance", distance + "");  
                              map.put("direction", direction + "");  
                              map.put("star_rating", star_rating + "");  
                              map.put("name", name + "");  
                              map.put("nightly_rate", nightly_rate + "");  
                              map.put("promoted_nightly_rate", promoted_nightly_rate + "");  
                              map.put("total_rate", total_rate + "");  
                              map.put("key", key + "");  
                              map.put("promoted_total_rate", promoted_total_rate + "");  
                              map.put("latitude", latitude + "");  
                              map.put("master_id", master_id + "");  
                              map.put("thumbnail", thumbnail + "");    
                              map.put("street_address", street_address + "");  
                              map.put("review_score", review_score + "");  
                            
                              
                              list.add(map);  
                          }  
                      }  
                
                      // ***********測(cè)試數(shù)據(jù)******************  
                        
                      for (Map<String, String> list2 : list) {  
                          String distance = list2.get("distance");  
                          String direction = list2.get("direction");  
                          String star_rating = list2.get("star_rating");  
                          String name = list2.get("name");  
                          String nightly_rate = list2.get("nightly_rate");  
                          String promoted_nightly_rate = list2.get("promoted_nightly_rate");  
                          String total_rate = list2.get("total_rate");  
                          String key = list2.get("key");  
                          String promoted_total_rate = list2.get("promoted_total_rate");  
                          String latitude = list2.get("latitude");  
                          String master_id = list2.get("master_id");  
                          String thumbnail = list2.get("thumbnail");  
                          String street_address = list2.get("street_address");  
                          String review_score = list2.get("review_score");  
                          System.out.println(distance);
                          System.out.println(direction);
                          System.out.println(star_rating);
                          System.out.println(name);
                          System.out.println(nightly_rate);
                          System.out.println(promoted_nightly_rate);
                          System.out.println(total_rate);
                          System.out.println(key);
                          System.out.println(promoted_total_rate);
                          System.out.println(latitude);
                          System.out.println(master_id);
                          System.out.println(thumbnail);
                          System.out.println(street_address);
                          System.out.println(review_score);
                      }  
                
                      return list;  
                  }  
                    
                    
                  /**
                   * 獲取類型復(fù)雜的JSON數(shù)據(jù)
                   *數(shù)據(jù)形式:
                      {"name":"小豬",
                       "age":23,
                       "content":{"questionsTotal":2,
                                  "questions": [ { "question": "what's your name?", "answer": "小豬"},{"question": "what's your age", "answer": "23"}]
                                 }
                      }
                   * @param path  網(wǎng)頁(yè)路徑
                   * @return  返回List
                   * @throws Exception
                   */  
                  public static List<Map<String, String>> getJSON(String path) throws Exception {  
                      List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
                      Map<String, String> map = null;  
                      URL url = new URL(path);  
                      HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對(duì)象,我們可以從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù).  
                      conn.setConnectTimeout(5 * 1000);   // 單位是毫秒,設(shè)置超時(shí)時(shí)間為5秒  
                      conn.setRequestMethod("GET");       // HttpURLConnection是通過HTTP協(xié)議請(qǐng)求path路徑的,所以需要設(shè)置請(qǐng)求方式,可以不設(shè)置,因?yàn)槟J(rèn)為GET  
                      if (conn.getResponseCode() == 200) {// 判斷請(qǐng)求碼是否是200碼,否則失敗  
                          InputStream is = conn.getInputStream(); // 獲取輸入流  
                          byte[] data = readStream(is);   // 把輸入流轉(zhuǎn)換成字符數(shù)組  
                          String json = new String(data); // 把字符數(shù)組轉(zhuǎn)換成字符串  
                            
                            
                          /*數(shù)據(jù)形式:
                              {"name":"小豬",
                               "age":23,
                               "content":{"questionsTotal":2,
                                          "questions": [ { "question": "what's your name?", "answer": "小豬"},{"question": "what's your age", "answer": "23"}]
                                         }
                              }
                          */    
                          JSONObject jsonObject=new JSONObject(json);     //返回的數(shù)據(jù)形式是一個(gè)Object類型,所以可以直接轉(zhuǎn)換成一個(gè)Object  
                          String name=jsonObject.getString("name");         
                          int age=jsonObject.getInt("age");  
                          Log.i("abc", "name:" + name + " | age:" + age); //測(cè)試數(shù)據(jù)  
                            
                          JSONObject contentObject=jsonObject.getJSONObject("content");       //獲取對(duì)象中的對(duì)象  
                          String questionsTotal=contentObject.getString("questionsTotal");    //獲取對(duì)象中的一個(gè)值  
                          Log.i("abc", "questionsTotal:" + questionsTotal);   //測(cè)試數(shù)據(jù)  
                            
                          JSONArray contentArray=contentObject.getJSONArray("questions");     //獲取對(duì)象中的數(shù)組  
                          for (int i = 0; i < contentArray.length(); i++) {  
                              JSONObject item = contentArray.getJSONObject(i); // 得到每個(gè)對(duì)象  
                              String question = item.getString("question");   // 獲取對(duì)象對(duì)應(yīng)的值  
                              String answer = item.getString("answer");  
                
                              map = new HashMap<String, String>(); // 存放到MAP里面  
                              map.put("question", question);  
                              map.put("answer", answer);  
                              list.add(map);  
                          }  
                      }  
                
                      // ***********測(cè)試數(shù)據(jù)******************  
                        
                      for (Map<String, String> list2 : list) {  
                          String question = list2.get("question");  
                          String answer = list2.get("answer");  
                          Log.i("abc", "question:" + question + " | answer:" + answer);  
                      }  
                
                      return list;  
                  }  
                    
                    
                    
                    
                  /**
                   * 把輸入流轉(zhuǎn)換成字符數(shù)組
                   * @param inputStream   輸入流
                   * @return  字符數(shù)組
                   * @throws Exception
                   */  
                  public static byte[] readStream(InputStream inputStream) throws Exception {  
                      ByteArrayOutputStream bout = new ByteArrayOutputStream();  
                      byte[] buffer = new byte[1024];  
                      int len = 0;  
                      while ((len = inputStream.read(buffer)) != -1) {  
                          bout.write(buffer, 0, len);  
                      }  
                      bout.close();  
                      inputStream.close();  
                
                      return bout.toByteArray();  
                  }  
                
              } 
          posted @ 2013-04-22 20:21 姚先進(jìn) 閱讀(287) | 評(píng)論 (0)編輯 收藏
           

          首先說一下Json數(shù)據(jù)的最基本的特點(diǎn),Json數(shù)據(jù)是一系列的鍵值對(duì)的集合,和XML數(shù)據(jù)來比,Json數(shù)據(jù)的體積更加小,傳輸效率高,易解析,不過可讀性不高;

                因?yàn)檫@次要從服務(wù)器端得到Json數(shù)據(jù),并且通過解析之后把解析后的數(shù)據(jù)顯示在Android客戶端中,首先部署服務(wù)器端代碼(直接使用Jsp/Servlet):

                 構(gòu)造的Json數(shù)據(jù)如下:

               [{"name":"張三","address":"北京","age":20},{"name":"李四","address":"上海","age":30},{"name":"王五","address":"深圳","age":35}]


          [一]服務(wù)器端(Person.java省略):

               ①:數(shù)據(jù)構(gòu)造JsonService.java

          1. <span style="font-size: 16px; ">public class JsonService {
          2.         public static List<Person> getListPerson() {
          3.                 List<Person> mLists = new ArrayList<Person>();
          4.                 mLists.add(new Person("張三", "北京", 20));
          5.                 mLists.add(new Person("李四", "上海", 30));
          6.                 mLists.add(new Person("王五", "深圳", 35));
          7.                 return mLists;
          8.         }</span>
          復(fù)制代碼
             ②:Servlet的代碼(包括構(gòu)造Json數(shù)據(jù),沒有使用Json數(shù)據(jù)轉(zhuǎn)換方法)JsonServlet.java
          1. <span style="font-size: 16px; ">public void doGet(HttpServletRequest request, HttpServletResponse response)
          2.                         throws ServletException, IOException {
          3.                 response.setContentType("text/html");
          4.                 response.setCharacterEncoding("UTF-8");
          5.                 PrintWriter out = response.getWriter();
          6.                 List<Person> persons = JsonService.getListPerson();
          7.                 StringBuffer sb = new StringBuffer();
          8.                 sb.append('[');
          9.                 for (Person person : persons) {
          10.                         sb.append('{').append("\"name\":").append("\""+person.getName()+"\"").append(
          11.                                         ",");
          12.                         sb.append("\"address\":").append("\""+person.getAddress()+"\"").append(",");
          13.                         sb.append("\"age\":").append(person.getAge());
          14.                         sb.append('}').append(",");
          15.                 }
          16.                 sb.deleteCharAt(sb.length() - 1);
          17.                 sb.append(']');
          18.                 out.write(new String(sb));
          19.                 out.flush();
          20.                 out.close();
          21.         }</span>
          復(fù)制代碼
          1. <span style="font-size: 16px; ">
          2. </span>
          復(fù)制代碼
            ③:部署到Tomact 瀏覽器輸入http://localhost/JsonWeb/JsonServlet直接訪問結(jié)果如下: 0_1330066556axYL.gif        至此服務(wù)器端代碼編碼完成,下面進(jìn)行客戶端代碼編寫;    (二)客戶端(Person類,和展示數(shù)據(jù)的布局文件因?yàn)楹?jiǎn)單省去)
                ①:獲取服務(wù)器端的Json數(shù)據(jù)并且解析的工具類JsonParse.java
            必要的需要導(dǎo)入的包省去  
          1. <span style="font-size:18px;">public class JsonParse {
          2.         /**
          3.          * 解析Json數(shù)據(jù)
          4.          *
          5.          * @param urlPath
          6.          * @return mlists
          7.          * @throws Exception
          8.          */
          9.         public static List<Person> getListPerson(String urlPath) throws Exception {
          10.                 List<Person> mlists = new ArrayList<Person>();
          11.                 byte[] data = readParse(urlPath);
          12.                 JSONArray array = new JSONArray(new String(data));
          13.                 for (int i = 0; i < array.length(); i++) {
          14.                         JSONObject item = array.getJSONObject(i);
          15.                         String name = item.getString("name");
          16.                         String address = item.getString("address");
          17.                         int age = item.getInt("age");
          18.                         mlists.add(new Person(name, address, age));
          19.                 }
          20.                 return mlists;
          21.         }
          22.         /**
          23.          * 從指定的url中獲取字節(jié)數(shù)組
          24.          *
          25.          * @param urlPath
          26.          * @return 字節(jié)數(shù)組
          27.          * @throws Exception
          28.          */
          29.         public static byte[] readParse(String urlPath) throws Exception {
          30.                 ByteArrayOutputStream outStream = new ByteArrayOutputStream();
          31.                 byte[] data = new byte[1024];
          32.                 int len = 0;
          33.                 URL url = new URL(urlPath);
          34.                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          35.                 InputStream inStream = conn.getInputStream();
          36.                 while ((len = inStream.read(data)) != -1) {
          37.                         outStream.write(data, 0, len);
          38.                 }
          39.                 inStream.close();
          40.                 return outStream.toByteArray();
          41.         }
          42. }</span>
          復(fù)制代碼
          ②:主Activity類
          1. <pre name="code" class="java">public class MainActivity extends Activity {
          2.         private Button mButton;
          3.         private ListView mListView;
          4.         //使用IP不能使用localhost或者127.0.0.1,因?yàn)閍ndroid模擬器默認(rèn)綁定這個(gè)IP,這里應(yīng)該訪問局域網(wǎng)IP
          5.         private static final String urlPath = "http://10.16.31.207/JsonWeb/JsonServlet";
          6.         private static final String TAG = "MainActivity";
          7.         private List<Person> persons;
          8.         @Override
          9.         public void onCreate(Bundle savedInstanceState) {
          10.                 super.onCreate(savedInstanceState);
          11.                 setContentView(R.layout.main);
          12.                 mButton = (Button) findViewById(R.id.button1);
          13.                 mListView = (ListView) findViewById(R.id.listView1);
          14.                 mButton.setOnClickListener(new MyOnClickListener());
          15.         }

          16.         private class MyOnClickListener implements OnClickListener {
          17.                 @Override
          18.                 public void onClick(View v) {
          19.                         try {
          20.                                 // 得到Json解析成功之后數(shù)據(jù)
          21.                                 persons = JsonParse.getListPerson(urlPath);
          22.                                 List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
          23.                                 for (int i = 0; i < persons.size(); i++) {
          24.                                         HashMap<String, Object> map = new HashMap<String, Object>();
          25.                                         map.put("name", persons.get(i).getName());
          26.                                         map.put("address", persons.get(i).getAddress());
          27.                                         map.put("age", persons.get(i).getAge());
          28.                                         data.add(map);
          29.                                 }
          30.                                 //初始化適配器,并且綁定數(shù)據(jù)
          31.                                 SimpleAdapter _Adapter = new SimpleAdapter(MainActivity.this,
          32.                                                 data, R.layout.listview_item, new String[] { "name",
          33.                                                                 "address", "age" }, new int[] { R.id.textView1,
          34.                                                                 R.id.textView2, R.id.textView3 });
          35.                                 mListView.setAdapter(_Adapter);
          36.                         } catch (Exception e) {
          37.                                 Toast.makeText(MainActivity.this, "解析失敗", 2000).show();
          38.                                 Log.i(TAG, e.toString());

          39.                         }
          40.                 }
          41.         }
          復(fù)制代碼
          至此服務(wù)器端和客戶端編碼介紹,運(yùn)行android應(yīng)用結(jié)果截圖:
          0_1330067381FcfP.gif
          Json數(shù)據(jù)解析服務(wù)器端加客戶端代碼.zip (75.08 KB, 下載次數(shù): 1309)



          1

          查看全部評(píng)分

          posted @ 2013-04-22 19:11 姚先進(jìn) 閱讀(349) | 評(píng)論 (0)編輯 收藏
           
               摘要: 、利用HttpUrlConnection 1 /** 2 * 從指定的URL中獲取數(shù)組 3 * @param urlPath 4 * @return 5 * @throws Exception 6 */ 7 public static String readParse(String urlPath) throws Excep...  閱讀全文
          posted @ 2013-04-22 19:10 姚先進(jìn) 閱讀(296) | 評(píng)論 (0)編輯 收藏
           



          例子1:android加載自己文件夾的圖片,使用R類

           

          main.xml文件

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              >
          <ImageView
               android:id="@+id/iv1"
               android:layout_width="fill_parent"
               android:layout_height="wrap_content"
               android:src="@drawable/longshuai"      <!-- longshuai.png為圖片的名稱,記在資源文件里頭,不用文件名后綴-->
             />
          </LinearLayout>

          注意:強(qiáng)調(diào)一下,資源文件的圖片命名規(guī)則比較嚴(yán)格,由[a-z]和數(shù)字和“_”組成,而且不能數(shù)字開頭,我就常犯傻,命名老是數(shù)字或者大寫字母開頭,這種錯(cuò)誤——囧。。

          我們要把longshuai.png導(dǎo)入到res中,最簡(jiǎn)單的方式就是直接找到這個(gè)文件夾,復(fù)制進(jìn)去

          之后右鍵更新,我們就可以在res中看到自己的圖片了

          android使用ImageView加載本地SdCard圖片和加載網(wǎng)絡(luò)圖片 - 夏天的風(fēng) - FreeSimpleHappy

           

          不用寫代碼。。直接用自動(dòng)生成的代碼。。

               public void onCreate(Bundle savedInstanceState)

              {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);

                }

          效果如下:

          android使用ImageView加載本地SdCard圖片和加載網(wǎng)絡(luò)圖片 - 夏天的風(fēng) - FreeSimpleHappy

           

           

          2、加載本地圖片(其實(shí)主要是SdCard中圖片)

          關(guān)于SdCard的使用,可以參見 http://longshuai2007.blog.163.com/blog/static/1420944142011611103950500/

           

          xml文件同上面的是一樣的,并不需要修改

              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                 
                  ImageView image1 = (ImageView) findViewById(R.id.iv1);  //獲得ImageView對(duì)象
                   /*為什么圖片一定要轉(zhuǎn)化為 Bitmap格式的!! */
                  Bitmap bitmap = getLoacalBitmap("/sdcard/tubiao.jpg"); //從本地取圖片(在cdcard中獲取)  //
                  image1 .setImageBitmap(bitmap); //設(shè)置Bitmap
                }

           

              /**
              * 加載本地圖片
              * @param url
              * @return
              */
              public static Bitmap getLoacalBitmap(String url) {
                   try {
                        FileInputStream fis = new FileInputStream(url);
                        return BitmapFactory.decodeStream(fis);  ///把流轉(zhuǎn)化為Bitmap圖片        

                     } catch (FileNotFoundException e) {
                        e.printStackTrace();
                        return null;
                   }
              }

           

          顯示效果如下:

          android使用ImageView加載本地SdCard圖片和加載網(wǎng)絡(luò)圖片 - 夏天的風(fēng) - FreeSimpleHappy
           
           
          3、獲取網(wǎng)絡(luò)上的圖片
          mian.xml文件和1中一樣,并不需要修改!
           
          代碼:
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                 
                  ImageView image1 = (ImageView) findViewById(R.id.iv1);
                  Bitmap bitmap =getHttpBitmap("
                                 //從網(wǎng)上取圖片
                  image1 .setImageBitmap(bitmap); //設(shè)置Bitmap
          }
           
              /**
              * 從服務(wù)器取圖片
              * @param url
              * @return
              */
              public static Bitmap getHttpBitmap(String url) {
                   URL myFileUrl = null;
                   Bitmap bitmap = null;
                   try {
                        myFileUrl = new URL(url);
                   } catch (MalformedURLException e) {
                        e.printStackTrace();
                   }
                   try {
                        HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
                        conn.setConnectTimeout(0);
                        conn.setDoInput(true);
                        conn.connect();
                        InputStream is = conn.getInputStream();
                        bitmap = BitmapFactory.decodeStream(is);
                        is.close();
                   } catch (IOException e) {
                        e.printStackTrace();
                   }
                   return bitmap;
              }
           
           
          注意:由于需要使用網(wǎng)絡(luò),所以 AndroidManfest.xml 文件需要添加使用網(wǎng)絡(luò)權(quán)限!!!
              <uses-permission android:name="android.permission.INTERNET" />
           
          這也是我為什么一直錯(cuò),而且一直找不到原因,它就是不顯示圖片,什么錯(cuò)誤都沒有,坑爹啊!!
           
          android使用ImageView加載本地SdCard圖片和加載網(wǎng)絡(luò)圖片 - 夏天的風(fēng) - FreeSimpleHappy
           
          posted @ 2013-04-21 16:08 姚先進(jìn) 閱讀(649) | 評(píng)論 (2)編輯 收藏
           
          ackage shenmixiaozhu;
          import java.sql.Date;
          public class TypeChange {
           
            public TypeChange() {
             }
             //change the string type to the int type
             public static   int stringToInt(String intstr)
             {
               Integer integer;
               integer = Integer.valueOf(intstr);
               return integer.intValue();
             }
             //change int type to the string type
             public static String intToString(int value)
             {
               Integer integer = new Integer(value);
               return integer.toString();
             }
             //change the string type to the float type
             public static   float stringToFloat(String floatstr)
             {
               Float floatee;
               floatee = Float.valueOf(floatstr);
               return floatee.floatValue();
             }
             //change the float type to the string type
             public static String floatToString(float value)
             {
               Float floatee = new Float(value);
               return floatee.toString();
             }
             //change the string type to the sqlDate type
             public static java.sql.Date stringToDate(String dateStr)
             {
               return   java.sql.Date.valueOf(dateStr);
             }
             //change the sqlDate type to the string type
             public static String dateToString(java.sql.Date datee)
             {
               return datee.toString();
             }

             public static void main(String[] args)
             {
               java.sql.Date day ;
               day = TypeChange.stringToDate("2003-11-3");
               String strday = TypeChange.dateToString(day);
               System.out.println(strday);
             }
          }
          posted @ 2013-04-10 16:31 姚先進(jìn) 閱讀(182) | 評(píng)論 (0)編輯 收藏
           

          android 完全退出應(yīng)用程序
          android android 退出應(yīng)用程序, 單例模式管理Activity
          引自:http://www.yoyong.com/archives/199
          android 退出應(yīng)用程序會(huì)調(diào)用android.os.Process.killProcess(android.os.Process.myPid())
          或是System.exit(0),這只是針對(duì)第一個(gè)Activity(也就是入口的Activity)時(shí)生效。如果有A,B,C
          三個(gè)Activity,而想在B 或C 中Activity 退出,調(diào)用上面的方法,往往會(huì)銷毀當(dāng)前的Activity 返回上
          一個(gè)Activity。當(dāng)然也可以逐個(gè)返回上一個(gè)Activity,直到跳轉(zhuǎn)到入口的Activity,最后退出應(yīng)用程
          序。但這樣比較麻煩,而且逐個(gè)返回的體驗(yàn)并不友好。
          網(wǎng)上比較流行的方法是定義棧,寫一個(gè)ExitApplication 類,利用單例模式管理Activity,在每個(gè)在
          Activity 的onCreate()方法中調(diào)用ExitApplication.getInstance().addActivity(this)方法,在退
          出時(shí)調(diào)用ExitApplication.getInstance().exit()方法,就可以完全退出應(yīng)用程序了。
          ExitApplication 類
          代碼如下:
          view plaincopy to clipboardprint?
          1 import java.util.LinkedList;
          2 import java.util.List;
          3
          4 import android.app.Activity;
          5 import android.app.Application;
          6
          7 public class ExitApplication extends Application {


          9 private List<Activity> activityList=new LinkedList<Activity>();

          10 private static ExitApplication instance;
          11
          12 private ExitApplication()
          13 {
          14 }
          15 //單例模式中獲取唯一的ExitApplication 實(shí)例
          16 public static ExitApplication getInstance()
          17 {
          18 if(null == instance)
          19 {
          20 instance = new ExitApplication();
          21 }
          22 return instance;
          23
          24 }
          25 //添加Activity 到容器中
          26 public void addActivity(Activity activity)
          27 {
          28 activityList.add(activity);
          29 }
          30 //遍歷所有Activity 并finish
          31
          32 public void exit()
          33 {
          34
          35 for(Activity activity:activityList)
          36 {
          37 activity.finish();
          38 }
          39
          40 System.exit(0);
          41
          42 }
          43 }
          下面的三個(gè)類IndexActivity, BActivity,CActivity 是簡(jiǎn)單的例子, 分別是
          IndexActivity–>BActivity–>CActivity 的跳轉(zhuǎn)順序。在每個(gè)Activity 類中onCreate()方法中調(diào)
          用ExitApplication.getInstance().addActivity(Activity activity)方法。在任何一個(gè)Activity 界面退
          出應(yīng)用程序時(shí),只要調(diào)用ExitApplication.getInstance().exit()方法,就可以在任何一個(gè)Activity
          中完全退出應(yīng)用程序。
          IndexActivity 類源代碼:
          view plaincopy to clipboardprint?
          44 import android.app.Activity;
          45 import android.content.Intent;
          46 import android.os.Bundle;
          47 import android.view.View;
          48 import android.view.View.OnClickListener;
          49 import android.widget.Button;
          50
          51 public class IndexActivity extends Activity {
          52 /** Called when the activity is first created. */
          53 @Override
          54 public void onCreate(Bundle savedInstanceState) {
          55 super.onCreate(savedInstanceState);
          56 setContentView(R.layout.main);
          57
          58 Button next=(Button)findViewById(R.id.next_to_b);
          59 next.setOnClickListener(nextClick);
          60
          61 Button exit=(Button)findViewById(R.id.exit_main);
          62 exit.setOnClickListener(exitClick);
          63 ExitApplication.getInstance().addActivity(this);
          64
          65 }
          66
          67 OnClickListener nextClick=new OnClickListener() {
          68
          69 @Override
          70 public void onClick(View v) {
          71 // TODO Auto-generated method stub
          72
          73 Intent intent=new Intent(IndexActivity.this,BActivity.class);
          74 startActivity(intent);
          75
          76 }
          77 };
          78
          79 OnClickListener exitClick=new OnClickListener() {
          80
          81 @Override
          82 public void onClick(View v) {
          83 // TODO Auto-generated method stub
          84 ExitApplication.getInstance().exit();
          85 }
          86 };
          87 }
          BActivity 類源代碼:
          view plaincopy to clipboardprint?
          88 import android.app.Activity;
          89 import android.content.Intent;
          90 import android.os.Bundle;
          91 import android.view.View;
          92 import android.view.View.OnClickListener;
          93 import android.widget.Button;
          94
          95 public class BActivity extends Activity {
          96
          97 @Override
          98 protected void onCreate(Bundle savedInstanceState) {
          99 // TODO Auto-generated method stub
          100 super.onCreate(savedInstanceState);
          101
          102 setContentView(R.layout.b);
          103 Button next_to_c=(Button)findViewById(R.id.next_to_c);
          104 next_to_c.setOnClickListener(next_to_cClick);
          105
          106 Button exit_b=(Button)findViewById(R.id.exit_b);
          107 exit_b.setOnClickListener(exitClick);
          108 ExitApplication.getInstance().addActivity(this);
          109
          110 }
          111
          112 OnClickListener next_to_cClick=new OnClickListener() {
          113
          114 @Override
          115 public void onClick(View v) {
          116 // TODO Auto-generated method stub
          117
          118 Intent intent=new Intent(BActivity.this,CActivity.class);
          119 startActivity(intent);
          120
          121 }
          122 };
          123
          124 OnClickListener exitClick=new OnClickListener() {
          125
          126 @Override
          127 public void onClick(View v) {
          128 // TODO Auto-generated method stub
          129 ExitApplication.getInstance().exit();
          130 }
          131 };
          132 }
          CActivity 類源代碼:
          view plaincopy to clipboardprint?
          133 import android.app.Activity;
          134 import android.os.Bundle;
          135 import android.view.View;
          136 import android.view.View.OnClickListener;
          137 import android.widget.Button;
          138
          139 public class CActivity extends Activity{
          140
          141 @Override
          142 protected void onCreate(Bundle savedInstanceState) {
          143 // TODO Auto-generated method stub
          144 super.onCreate(savedInstanceState);
          145
          146 setContentView(R.layout.c);
          147
          148 Button exit_c=(Button)findViewById(R.id.exit_c);
          149 exit_c.setOnClickListener(exitClick);
          150 ExitApplication.getInstance().addActivity(this);
          151
          152 }
          153
          154 OnClickListener exitClick=new OnClickListener() {
          155
          156 @Override
          157 public void onClick(View v) {
          158 // TODO Auto-generated method stub
          159 ExitApplication.getInstance().exit();
          160 //如果只是調(diào)用以下其中的一個(gè)方法,并不會(huì)完全退出應(yīng)用
          161 //android.os.Process.killProcess(android.os.Process.myPid());
          162 //System.exit(0);
          163 }
          164 };
          165
          166 }

          posted @ 2013-04-10 09:05 姚先進(jìn) 閱讀(198) | 評(píng)論 (0)編輯 收藏
           

          1、Listview簡(jiǎn)述

          A view that shows items in a vertically scrolling list. The items come from theListAdapter associated with this view.

          簡(jiǎn)單來說就是,創(chuàng)建Listview,然后給數(shù)值就行了。

          而這些數(shù)值來源有三種方式:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter


          第一種是最簡(jiǎn)單的一種Adapter,是字符串?dāng)?shù)值,只能在ListView顯示出文本信息。

          第二種是一種自定義的數(shù)據(jù)來源,要自定義布局方式,可以放置圖片,按鈕,文本之類的。

          第三種數(shù)據(jù)來源于數(shù)據(jù)庫(kù)。


          本文為第一種方式,ArrayAdapter,其他兩項(xiàng)的方法都差不多,主要是adapter不同。


          2、使用ListView步驟

          首先創(chuàng)建Listview組件,然后調(diào)用Listview.ArrayAdapter()方法,設(shè)置Adapter。


          通過調(diào)用setOnItemClickListener()接口方法,設(shè)置“點(diǎn)擊”listview某一項(xiàng)的監(jiān)聽事件。

          通過調(diào)用setOnItemLongClickListener()接口方法,設(shè)置“長(zhǎng)按”listview某一項(xiàng)的監(jiān)聽事件。


          需要說明的是,當(dāng)設(shè)置匿名內(nèi)部類new OnItemClickListener()時(shí),eclipse不會(huì)自動(dòng)載入復(fù)寫函數(shù),要點(diǎn)擊左邊的錯(cuò)誤提示,然后Add unimplemented methods,才能載入復(fù)寫函數(shù)onItemClick()。


          1. mylistview.setOnItemClickListener(new OnItemClickListener() {  
          2.   
          3.     @Override  
          4.     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {  
          5.         // TODO Auto-generated method stub  
          6.           
          7.     }  
          8. });  

          關(guān)于onItemClick方法,下面詳細(xì)說說。(以下是官方的說明,參數(shù)命名不同而已,類型都是一樣的。arg0=parent,arg1=view,arg2=position,arg3=id)

          public abstract void onItemClick(AdapterView<?> parent,View view, int position, long id)

          Callback method to be invoked when an item in this AdapterView has been clicked.

          Implementers can call getItemAtPosition(position) if they need to access the data associated with the selected item.

          //當(dāng)點(diǎn)擊listview某一項(xiàng)時(shí),這個(gè)回調(diào)方法就會(huì)被調(diào)用。

          Parameters
          parent The AdapterView where the click happened.
          view The view within the AdapterView that was clicked (this will be a view provided by the adapter)
          position The position of the view in the adapter.
          id The row id of the item that was clicked.


          主要說說最后三個(gè)參數(shù),

          view——————是你點(diǎn)擊的Listview的某一項(xiàng)的內(nèi)容,來源于adapter。如用((TextView)arg1).getText(),可以取出點(diǎn)擊的這一項(xiàng)的內(nèi)容,轉(zhuǎn)為string類型。

          position————是adapter的某一項(xiàng),如點(diǎn)擊了listview第2項(xiàng),而第2項(xiàng)對(duì)應(yīng)的是adapter的第2個(gè)數(shù)值,那此時(shí)position的值就為1了。

                                       如對(duì)應(yīng)adapter的第3個(gè)數(shù)值,那此時(shí)position的值就為2了。

          id———————id的值為點(diǎn)擊了Listview的哪一項(xiàng)對(duì)應(yīng)的數(shù)值,點(diǎn)擊了listview第2項(xiàng),那id就等于1。

          注:這些數(shù)值都是從0開始的。

          1. /*author:conowen 
          2.  * date:2012.2.26 
          3.  */  
          4. package com.conowen.listview;  
          5.   
          6. import android.app.Activity;  
          7. import android.os.Bundle;  
          8. import android.view.View;  
          9. import android.widget.AdapterView;  
          10. import android.widget.AdapterView.OnItemClickListener;  
          11. import android.widget.AdapterView.OnItemLongClickListener;  
          12. import android.widget.ArrayAdapter;  
          13. import android.widget.ListView;  
          14. import android.widget.TextView;  
          15. import android.widget.Toast;  
          16.   
          17. public class ListviewActivity extends Activity {  
          18.     /** Called when the activity is first created. */  
          19.     @Override  
          20.     public void onCreate(Bundle savedInstanceState) {  
          21.         super.onCreate(savedInstanceState);  
          22.         setContentView(R.layout.main);  
          23.         ListView lv = (ListView) findViewById(R.id.lv);  
          24.         String[] data = { "windows", "linux", "ios", "android", "wp7",  
          25.                 "Symbian" };// 定義adapter  
          26.         lv.setAdapter(new ArrayAdapter<String>(this,// 把a(bǔ)dapter綁定到listview里面  
          27.                 android.R.layout.simple_expandable_list_item_1, data));  
          28.         // 點(diǎn)擊事件  
          29.         lv.setOnItemClickListener(new OnItemClickListener() {  
          30.   
          31.             @Override  
          32.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
          33.                     long arg3) {  
          34.                 // TODO Auto-generated method stub  
          35.                 Toast.makeText(ListviewActivity.this, "你點(diǎn)擊的是第" + arg3 + "項(xiàng)",  
          36.                         Toast.LENGTH_SHORT).show();  
          37.                 // 取出所點(diǎn)擊的那一項(xiàng)的id  
          38.   
          39.             }  
          40.   
          41.         });  
          42.         // 長(zhǎng)按事件  
          43.         lv.setOnItemLongClickListener(new OnItemLongClickListener() {  
          44.   
          45.             @Override  
          46.             public boolean onItemLongClick(AdapterView<?> arg0, View arg1,  
          47.                     int arg2, long arg3) {  
          48.                 // TODO Auto-generated method stub  
          49.                 Toast.makeText(ListviewActivity.this,  
          50.                         ((TextView) arg1).getText(), Toast.LENGTH_LONG).show();  
          51.                 // 取出點(diǎn)擊listview某一項(xiàng)的內(nèi)容  
          52.                 return false;  
          53.             }  
          54.   
          55.         });  
          56.     }  
          57. }  

          posted @ 2013-04-09 21:49 姚先進(jìn) 閱讀(206) | 評(píng)論 (0)編輯 收藏
           
           for(String s:v)

           

          s是遍歷后賦值的變量,v是要遍歷的list。
          可以通過以下語(yǔ)句進(jìn)行測(cè)試:
          List<String> v=new ArrayList();
          v.add("one");
          v.add("two");
          for(String s:v){
          System.out.println(s);
          }
          注意s要跟前面的類型匹配。

          s表示的其實(shí)就是v中得任意一個(gè)元素,v可以是數(shù)組,也可以是集合,如list或set。這種語(yǔ)句叫做foreach語(yǔ)句。其實(shí)就是Iterator迭代器的簡(jiǎn)化,意思就是循環(huán)的從v中拿出一個(gè)元素s進(jìn)行操作
          posted @ 2013-04-09 19:54 姚先進(jìn) 閱讀(216) | 評(píng)論 (0)編輯 收藏
           


          2008-06-01 16:35:46|  分類: mysql |字號(hào) 訂閱

          1.response.setContentType("text/html;charset=gb2312");

          在做servlet的時(shí)候,在doGet中已經(jīng)設(shè)定了response.setContentType("text/html;charset=gb2312");

          pw.println("姓名");   
               pw.println("性別"); 
               pw.println("郵箱"); 
               pw.println("地址"); 
               pw.println("權(quán)限"); 

          這些漢字的可以正確顯示,但是從數(shù)據(jù)庫(kù)中查詢返回的漢字顯示為亂碼:

          姓名 性別 郵箱 地址 權(quán)限
          admin 0 admin@163.com ???????? 1
          user1 0 user1@163.com ???????? 5
          user2 0 user2@163.com ???????? 5
          user3 0 user3@163.com ?????à?? 3
          user4 0 user4@163.com ???????¨ 3
          user5 0 user5@163.com ???????¨ 5
          user6 0 user6@163.com ???????¨ 5

          最近幾天一直都在學(xué)JSP,我用的數(shù)據(jù)庫(kù)是Mysql。在連接數(shù)據(jù)庫(kù)的過程中,剛開始我只是簡(jiǎn)單的執(zhí)行了查詢命令,發(fā)現(xiàn)從數(shù)據(jù)庫(kù)取出的中文數(shù)據(jù)全部顯示成了亂碼,查了一些資料之后,我先用了下面的一個(gè)轉(zhuǎn)換函數(shù),值得高興的是,讀出的中文顯示正常:

               

               

               將從Mysql數(shù)據(jù)庫(kù)中得到的中文數(shù)據(jù),通過以下轉(zhuǎn)換函數(shù) String trans(String chi)進(jìn)行處理,即可正常顯示中文:

              

              String trans(String chi) {

                  String result = null;

                  byte temp[];

                  try {

                      temp = chi.getBytes("iso-8859-1");

                      result = new String(temp);

                  } catch(UnsupportedEncodingException e) {

                      System.out.println(e.toString());

                  }

                  return result;

          }

          但很快,我意識(shí)到這種方法只是治標(biāo)不治本,因?yàn)樵诓迦胫形臄?shù)據(jù)時(shí),又沒法在Mysql中正常顯示中文。而真正治本的方法是,將Mysql的編碼格式由默認(rèn)的latin1改成gb2312.

          改的步驟如下:

          1.      設(shè)置Mysql的編碼格式(注意是在創(chuàng)建數(shù)據(jù)庫(kù)之前就要設(shè)置)

          找到Mysql安裝目錄下的 myini文件,用記事本打開,找到以下兩句:

          [mysql]

          default-character-set=latin1

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

          [mysqld]

          # The TCP/IP Port the MySQL Server will listen on

          port=3306

          #Path to installation directory. All paths are usually resolved relative to this.

          basedir="C:/Program Files/MySQL/MySQL Server 5.0/"

          #Path to the database root

          datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"

          # The default character set that will be used when a new schema or table is

          # created and no character set is defined

          default-character-set=latin1

                            我們需要做的是將這兩處的默認(rèn)編碼格式由“latin1”改成“gb2312”。

                            改好之后,重啟Mysql

          2.      Mysql中開始創(chuàng)建數(shù)據(jù)庫(kù)

             用相關(guān)命令創(chuàng)建數(shù)據(jù)庫(kù),表等

          注意: 在創(chuàng)建表時(shí)要加上一句 TYPE=MyISAM, default character set gb2312;

              

             如以下示例:

              create table student

              -> (sno varchar(20),

              -> sname varchar(10),

              -> sex char(2),

              -> age numeric(2),

              -> dept varchar(20),

              -> primary key(sno))

              -> type=myisam,default character set gb2312;

              

          3.      Java文件或者JSP文件中連接數(shù)據(jù)庫(kù)

             Java代碼中:

          str = "com.mysql.jdbc.Driver";

          url="jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=gb2312";

          user = "root";

          password = "123456";

                      

          Class.forName(str).newInstance();

               conn = DriverManager.getConnection(url,user,password);

             JSP中需要注意的有:

          <%@page contentType="text/html"%>

          <%@page pageEncoding="gb2312" %>

          <%@ page import="java.sql.*,java.io.*" %>

          gb2312">

                       

                       OK,經(jīng)過上述一些設(shè)置之后,JAVAMysql將不會(huì)再出現(xiàn)中文顯示亂碼!

          posted @ 2013-04-09 16:34 姚先進(jìn) 閱讀(407) | 評(píng)論 (0)編輯 收藏
           

          在android中,有很多功能是不能放在onCreate或者onStart方法里面,因?yàn)檫@些功能相對(duì)

          來說費(fèi)時(shí)比較長(zhǎng),比如說下載一個(gè)文件,下載的過程比較長(zhǎng),但是如果寫在Activity中,

          那么這段時(shí)間Activity是完全沒有響應(yīng)的,那么就可以將這種處理大量數(shù)據(jù)或者耗時(shí)比較

          長(zhǎng)的東西放在一個(gè)單獨(dú)的線程中來完成,即Activity是一個(gè)線程,而下載的是在另外一個(gè)

          線程,那么這樣就可以使得下載跟Activity之間互不影響,從而得到了良好的用戶體驗(yàn)

           

          這里有兩種隊(duì)列,一種是線程隊(duì)列,就是用postXX方法或者removeCallbacks方法對(duì)線程對(duì)象的操作。另一種是消息隊(duì)列,用sendMessage和handleMessage方法來對(duì)消息對(duì)象進(jìn)行處理

           



           

          handler采用的是一個(gè)消息隊(duì)列的方式,每一個(gè)handler都有一個(gè)與之關(guān)聯(lián)的消息隊(duì)列,而且是先進(jìn)先出的方式執(zhí)行,即:每次加入一個(gè)handler,然后拿出來,對(duì)其進(jìn)行處理,然后再拿出另一個(gè),再進(jìn)行處理

           

          例子一:這個(gè)例子僅僅是對(duì)線程對(duì)象進(jìn)行操作的測(cè)試

          Java代碼  收藏代碼
          1. package org.hualang.handler;  
          2.   
          3. import android.app.Activity;  
          4. import android.os.Bundle;  
          5. import android.os.Handler;  
          6. import android.view.View;  
          7. import android.widget.Button;  
          8.   
          9. public class HandlerTest extends Activity {  
          10.       
          11.     private Button mybutton1;  
          12.     private Button mybutton2;  
          13.     @Override  
          14.     public void onCreate(Bundle savedInstanceState) {  
          15.         super.onCreate(savedInstanceState);  
          16.         setContentView(R.layout.main);  
          17.           
          18.         mybutton1 = (Button)findViewById(R.id.mybutton1);  
          19.         mybutton2 = (Button)findViewById(R.id.mybutton2);  
          20.           
          21.         mybutton1.setOnClickListener(new Button.OnClickListener()  
          22.         {  
          23.   
          24.             @Override  
          25.             public void onClick(View arg0) {  
          26.                 /** 
          27.                  * 調(diào)用Handler的post方法,將要執(zhí)行的線程對(duì)象添加到 
          28.                  * 線程隊(duì)列中 
          29.                  */  
          30.                 handler.post(updateThread);  
          31.             }  
          32.               
          33.         });  
          34.         mybutton2.setOnClickListener(new Button.OnClickListener()  
          35.         {  
          36.   
          37.             @Override  
          38.             public void onClick(View v) {  
          39.                 // TODO Auto-generated method stub  
          40.                 handler.removeCallbacks(updateThread);  
          41.             }  
          42.               
          43.         });    
          44.           
          45.     }  
          46.     //創(chuàng)建Handler對(duì)象  
          47.     Handler handler = new Handler();  
          48.     /** 
          49.      * 將要執(zhí)行的操作卸載寫入線程對(duì)象的run()方法當(dāng)中 
          50.      */  
          51.     Runnable updateThread = new Runnable()  
          52.     {  
          53.         public void run()  
          54.         {  
          55.             System.out.println("更新線程");  
          56.             //在run方法內(nèi)部,執(zhí)行postXX的方法,每隔3秒會(huì)執(zhí)行一次  
          57.             handler.postDelayed(updateThread, 3000);  
          58.         }  
          59.     };  
          60. }  

           

          運(yùn)行結(jié)果如下:



           程序解釋:首先創(chuàng)建一個(gè)Handler對(duì)象,然后創(chuàng)建一個(gè)繼承自Runnable接口的線程

          程序首先點(diǎn)擊按鈕“開始”,于是會(huì)馬上執(zhí)行post方法,將執(zhí)行的線程對(duì)象添加到線程隊(duì)列中,這時(shí)會(huì)馬上執(zhí)行

          Java代碼  收藏代碼
          1. public void run()  
          2.         {  
          3.             System.out.println("更新線程");  
          4.             //在run方法內(nèi)部,執(zhí)行postXX的方法,每隔3秒會(huì)執(zhí)行一次  
          5.             handler.postDelayed(updateThread, 3000);  
          6.         }  

           

          然后,執(zhí)行postDelayed方法,由于里面設(shè)置的間隔時(shí)間,所以每3秒會(huì)調(diào)價(jià)一個(gè)handler對(duì)象到線程隊(duì)列中,并且一直執(zhí)行,直到點(diǎn)擊“結(jié)束”按鈕,調(diào)用removeCallbacks方法將其從線程隊(duì)列中移除

           

           

          例子2:下面的例子將簡(jiǎn)單的對(duì)線程對(duì)象和消息對(duì)象進(jìn)行處理

          Java代碼  收藏代碼
          1. package org.hualang.handlertest2;  
          2.   
          3. import android.app.Activity;  
          4. import android.os.Bundle;  
          5. import android.os.Handler;  
          6. import android.os.Message;  
          7. import android.view.View;  
          8. import android.widget.Button;  
          9. import android.widget.ProgressBar;  
          10.   
          11. public class HandlerTest2 extends Activity {  
          12.     private ProgressBar bar = null;  
          13.     private Button start = null;  
          14.     @Override  
          15.     public void onCreate(Bundle savedInstanceState) {  
          16.         super.onCreate(savedInstanceState);  
          17.         setContentView(R.layout.main);  
          18.         bar = (ProgressBar)findViewById(R.id.progress1);  
          19.         start = (Button)findViewById(R.id.start);  
          20.         start.setOnClickListener(new Button.OnClickListener()  
          21.         {  
          22.   
          23.             @Override  
          24.             public void onClick(View v) {  
          25.                 bar.setVisibility(View.VISIBLE);  
          26.                 handler.post(handlerThread);  
          27.             }  
          28.               
          29.         });  
          30.     }  
          31.     /** 
          32.      * 使用匿名內(nèi)部類來復(fù)寫hanlder當(dāng)中的hanldrMessage方法 
          33.      * 這里的msg對(duì)象就是從線程部分發(fā)送過來的對(duì)象 
          34.      */  
          35.     Handler handler = new Handler()  
          36.     {  
          37.         public void handleMessage(Message msg)  
          38.         {  
          39.             bar.setProgress(msg.arg1);  
          40.             handler.post(handlerThread);  
          41.         }  
          42.     };  
          43.     //線程類,該類使用的是匿名內(nèi)部類的方式進(jìn)行聲明  
          44.     Runnable handlerThread = new Runnable()  
          45.     {  
          46.         int i = 0;  
          47.         public void run()  
          48.         {  
          49.             System.out.println("開始線程");  
          50.             i = i + 10;  
          51.             /** 
          52.              * 得到一個(gè)消息對(duì)象,Message類是由android操作系統(tǒng)提供 
          53.              * obtainMessage方法用來得到Message對(duì)象 
          54.              */  
          55.             Message msg = handler.obtainMessage();  
          56.             /** 
          57.              * Message中有個(gè)成員變量,即msg獨(dú)享的arg1參數(shù) 
          58.              * 將其值設(shè)置為i。用arg1或arg2這兩個(gè)成員變量傳遞 
          59.              * 消息,優(yōu)點(diǎn)是系統(tǒng)性能消耗較少 
          60.              */  
          61.             msg.arg1 = i;  
          62.             try {  
          63.                 //當(dāng)前線程休眠1秒  
          64.                 Thread.sleep(5000);  
          65.             } catch (InterruptedException e) {  
          66.                 // TODO Auto-generated catch block  
          67.                 e.printStackTrace();  
          68.             }  
          69.             /** 
          70.              * 發(fā)送一個(gè)消息,用sendMessage是將msg加入到消息 
          71.              * 隊(duì)列中。而post是將線程加入到線程隊(duì)列中 
          72.              */  
          73.             handler.sendMessage(msg);  
          74.             if( i == 100)  
          75.             {  
          76.                 /** 
          77.                  * 如果i=100的時(shí)候,就將線程對(duì)象 
          78.                  * 從handler當(dāng)中移除 
          79.                  */  
          80.                 handler.removeCallbacks(handlerThread);  
          81.                 bar.setVisibility(View.GONE);  
          82.             }  
          83.         }  
          84.     };  
          85. }  

            

          main.xml

          Xml代碼  收藏代碼
          1. <?xml version="1.0" encoding="utf-8"?>  
          2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
          3.     android:orientation="vertical"  
          4.     android:layout_width="fill_parent"  
          5.     android:layout_height="fill_parent"  
          6.     >  
          7. <ProgressBar  
          8.     android:id="@+id/progress1"  
          9.     android:layout_width="fill_parent"  
          10.     android:layout_height="wrap_content"  
          11.     android:visibility="gone"  
          12.     style="?android:attr/progressBarStyleHorizontal"  
          13. />  
          14. <Button  
          15.     android:id="@+id/start"  
          16.     android:layout_width="wrap_content"  
          17.     android:layout_height="wrap_content"  
          18.     android:gravity="center"  
          19.     android:text="點(diǎn)擊我"  
          20. />  
          21. </LinearLayout>  

           

          運(yùn)行結(jié)果:



           

           

          程序說明:

          1、當(dāng)點(diǎn)擊按鈕后,會(huì)執(zhí)行按鈕的onClick方法中的

          Java代碼  收藏代碼
          1. bar.setVisibility(View.VISIBLE);  
          2. handler.post(handlerThread);  

           將進(jìn)度條顯示出來,并且將線程對(duì)象加入到線程隊(duì)列中

          2、線程對(duì)象對(duì)先打印出一個(gè)“開始線程”,然后i的值增加10,然后從系統(tǒng)中獲取一個(gè)Message對(duì)象

          3、將i賦給Message對(duì)象的參數(shù)arg1

          4、當(dāng)前線程休眠5秒,然后通過sendMessage方法發(fā)送一個(gè)Message對(duì)象發(fā)送到消息隊(duì)列中

          5、然后再執(zhí)行,通過handleMessage方法設(shè)置進(jìn)度條的值,并且將其加入到進(jìn)程隊(duì)列中

          Java代碼  收藏代碼
          1. Handler handler = new Handler()  
          2.     {  
          3.         public void handleMessage(Message msg)  
          4.         {  
          5.             bar.setProgress(msg.arg1);  
          6.             handler.post(handlerThread);  
          7.         }  
          8.     };  

           6、循環(huán)執(zhí)行,直到i=100,進(jìn)度條隱藏,并將線程對(duì)象從線程隊(duì)列中取出






          對(duì)于Handler來說,它和與它調(diào)用它的Activity是出于同一線程的,上一篇并沒有調(diào)用線程
          的start方法,而是直接執(zhí)行的run方法。而啟動(dòng)一個(gè)線程是調(diào)用的start方法

          上一篇博客里的對(duì)Handler的調(diào)用時(shí)通過Runnable接口來實(shí)現(xiàn)的,并且是通過run()方法來啟動(dòng)那個(gè)線程的,而且是Activity和 Handler是兩個(gè)線程獨(dú)立運(yùn)行的,互補(bǔ)干擾,但是實(shí)際情況確實(shí),Activity所在的線程和Handler的線程是同一個(gè)線程,下面進(jìn)行一下實(shí)驗(yàn)

           

          Java代碼  收藏代碼
          1. package org.hualang.handlertest3;  
          2.   
          3. import android.app.Activity;  
          4. import android.os.Bundle;  
          5. import android.os.Handler;  
          6. import android.util.Log;  
          7.   
          8. public class HandlerTest3 extends Activity {  
          9.     private Handler handler = new Handler();  
          10.     private String TAG = "System.out";  
          11.     @Override  
          12.     public void onCreate(Bundle savedInstanceState) {  
          13.         super.onCreate(savedInstanceState);  
          14.         handler.post(r);  
          15.         setContentView(R.layout.main);  
          16.         //Thread t = new Thread(r);  
          17.         //t.start();  
          18.           
          19.         Log.d(TAG,"Activity id:"+Thread.currentThread().getId());  
          20.         Log.d(TAG,"Activity name:"+Thread.currentThread().getName());  
          21.           
          22.     }  
          23.     Runnable r = new Runnable()  
          24.     {  
          25.         public void run()  
          26.         {  
          27.             Log.d(TAG,"Handler id:"+Thread.currentThread().getId());  
          28.             Log.d(TAG,"Handler name:"+Thread.currentThread().getName());  
          29.             try {  
          30.                 Thread.sleep(5000);  
          31.             } catch (InterruptedException e) {  
          32.                 // TODO Auto-generated catch block  
          33.                 e.printStackTrace();  
          34.             }  
          35.         }  
          36.     };  
          37. }  

           

          運(yùn)行結(jié)果:

          證明是同一個(gè)線程的兩個(gè)依據(jù):

          ①Activity的id或name和Handler的id或name是同樣的

          ②我設(shè)置了

           handler.post(r);
           setContentView(R.layout.main);

          也就是,如果執(zhí)行后馬上顯示文本信息,那么可以證明它們不在同一個(gè)線程,但是實(shí)際情況是要先執(zhí)行了handler后5秒,才顯示文本信息,說明它們?cè)谕痪€程



           

           

          如果將代碼改為

          Java代碼  收藏代碼
          1. //handler.post(r);  
          2. setContentView(R.layout.main);  
          3. Thread t = new Thread(r);  
          4. t.start();  

           再次執(zhí)行,運(yùn)行結(jié)果如下,通過start啟動(dòng)線程,它們不在同一個(gè)線程中

           

           

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

          Looper即循環(huán)的從隊(duì)列當(dāng)中取得消息的功能,如果在線程中使用Looper
          那么,就會(huì)循環(huán)的從線程隊(duì)列當(dāng)中取得消息并處理,如果隊(duì)列當(dāng)中沒有消息的話
          ,線程就進(jìn)入了休眠狀態(tài)

          Looper很少自己創(chuàng)建,在Android中給出了HandlerThread類,并且具有循環(huán)取得并處理消息的功能

           

          下面來實(shí)現(xiàn)這種Activity和Handler分別在兩個(gè)線程中執(zhí)行,實(shí)現(xiàn)真正的異步處理

          Java代碼  收藏代碼
          1. package org.hualang.handlertest;  
          2.   
          3. import android.app.Activity;  
          4. import android.os.Bundle;  
          5. import android.os.Handler;  
          6. import android.os.HandlerThread;  
          7. import android.os.Looper;  
          8. import android.os.Message;  
          9. import android.util.Log;  
          10.   
          11. public class HandlerTest4 extends Activity {  
          12.     /** Called when the activity is first created. */  
          13.     @Override  
          14.     public void onCreate(Bundle savedInstanceState) {  
          15.         super.onCreate(savedInstanceState);  
          16.         setContentView(R.layout.main);  
          17.         Log.d("System.out","Activity所在線程的id:"+Thread.currentThread().getId());  
          18.         /** 
          19.          * 生成一個(gè)HandlerThread對(duì)象,實(shí)現(xiàn)了使用Looper來處理消息隊(duì)列的功能 
          20.          * 這個(gè)類由Android應(yīng)用程序框架提供 
          21.          */  
          22.         HandlerThread handlerThread = new HandlerThread("handlerThread");  
          23.         handlerThread.start();  
          24.         MyHandler handler = new MyHandler(handlerThread.getLooper());  
          25.         Message msg = handler.obtainMessage();  
          26.         /** 
          27.          * 將Message對(duì)象發(fā)送到目標(biāo)對(duì)象 
          28.          * 所謂的目標(biāo)對(duì)象,就是生成該msg對(duì)象的handler對(duì)象 
          29.          */  
          30.         msg.sendToTarget();  
          31.     }  
          32.     class MyHandler extends Handler  
          33.     {  
          34.         public MyHandler()  
          35.         {     
          36.         }  
          37.         public MyHandler(Looper looper)  
          38.         {  
          39.             super(looper);  
          40.         }  
          41.         public void handleMessage(Message msg)  
          42.         {  
          43.             Log.d("System.out", "handler所在線程的id:"+Thread.currentThread().getId());  
          44.         }  
          45.     }  
          46. }  

           

          運(yùn)行結(jié)果:



           

          可以看到,Activity和Handler是在兩個(gè)不同的線程中執(zhí)行的,這樣就是實(shí)現(xiàn)了真正的異步處理

          1、首先創(chuàng)建一個(gè)HandlerThread對(duì)象,這個(gè)HandlerThread類實(shí)現(xiàn)了循環(huán)的取得消息并處理

          2、用start方法啟動(dòng)一個(gè)新線程

          3、創(chuàng)建MyHandler類,里面?zhèn)鬟f的參數(shù)即Looper方法所獲得的可以循環(huán)在隊(duì)列中取得的消息

          4、MyHandler類調(diào)用的是帶參數(shù)Looper的構(gòu)造方法,并且實(shí)現(xiàn)了handlerMessage方法

          5、獲取一個(gè)Message對(duì)象

          6、將這個(gè)對(duì)象發(fā)送到生成該msg對(duì)象的handler對(duì)象,從而執(zhí)行了handleMessage方法

           

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

          最后,將說一下Message里傳送的數(shù)據(jù)的使用,這里的msg對(duì)象可以使用arg1,arg2或者obj

          arg1 and arg2 are lower-cost alternatives to using setData() if you only need to store a few integer values. 也就是相對(duì)于setData()方法,如果你僅僅保存一些簡(jiǎn)單的整形數(shù)的話,arg1,arg2對(duì)資源的要求較低,而setData()方法一般用于傳遞 大量數(shù)據(jù)的時(shí)候會(huì)用到

           

          如果是msg.obj,那么可以這樣用

          msg.obj = "Welcome to china";

          然后在handleMessage()方法中用

          String str = (String)msg.obj;來獲得傳遞的值

           

          如果使用getData()方法的話,需要用到Bundle對(duì)象來傳遞,下面用個(gè)例子來說明

          Java代碼  收藏代碼
          1. Bundle b = new Bundle();  
          2. b.putInt("age", 22);  
          3. b.putString("name", "loulijun");  
          4. msg.setData(b);  
          5. msg.sendToTarget();  

           

          上面的代碼用來設(shè)置要傳遞的數(shù)據(jù)

          下面的代碼用來獲取Bundle傳遞過來的數(shù)據(jù)并且用Toast來顯示

          Java代碼  收藏代碼
          1. Bundle b = msg.getData();  
          2.             int age = b.getInt("age");  
          3.             String name = b.getString("name");  
          4.             Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG);  
          5.             toast.show();  

           

          package org.hualang.handlertest;

          import android.app.Activity;
          import android.os.Bundle;
          import android.os.Handler;
          import android.os.HandlerThread;
          import android.os.Looper;
          import android.os.Message;
          import android.util.Log;
          import android.widget.Toast;

          public class HandlerTest4 extends Activity {
              /** Called when the activity is first created. */
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
                  Log.d("System.out","Activity所在線程的id:"+Thread.currentThread().getId());
                  /**
                   * 生成一個(gè)HandlerThread對(duì)象,實(shí)現(xiàn)了使用Looper來處理消息隊(duì)列的功能
                   * 這個(gè)類由Android應(yīng)用程序框架提供
                   */
                  HandlerThread handlerThread = new HandlerThread("handlerThread");
                  /**
                   * 使用HandlerThread的getLooper()方法之前,必須先調(diào)用該類的start()方法,否則是個(gè)null,會(huì)報(bào)錯(cuò)
                   */
                  handlerThread.start();
                  MyHandler handler = new MyHandler(handlerThread.getLooper());
                  Message msg = handler.obtainMessage();
                  /**
                   * 將Message對(duì)象發(fā)送到目標(biāo)對(duì)象
                   * 所謂的目標(biāo)對(duì)象,就是生成該msg對(duì)象的handler對(duì)象
                   */
                  //msg.obj = "Hello world";
                  Bundle b = new Bundle();
                  b.putInt("age", 22);
                  b.putString("name", "loulijun");
                  msg.setData(b);
                  msg.sendToTarget();
              }
              class MyHandler extends Handler
              {
              public MyHandler()
              {
              }
              public MyHandler(Looper looper)
              {
              super(looper);
              }
              public void handleMessage(Message msg)
              {
              //String str = (String)msg.obj
              Bundle b = msg.getData();
              int age = b.getInt("age");
              String name = b.getString("name");
              Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG);
              toast.show();
              Log.d("System.out", "handler所在線程的id:"+Thread.currentThread().getId());
              }
              }
          }

           運(yùn)行結(jié)果:



           

           


          posted @ 2013-04-09 09:36 姚先進(jìn) 閱讀(267) | 評(píng)論 (0)編輯 收藏
           

          創(chuàng)建HttpServlet的步驟

          0人收藏此文章, 我要收藏 發(fā)表于3年前(2009-05-31 15:58) , 已有955次閱讀 ,共0個(gè)評(píng)論

          創(chuàng)建用戶自己的HttpServlet類。通常涉及下列4個(gè)步驟

          1. 擴(kuò)展HttpServlet抽象類
          2. 覆蓋HttpServlet的部分方法,例如覆蓋doGet()和doPost()方法
          3. 獲取HTTP請(qǐng)求信息。例如通過HttpServletRequest對(duì)象來檢索HTML表單所提交的數(shù)據(jù)或URL上的查詢字符串。無(wú)論是 HTML表單數(shù)據(jù)還是URL上的查詢字符串,在HttpServletRequest對(duì)象中都以參數(shù)名/參數(shù)值的形式存放,可以通過以下方法檢索參數(shù)信 息:
          •  getParameterNames():  返回一個(gè)Enumeration對(duì)象。它包含了所有的參數(shù)名信息
          •  getParameter(String name): 返回參數(shù)名name對(duì)應(yīng)的參數(shù)值
          •  getParamaterValues(): 返回一個(gè)Enumeration對(duì)象,它包含了所有的參數(shù)值信息

             4.生成HTTP響應(yīng)結(jié)果。通過HttpServletResponse對(duì)象可以生成響應(yīng)結(jié)果。HttpServletResponse對(duì)象有一個(gè) getWriter()方法,該方法返回一個(gè)PrintWriter對(duì)象。使用PrintWriter的print()或println()方法可以向客 戶端發(fā)送字符串?dāng)?shù)據(jù)流。

           例子: 提供一個(gè)Servlet樣例(HelloServlet.java)

          package com.myServlet

            import  javax.servlet.*;
            import  javax.servlet.http.*;
            import java.io.*;

            public class HelloServlet extends HttpServlet     // 第一步:擴(kuò)展HttpServlet抽象類
           {

            // 第二步: 覆蓋doGet()方法
             public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException ,ServletException{

           //  第三步: 獲取HTTP請(qǐng)求中的參數(shù)信息

             String clientName=request.getParameter("clientName");

             if(clientName!=null)

              clientName=new String(clientName.getBytes("ISO-8859-1"),"GB2312");

          else

           clientName="你好"

           // 第四步

           PrintWriter out;
           String title="HelloServlet";
           String heading1="This is output from HelloServlet by doGet:";
            response.setContentType("text/html;charset=GB2312");

           out=response.getWriter();

          out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>);

           out.print("</HEAD><BODY>")

          out.print(heading1);

          out.println("<h1><P>"+clientName+":你好</h1>"+);

          out.print("</BODY></HTML>");

          out.close();

               }

           }

          上述HelloServlet類擴(kuò)展HttpServlet抽象類,覆蓋了doGet方法。在重寫的doGet方法中,通過 getParameter方法讀取HTTP請(qǐng)求中的一個(gè)參數(shù)ClientName。在上述代碼中,為了解決漢化問題,做了必要的轉(zhuǎn)碼工作。客戶提交的查詢 數(shù)據(jù)采用默認(rèn)的ISO-8859-1編碼,應(yīng)該把它轉(zhuǎn)換為中文編碼GB2312:

            // 字符編碼轉(zhuǎn)換

             clientName=new String(clientName.getBytes(“ISO-8859-1”),"GB2312");

          // 設(shè)置輸出響應(yīng)數(shù)據(jù)的字符編碼

           response.setContentType("text/html;charset=GB2312");

          HellowServlet.class 的存放位置為:

           <CATALINA_HOME>/webapps/helloapp/WEB-INF/classes/mypack/HelloServlet.class

          在Web.xml中位HelloServlet類加上如下<servlet>和<servlet-mapping>元素:

           <servlet>

             <servlet-name>HelloServlet</servlet-name>
            <servlet-class>mypackCounterServlet</servlet-class>

          </servlet>

          <servlet-mapping>HelloServlet</servlet-mapping>

          <url-pattern>/hello</url-pattern>

          </servlet-mapping>

          然后通過如下URL訪問HelloServlet:

          posted @ 2013-03-14 20:40 姚先進(jìn) 閱讀(280) | 評(píng)論 (0)編輯 收藏
           

          有些網(wǎng)友不知道怎么才能運(yùn)行自己的JSP文件,我在這里簡(jiǎn)單介紹一下,給大家提供一點(diǎn)參考:
          1. 下載并安裝tomcat。下載地址:http://jakarta.apache.org/tomcat
          2. 編寫自己的JSP網(wǎng)頁(yè)和Java對(duì)象。
          3. 配置自己的Web應(yīng)用。配置方法:
             在TOMCAT_HOME/conf/server.xml文件中加入一行:
             <Content path="/appName" docBase="webapps/appName" debug="0" reloadable="true"/>
             其中,TOMCAT_HOME是tomcat的主目錄,appName是你的Web應(yīng)用的名稱。
          4. 將你的jsp文件、html文件、image文件拷貝到TOMCAT_HOME/webapps/appName目錄下。
          5. 編譯你的java文件。
          6. 將編譯好的class文件拷貝到TOMCAT_HOME/webapps/WEB-INF/classes目錄下。也可將class文件打包成jar文件放到TOMCAT_HOME/webapps/WEB-INF/lib目錄下。
          7. ALL IS OK! 你可以在你的瀏覽器上看到你的成果了:
             http://localhost:8080/appName/youjsp.jsp
             其中,appName是你配的Web應(yīng)用名稱,youjsp.jsp是你編寫的jsp文件名。

          posted @ 2013-03-14 19:46 姚先進(jìn) 閱讀(229) | 評(píng)論 (0)編輯 收藏
           
          1.輸入密碼:******
          2.ues mysql;使用Mysql
          3.show databases;顯示數(shù)據(jù)庫(kù)
          4.use register;使用數(shù)據(jù)庫(kù)名為register
          5.show tables;顯示register數(shù)據(jù)庫(kù)中的表
          6.describe user;對(duì)表user進(jìn)行操作:

          insert into user(username,password) values("xiaoyan","123456");插入數(shù)據(jù)
          insert into user(username,password) values("ff","123456");插入數(shù)據(jù)
          delete from user where username="xiaoyan";刪除數(shù)據(jù)
          update user set username="xiaoyan" where username="ff";更新數(shù)據(jù)
          select * from user;查詢數(shù)據(jù)

          7.quit;推出
          1、顯示當(dāng)前數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù)庫(kù)列表:
          mysql> SHOW DATABASES;
          注意:mysql庫(kù)里面有MYSQL的系統(tǒng)信息,我們改密碼和新增用戶,實(shí)際上就是用這個(gè)庫(kù)進(jìn)行操作。
          2、顯示數(shù)據(jù)庫(kù)中的數(shù)據(jù)表:
          mysql> USE 庫(kù)名;
          mysql> SHOW TABLES;
          3、顯示數(shù)據(jù)表的結(jié)構(gòu):
          mysql> DESCRIBE 表名;
          4、建立數(shù)據(jù)庫(kù):
          mysql> CREATE DATABASE 庫(kù)名;
          5、建立數(shù)據(jù)表:
          mysql> USE 庫(kù)名;
          mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
          6、刪除數(shù)據(jù)庫(kù):
          mysql> DROP DATABASE 庫(kù)名;
          7、刪除數(shù)據(jù)表:
          mysql> DROP TABLE 表名;
          8、將表中記錄清空:
          mysql> DELETE FROM 表名;
          9、顯示表中的記錄:
          mysql> SELECT * FROM 表名;
          10、往表中插入記錄:
          mysql> INSERT INTO 表名 VALUES (”hyq”,”M”);
          11、更新表中數(shù)據(jù):
          mysql-> UPDATE 表名 SET 字段名 1=’a',字段名2=’b’ WHERE 字段名3=’c';
          12、用文本方式將數(shù)據(jù)裝入數(shù)據(jù)表中:
          mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;
          13、導(dǎo)入.sql文件命令:
          mysql> USE 數(shù)據(jù)庫(kù)名;
          mysql> SOURCE d:/mysql.sql;
          14、命令行修改root密碼:
          mysql> UPDATE mysql.user SET password=PASSWORD(’新密碼’) WHERE User=’root’;
          mysql> FLUSH PRIVILEGES;
          15、顯示use的數(shù)據(jù)庫(kù)名:
          mysql> SELECT DATABASE();
          16、顯示當(dāng)前的user:
          mysql> SELECT USER();

          一、啟動(dòng)與退出

          1、進(jìn)入MySQL:?jiǎn)?dòng)MySQL Command Line Client(MySQL的DOS界面),直接輸入安裝時(shí)的密碼即可。此時(shí)的提示符是:mysql&gt;

          2、退出MySQL:quitexit


          二、庫(kù)操作

          1、創(chuàng)建數(shù)據(jù)庫(kù)

          命令:create database

          例如:建立一個(gè)名為xhkdb的數(shù)據(jù)庫(kù)

          mysql> create database xhkdb;


          2、顯示所有的數(shù)據(jù)庫(kù)

          命令:show databases (注意:最后有個(gè)s)

          mysql> show databases;


          3、刪除數(shù)據(jù)庫(kù)

          命令:drop database

          例如:刪除名為 xhkdb的數(shù)據(jù)庫(kù)

          mysql> drop database xhkdb;


          4、連接數(shù)據(jù)庫(kù)

          命令: use

          例如:如果xhkdb數(shù)據(jù)庫(kù)存在,嘗試存取它:

          mysql> use xhkdb;

          屏幕提示:Database changed


          5、當(dāng)前選擇(連接)的數(shù)據(jù)庫(kù)

          mysql> select database();


          6、當(dāng)前數(shù)據(jù)庫(kù)包含的表信息:

          mysql> show tables; (注意:最后有個(gè)s)


          三、表操作,操作之前應(yīng)連接某個(gè)數(shù)據(jù)庫(kù)

          1、建表

          命令:create table ( [,.. ]);

          mysql> CREATE TABLE `testa` (
              ->   `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
              ->   `name` varchar(20) DEFAULT NULL ,
              ->   PRIMARY KEY (`id`)
              -> ) ENGINE=MyISAM AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;


          2、獲取表結(jié)構(gòu)

          命令: desc 表名,或者show columns from 表名

          mysql> DESCRIBE MyClass

          mysql> desc MyClass;

          mysql> show columns from MyClass;


          3、刪除表

          命令:drop table

          例如:刪除表名為 MyClass 的表

          mysql> drop table MyClass;


          4、插入數(shù)據(jù)

          命令:insert into [( [,.. ])] values ( 值1 )[, ( 值n )]


          5、查詢表中的數(shù)據(jù)

          1)、查詢所有行

          mysql> select * from MyClass;


          2)、查詢前幾行數(shù)據(jù)

          mysql> select * from MyClass order by id limit 0,2;


          6、刪除表中數(shù)據(jù)

          命令:delete from 表名 where 表達(dá)式

          例如:刪除表 MyClass中編號(hào)為1 的記錄

          mysql> delete from MyClass where id=1;


          7、修改表中數(shù)據(jù):update 表名 set 字段=新值,… where 條件

          mysql> update MyClass set name=”Mary” where id=1;


          8、在表中增加字段:

          命令:alter table 表名 add字段 類型其他;

          例如:在表MyClass中添加了一個(gè)字段passtest,類型為int(4),默認(rèn)值為0

          mysql> alter table MyClass add passtest int(4) default ”0”


          9、更改表名:

          命令:rename table 原表名 to 新表名;

          例如:在表MyClass名字更改為YouClass

          mysql> rename table MyClass to YouClass;
          posted @ 2013-03-13 12:46 姚先進(jìn) 閱讀(2330) | 評(píng)論 (0)編輯 收藏
           
          主站蜘蛛池模板: 铅山县| 子洲县| 日喀则市| 疏勒县| 固阳县| 安新县| 公安县| 冀州市| 光山县| 普格县| 芷江| 阿拉善右旗| 宁海县| 三亚市| 措美县| 榆林市| 罗江县| 临湘市| 保定市| 富锦市| 安福县| 通化县| 定边县| 浦北县| 来安县| 柯坪县| 彰化市| 石屏县| 大厂| 福州市| 红桥区| 凤庆县| 兴隆县| 灵川县| 临西县| 洪泽县| 高密市| 巴南区| 宜兰县| 军事| 偏关县|