20155303 2016-2017-2 《Java程序設計》第十周學習總結


20155303 2016-2017-2 《Java程序設計》第十周學習總結

目錄

學習內容總結

網絡編程

一、概述

  • 應用層協議使用了傳輸層的協議。傳輸層常見的兩種協議是TCP和UDP。
  • Java提供了類來封裝應用層協議。
  • HTTP是允許Web服務器和瀏覽器之間通過互聯網發送和接收數據的協議。
  • 一次HTTP請求包含3各部分:①方法——統一資源標識符(URI)——協議/版本;②請求頭;③請求實體。
  • URL(統一資源定位符)是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標准資源的地址。互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。

二、java.net.URL

  • 在Java中,一個URL通過一個java.net.URL對象來表示。可以通過調用URL類的構造方法來構建一個URL。手冊中提到的URL構造方法有以下幾個:

  • 可以使用URL類的getFile()getHost()getPath()getPort()getProtocol()getQuery()等方法來獲取一個URL的各個部分。
  • 可以使用URL類的openStream方法讀取一個Web資源。

三、java.net.URLConnection

  • API手冊顯示,URLConnection類沒有公共的構造方法,因此無法使用new關鍵字構造URLConnection實例。要獲取實例需要在URL對象上調用openConnection方法。
  • URLConnection類的兩個字段doInput(默認值是true)和doOutput(默認值是false),分別表示URLConnection是用於讀還是寫。可以使用setDoInput和setOutPut方法來設置doInput和doOutput的值。

四、java.net.Socket

  • 套接字是一個網絡鏈接的端點。套接字使得應用程序能夠從網絡讀取或者向網絡寫入信息。
  • 創建一個套接字,可以使用如下構造方法Socket(String host, int port)。其中,host是遠程機器名或IP地址,port是遠程應用程序的端口號。
  • 可以調用Socket類的getOutputStream方法獲取一個java.io.OutputStream對象,用來發送字節流;從返回的OutputStream對象構建一個java.io.PrintWriter對象,向遠程應用程序發送文本。

五、java.net.ServerSocket

  • Socket表示一個“客戶端”套接字,而ServerSocket是服務器套接字的一個實現。
  • 要創建服務器套接字,需要使用ServerSocket類提供的構造方法之一,其具有以下簽名:public ServerSocket(int port,int backlog,InetAddress bindAddr)。注意,該構造方法綁定的地址必須是java.net.InetAddress類的一個實例。

數據庫

『常用命令總結如下』(To Be Continued...)

  • CREATE DATABASE <數據庫名字>;——創建一個數據庫
  • show databases;——顯示數據庫
  • use <數據庫名字>——連接數據庫
  • show tables;——查看當前數據庫里有幾張表
  • CREATE TABLE 表的名字(列名a 數據類型(數據長度)...);——在數據庫中新建一張表
  • SELECT * FROM 表的名字;——查看表中的內容
  • INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);——向表中插入數據

返回目錄

教材學習中的問題和解決過程

  • 『問題一』Java API支持的加密算法都有哪些呢?
  • 『問題一解決』
  • MessageDigest類:構建MD5、 SHA等摘要算法;

  • Mac類:構建HMAC算法;

  • Cipher類:構建DES、 AES、Blowfish對稱加密算法, 以及RSA、 DSA、 DH等多種非對稱加密算法;

  • Signature類:數字簽名和簽名驗證;

  • Certificate類:操作證書;

如何讓代碼支持多語言(比如,英文/繁體中文/日文)呢?如果軟件需要支持某種新語言的時候,怎樣做到只讓翻譯人員介入,而不需要開發/測試做重復工作呢?

  • 『問題二解決』思考並查閱了相關資料后,大致有了以下思路:用接口把不同語言的資源文件統一起來,抽象出接口,程序中使用接口返回字符串。專門編寫一個函數,將此函數做成一個dll文件。根據需要調用函數,將相應語言的dll載入即可。這樣一來,只需要讓翻譯人員介入,而開發/測試就不用做重復工作了。

之后婁老師提醒:

不用這么復雜,教材上就有例子。

決定回歸教材,再學習一遍。

課本第十五章有關於“國際化”的講解,可以在不修改應用程序的情況下,根據不同用戶直接采用不同語言、日期、格式等等。為我這個問題的解決提供了思路。

學習之后了解到,java.util.ResourceBundle可以方便地處理多個語言環境,翻譯成不同的語言。所以,將不同的語言寫成.properties文檔放在src文件夾里,在程序中使用Local指定language與country,再通過getBundle()調用所需語言,取得相應的.properties中的信息,就可以根據不同的用戶采用不同的語言,實現國際化了。

基於對課本的理解進行以下嘗試:

運行結果符合期望。但過程中出現了一點小問題:課本上說使用native2ascii -encoding Big5可以將.txt轉化為.properties。

但是轉換之后發現.properties里的ASCII碼值對應過來是中文亂碼,並不是.txt里的中文。

查閱資料了解到,在繁體中文Windows操作系統中,ANSI編碼代表Big5,而在簡體中文Windows操作系統中,ANSI 編碼代表 GBK 編碼。所以我的默認編碼應該為GBK,並不是Big5,重新嘗試之后.properties里的ASCII碼就與中文對應上了。

