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类:操作证书;
......
-
『问题二』谢涛老师在我的实验二 Java面向对象程序设计博客中提出问题:
如何让代码支持多语言(比如,英文/繁体中文/日文)呢?如果软件需要支持某种新语言的时候,怎样做到只让翻译人员介入,而不需要开发/测试做重复工作呢?
『问题二解决』思考并查阅了相关资料后,大致有了以下思路:用接口把不同语言的资源文件统一起来,抽象出接口,程序中使用接口返回字符串。专门编写一个函数,将此函数做成一个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的文档规范。<!DOCTYPE html>是文档声明;是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小时
(有空多看看现代软件工程课件:软件工程师能力自我评价表)