soarli

Java网络编程课堂笔记
2.21第一次上课今天有幸得到软件专业许鑫老师《网络编程》课程的在线学习资源,笔记在此整理总结。为什么要学习网络编...
扫描右侧二维码阅读全文
21
2020/02

Java网络编程课堂笔记

2.21第一次上课

今天有幸得到软件专业许鑫老师《网络编程》课程的在线学习资源,笔记在此整理总结。

为什么要学习网络编程

image

课程概览

  • 第1章 网络编程概述
  • 第2章 服务端多线程
  • 第3章 线程池
  • 第4章 非阻塞I/O
  • 第5章 UDP通信
  • 第6章 客户机离开逻辑
  • 第7章 SSL安全通信
  • 第8章 邮件客户端
  • 第9章 WebSocket通信
  • 第10章 在线客服系统
  • 第11章 网络爬虫
  • 第12章 Web开发技术
  • 第13章 Servlet
  • 第14章 JSP
  • 第15章 JSTL
  • 第16章 过滤器与监听器

书籍

  • 计算机网络
  • Java网络编程

开发工具

  • Eclipse
  • IDEA

学习目标

  • 理解OSI模型
  • 理解TCP/IP模型
  • 理解 Socket 编程模型
  • Java Socket 编程模型
  • 熟悉网络命令与工具
  • ipconfig、ping、netstat、tracert、WireShark

网络编程概述

两种通信模式

客户-服务器模式

(C/S模式)即Client/Server模式

对等模式

(P2P模式)即 Peer-to-Peer模式。

两种网络协议标准

  • 法律上的(de jure)国际标准OSl并没有得到市场的认可
  • 是非国际标准TCP/IP现在获得了最广泛的应用

TCP/IP常被称为事实上的(de facto)国际标准

套接字编程模型

套接字处于应用层和传输层之间。

image

image

调用 socket 创建套接字

image

服务器套接字工作模式

image

客户机/服务器套接字通信简单示意模型

image

客户机/服务器会话模型

image

Socket编程基础

网络参考模型

image

网络通讯要素

image

TCP和UDP

image

Socket

image

IDEA的使用

创建一个工程:

image

jdk的配置:

image

工程名:

image

设置字体大小:

image

右键即可运行:

image

UDP传输

image

UDP接收端(服务端)

image

UDP发送端

image

image

TCP传输

image

TCP服务端

image

image

TCP客户端

image

image

小结

思考

对于Web服务器而言,当有多个客户端同时访问服务器时,服务端又如何提供服务呢?

image

image

image

2.28第二次上课

多线程通信

1.多线程生活应用场景

售票窗口

卖饭

一对一服务模式,套用到服务器与客户机的工作关系上,当客户机请求服务时,服务器会为每一个客户机立即创建一个新线程,那么这种响应模式就是一客户一线程

2.创建线程方式一

继承Thread类

1.子类覆盖父类中的run方法,将线程运行的代码存放在run中。

2.建立子类对象的同时线程也被创建。

3.通过调用start方法开启线程。

3.创建线程方式二

实现Runnable接口

1.子类实现接口中的run方法。

2.通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。

3.Thread类对象调用start方法开启线程。

思考:为什么要给Thread类的构造函数传递Runnable的子类对象?

一客户一线程工作模型

image

4.服务端多线程

多线程服务端改造

1.继承Thread类

  • 1.1主方法一个主线程
  • 1.2主线程再等到接受到客户端访问请求的时候,再去开辟线程

2.重写run方法

3.改造socket

客户端改造

重复的一直发消息

1.可以通过键盘输入

2.可以重复一直的输入

5.GUI界面设计

image

6.GUI与程序关联

image

7.小结

一客户一线程,主要逻辑集中在服务器这一端。

一般把服务器启动逻辑放在一个线程:启动线程

处理客户机并发连接逻辑放在一个线程:连接线程

与客户机一对一数据交换放在一个线程:会话线程

连接一旦建立,会话线程即创建并启动。有多少连接,即创建多少会话线程。当客户机断开连接时,服务器上对应的会话线程也会结束,连接数减少,线程数随之减少

重点:

1.Socket的多线程改造

2.按照课程框架,改造代码

总结:
由于之前没有学过Java,很多代码看不太懂,接下来还是注重下基本功的学习,顺便把计算机网络学透吧!

3.9第三次上课

第3章线程池

日常生活中存在大量有形无形的排队或拥挤现象,线程池所体现的技术思想与生活中的排队现象一脉相承,根据服务器资源负载能力,预先设定一个比较有效率的客户线程规模,当客户机请求总数超过规模限制时采取排队等候的方法,只有当线程池中的某个或某些线程结束,排队的客户请求才能依次进入线程池得到即时服务。

现实生活的例子

  • 以公司运作比喻。公司等待客户来提交请求;公司有固定数量的正式工以维持运转;旺季业务较多时,新来的客户请求会被排期,比如接单后告诉用户一个月后才能开始服务;当排对人数太多时,为避免用户等太久,公司会通过雇佣一些临时工;如果临时工也忙不过来,公司将决定不再接收新的客户,直接拒单。
  • 线程池就是程序中的“公司”。

线程池的优势

  • 在业务场景中,如果一个对象创建销毁开销比较大,那么此时建议池化对象进行管理.
  • 例如线程,jdbc连接等等,在高并发场景中,如果可以复用之前销毁的对象,那么系统效率将大大提升.
  • 另外一个好处是可以设定池化对象的上限,例如预防创建线程数量过多导致系统崩溃的场景.

线程池的工作模型

image

线程池详解

1.为什么要用线程池

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建、销毁线程造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控

2.JDK线程池

image

image

ExecutorService接口继承了Executor接口,定义了管理线程任务的方法。ExecutorService的抽象类AbstractExecutorService提供了submit、invokeAll()等部分方法实现,但是核心方法Executor.execute()并没有实现。因为所有任务都在这个方法里执行,不同的线程池实现策略会有不同,所以交由具体的线程池来实现。

3.ThreadPoolExecutor 线程池类参数详解

image

当线程池任务处理不过来的时候(什么时候认为处理不过来后面描述),可以通过handler指定的策略进行处理,ThreadPoolExecutor提供了四种策略:

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常;也是默认的处理方式。
  • ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardoldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务可以通过实现RejectedExecutionHandler接口自定义处理方式。

创建线程池

我们可以通过自定义ThreadPoolExecutor或者jdk内置的Executors来创建一系列的线程池

  • newFixedThreadPool:创建固定线程数量的线程池
  • newSingleThreadExecutor:创建单一线程的池,保证任务执行的顺序
  • newCachedThreadPool:创建线程数量自动扩容,自动销毁的线程池(线程数可变,回收,扩容)
  • newScheduledThreadPool:创建支持计划任务的线程池

线程池提交

直接调用executorService.execute(runnable)或者submit(runnable)即可

潜在宕机风险

使用Executors来创建要注意潜在宕机风险.其返回的线程池对象的弊端如下:

  • FixedThreadPoolSingleThreadPoolPool:允许的
    请求队列

长度为Integer.MA X_VALUE,可能会堆积大量的请求,从而导致OOM.

  • CachedThreadPoolScheduledThreadPool:允许的创建线程数量为Integer.
    MAX_VALUE,可能会创建大量的线程,从而导致OOM.

综上所述,在可能有大量请求的线程池场景中,更推荐自定义ThreadPoolExecut or来创建线程池.

线程池大小配置

一般根据任务类型进行区分,假设CPU为N核

  • CPU密集型任务需要减少线程数量,降低线程之间切换造成的开销,可配置线程池大小为N+1.
  • IO密集型任务则可以加大线程数量,可配置线程池大小为N*2.
  • 混合型任务则可以拆分为CPU密集型与I0密集型,独立配置.

自定义阻塞队列与回调接口