返回目錄

代碼調試中的問題和解決過程

  • 『問題一』讀取Web資源打印出的網頁的內容如下:

各個部分都是什么含義呢?

  • 『問題一解決』這個是HTML5的文檔規范。是文檔聲明;是HTML5中心的語言規范,之前也學習過,分別表示語言編碼與地區編碼;是頭部開始; 為網頁提供了一種編碼方式,說明整個文檔的語言是國際通用的utf-8。

  • 『問題二』在課本P234中的HttpServer程序中使用Response類提示出現以下錯誤(其實是因為我還沒有編寫Response類,只是想看一看IDEA中的錯誤提示...):

  • 『問題二解決』IDEA提示要導入javax.xml.ws.Response,於是我就按照它的要求導了包,還是報錯:

這次提示“Response”是抽象接口,不能被實例化。那么,javax.xml.ws.Response究竟是什么呢?查詢了Java EE標准文檔,說明如下:

這...很明顯這不是我們想要的Response,所以重新定義Response類以及其中的方法,問題得到解決。

  • 『問題三』

第二次課堂實踐課的題目中,需要調用Integer類的parseInt()方法。可是有些同學不能正常調用Integer的各種方法,如下圖:

我們討論之后還是不太清楚原因,於是我打算通過實踐深入研究一下。

  • 『問題三解決』

我注意到這位同學其他package里的Integer類的各種方法都可以調用,所以應該是當前package的問題。

將其他package里的程序拷貝過來,出現了這樣的提示:The code fragment which you have pasted uses classes that are not accessible by imports in the new context.Select classes that you what to import to the new file.

選擇OK導入包即可。

可是為什么在這個package里調用parseInt()方法就需要導包呢?當前package究竟特殊在哪里呢?請教了老師,老師說因為我們在實驗二定義了自己的Integer等類,與Java重名了,就和兩個班有重名的同學一樣,區分必須加上班級名,因此要加上包名。為了避免這種現象,不同的實驗最好放在不同的package里。

這樣一來,以上的疑問就都解決了。

返回目錄

代碼托管

返回目錄

上周考試錯題總結

『問題』課本第十章哪一個程序體現了OCP和DIP原則?

『解答』OCP是OOD中最重要的一個原則,OCP的內容是:

  • software entities (class, modules, function, etc.) should open for extension,but closed for modification.
  • 軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。

OCP可以用以下手段實現:(1)抽象和繼承,(2)面向接口編程。

DIP的內容是:

  • High level modules should not depend upon low level modules. Both should depend upon abstractions
  • Abstractions should not depend upon details. Details should depend upon abstractions
  • 高層模塊不應該依賴於低層模塊。二者都應該依賴於抽象
  • 抽象不應該依賴於細節。細節應該依賴於抽象

通過接口或者抽象類,DIP在應用中通過依賴注入的方式實現解耦,重用低級模塊,重用實現,解除依賴。

課本第十章P312的BufferedIO程序打包了InputStream和OutputStream進行裝飾,體現了OCP和DIP原則。

返回目錄

結對及互評

結對對象:20145202馬超

結對學習內容:解決對方學習過程中遇到的問題,並一起學習探討實驗三的內容。

返回目錄

學習感悟及思考

到目前為止,Java的基本內容已經過了一遍,對這門語言也有了一個大致的了解。但在實踐過程中,還不能做到得心應手,所以在今后的學習中要注重實踐,經常利用學到的知識解決問題,才能有更深的理解。

另外,隨着對自己所做項目的進一步深入學習,學科之間千絲萬縷的關系逐漸浮現出來。數據結構、密碼學、計算機網絡、數論、程序設計、物聯網甚至金融學的相關知識都在其中體現。小孔中窺探到的互聯網金融世界竟如此璀璨,讓我們深深着迷。路行致遠,邁出了開始的一小步,一個神奇而又充滿未知的世界正在等待我們叩響大門。

返回目錄

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 16/16 1/1 18/18 初步認識了Java
第二周 219/235 1/2 28/46 學習了Java的基本語法知識
第三周 766/1001 1/3 23/69 了解對象與參考的關系,以及封裝的概念與實現
第四周 984/1985 1/4 18/87 學習了繼承與多態的關系,以及接口的多態操作
第五周 866/2851 1/5 12/99 學習了異常處理,學會使用Collection收集對象
第六周 664/3515 1/6 15/114 認識字節流和字符流的繼承架構,學習線程與並行API
第七周 469/3984 2/8 13/127 認識Date與Calender
第八周 315/4299 1/9 15/142 學習了NIO、日志、正則表達式等內容,復習第六章“繼承與多態”和“Linux 目錄結構及文件基本操作”
第九周 553/4852 2/11 20/142 學習了數據庫、反射與類加載器、自定義泛型枚舉與注釋等內容,復習常用命令join、cut、split和sort
第十周 343/5195 1/12 18/160 初步學習了網絡編程和數據庫常用命令,學會使用Java實現一些密碼學算法

嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計為什么這么難軟件工程 估計方法

  • 計划學習時間:15小時

  • 實際學習時間:18小時

(有空多看看現代軟件工程課件:軟件工程師能力自我評價表)

返回目錄

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM