posts - 78, comments - 34, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2010年1月26日

                 我們的課程即將結(jié)束,有一種想立即進入公司工作的沖動,也有一種對這種整日在學(xué)校學(xué)習(xí)生活的眷戀。

                

                 培訓(xùn)學(xué)校都是騙子,這是在網(wǎng)上見得多的傳言。在我想找一家培訓(xùn)機構(gòu)提升自己的技術(shù)時,現(xiàn)實和這些話語讓我有些的警覺。為了找一家好的培訓(xùn)機構(gòu),我使用了兩個月的業(yè)余時間不停的在網(wǎng)上轉(zhuǎn)悠,不停的對比各培訓(xùn)機構(gòu)的課程,對比視頻,對比網(wǎng)上的評論...。因為我已經(jīng)有近三年的桌面相關(guān)開發(fā)經(jīng)驗,我需要的課程內(nèi)容是提高技術(shù)。最終找到了感覺上適合我的傳智播客!(價錢也比較合理)

           

                 我是2009115日班的,來到北京我不大喜歡學(xué)校推介的住宿環(huán)境,幸好我提前兩天來到這里。第二天便與幾個同學(xué)在外面找了個租處——唐家?guī)X, 這里的環(huán)境還算不錯,來到之后才知道唐家?guī)X已經(jīng)是全國知名的地境(螞族)。這里吃飯的地方比較多,價格還算合理,多嘗試了幾家飯店,選擇了我們比較喜歡的長吃(6-10元)。這里也有早餐,我一般都在飯店里吃(3元左右),特殊情況我才會在馬路邊上擺的攤子買點早餐。

           

                 上了幾天的課程,我已深覺到我的選擇是正確的。來之前,家人和朋友還擔(dān)心學(xué)校的可信度,現(xiàn)在他們是放心了。授課內(nèi)容和方式正如傳智播客所倡導(dǎo)的——深度,這是他們的文化,這是正確的道路。

           

                 傳智播客提倡學(xué)生們寫學(xué)習(xí)日志,按要求完成后還有獎金,這是一個非常好的激勵學(xué)習(xí)方式,當(dāng)然也這是一個非常好的推廣學(xué)校的方式。這一點也非常吸引我,所以在我來之前就做了寫學(xué)習(xí)日志的決定。因為我知道我不想終生做為一個技術(shù)人員,即使做為一個技術(shù)人員做到一定的時候?qū)懶〇|西是必須的。可能會寫技術(shù)文章、項目文檔...。其次,我想將學(xué)習(xí)的每一項技術(shù)詳細認真的總結(jié),深入他們的原理。這些促使做了寫日志的決定。

           

                 但來到學(xué)校學(xué)習(xí)了幾天才發(fā)現(xiàn),要詳細認真的總結(jié)所學(xué)習(xí)的內(nèi)容那是不可能的。課后的每天晚上我都堅持寫學(xué)習(xí)日志,忙的時候?qū)懙搅璩?span lang="EN-US" xml:lang="EN-US">2:00(偶爾)。如果我能詳細認真的總結(jié)出每天的學(xué)習(xí)內(nèi)容,那我已經(jīng)可以出三四本書籍了。

           

                 至于寫學(xué)習(xí)日志這一點,要適力而為。如果想寫好學(xué)習(xí)日志,就要投入時間和精力,這樣就減少了動手練習(xí)的時間,對于新人來說這是致命的。我一般都是使用休息的時間來動手。所以,寫學(xué)習(xí)日志自己要打量好了,要寫到什么程度、要做多少練習(xí)。

           

                 在來傳智之前,也有看到網(wǎng)上罵傳智的貼子。這帖子無論是來自真實的學(xué)員、還是來自某些競爭對手。強大而美好的東西自然能證實自己。一個再好的人,怎么會得到所有的人認可!在學(xué)校里學(xué)習(xí)的都是好學(xué)生嗎?都是努力學(xué)習(xí)的學(xué)生嗎?肯定不是,似乎在哪里都能看到這一部分人,當(dāng)然我以前也不那么喜歡學(xué)習(xí)。既然遠遠來到這里學(xué)習(xí),也想找一份好工作,那就努力學(xué)習(xí)吧!

           

                 在近期課程將要結(jié)束時,有到學(xué)校來招聘的公司。這些信息是即時在學(xué)校的網(wǎng)站上發(fā)布。

          有的同學(xué)已經(jīng)與公司簽訂了合同。但來直接來學(xué)校招聘的公司一般給的工資都不會太高,也有給的還算理想的,主要看個人能力。我想回大連工作,沒有參加他們的面試。課程結(jié)束后我就回大連,雖然老師們不建議我回去...

           

                 我要感謝傳智播客那些認真、負責(zé)、可愛的老師,張孝祥、方力勛、馮威、佟剛、湯陽光、徐培成、毛偉、黎活明,他們讓我大豐收。感謝他們的殷勤付出,祝他們身體健康,工作愉快!(話外,上老張和老黎的課要注意下課時及時打水和去衛(wèi)生間,這兩人太尿性了。)

           

                 現(xiàn)在WEB開發(fā)、桌面開發(fā)對我來說已經(jīng)沒多大神秘了,但需要我學(xué)習(xí)的內(nèi)容仍然很多很多!    

           

                 我時而為自己的命運慶幸,我的道路讓我深感到了他的正確!

           

          posted @ 2010-03-16 21:27 長城 閱讀(3020) | 評論 (6)編輯 收藏

              剩下5天的內(nèi)容是ERP進銷存項目和Linux,這幾天我將為今后的工作做準(zhǔn)備,所以可能不再學(xué)習(xí)總結(jié)了!

          posted @ 2010-03-11 21:11 長城 閱讀(1544) | 評論 (0)編輯 收藏

                 今日繼續(xù)我們的Axis學(xué)習(xí),我只進行一下簡單的總結(jié)。有機會再補上吧!

           

                 昨天我們學(xué)習(xí)了,使用WebService進行運程調(diào)用,傳遞基本類型數(shù)據(jù)和類實體數(shù)據(jù)。在傳遞基本數(shù)據(jù)類型時,我們不需要進行任何操作。但在傳遞類實體類型數(shù)據(jù)時,我們需要在服務(wù)器端和客戶端進行序列化和反序列化注冊。那還有哪些數(shù)據(jù)傳遞是我們需要注意的?

           

                 基本數(shù)據(jù)類型數(shù)組和集合、類類型數(shù)組和集合、遠程異常。在傳遞基本類型數(shù)組或集合時,我們不需要添加任何聲明。但在傳遞類類型數(shù)組或集合時,需要添加與傳遞類實例進行相同的注冊。遠程異常應(yīng)該如何傳遞?

           

                 遠程異常,需要通過fault元素注冊一個 遠程異常。

           

                 上面我們對基本數(shù)據(jù)類型和類類型的簡單傳輸有了基本的認識,但是復(fù)合類型應(yīng)該如何傳遞呢?類套類,這樣下去,難道我們需要手動添加注冊信息嗎?當(dāng)然不需要,Axis為我們提供了相應(yīng)的工具,通過WSDL生成客戶端和服務(wù)器端Java類,通過Java類(接口)生成WSDL文檔,在此我就不詳細總結(jié)了。

           

                 除了Axis,老徐又給我們介紹了xfire,它也是WebService的一種實現(xiàn)工具。在此也不做總結(jié)了。

           

                 有位網(wǎng)友跟我說還有一種WebService——xcf,是目前最流行的,我并未對此進行埋閱。但我想說的是,以后可能還會有其他流行的WebService實現(xiàn),但無論出什么樣的新東西,它的核心思想都是一樣的。這也是我來傳智學(xué)習(xí)的一大原因,如果只知道一種工具如何使用,而不知道它的道理,確實不高明。如果掌握了它的道理,那就是以不變應(yīng)萬變了!

           

          posted @ 2010-03-10 21:42 長城 閱讀(1547) | 評論 (0)編輯 收藏

               摘要:        WebService課程由徐培成老師主講,依然發(fā)揚傳智播客的特點——深入理論和實踐。今天老徐講的原理的專業(yè)術(shù)語比較多,但我只做WebService的應(yīng)用總結(jié)。如果你的Java和JavaWeb基礎(chǔ)好些,我想你看到WebService的應(yīng)用,自然就能想到它的實現(xiàn)原理。      &nbs...  閱讀全文

          posted @ 2010-03-08 22:40 長城 閱讀(3253) | 評論 (1)編輯 收藏

               摘要: 一、Android中的通知          一般手機上邊都有一個狀態(tài)條,顯示電池電量、信號強度、未接來電、短信...。Android的屏幕上方也具有狀態(tài)條。這里所說的通知,就是在這個狀態(tài)條上顯示通知。          發(fā)送通知的步驟如下: &n...  閱讀全文

          posted @ 2010-03-07 12:41 長城 閱讀(2286) | 評論 (0)編輯 收藏

               摘要:          今日課程內(nèi)容較多,我們的課上到晚7:20。   一、創(chuàng)建新的Activity        在進行桌面開發(fā)時,我們可以通過一個窗口上的控件事件打開另一個新的窗口。在WEB應(yīng)用開發(fā)時,我們也可以通過一個連接打開一個新的頁面。通過...  閱讀全文

          posted @ 2010-03-07 10:42 長城 閱讀(6147) | 評論 (0)編輯 收藏

               摘要:        我們編寫的是Andorid的HTTP多線程斷點下載應(yīng)用程序。因為之間我們學(xué)習(xí)的學(xué)習(xí)積累,直接使用單線程下載HTTP文件對我們來說是一件非常簡單的事。那么,多線程斷點下載的難點在哪里?1.多線程下載,2.支持?jǐn)帱c。          多線程下載: &...  閱讀全文

          posted @ 2010-03-04 14:35 長城 閱讀(5428) | 評論 (1)編輯 收藏

               摘要:        昨天我們只對Android接收網(wǎng)絡(luò)數(shù)據(jù)進行了簡單介紹,今天我們完成了Android數(shù)據(jù)存儲網(wǎng)絡(luò)部分的所有內(nèi)容。在此我將對這非常重要的內(nèi)容進行總結(jié)。          本篇日志是對Android與WEB應(yīng)用服務(wù)之間進行數(shù)據(jù)交互的總結(jié),下篇日志是一個經(jīng)典...  閱讀全文

          posted @ 2010-03-04 11:34 長城 閱讀(6202) | 評論 (0)編輯 收藏

          既然是3G開發(fā),網(wǎng)絡(luò)重要性自然不必多說!Android的網(wǎng)絡(luò)存儲使用HTTP協(xié)議,我們編寫的Android網(wǎng)絡(luò)應(yīng)用就相當(dāng)于一個瀏覽器。由于Android的應(yīng)用是使用Java來開發(fā)的,所以網(wǎng)絡(luò)應(yīng)用使用的也是J2SE的包。

           

                 Android如何與服務(wù)器交互數(shù)據(jù)?我們可以建立一個WEB應(yīng)用,這對我們來說是一件十分容易的事。在WEB應(yīng)用的相關(guān)請求處理中接收Andorid提交的數(shù)據(jù)、返回XML數(shù)據(jù)或JSON數(shù)據(jù)。Android發(fā)送相應(yīng)的請求并接收服務(wù)相應(yīng)的數(shù)據(jù)。這就是AndroidWEB應(yīng)用的數(shù)據(jù)交互。

           

                 Android發(fā)送請求和獲取數(shù)據(jù)如下:

          String path = "http://www.android.com/images/opensourceproject.gif";

          URL url = new URL(path);

          HttpURLConnection conn = (HttpURLConnection)url.openConnection();

          conn.setConnectTimeout(6 * 1000);

          InputStream inStream = conn.getInputStream();

           

                 既然獲得了InputStream,那么對數(shù)據(jù)進行操作就比較容易了。

           

                 通過上面的代碼,可見Android的網(wǎng)絡(luò)應(yīng)用是如此容易!

           

                 這只是個開始,明天繼續(xù)學(xué)習(xí)網(wǎng)絡(luò)部分!

           

          posted @ 2010-03-02 22:53 長城 閱讀(1498) | 評論 (0)編輯 收藏

               摘要:        早上我們簡要的對SQLite進行回顧,然后將SQLite的事務(wù)管理和SQLiteDataBase提供的Insert、Update、Delete、Query方法進行了簡單的講解。          今日的重點內(nèi)容是ContentProvider(內(nèi)容提...  閱讀全文

          posted @ 2010-03-02 22:12 長城 閱讀(4490) | 評論 (4)編輯 收藏

               摘要: 前兩篇日志我已經(jīng)總結(jié)了本地數(shù)據(jù)存儲的前兩種:文件和配置項。還剩下最后一種數(shù)據(jù)庫存儲——SQLite。   一、SQLite簡介   在Android平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數(shù)字)、TEXT(字符串文本)和BLOB(二進制對象)數(shù)據(jù)類型,雖然它支持的類型雖然只有五種,但實際上sqli...  閱讀全文

          posted @ 2010-03-01 22:58 長城 閱讀(5808) | 評論 (5)編輯 收藏

               摘要:        在此之前的學(xué)習(xí)內(nèi)容是數(shù)據(jù)存儲之一文件存儲。在本地存儲中常用的有,文件、配置文件、數(shù)據(jù)庫。前面的學(xué)習(xí)主要是針對本地文件的。我認為可以把SharedPreferences看做是配置文件,雖然它也是采用XML格式存儲的。          比如我們使用的桌...  閱讀全文

          posted @ 2010-03-01 15:01 長城 閱讀(2440) | 評論 (0)編輯 收藏

               摘要:        今日繼續(xù)學(xué)習(xí)Android中使用Pull的XML解析技術(shù)實現(xiàn)對XML文件的解析和創(chuàng)建。由于明天休息,時間比較充裕,所以我也將昨天未總結(jié)的SAX解析技術(shù)在此做個總結(jié)。   一、SAX解析技術(shù)        Sax使用的是事件驅(qū)動的流式解析技術(shù)。事件驅(qū)...  閱讀全文

          posted @ 2010-03-01 12:01 長城 閱讀(2950) | 評論 (0)編輯 收藏

               摘要:        今日重點內(nèi)容是Adnroid的數(shù)據(jù)存儲和訪問。Android的數(shù)據(jù)存儲有五種:文件 SharedPreferences、SQLite數(shù)據(jù)庫、內(nèi)容提供者(Content provider)、網(wǎng)絡(luò)。今天老黎講解Android的單元測試、文件存儲和訪問以及解析XML文件。   一、Android的單元測試 &nb...  閱讀全文

          posted @ 2010-02-27 21:31 長城 閱讀(4787) | 評論 (4)編輯 收藏

           一、創(chuàng)建 Android工程

          Project name:SendMessage

          BuildTarget:Android2.1

          Application name:發(fā)送短信

          Package name:com.changcheng.Activity

          Create Activity:SendMessage

          Min SDK Version:7


          二、編輯工程

          1.編輯strings.xml文件內(nèi)容為:

          <?xml version="1.0" encoding="utf-8"?>

          <resources>

          <string name="hello">請輸入手機號碼:</string>

          <string name="app_name">發(fā)送短信</string>

          <string name="content">請輸入信息內(nèi)容:</string>

          <string name="send">發(fā)送</string>

          </resources>


          2.編輯main.xml文件內(nèi)容為:

          <?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">

          <!-- 請輸入手機號碼標(biāo)簽 -->

          <TextView android:layout_width="fill_parent"

          android:layout_height="wrap_content" android:text="@string/hello" />

          <!-- 手機號碼編輯框 -->

          <EditText android:layout_width="fill_parent"

          android:layout_height="wrap_content" android:id="@+id/mobile" />

          <!-- 請輸入信息內(nèi)容標(biāo)簽 -->

          <TextView android:layout_width="fill_parent"

          android:layout_height="wrap_content" android:text="@string/content" />

          <!-- 信息內(nèi)容編輯框 -->

          <EditText android:layout_width="fill_parent"

          android:layout_height="wrap_content" android:minLines="3"

          android:id="@+id/message" />

          <!-- 發(fā)送按鈕 -->

          <Button android:layout_width="wrap_content"

          android:layout_height="wrap_content" android:text="@string/send"

          android:id="@+id/send"/>

          </LinearLayout>

          注意,我們在電話號碼輸入框和撥打電話按鈕中添加了android:id屬性。如電話號碼輸入框的android:id=”@+id/mobile”@代碼R.java+id代碼添加id靜態(tài)內(nèi)部類,mobile代表向id類中添加一個常量成員。ADT將自動為我們生成常量值。

          android:minLines設(shè)置信息內(nèi)容編輯框的最小行數(shù)。


          3.編輯Call.java內(nèi)容:

          package com.changcheng.activity;


          import java.util.List;

          import android.app.Activity;

          import android.os.Bundle;

          import android.telephony.SmsManager;

          import android.view.View;

          import android.view.View.OnClickListener;

          import android.widget.Button;

          import android.widget.EditText;


          public class SendMessage extends Activity {

          /** Called when the activity is first created. */

          @Override

          public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.main);

          // 根據(jù)ID獲取按鈕

          Button button = (Button) this.findViewById(R.id.send);

          // 注冊按鈕被單擊事件

          button.setOnClickListener(new OnClickListener() {


          @Override

          public void onClick(View v) {

          // 根據(jù)ID獲取手機號碼編輯框

          EditText mobileText = (EditText) findViewById(R.id.mobile);

          // 獲取手機號碼

          String mobile = mobileText.getText().toString();

          // 根據(jù)ID獲取信息內(nèi)容編輯框

          EditText messageText = (EditText) findViewById(R.id.message);

          // 獲取信息內(nèi)容

          String message = messageText.getText().toString();

          // 移動運營商允許每次發(fā)送的字節(jié)數(shù)據(jù)有限,我們可以使用Android給我們提供 的短信工具。

          if (message != null) {

          SmsManager sms = SmsManager.getDefault();

          // 如果短信沒有超過限制長度,則返回一個長度的List

          List<String> texts = sms.divideMessage(message);

          for (String text : texts) {

          sms.sendTextMessage(mobile, null, text, null, null);

          }

          }

          }

          });

          }

          }

          sms.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)

          destinationAddress:接收方的手機號碼

          scAddress:發(fā)送方的手機號碼

          text:信息內(nèi)容

          sentIntent:發(fā)送是否成功的回執(zhí),以后會詳細介紹。

          DeliveryIntent:接收是否成功的回執(zhí),以后會詳細介紹。


          4.編輯AndroidManifest.xml內(nèi)容:

          <?xml version="1.0" encoding="utf-8"?>

          <manifest xmlns:android="http://schemas.android.com/apk/res/android"

          package="com.changcheng.activity" android:versionCode="1"

          android:versionName="1.0">

          <application android:icon="@drawable/icon" android:label="@string/app_name">

          <activity android:name=".SendMessage" android:label="@string/app_name">

          <intent-filter>

          <action android:name="android.intent.action.MAIN" />

          <category android:name="android.intent.category.LAUNCHER" />

          </intent-filter>

          </activity>

          </application>

          <uses-sdk android:minSdkVersion="7" />

          <!-- 注冊發(fā)送短信的權(quán)限 -->

          <uses-permission android:name="android.permission.SEND_SMS" />

          </manifest>

          注冊發(fā)送短信的權(quán)限,如果沒有注冊這個,將使用不了系統(tǒng)的發(fā)送短信功能。以后在我們的應(yīng)用程序開發(fā)中,有使用到系統(tǒng)功能的必須在這個文件中進行注冊。我們可以查看Android的幫助手冊都有哪些功能。(.../android-sdk-windows/docs/reference/android/Manifest.permission.html


          三、啟動模擬器

          我們給誰發(fā)短信?我們可以啟動兩個模擬器。使用一個模擬器給另一個模擬器發(fā)信息。首先我們使用工具欄上的手機圖標(biāo)再添加一個Android2.1的模擬器,另記一個名稱。


          在啟動兩個模擬器之前,我們需要模擬器能“接收到信號”。如果我們的機器是聯(lián)網(wǎng)的,啟動模擬器后,主界面顯示信號強度的旁邊會有一個3G的字樣,這說明模擬器已經(jīng)能接收到信號了。如果我們的機器不能聯(lián)網(wǎng),那么將自己的IP地址、網(wǎng)關(guān)和DNS服務(wù)器都設(shè)置為相同的值,比如都設(shè)置為192.168.0.100。如果我們的機器是在局域網(wǎng)下,但沒有聯(lián)網(wǎng),那么將自己的網(wǎng)關(guān)和DNS設(shè)置為路由的IP即可,一般情況下路由的IP192.168.0.1


          OK,現(xiàn)在我們啟動兩個模擬器!


          四、發(fā)送短信

          我們啟動模擬器后,可以看到模擬器窗口的標(biāo)題欄上有555455556的字樣。這是模擬器監(jiān)聽的端口即——127.0.0.15554


          在工程上右鍵,Run As Android Application,選擇其中的一個模擬器。比如選擇了端口為5554的模擬器。OK,程序被加載到模擬器中了,會被自動運行。


          我們在電話號碼編輯框中輸入5556(接收端模擬器的端口號),點擊發(fā)送按鈕!


          OK,你看到效果了嗎?5556主界面,顯示信號強度的旁邊顯示收到新短信。


          五、使用ADT插件發(fā)送短信給模擬器

          如果機器太慢,無法啟動兩個模擬器,我們可以只啟動一個模擬器。然后在菜單windows->show view->other->Android->Emulator Control打開Emulator Control面板。


          Telephony Actions分組框中,Voice是呼叫,SMS是發(fā)送短信。Incoming number是模擬器的端口號,我們也可以使用這個功能給我們的模擬器撥打電話或發(fā)送短信。


          posted @ 2010-02-27 00:20 長城 閱讀(3508) | 評論 (0)編輯 收藏

           

          一、創(chuàng)建 Android工程

          Project name:Call

          BuildTarget:Android2.1

          Application name:撥打電話

          Package name:com.changcheng.Activity

          Create Activity:Call

          Min SDK Version:7


          二、編輯工程

          1.編輯strings.xml文件內(nèi)容為:

          <?xml version="1.0" encoding="utf-8"?>

          <resources>

          <string name="hello">請輸入 手機號碼:</string>

          <string name="app_name">撥打電話</string>

          <string name="button_call">呼叫</string>

          </resources>



          2.編輯main.xml文件內(nèi)容為:

          <?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">

          <!-- 標(biāo)題標(biāo)簽 -->

          <TextView android:layout_width="fill_parent"

          android:layout_height="wrap_content" android:text="@string/hello" />

          <!-- 電話號碼輸入框 -->

          <EditText android:layout_width="fill_parent"

          android:layout_height="wrap_content"

          android:id="@+id/mobile"/>

          <!-- 撥打電話按鈕 -->

          <Button android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:text="@string/button_call"

          android:id="@+id/button_call"/>

          </LinearLayout>

          注意,我們在電話號碼輸入框和撥打電話按鈕中添加了android:id屬性。如電話號碼輸入框的android:id=”@+id/mobile”@代碼R.java+id代碼添加id靜態(tài)內(nèi)部類,mobile代表向id類中添加一個常量成員。ADT將自動為我們生成常量值。


          3.編輯Call.java內(nèi)容:

          package com.changcheng.Activity;


          import android.app.Activity;

          import android.content.Intent;

          import android.net.Uri;

          import android.os.Bundle;

          import android.view.View;

          import android.view.View.OnClickListener;

          import android.widget.Button;

          import android.widget.EditText;


          public class Call extends Activity {

          /** Called when the activity is first created. */

          @Override

          public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.main);

          // 根據(jù)ID獲取按鈕

          Button button = (Button) this.findViewById(R.id.button_call);

          // 為按鈕添加被單擊事件

          button.setOnClickListener(new OnClickListener(){


          @Override

          public void onClick(View v) {

          // 根據(jù)ID獲取編輯框

          EditText editText = (EditText) findViewById(R.id.mobile);

          // 獲取電話號碼

          String mobile = editText.getText().toString();

          // 生成呼叫意圖

          Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ mobile));

          // 開始呼叫

          startActivity(intent);

          }

          });

          }

          }



          4.編輯AndroidManifest.xml內(nèi)容:

          <?xml version="1.0" encoding="utf-8"?>

          <manifest xmlns:android="http://schemas.android.com/apk/res/android"

          package="com.changcheng.Activity"

          android:versionCode="1"

          android:versionName="1.0">

          <application android:icon="@drawable/icon" android:label="@string/app_name">

          <activity android:name=".Call"

          android:label="@string/app_name">

          <intent-filter>

          <action android:name="android.intent.action.MAIN" />

          <category android:name="android.intent.category.LAUNCHER" />

          </intent-filter>

          </activity>


          </application>

          <uses-sdk android:minSdkVersion="7" />

          <!-- 注冊使用撥打電話功能的權(quán)限 -->

          <uses-permission android:name="android.permission.CALL_PHONE"/>

          </manifest>

          注冊使用撥打電話功能的權(quán)限,如果沒有注冊這個,將使用不了系統(tǒng)的撥打電話功能。以后在我們的應(yīng)用程序開發(fā)中,有使用到系統(tǒng)功能的必須在這個文件中進行注冊。我們可以查看Android的幫助手冊都有哪些功能。(.../android-sdk-windows/docs/reference/android/Manifest.permission.html


          三、啟動模擬器

          我們給誰打電話?我們可以啟動兩個模擬器。使用一個模擬器給另一個模擬器撥打。首先我們使用工具欄上的手機圖標(biāo)再添加一個Android2.1的模擬器,另記一個名稱。


          在啟動兩個模擬器之前,我們需要模擬器能“接收到信號”。如果我們的機器是聯(lián)網(wǎng)的,啟動模擬器后,主界面顯示信號強度的旁邊會有一個3G的字樣,這說明模擬器已經(jīng)能接收到信號了。如果我們的機器不能聯(lián)網(wǎng),那么將自己的IP地址、網(wǎng)關(guān)和DNS服務(wù)器都設(shè)置為相同的值,比如都設(shè)置為192.168.0.100。如果我們的機器是在局域網(wǎng)下,但沒有聯(lián)網(wǎng),那么將自己的網(wǎng)關(guān)和DNS設(shè)置為路由的IP即可,一般情況下路由的IP192.168.0.1


          OK,現(xiàn)在我們啟動兩個模擬器!


          四、撥打電話

          我們啟動模擬器后,可以看到模擬器窗口的標(biāo)題欄上有555455556的字樣。這是模擬器監(jiān)聽的端口即——127.0.0.15554


          在工程上右鍵盤,Run As Android Application,選擇其中的一個模擬器。比如選擇了端口為5554的模擬器。OK,程序被加載到模擬器中了,會被自動運行。


          我們在電話號碼編輯框中輸入5556(接收端模擬器的端口號),點擊呼叫按鈕!


          OK,你看到效果了嗎?5554模擬器顯示正在呼叫,5556模擬器有來電顯示...


          五、使用ADT插件呼叫模擬器

          如果機器太慢,無法啟動兩個模擬器,我們可以只啟動一個模擬器。然后在菜單windows->show view->other->Android->Emulator Control打開Emulator Control面板。


          Telephony Actions分組框中,Voice是呼叫,SMS是發(fā)送短信。Incoming number是模擬器的端口號,我們也可以使用這個功能給我們的模擬器撥打電話或發(fā)送短信。

           

          posted @ 2010-02-26 23:00 長城 閱讀(3715) | 評論 (0)編輯 收藏

               摘要:   萬眾矚目,Android終于開課了。本課程有黎活明老師主講,講課細致而流暢。想做細他的課程總結(jié),那我沒時間和精力了。也是總結(jié)個框框,雖然是個框框,但如果看著我的日志跟著我做,也能做起Android開發(fā)。 今日的重點內(nèi)容是,3G簡介、Android簡介、Android的開發(fā)環(huán)境搭建、HelloWorld程序、Android程序運行過程、撥打電話小程序、發(fā)送短信小程序。我們跳...  閱讀全文

          posted @ 2010-02-26 21:21 長城 閱讀(5351) | 評論 (2)編輯 收藏

           我今天用Struts2Spring整合,但部署到Tomcat(tomcat-6.0.20)時,WabAppClassLoader卻給我拋出了一個異常:ClassNotFindException:xxx.ActionServletActionServletStruts1中使用的Action控制器。但我使用的是Struts2啊!

          我反復(fù)查看自己的配置文件和使用到的Jar包,沒有任何問題。然后到網(wǎng)上搜索答案,出現(xiàn)這個問題的人還不少。有的是使用Strut1出現(xiàn)這個問題,那么他可能是沒有導(dǎo)入Struts1的核心包導(dǎo)致的。至于使用Struts2也出現(xiàn)這個問題多少就有些奇怪了。

          一些網(wǎng)友給出答案,是將Tomcat刪除,然后安裝一個新的Tomcat這樣就可以解決問題。確實如此,我使用這個方法解決了問題。但為什么會出現(xiàn)這個問題呢?我最先想到的是Tomcat可能有緩存功能,于是我查看Tomcat的目錄。發(fā)現(xiàn)它有一個temp目錄和一個work目錄,temp目錄是做什么用的我不知道,work目錄是為我們生成JSPclass文件。

          問題就可能出現(xiàn)在這兩個目錄,所以以后遇見莫名其妙的問題可以刪除這兩個目錄中的內(nèi)容,然后再試一試。

          posted @ 2010-02-25 23:58 長城 閱讀(444) | 評論 (0)編輯 收藏

                 Struts2第四天,正如預(yù)期Struts2的內(nèi)容還沒有講完,還需要再加一天課。按照正常的授課方式,Struts2在四天內(nèi)是可以講完的,但這可能是老張最后一次講Struts2,所以他要講得細致些。

           

                 今天的重點內(nèi)容是Struts2的表單錯誤信息排版、Struts2中的FreeMark、和Struts2中的UI標(biāo)簽。老張計的比較細致,我做總結(jié)就不做的那么細致了。

           

          一、Struts2的表單錯誤信息排版

                 Struts2的表單錯誤信息排版是一個比較常見的問題,但網(wǎng)給所見到的解決方案似乎并不正統(tǒng)。老張給出了他的解決方法。

           

                 通過之前的學(xué)習(xí),我們知道Struts2中的大部分?jǐn)?shù)據(jù)交互操作是由ValueStack來完成的。錯誤信息也是如此。我們在后臺使用配置文件校驗或硬編碼校驗,Struts2將錯誤信息存放在類型為MapfieldErrors對象中。

           

                 我們可以在頁面表單字段的后邊添加此錯誤信息,比如在user.name表單字段后邊添加<s:property value="fieldErrors['user.name'][0]"/>,這樣錯誤信息可以顯示在對應(yīng)的字段后邊。這是針對我們使用非struts2ui標(biāo)簽時(使用提htmlui標(biāo)簽)。但這里有一個問題,如果我的表單字段特別的多,難道我要手動為每個字段添加一個這樣的錯誤信息,這多少有些麻煩,而且以后字段有什么變化還需要行動更改...

           

                 Struts2在各方面都做的非常細致和人性化,Struts2UI標(biāo)簽等主要是使用FreeMark來實現(xiàn)的。Struts2使用FreeMar來實現(xiàn)模板和主題,那么我們回顯表單數(shù)據(jù)和錯誤信息也可以使用FreeMark來實現(xiàn)。此時我們的表單需要使用struts-tags提供的標(biāo)簽來定義,然后我們修改它的ftl模板文件。

           

                 下面我們看看一下應(yīng)該如何修改ftl模板文件,我們以UI標(biāo)簽<s:textarea>為例。Struts2的模板文件存在哪?在Struts2的核心包中的template.xhtml中,textarea.ftl文件內(nèi)容:

          <#include "/${parameters.templateDir}/${parameters.theme}/controlheader.ftl" />

          <#include "/${parameters.templateDir}/simple/textarea.ftl" />

          <#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />

                

                 我們只需修改 controlheader.ftlcontrolfooter.ftl即可,難道我們需要修改Struts2核心包中的內(nèi)容?當(dāng)然不用,這一點Struts2已經(jīng)為我們考慮到了。我們將這兩個文件解壓縮并放到WebRoot目錄下的”template/xhtml”目錄,必須是xhtml目錄。看default.properties文件中的這斷配置:

          ### Standard UI theme

          ### Change this to reflect which path should be used for JSP control tag templates by default

          struts.ui.theme=xhtml

          struts.ui.templateDir=template

          #sets the default template type. Either ftl, vm, or jsp

          struts.ui.templateSuffix=ftl

          Struts2會先到我們的WebRoot目錄搜索相關(guān)ftl文件,如果沒有才到自己的包中找。

           

                 我們的目標(biāo),要使用Struts2UI標(biāo)簽并將錯誤信息顯示在標(biāo)簽的旁邊。所以我們修改這兩個文件的內(nèi)容為:

          controlheader.ftl

          <#--

                 Only show message if errors are available.

                 This will be done if ActionSupport is used.

          -->

          <#assign hasFieldErrors = parameters.name?? && fieldErrors?? && fieldErrors[parameters.name]??/>

          <#if parameters.labelposition?default("") == 'top'>

              <td align="left" valign="top" colspan="2"><#rt/>

          <#else>

              <td class="tdLabel"><#rt/>

          </#if>

          <#if parameters.label??>

              <label <#t/>

          <#if parameters.id??>

                  for="${parameters.id?html}" <#t/>

          </#if>

          <#if hasFieldErrors>

                  class="errorLabel"<#t/>

          <#else>

                  class="label"<#t/>

          </#if>

              ><#t/>

          <#if parameters.required?default(false) && parameters.requiredposition?default("right") != 'right'>

                  <span class="required">${stack.findValue("getText('requiredmark')")}</span><#t/>

          </#if>

          ${parameters.label?html}<#t/>

          <#if parameters.required?default(false) && parameters.requiredposition?default("right") == 'right'>

           <span class="required"><@s.text name="requiredmark"></@s.text></span><#t/>

          </#if>

          ${parameters.labelseparator?default(":")?html}<#t/>

          <#include "/${parameters.templateDir}/xhtml/tooltip.ftl" />

          </label><#t/>

          </#if>

              </td><#lt/>

          <#-- add the extra row -->

          <#if parameters.labelposition?default("") == 'top'>

          </tr>

          <tr>

          </#if>

           

          controlfooter.ftl

          ${parameters.after?if_exists}<#t/>

              </td><#lt/>

          <#assign hasFieldErrors = parameters.name?? && fieldErrors?? && fieldErrors[parameters.name]??/>

          <#if hasFieldErrors>

              <td ><#rt/>

          <#list fieldErrors[parameters.name] as error>

                  <span class="errorMessage">${error?html}</span><#t/>

          </#list>       

              </td><#lt/>

          </#if>

          <#--

                 if the label position is top,

                 then give the label it's own row in the table

          -->

          <tr>   

          </tr>

           

          至于為什么這么修改,一看便知,我就不多做解釋了。

           

          二、Struts2如何使用Freemarker

                 Struts2是如何使用Freemarker的?在struts2的核心包中有一個default.properties配置文件,Struts2的默認配置都在這個文件中。有一些配置是開啟的有一些配置是關(guān)閉的。我們要想打開被關(guān)閉的配置可以在struts.xml中,添加<constant name="配置項名" value="配置項值"></constant>元素。

           

                 default.properties中有一個struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager配置,Struts2是通過FreemarkerManager類來實現(xiàn)對Freemarker的操作的。

           

                 通過查看源代碼,我們知道通過調(diào)用FreemarkerManager類的buildTemplateModel方法生成一個model對象,然后將這個對象放在ValueStack中提供給Freemarker的引擎使用。model中都包含發(fā)哪些數(shù)據(jù)?Freemark的模板信息自然不用說,它還包含RequestApplicationResponse等這些在WEB應(yīng)用中常用到的對象。具體我就不詳細列出了,大家可以查看源代碼。我們在上邊兩個模板文件中使用到的 parameters.name也是存儲在model中的。

           

                 在此特別提出一個被叫做UIBean的類型,UIBean就是對應(yīng)Struts2UI標(biāo)簽的對象實體。比如標(biāo)簽有namethemeid等數(shù)據(jù),這些都會被封裝到UIBean中。Freemarker也正是使用這個東東給我們生成了相應(yīng)該的頁面文件。    

           

          三、Struts2中的UI標(biāo)簽

                 關(guān)于各UI標(biāo)簽的詳細使用方式,在此就不做總結(jié)了。

           

                 在實際開發(fā)中有一個重要的問題需要我們解決,比如有一個選擇個人喜好的表單。我們需要通過一個Action的方法(likesUI)將喜好列表提供給頁面,可以讓用戶選擇。但在應(yīng)用提交選擇進行表單校驗時,用戶提交的數(shù)據(jù)不合法,我們需要重新返回到用戶選擇的界面。此時,我們需要調(diào)用 likesUI,獲取列表將數(shù)據(jù)提供給用戶選擇的界面。

           

                 我們可以在Action中添加”<result name="input" type="chain">likesUI</result>”,使其發(fā)生錯誤時直接跳轉(zhuǎn)到likesUI,我們也需要在likesUI中添加一個 名稱為inputresult標(biāo)簽,但這個標(biāo)簽的值不能為likesUI,否則會遞歸調(diào)用,直到緩存溢出。我們應(yīng)將它的值指定為likesUI.jsp頁面。但即使指定了這個頁面,Struts2的內(nèi)部實現(xiàn)方式也不會調(diào)用likesUI方法從,不會將數(shù)據(jù)傳遞給likesUI.jsp頁面,而它直接跳轉(zhuǎn)到likesUI.jsp頁面。

           

                 看來我們不能這么做,通過張老師對源代碼的詳細解析,我們只需要將likesUIAction中的likesUI的方法命名為input(),并只在likeUIAction中添加”<result name="input">/WEB-INF/pages/user/likesUI.jsp</result>“即可。為什么呢?

           

                 在表單校驗發(fā)生錯誤并使用 chain進行跳轉(zhuǎn)時,會被chain攔截器給攔截了(ActionChainResult)。然后又會被攔截器validation給攔截了,它再進行表單校驗進還是以前的數(shù)據(jù),還是會出錯然后它就直接跳轉(zhuǎn)到我們指定的頁面了。注意配置文件中的validation

          <interceptor-ref name="validation">

                 <param name="excludeMethods">input,back,cancel,browse</param>

          </interceptor-ref>

          它忽略請求為 input,back,cancel,browse請求路徑。所以我們需要將我們的方法名定義為 input()

           

                 我只是泛泛而結(jié),如果想了解Struts2的更多細節(jié)請下載老張的視頻看吧!

           

                 最后送給大家一個Struts2開發(fā)用例參考模式圖:

          clip_image002
                 1.用戶申請注冊,打開注冊頁面。

                 2.用戶提交注冊申請,表單校驗錯誤。

                 3.表單校驗錯誤不要跳轉(zhuǎn)到regUser.jsp頁面,而是應(yīng)該跳轉(zhuǎn)到RegUserUI這個Action方法。

                 4.用戶提交注冊申請,表單校驗通過。

                 5.表單校驗通過,調(diào)用RegUser這個Action方法進行注冊。

                 6.注冊成功后,不要跳轉(zhuǎn)到list.jsp頁面。而是應(yīng)該調(diào)用ListAction這個Action方法。

                 7.ListAction獲取所有用戶信息后,跳轉(zhuǎn)到list.jsp

           

                 一定要記得老張還有一天的Struts2的課程,下一次課程的重點內(nèi)容應(yīng)該是Struts2的文件上傳與下載,Struts2的防止表單重復(fù)提交,Struts2SpringAJAX整合,Struts2的插件。

           

                 接下來的課程內(nèi)容讓我等的好久啊——Android!雖然聽學(xué)習(xí)過的同學(xué)們說十分簡單,但我還是迫不及待的想Android的一睹真容。我想很多人都是這樣吧!那就關(guān)注我接下來6天課程的總結(jié)日志吧!

          posted @ 2010-02-25 21:32 長城 閱讀(584) | 評論 (0)編輯 收藏

                 Struts2第三天。如果老張他喜歡頭發(fā),他肯定會把頭上的頭發(fā)有多少根,一根一根的數(shù)出來。他搞的太細了!

           

                 今天的重點內(nèi)容是國際化、表單與Action數(shù)據(jù)交互、表單校驗,不多說了開始總結(jié)。

           

          一、Struts2國際化

                 在我們學(xué)習(xí)WEB基礎(chǔ)的時候就講到了國際化,Struts2中的國際化實現(xiàn)方式與我們之前所學(xué)習(xí)到的國際化相同。但是Struts2中對國際化做了強化支持!

           

                 我們通過在struts.xml文件中加入”<constant name="struts.custom.i18n.resources" value="*.properties"></constant>”為指定全局國際化資源文件。Struts2會根據(jù)瀏覽器設(shè)置的語言信息運行對應(yīng)的國際化文件,如果沒找到就根據(jù)操作系統(tǒng)的語言查找指定的文件,還是沒有,那就使用默認的。我們必須在struts.xml中使用定義在struts-default.xml文件中的defaultStack攔截器堆棧。使用defaultStack我們必須在package中添加extends="struts-default"屬性。如果在我們的Action中沒有使用任何攔截器,defaultStack默認被使用。如果有使用任何其他攔截器,我們必須手動加入defaultStack攔截器堆棧。Struts2將使用defaultStack攔截器堆棧中的i18n攔截器,為我們提供國際化支持。

           

                 引入多個全局資源包的方法是在上面的value屬性中添加以”,”分隔的多個資源文件。排在最后的資源包的優(yōu)先級別最高(如果有重復(fù)的資源名稱)。那如果有時我想在JSP頁面中使用第一個資源包中的資源怎么辦?Struts2為我們提供了一個標(biāo)簽“<s:i18n name="first.properties"></s:i18n>”,在標(biāo)簽體內(nèi)使用到的國際化資源,全以first.properties為先。

           

                 我們可以為每個Action指定一個資源包,資源包的名稱與Action的名稱相同。Struts2的國際化模塊會先找與Action對應(yīng)的資源包,如果沒有就找它上一級的資源包,就這樣逐級向上。如果直到類所在包的是后一層目錄也沒找到就使用全局資源。這有什么好處?我們可能會有多個Action使用同一個或多個相同的資源,難道我們要在每個Action對應(yīng)的資源包里定義它嗎?當(dāng)然不需要,我們只需要把它定義在這幾個Action的上級且同一目錄即可。

           

                 我們?nèi)绾卧?span lang="EN-US" xml:lang="EN-US">JSP頁面有使用國際化資源?Struts2tags為我們提供了“<s:text name=""></s:text>”標(biāo)簽,它是專門用來訪問國際化資源的。除此之外我們也可以使用“<s:property value=”getText(key)”>”,這個getText()是哪來的?當(dāng)然是ValueStack中的某個對象的方法嘍!是類型為com.opensymphony.xwork2.DefaultTextProvider對象的。Struts2中使用OGNL操作ValueStackContextMapOGNL看到getText(key)時,它會在ValueStack中從上向上反射每一個對象,如果哪一個對象最先具有這個方法,則OGNL就調(diào)用這個對象的getText(key)方法。

           

                 除了在JSP頁面中需要使用到國際化資源,我們在Action中也需要使用國際化資源。此時,我們需要將我們的Action類繼承自ActionSupport類,它實現(xiàn)了專門用于操作國際化的接口TextProviderActionSupport還實現(xiàn)了其他非常有用的接口,我們在下面會總結(jié)。此后,我們只需要調(diào)用getText()方法,即可獲得相應(yīng)的資源信息。我們的Action也可以繼承自DefaultTextProvider類,但它默認情況下去搜索全局資源包,不會找Action的資源包。而ActionSUpport正如我們在上面所說,以Action的資源包優(yōu)先級最高...

           

                 我們知道我們可以為國際化資源指定參數(shù),比如“regNameError={0} is invalid.”。我們在JSP頁面中可以通過<s:param></s:param>標(biāo)簽來指定,如:

          <s:text name=”regNameError”>

                 <s:param></s:param>

          </s:text>

          <s:text name=”getText('regNameError','xxx')”></s:text>。在Action中直接使用getText(“regNameError”,”xxx”)

           

                 我們之所以能夠如此方便的使用國際化支持,JDK中的java.util.Locale為此做了很大的貢獻。目前我們使用國際化操作,無不基于java.util.Locale。因為OGNL的強大,我們也可以在JSP頁面中使用java.util.Locale還記得嗎?在OGNL中調(diào)用XXX類的靜態(tài)方法或成員的方式,比如調(diào)用java.util.LocalegetCountry()<s:property value=”@java.util.Locale@getDefault()”/>

           

          二、表單與Action數(shù)據(jù)交互

                 相比Struts1,在Strut2中的一大變化是我們不需要ActionForm了。我們在使用Struts1時,為了操作表單數(shù)據(jù),我們需要額外定義一個繼承自ActionFormFormBean。然后再將FormBean中的數(shù)據(jù)CopyBean中。

           

                 Struts2是如何實現(xiàn)對表單數(shù)據(jù)的操作呢?Struts2ValueStack一直發(fā)輝著它的作用,ValueStack像是能完成Struts2的在所在操作,上面的國際化也是使用的ValueStack存儲的。在Struts2中操作表單數(shù)據(jù),我們需要在我們Action定義屬性。在Action添加的屬性可以是基本數(shù)據(jù)類型也可以是復(fù)合類型。

           

                 進行表單與Action數(shù)據(jù)交互時,我們的Action類無需實現(xiàn)任何接口或繼承自任何類。但是,我們必須在struts.xml中使用定義在struts-default.xml文件中的defaultStack攔截器堆棧。使用defaultStack我們必須在package中添加extends="struts-default"屬性。如果在我們的Action中沒有使用任何攔截器,defaultStack默認被使用。如果有使用任何其他攔截器,我們必須手動加入defaultStack攔截器堆棧。

           

                 Struts2正是使用在defaultStack中的params攔截器,來為我們的Action設(shè)置屬性值。如何使用基本類型屬性和復(fù)合類型屬性與JSP頁面交互呢?比如在我們的RegUserAction中有一個User屬性和一個字符串型的password2屬性。那么我們在JSP頁面中應(yīng)該這樣使用:

          <s:form action=”RegUserAction”>

              <s:textfield name=”user.name”/>

              <s:textfield name=”user.password”/>

              <s:textfield name=”user.email”/>

              <s:textfield name=”password2”/>

              <s:submit value=”注冊”></s:submit>

          </s:form>

           

                 點擊注冊按鈕后,Struts2正是使用params攔截器將數(shù)據(jù)設(shè)置到RegUserAction的屬性中。

           

                 因為這些表單字段數(shù)據(jù)是被保存在ValueStack中,所以我們在JSP頁面我們可以使用EL表達試,如:${user.name},也可以使用OGNL表達式,如:<s:property value=”user.name”/>來獲取數(shù)據(jù)。

           

                 除此之外,我們可以讓Action實現(xiàn)ModelDriven接口,并將User做為它的泛型參數(shù)。如果被ModelDriven接管的實體類型中有與我們的Action屬性相同的,ModelDriven的優(yōu)先級高。Struts2會設(shè)置ModelDriven接管的實體類型的是屬性,而忽略Action的同名屬性。但這并不會引起錯誤,因為我們的數(shù)據(jù)全部放在ValueStack中,使用OGNL可以正確獲取。我們不推薦使用ModelDriven

           

          三、表單校驗

                 表單校驗在Struts2中實現(xiàn)比較簡單,表單數(shù)據(jù)的校驗分為前臺校驗和后臺校驗。同樣我們需要開啟defaultStack攔截器堆棧,首先我們來看看后臺校驗。

           

                 后臺校驗,我們的Action可以繼承ValidationAwareSupport類和實現(xiàn)Validateable接口。因為我們同時需要在類中使用到國際化表單校驗,所以我們可以直接繼承ActionSupport類。Action類需要實現(xiàn)validate方法。

           

                 validate方法中進行Action的屬性校驗,并且我們可以調(diào)用ActionSupport類的addActionError(String)方法,添加錯誤信息。我們可以在這里使用國際化支持,而在JSP頁面中需要使用<s:fieldError>取出所有錯誤信息,或者指定字段名而取出某個字段的錯誤信息。

           

                 但有一個問題,一個Action類可以有多個方法分別用于處理不同的請求。Struts2每當(dāng)調(diào)用其中一個方法時都會進行表單校驗,這沒必要啊!所以我們在不需要進行表單校驗的方法上添加“@SkipValiation”注解,這樣就會被Struts2過濾掉。

           

                 我們也可以添加”ActionClassName-validation.xml”配置文件,來為指定名稱的Action(ActionClassName)添加表單校驗。具體的配置可以參看struts2包中所帶的例子程序。我們也可以使用“ActionClassName-actionname-validation.xml”來為Action類中的某個具體方法指定表單校驗。

           

                 前臺校驗,前臺校驗的好處不再說明了。前提我們以配置文件的方式為Action指定的表單校驗,那么在JSP頁面中,我們可以直接引用配置文件中的數(shù)據(jù),實現(xiàn)前臺校驗。Struts2中的struts-tags為我們提供的表單標(biāo)簽中可以引用配置文件中對應(yīng)的校驗數(shù)據(jù)。在我們訪問到某個JSP頁面時,Struts2的標(biāo)簽會為我們自動生成相應(yīng)的JavaScript代碼,但Struts2的表單前臺校驗的這種功能還不夠強大。在此就不多做總結(jié)了。

           

                 老張講得比較細致,我也僅僅是泛泛而總結(jié)。按照正常的進程,我們明天還有一天的Struts2課程,但由于時間不夠,老張決定哪天同學(xué)們休息時再為我們補一天,太好了!

          posted @ 2010-02-23 23:39 長城 閱讀(542) | 評論 (0)編輯 收藏

               摘要: Struts2第二天,大家似乎沒有從年假中蘇醒過來,上課顯得有些疲憊。不過還好,聽課效果還不錯。今日的主要內(nèi)容是OGNL,Struts2使用OGNL訪問contextMap和valueStack。老張很執(zhí)著,他在研究Struts2時遇到的一些問題,一定要解決,并且要詳細解決。通過他在講課中,我們可以看出這一點。有開發(fā)經(jīng)驗的人都知道,我們時而被陌生技術(shù)的一個小細節(jié)搞的暈頭轉(zhuǎn)向,耗費了大半天的時間我們...  閱讀全文

          posted @ 2010-02-22 16:59 長城 閱讀(742) | 評論 (0)編輯 收藏

               摘要:          春節(jié)假期終于結(jié)束了,假期內(nèi)在北京只出去轉(zhuǎn)了兩天,感覺很好!剩余時間呆在屋子里寫了個練習(xí)程序收獲頗豐。          依然迫不及待,迫不及待的學(xué)完課程趕緊回大連。我想除了我,很多同學(xué)和網(wǎng)友也都期待著今天由張考祥老師主講的Strut...  閱讀全文

          posted @ 2010-02-20 23:56 長城 閱讀(577) | 評論 (0)編輯 收藏

               摘要:          今日教育辦公系統(tǒng)結(jié)束。新內(nèi)容有:導(dǎo)出數(shù)據(jù)到PDF文檔、生成圖表(餅圖、柱圖...),整體上操作比較簡單。   一、創(chuàng)建PDF文檔          我們使用iText創(chuàng)建PDF文檔,需要到http://itext...  閱讀全文

          posted @ 2010-02-09 01:25 長城 閱讀(486) | 評論 (0)編輯 收藏

               摘要:          今日我們已經(jīng)將權(quán)限模塊與員工管理整合完畢,但下午有學(xué)習(xí)新的內(nèi)容。將數(shù)據(jù)導(dǎo)出為excel表格,或從excel表格導(dǎo)入數(shù)據(jù)。這一項功能比較常用!在Windows平臺下微軟有為我們提供Office的COM套件,Apache為我們提供的poi正是為Java打造的Office套件。    &...  閱讀全文

          posted @ 2010-02-08 00:30 長城 閱讀(384) | 評論 (0)編輯 收藏

          spring-security最后一天,今天的主要內(nèi)容是將需要指定權(quán)限才可以訪問的資源放到數(shù)據(jù)庫中,脫離applicationContext.xml配置文件。然后我們將近兩天學(xué)習(xí)的srping-security整合到教育辦公系統(tǒng)中。


          我們繼續(xù)昨天的內(nèi)容,將資源文件信息保存到數(shù)據(jù)庫中。



          1.applicationContext.xml

          將昨天applicationContext.xml“配置SpringSecurityhttp安全服務(wù)”部分的內(nèi)容替換為:

          <sec:http auto-config="true" session-fixation-protection="none" />

          <bean

          class="org.springframework.security.intercept.web.FilterSecurityInterceptor"

          autowire="byType">

          <sec:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/>

          <property name="objectDefinitionSource" ref="objectDefinitionSource"/>

          </bean>

          這里的objectDefinitionSource是下邊的類,cutom-filter是在調(diào)用AUTHENTICATION_PROCESSING_FILTER過濾器之前調(diào)用FilterSecurityInterceptor


          2.添加數(shù)據(jù)表

          resc表與role表是多對多關(guān)系。


          1).resc

          image

          2).resc_role

          image

          3.相關(guān)類

          要讓spring-security可以從數(shù)據(jù)庫中獲取相關(guān)資源信息,我們必須編寫一個實現(xiàn)FactoryBean接口的類。

          package cn.itcast.cc.spring.security;


          import java.util.LinkedHashMap;

          import java.util.Map;

          import javax.annotation.Resource;

          import org.springframework.beans.factory.FactoryBean;

          import org.springframework.security.ConfigAttributeDefinition;

          import org.springframework.security.ConfigAttributeEditor;

          import org.springframework.security.intercept.web.DefaultFilterInvocationDefinitionSource;

          import org.springframework.security.intercept.web.RequestKey;

          import org.springframework.security.util.AntUrlPathMatcher;

          import org.springframework.security.util.UrlMatcher;

          import org.springframework.stereotype.Component;


          @Component("objectDefinitionSource")

          public class DefaultFilterInvocationDefinitionSourceImpl implements FactoryBean {


          @Resource

          ResourceDetailsService resourceDetailsService;


          private UrlMatcher getUrlMatcher() {

          UrlMatcher urlMatcher = new AntUrlPathMatcher();

          return urlMatcher;

          }


          @Override

          public Object getObject() throws Exception {

          UrlMatcher urlMatcher = this.getUrlMatcher();

          // 獲取數(shù)據(jù)Map

          Map<String, String> srcMap = resourceDetailsService.buildRequestMap();

          LinkedHashMap<RequestKey, Object> requestMap = new LinkedHashMap<RequestKey, Object>();

          ConfigAttributeEditor editor = new ConfigAttributeEditor();

          // 轉(zhuǎn)換數(shù)據(jù)Map

          for (Map.Entry<String, String> entry : srcMap.entrySet()) {

          String url = entry.getKey();

          String roles = entry.getValue();

          if (roles != null) {

          editor.setAsText(roles);

          requestMap.put(new RequestKey(url), editor.getValue());

          } else {

          requestMap.put(new RequestKey(url), ConfigAttributeDefinition.NO_ATTRIBUTES);

          }

          }

          // 生成并返回對象

          return new DefaultFilterInvocationDefinitionSource(urlMatcher,

          requestMap);

          }


          @Override

          public Class getObjectType() {

          return null;

          }


          @Override

          public boolean isSingleton() {

          return false;

          }


          }


          其中ResourceDetailsService接口的實現(xiàn)類如下:

          package cn.itcast.cc.spring.security;


          import java.util.HashMap;

          import java.util.List;

          import java.util.Map;

          import javax.annotation.Resource;

          import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

          import org.springframework.stereotype.Component;


          @Component("userDetailsService")

          public class ResourceDetailsServiceImpl implements ResourceDetailsService {


          @Resource

          private SimpleJdbcTemplate jdbcTemplate;

          @Override

          public Map<String, String> buildRequestMap() {

          // 注意:這里需要使用左外連接查詢,是因為有些頁面沒有指定role

          // 即,任何權(quán)限都不可以訪問的頁面!

          String sql = "SELECT res_string as url,r.name as role " +

          "FROME resc LEFT JOIN resc_role rr ON rr.resc_id = resc.id " +

          "LEFT JOIN role r ON rr.role_id = r.id";

          List<Map<String, Object>> results = this.jdbcTemplate.queryForList(sql);

          Map<String, String> srcMap = new HashMap<String, String>();

          // 將查詢后的數(shù)據(jù)拼接并放入到Map

          for(Map<String,Object> val:results){

          String url = (String) val.get("url");

          String role = (String) val.get("role");

          if(srcMap.containsKey(url)){

          role = srcMap.get(url) + "," + role;

          }

          srcMap.put(url, role);

          }

          return srcMap;

          }

          }


          Spring-security還為我們提供了其他實用的輔助功能,具體的google一下吧!

          posted @ 2010-02-04 23:18 長城 閱讀(407) | 評論 (0)編輯 收藏

               摘要:          有沒有發(fā)現(xiàn)一個問題,我們之前做的所有練習(xí),都沒的權(quán)限管理這個模塊。我們的WEB應(yīng)用中的同一個帳戶可以在多臺機器上同時登陸,每一個用戶可以操作所有功能模塊。這樣在以后的應(yīng)用開發(fā)中是結(jié)對不可行的!          &nb...  閱讀全文

          posted @ 2010-02-03 23:52 長城 閱讀(2624) | 評論 (0)編輯 收藏

           

                  今天重點內(nèi)容是AJAX技術(shù)在教育辦公系統(tǒng)中V層的應(yīng)用,實現(xiàn)的功能有:AJAX分頁查詢、AJAX刪除、AJAX修改。

                  還記得學(xué)習(xí)AJAX時使用JQuery向服務(wù)器發(fā)送請求,并在回調(diào)函數(shù)中將返回的數(shù)據(jù)動態(tài)插入到DOM的某處嗎?Yes,我們今天主要就是玩這個技術(shù)。感覺沒什么好總結(jié)的,就是疊代碼、串代碼,沒什么新鮮東西。


                  但我想說的是看著佟佟搞著代碼,操作著頁面多少有些惡心。因為我以前是做桌面的組件沒這么麻煩,也沒這么靈活,但目標(biāo)都是一樣的——顯示數(shù)據(jù),提供給用戶查詢或編輯。所以我要思考一個問題,將分頁、DAOAJAX操作封裝成像桌面軟件的組件那樣方便易用,其實已經(jīng)實現(xiàn)了通用分頁和DAO。關(guān)于頁面AJAX并不理想,雖然JQuery有很多插件,但從這兩天的內(nèi)容來看插件的操作并不理想,有時間我要為此多研究研究。

                  明天的內(nèi)容比較有吸引力!哈哈!


           

          posted @ 2010-02-02 21:33 長城 閱讀(292) | 評論 (0)編輯 收藏

           

                   每次學(xué)習(xí)項目或者新的知識時,都 不能建立宏觀的了解。中午或者晚上需要回來整理一下,才能對所學(xué)的知識有個宏觀的了解(框架的了解)。我們現(xiàn)在做的這個項目,似乎一直學(xué)習(xí)的是新知識,其實并不是。而是Java的高級用法,它讓我感覺到了Java的強悍。


                   今日重點通用分頁功能,幾乎每一個像樣些的練習(xí)都有分頁功能,它如此重要!今天的分頁功能是通用的,適用于任何WEB應(yīng)用。基于昨天的兩個工具類,今天新添加了一個HibernateDao 擴展了SimpleHibernateDao。這個DAO除了進行常規(guī)的CURD操作,還為我們提供了分頁功能和多條件模糊查詢功能,用起來更方便。

           

                   下面是查詢分頁信息操作的時序圖:


                   (如有需要代碼的,可以給我留言!)   

           

              項目整體上來說并不難,只要抓住了項目的框架和重點內(nèi)容。什么才是最難的?自己動手實踐才是最難的。來傳智播客學(xué)習(xí)已經(jīng)三個月了,我一直堅持著整理學(xué)習(xí)日志,想將每天的學(xué)習(xí)重點都詳細的整理出來,但那根本不現(xiàn)實,因為學(xué)習(xí)內(nèi)容太豐富了。我也有動手去實踐那些重點的內(nèi)容,但效果并不另我滿意。我想我應(yīng)該拿出更多的時間去實踐,但寫日志占用了我大部分時間!

           

                   有失必有得,這都是個人的選擇。我之所以寫日志,是想練習(xí)自己對文章框架和知識結(jié)構(gòu)的整理能力。做為一個優(yōu)秀的程序員,我想這一點是十分重要的。我在這方面得到了一定的提升,別我欣慰。但仍然需要繼續(xù)努力!說心里話,我的文章結(jié)構(gòu)還差的很,因為沒有經(jīng)過細心整理和校驗。

           

                   我想我應(yīng)該靈活的去處理實踐與寫作的時間,當(dāng)實踐變得重要時就應(yīng)該拿出大部分時間給實踐。當(dāng)理論性知識重要時,更應(yīng)該拿出些時間去寫日志。嗯,就這么做吧!還有一個月20天課程就結(jié)束了!

          posted @ 2010-01-31 23:55 長城 閱讀(2056) | 評論 (5)編輯 收藏

               摘要:          東西好多啊,我的編寫進度是跟不上了。把重點日志好好整理一下!以前編寫的練習(xí)主要是練習(xí)基本功,現(xiàn)今的練習(xí)是要是怎么快怎么來。比如分頁功能,以前是靠自己手動一點一點的寫。而如今一個插件搞定,而且功能十分強大。          ...  閱讀全文

          posted @ 2010-01-30 23:11 長城 閱讀(951) | 評論 (0)編輯 收藏

               摘要: 今天是教育辦公系統(tǒng)的第一天,我本以為這個系統(tǒng)是一個全面些,功能強的項目。實際確實如此,功能強大、全面!但我們只需要完成其中的一小部分,核心的部分。其實想想,這么好的一個系統(tǒng),如果真把它做出來并通過測試,我估計至少需要二個月左右的時間。而我們只有9天的時間,這9天的時間將項目的核心部分學(xué)習(xí)一下還是相當(dāng)不錯的。 其實在企業(yè)開發(fā)中,這種規(guī)模的項目是不可以由一個人來完成的。所以從這個角度考慮,我...  閱讀全文

          posted @ 2010-01-30 00:31 長城 閱讀(624) | 評論 (0)編輯 收藏

               摘要: 今日的三大主要內(nèi)容:Spring中的數(shù)據(jù)庫操作事務(wù)、Spring整合hibernate、Spring整合Struts1.X,最來再來一個SSH整合。 數(shù)據(jù)庫操作、數(shù)據(jù)庫事務(wù)管理、hibernate、Sturts,這些大家都已經(jīng)十分熟悉了。所以將他們與Spring整合使課程內(nèi)容比較簡單。Spring的特性是什么?不就是IOC的DI和AOP嗎!簡單在大腦里回顧一下,SSH整合正是使用這些特性。 一...  閱讀全文

          posted @ 2010-01-28 17:23 長城 閱讀(662) | 評論 (0)編輯 收藏

               摘要: 這知識越學(xué)越簡單了。其實現(xiàn)在學(xué)習(xí)的Spring和之前學(xué)習(xí)的Hibernate等框架等,他們的實現(xiàn)都是我們之前學(xué)習(xí)的Java基礎(chǔ)和JavaWeb基礎(chǔ)。再加之做了幾個總結(jié)性的練習(xí),鞏固了基礎(chǔ)。所以現(xiàn)在學(xué)習(xí)起來就比較容易了。 今日的課程內(nèi)容為兩部分:Spring中的AOP面向切面編程和Spring對JDBC的支持。   一、Spring-AOP AOP面向切面編程(Aspect-Orie...  閱讀全文

          posted @ 2010-01-26 22:49 長城 閱讀(374) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 北宁市| 彭山县| 图们市| 邢台县| 华容县| 正宁县| 庐江县| 青川县| 城固县| 金寨县| 西藏| 施秉县| 江华| 涿州市| 青浦区| 凤凰县| 嘉峪关市| 吉木萨尔县| 四会市| 信阳市| 武隆县| 丹凤县| 屯昌县| 禹城市| 开阳县| 儋州市| 莱西市| 沙河市| 北碚区| 桦甸市| 上犹县| 巴楚县| 淮阳县| 沧源| 北海市| 庄浪县| 哈尔滨市| 绥棱县| 西乌珠穆沁旗| 宜宾市| 大新县|