主要存放等待执行的线程,ThreadPoolExecutor中支持自定义该队列来实现不同的排队队列.

  • ArrayBlockingQueue:先进先出队列,创建时指定大小,有界;
  • LinkedBlockingQueue:使用链表实现的先进先出队列,默认大小为Integer.MAX_VALUE;
  • SynchronousQueue:不保存提交的任务,数据也不会缓存到队列中,用于生产者和消费者互等对方,一起离开.
  • PriorityBlockingQueue:支持优先级的队列
队列操作:

回调接口:

可以在回调接口中,对线程池的状态进行监控,例如任务执行的最长时间,平均时间,最短时间等等,还有一些其他的属性如下:

  • taskCount:线程池需要执行的任务数量.
  • completedTaskCount:线程池在运行过程中已完成的任务数量.小于或等于taskCount.
  • largestPoolSize:线程池曾经创建过的最大线程数量.通过这个数据可以知道线程池是否满过
  • 如等于线程池的最大大小,则表示线程池曾经满了.
  • getPoolSize:线程池的线程数量.如果线程池不销毁的话,池里的线程不会自动销毁,所以这个大小只增不减.
  • getActiveCount:获取活动的线程数.

自定义拒绝策略

线程池满负荷运转后,因为时间空间的问题,可能需要拒绝掉部分任务的执行.jdk提供了RejectedExecutionHa ndler接口,并内置了几种线程拒绝策略

  • AbortPolicy:直接拒绝策略,默认,丢弃任务并抛出RejectedExecutionException异常。
  • DiscardPolicy:丢弃任务,但是不抛出异常(不推荐)。
  • callerRunsPolicy:调用者自己执行任务策略。调用任务的run)方法绕过线程池直接执行。
  • DiscardoldestPolicy:舍弃最老的未执行任务策略,抛弃队列中等待最久的任务,然后把当前任务加入队列中。

友好的拒绝策略:

  • 保存到数据库进行削峰填谷。在空闲时再提出来执行。
  • 转向某个提示页面
  • 打印日志

自定义拒绝策略:

自定义线程工厂

  • 线程工厂用于创建池里的线程.例如在工厂中都给线程setDaemon(true),这样程序退出的时候,线程自动退出.
  • 统一指定线程优先级,设置名称等等.

关闭线程池

跟直接new Thread不一样,局部变量的线程池,需要手动关闭,不然会导致线程泄漏问题.
默认提供两种方式关闭线程池.

  • shutdown:等所有任务,包括阻塞队列中的执行完,才会终止,但是不会接受新任务.
  • shutdownNow:立即终止线程池,打断正在执行的任务,清空队列.

小结

Executors为我们提供了构造线程池的便捷方法,对于服务器程序我们应该杜绝使用这些便捷方法,而是直接使用线程池ThreadPoolExecutor的构造方法,避免无界队列可能导致的OOM以及线程个数限制不当导致的线程数耗尽等问题。

线程能够充分合理地协调利用CPU、内存、I/o等系统资源,但是线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有空间,在线程销毁时需要回收这些系统资源。频繁地创建和销毁线程会大大浪费系统资源,这时候就需要线程池来管理线程,提高线程的复用。

线程池根据服务器的CPU、内存、网络吞吐能力等关键指标设定适度的线程规模,有助于平衡服务器的负载能力,有助于保障服务器的可靠、持续运行,这正是从实际出发的表现。所以,线程池技术在实践中应用广泛,值得大家深入研究……

线程池的作用:

  • 复用线程、控制最大并发数。
  • 实现定时、周期等与时间相关的功能。·实现任务队列缓存策略和拒绝机制。
  • 隔离线程环境。如:文件上传服务和数据查询服务在同一台服务器上,由于文件上传服务耗时严重,如果文件上传和数据查询服务使用同一个线程池,那么文件上传服务会影响到数据查询服务。可以通过配置独立线程池来实现文件上传和数据查询服务隔离,避免两者相互影响。

3.13第四次上课

第四章:NIO

问题引入

目前的网络模型:

(1)server创建初始化一些预备工作之后,就开始等待客户端clie nt的链接

(2)client 开始链接 server。

(3)server一旦请求到client的请求之后就会开启一个线程去处理。

就好比是公司,每来一个顾客,我们就需要去创建一个线程去处理。如果客户端很多的话,server 就必须要开启很多个Thread去处理。如果请求量很大,这种模式就不太合适了

高并发应用场景

发送文件,多媒体,减少流量

  • JDK1.4后,Java提供了一个全新的1OAPl,即Java Non-Blocking 1O
  • NIO主要有三大核心:Channel(通道),Buffer(缓冲区),Selector。传统10基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是、从通道读取到缓冲区中,或者从缓冲区写入到通道中。通道表示打开到I0设备(例如:文件、套接字)的连接。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。简而言之,Channel负责传输,Buffer负责存储。
  • 好处:单个线程可以监听多个数据通道。

NIO的新特性

核心组件

NIO与IO区别

IO是面向流,NIO是面向缓冲区。
JavaIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。

此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。NIO的缓冲导向方法略有不同。

数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

IO是阻塞,NIo是非阻塞的。
这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到有数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。NIO非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

API1:Channe1

  • Channel和I0中的Stream(流)是差不多一个等级的。只不过stream是单向的,譬如:Inputstream,Out putstream.而Channel是双向的,既可以用来进行读操作,又可以用来讲行写揭作。

NIO中的Channel的主要实现有:

  • FileChannel从文件中读写数据。
  • DatagramChannel能通过UDP读写网络中的数据。
  • SocketChannel 能通过TCP读写网络中的数据
  • serverSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel

分别可以对应文件IO、UDP和TCP(Server和Client)

API2:Buffer

  • NIO中的关键Buffer实现:
    ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer,分别对应基本数据类型:byte,char,doubl e,float,int,long,short。还有MappedByteBuffer,HeapByteBuffer,DirectByteBuffer
  • 在缓冲区中,最重要的属性有三个,它们一起合作完成对缓冲区内部状态的变化跟踪:

position:指定了下一个将要被写入或者读取的元素索引,它的值由get)/put)方法自动更新,在新创建一个Buffer对象时,position被初始化为0。

limit:指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。

capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量。

Buffer 常用操作

API3:Selector

  • selector运行单线程处理多个Channel,如果应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便。例如在一个聊天服务器中。
  • 要使用Selector,向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。
    一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。
  • 仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占田系统的一些资源(如内存)。因此使用的线程越少越好。

IO VS NIO演示

NIO和IO对程序设计的影响

  • API 调用
  • 数据处理
  • 用来处理数据的线程数

通信模型

IO VS NIO

客户端改造

  • 界面设计
  • 逻辑业务设计

1.连接服务器和发送数据分开

2.UI和业务关联

基于NIO的客户端改造

  • 简单的NIO客户端
  • 业务逻辑改造

客户端NIO发送文件

NIO基于通道

1.连接两个通道

SoceketChannel一个通道

FileChannel一个通道

2.Ul体验优化

服务端改造

Selector原理
  • selector类可以用于避免使用阻塞式客户端中很浪费资源的“忙等”方法。例如,考虑一个IM服务器。像QQ或者旺旺这样的,可能有几万甚至几千万个客户端同时连接到了服务器,但在任何时刻都只是非常少量的消息。
  • 需要读取和分发。这就需要一种方法阻塞等待,直到至少有一个信道可以进行I/O操作,并指出是哪个信道。NIO的选择器就实现了这样的功能。一个Selector实例可以同时检查一组信道的I/O状态。用专业术语来说,选择器就是一个多路开关选择器,因为一个选择器能够管理多个信道上的I/O操作。然而如果用传统的方式来处理这么多客户端,使用的方法是循环地一个一个地去检查所有的客户端是否有I/O操作,如果当前客户端有I/O操作,则可能把当前客户端扔给一个线程池去处理,如果没有I/O操作则进行下一个轮询,当所有的客户端都轮询过了又接着从头开始轮询;这种方法是非常笨而且也非常浪费资源,因为大部分客户端是没有I/O操作,
  • selector在内部可以同时管理多个I/O,当一个信道有I/O操作的时候,通知Selector,Selector就是记住这个信道有I/O操作,并且知道是何种I/O操作,是读呢?是写呢?
    还是接受新的连接;所以如果使用Selector,它返回的结果只有两种结果,一种是0,即在你调用的时刻没有任何客户端需要I/O操作,另一种结果是一组需要I/O操作的客户端,这时你就根本不需要再检查了,因为它返回给你的肯定是你想要的。这样一种通知的方式比那种主动轮询的方式要高效得多!
  • 要使用选择器(Selector),需要创建一个Selector实例(使用静态工厂方法open())并将其注册(register)到想要监控的信道上(注意,这要通过channel的方法实现,而不是使用selector的方法)。最后,调用选择器的select()方法。该方法会阻塞等待,直到有一个或更多的信道准备好了I/O操作或等待超时。select()方法将返回可进行I/O操作的信道数量。现在,在一个单独的线程中,通过调用select)方法就能检查多个信道是否准备好进行I/O操作。如果经过一段时间后仍然没有信道准备好,select()方法就会返回0,并允许程序继续执行其他任务。
Selector实现过程:
  • 第一步:创建 Selector
  • 第二步:创建ServerSocketChannel,绑定监听端口
  • 第三步:将Channel设置为非阻塞模式
  • 第四步:将Channel注册到Selector上,监听连接事件
  • 第五步:循环调用Selector的select方法,检测就绪情况
  • 第六步:调用selectedkeys方法获取就绪channel集合
  • 第七步:判断就绪事件种类,调用业务处理方法

3.20第五次上课

这次老师采取了腾讯课堂直播形式上课,全程使用IDEA软件Java代码演示,唯一听得懂的就是使用QQ做了一个基于局域网IP聊天的客户端,同网关人员可以看到其他人上下线的信息与发送的消息。qwq真不知道怎么把全程听得下来的。。

4.18第六次上课

近一个月学过一次,一直没写总结,这次把漏下的课程学一学。

JDBC与SSL安全通信

老师推荐了网站W3Schoolhttps://www.w3school.com.cn),让大家自己学习HTMLhttps://www.w3school.com.cn/html/index.asp)和HTML5https://www.w3school.com.cn/html5/index.aspCSShttps://www.w3school.com.cn/css/index.asp) 。

问题引入

  1. 用户名和密码验证注册登录问题
  2. 用户的登录注册涉及密码安全问题。需要考虑数据传输的加密问题。

SSL广泛应用于Web浏览器Web服务器之间的安全通信。用户每次在网上下单购物或者登陆电子银行,其交易细节都自动进行了一些SSL加密和认证

安全登录、安全注册、信息与文件的安全传输。这里安全注册是指用户的密码在数据库中以加密形式保存,用户的安全登录是指用户的密码从客户机到服务器以加密形式传输。文件的安全传输,是指采用数字签名配合SSL技术来保证文件的真实性、完整性和不可否认性

目标归纳:

  1. 结合JDBC进行用户名和密码的登录验证
  2. 结合SSL开展信息传输的加密,密码传输的加密

JDBC封装改造

  • 数据库操作,每次都写一遍连接过程

    • 不合适
  • 最小原子功能问题

    • 要分层、分离业务逻辑
    • 驱动和数据连接密码放在代码里面也不合适
    • sql注入漏洞
  • 面向对象的概念

登录功能改造

问题分析与解决方案

  • 修改登录验证代码
  • 目的:要实现用户的动态管理

    • 把用户名和密码发送到数据库进行验证

      • 连接数据库
      • 发送验证sQL
      • 根据返回结果往下走
  • 成功,打开聊天界面
  • 失败,重新登录

SSL安全通信

SSL介绍

SSL解决了网络的可靠传输和保密传输的有效技术

Java对SSL协议的支持框架

SSL协议工作过程

公钥/私钥

问题分析与解决方案

步骤1:用keytool生成秘钥

步骤2:客户端和服务端开发

  • 加密工具
  • 安全Socket创建
  • 客户端消息加密处理
  • 服务端接收验证

步骤3安全登录和数据传输改造

  • 要加密的信息进行加密以后再去传输,服务端验证时只需要验证加密后的密码文本就可以,不需要再去验证真正的密码,密码加密传输问题解决
  • 1.实现密码的加密传输密码传输前进行SHA-256加密,传输到服务端后,服务端验证密码是加密后的密码

扩展:发送文件与数字签名

小结

  • 目标1.结合JDBC进行用户名和密码的登录验证

    • JDBC分层的概念思想
  • 目标2.结合SSL开展信息传输的加密

    • 敏感信息的传输必须加密

Web开发概述与环境搭建

问题引入

网络时代目前的GUI版聊天能否改成Web版

  1. 是否有Web版的通信WebSocket、Servlet
  2. 是否能把GUl界面改成网页的形式
  3. 网页制作

HTML、CSS(盒 子模型、选择器)、JavaScript ( Dom操作)

目标归纳:

  1. Web开发与环境搭建
  2. HTTP必须理解掌握(考试考查重要内容)
  3. Web前端界面——HTML(div)+CSS+JS

1.Web开发与环境搭建

程序、软件、软件产品

Web开发涉及知识

WEB服务器

常见的web服务器

Tomcat简介

Tomcat的版本

安装Tomcat

Tomcat启动

常见启动问题

Tomcat目录结构

JavaWEB应用程序

JavaWEB应用的组成结构

WEB应用与桌面应用

HTTP

HTTP的应用

TCP/IP与HTTP

HTTP简介

运行方式

运行原理

请求报文结构

请求报文实例

响应报文结构

响应报文实例

HTTP访问演示

访问细节

HTTP请求的细节——请求头

HTTP请求的细节——请求方式

HTTP响应细节——常用响应头

HTTP响应的细节——状态行

HTTP应用——实现原理

Web前端

DHTML简介

HTML和CSS的关系

  • HTML:页面结构
  • CSS:页面样式表现
  • JavaScript:交互行为

如何编写CSS

CSS语法

CSS简单属性

CSS选择器综述

什么是JavaScript

在什么地方插入JavaScript

JavaScript用途

JavaScript程序

JavaScript基本语法

基本对象

全局对象

如:

事件处理

DOM与BOM

1.Servlet原理

Servlet简介

Servlet在web应用中的位置

执行过程

Servlet的运行过程

Servlet接口实现类

Servlet的一些细节(1)

Servlet的一些细节(2)

Servlet的一些细节(3)

Servlet的一些细节(4)

Servlet的生命周期

Servlet的生命周期(1)

Servlet的生命周期(2)

4.21第七次上课

3.线程安全

Servlet的线程安全

解决并发问题

ServletConfig对象

ServletContext

设置字符集编码:

ServletContext应用

4.Servlet 强化练习

Refresh

应用:

文件下载

Servlet跳转与转发

缓存控制

防盗链

小结:

思考:

多国语言网站实现?
在线用户统计?
单点登录?

作业:

5.12第八次上课

JSP与MVC

问题引入

目标归纳

JSP概述

JSP工作原理

JSP是一种Servlet。

JSP真实开发中应用

JSP语法

JSP模版
JSP表达式
JSP脚本片断
JSP注释
JSP语句
JSP指令
JSP标签
JSP内置对象

JSP元素和模板数据

JSP脚本表达式

JSP脚本片断1

JSP脚本片断2

JSP脚本片断3

JSP注释

JSP声明

JSP语句

JSP指令

Page指令

使用page指令解决JSP中文乱码

include指令

用包含的时候注意HTML元素别重复,特别htmltitle

JSP行为标签

<jsp:include>include指令的比较

JSP运行原理和九大隐式对象

out隐式对象

pageContext对象

通过pageContext获得其他对象

pagecontext作为成对象

引入和跳转到其他资源

映射JSP

JavaBean与MVC

Java Bean概述

JavaBean的属性

在JSP中使用Java Bean

<jsp:useBean>标签

<jsp:useBean>执行原理

带标签体的<jsp:useBean>标签

JSP开发模式

JSP应用

使用include进行模板开发

MVC开发——注册示例

思考:

如何实现记住用户名和密码?
如何实现登录信息的同步?

作业:

5.13第九次上课

JSTL与会话管理

问题引入与目标归纳

EL表达式简介

获取数据(1)

获取数据(2)

执行运算

获得web开发常用对象

使用EL调用Java方法

EL Function开发步骤

开发EL Function注意事项

EL注意事项

EL表达式保留关键字

SUN公司:EL函数库—JSTL

JSTL标签库

会话管理

会话

保存会话数据的两种技术

Cookie技术

Session

Cookie API

Cookie应用

Cookie细节

Cookie应用

显示上次浏览商品的实现过程

session

session案例

使用Session完成用户登陆
利用Session防止表单重复提交
利用Session实现一次性验证码

点“提交之后”按钮变灰

小结:

思考:

  • 如何实现权限和资源的限制访问?
  • 如何实现资源访问统计?

作业:

过滤器与监听器

Filter简介

快速入门

Filter是如何实现拦截的?

Filter开发入/门

Filter的生命周期

FilterConfig接口

Filter常见应用(1)

Filter常见应用(2)

Filter常见应用(3)

Filter常见应用(4)

Filter常见应用(5)

Filter的部署一映射Filter

Fiter的部署一映射Filter示例

监听器

Servlet监听器8个监听4个事件

监听ServletContext域对象创建和毁

编写Servlet监听器

监听HttpSession域对象创建和销毁

Servlet监听器在开发中的应用案例:

监听三个域对象属性变化

感知Session绑定的事件监听器

作业:

5.18第十次上课

邮件开发与文件上传

问题引入与目标归纳

1.文件上传与下载

文件上传概述

文件上传概述

fileupload组件工作流程

核心API-DiskFileltemFactory

文件上传案例

多个文件上传的javascript编码

上传文件的处理细节(1)

上传文件的处理细节(2)

上传文件的处理细节(3)

文件下载

2.邮件开发

邮件服务器

邮件客户端

电子邮件的基本工作原理

SMTP协议概念

SMTP协议命令

POP3协议概念

POP3协议命令

IMAP协议

IMAP协议的优点

IMAP协议缺点

为什么选择JavaMail

JavaMail核心API

发送邮件

发送邮件的基本过程

JavaMail发送邮件步骤总结如下:

JavaMail接收邮件步骤如下:

小结:

作业:

5.23第十一次上课

这次看上看到了老师用Java写了一个爬虫,爬取百度新闻的新闻列表超链接的标题和链接,并把爬到的数据成功存到了数据库,以及网页后台管理发布系统的实现。至于操作,不会。。。

6.3第十二次上课

WebSocket

WebsocketAJAX

技术比较

轮询(polling):

Flash 插件:

Websocket:

开发准备

使用Websocket

编写基础类

CopyOn WriteArrayList

实现收发消息与保存记录

小结:

6.5第十三次上课

反射与注解

反射的引入

什么是反射

Class类和Class类实例

获得Class对象

九个预定义Class对象

Class中-得到构造方法constructor

Class中-得到方法Method

Class中-得到字段Field

Class中-得到注解Annotation

Class中-判断对象类型

从Class中获取信息

使用反射生成操作对象-创建对象

例子

忽略访问权限

使用反射操作对象-调用方法

使用反射操作对象-调用可变参数方法

调用主方法

反射和泛型

反射和泛型-泛型和Cass类

反射和泛型-反射来获取泛型信息

ParameterizedType在泛型DA0

注解

预定义注解

自定义注解

读取注解

最后修改:2020 年 06 月 08 日 11 : 45 PM

发表评论