Servlet 3.0 特性
Servlet3.0 新特性 ----- 对于web 开发很有用的 ---- JavaEE6 最新开发工具
1、web.xml 关于 Servlet 、Filter、Listener 通过注解进行配置
2、服务器异步处理机制
3、集成文件上传API
安装eclipse3.7 和 tomcat7.0
启动Eclipse 版本必须和 JDK版本 位数匹配
启动错误 eclipse.ini -Xmx512m 尝试 修改256 或者 128
在Eclipse集成tomcat 编写web工程
1、创建Dynamic web project --- 配置target runtime 运行环境 tomcat
* eclipse目录默认 没有WebRoot 目录 --- 有WebContent
2、eclipse和my eclipse发布方式不同
* myeclipse 将目录复制tomcat/webapps
* eclipse 内部有tomcat插件,将web目录复制插件目录/webapps
* 自动生成Servers工程目录 --- 保存tomcat启动需要配置文件
1、3.0 web 工程没有web.xml
@WebServlet("/hello")
@WebFilter("/hello")
@WebListener
* 当你配置欢迎页面、错误页面 编写web.xml
* metadata-complete web-app元素的属性 设置为true 将不支持注解技术
2、异步处理支持
运行服务器端对Response 用多个线程统计信息响应生成
* 作用 改善用户体验
3、内部提供一套API 完成文件上传
编写文件上传form 表单
在服务器端Servlet 中 @MultipartConfig
* getParameter位于getPart操作之前 --- 必须先处理普通form域,再处理上传域
动态代理价值: 当.class文件 被类加载器加载 到内存 形成Class对象,所有程序访问都是针对Class对象 ,动态代理技术可以根据Class对象的实现接口,在内存中虚拟构造一个对象,该对象成为代理对象,访问真实对象的所有API的过程中 都将通过代理对象去访问 。
* 拦截对真实对象的访问 修改访问参数、拦截访问请求
* Java Spring 内部拦截器技术 -- 使用动态代理
动态代理案例
1、编写真实业务对象
2、使用动态代理,必须为真实对象提供一个接口
3、使用Proxy的newInstance 根据真实业务对象,创建代理对象
4. 根据代理对象取间接访问真实对象
5、拦截真实访问后,阻止对目标访问、修改参数、修改返回值
银行取钱案例 ATM : 取款手续费用
真实业务对象如果想动态代理,生成代理对象 -------- 实现接口
* 在实际企业开发中,动态代理经常用于加强方法原来逻辑功能 ---- 无需修改原来程序逻辑,就可以实现方法增强
线程和进程区别 ?一个进程是多个线程组成的,进程是操作系统管理内存最小单位,线程使用内存,从进程申请
线程的创建有两种方式:extends Thread、implements Runnable接口
* 获得当前线程的名字 Thread.currentThread().getName();
* 优先使用Runnable 接口 ---- 因为java单继承,如果继承Thread 就不能继承其他类
线程的四种状态:创建(new Thread().start())、执行状态 (线程run方法正在运行)、阻塞状态(run方法在执行一段时间后暂停执行)、线程死亡(run方法执行结束、发生异常)
* 新建 --- 运行 (获得cpu的使用权)
* 运行 --- 阻塞 (Thread.sleep join 使用同步锁 wait IO读写、网络传输)
* 阻塞 --- 运行 结束阻塞,重新获得cpu使用权
sleep 使当前线程睡眠一段时间,睡眠过程中,不释放锁资源
join 等待目标线程执行结束后,当前线程才能继续执行
同步锁,当运行一个代码块,使用同步锁机制,一个线程已经将代码块锁定,另一个线程无法进入代码块 ---- 执行等待锁
wait 当你获得一个同步锁后,选择在锁上面监视器进行等待,等待必须由别人进行 唤醒 notify notifyAll
锁:保证一段程序同一时间只能由一个线程进行执行 ---- 阻止两个线程同时执行一段代码
* java中每个对象都可以作为锁 ----- 锁的本质,锁定一块内存地址
* 特殊锁 锁定方法
public static synchronized void a() {} ---- 锁定 类的Class对象
public synchronized void b() {} --- 锁定this 对象
同步锁案例 : 售票系统 模拟火车站多个售票窗口同时售票 ---- 确保同一个时间 只能有一个窗口打票
死锁原因:互相等待 ------ 同步代码块嵌套
* 尽量同步代码块不要嵌套
锁监视器操作 ----- java中所有对象都可以作为锁,java 中 Object类 提供 wait notify notifyAll
wait :当前线程 在锁对象的监视器上进行等待
notify : 唤醒 一个 在 指定锁对象的监视器上等待的线程
notifyAll : 唤醒所有在指定 锁对象的监视器上等待的线程
* 线程通信案例 (当两个线程协同完成某个任务 )---- 生产者消费者模型
生产者消费者场景 :一个生产者、一个消费者,生产者生产一个面包,通知消费者来吃,消费者吃完了,通知生产者生产
* 生产者发现面包还没吃 需要等待
* 消费者发现面包已经吃了 需要等待
JDK5.0 之后提供两个接口 Lock 和 Condition ,简化同步和锁编程
java.util.concurrent.locks.Lock ---- 取代 synchronized
java.util.concurrent.locks.Condition ---- 取代 wait notify
* 在同一个锁上面 建立多个监视器
java.util.concurrent 包 和 子包 ---- ArrayBlockingQueue<E> CopyOnWriteArrayList<E> LinkedBlockingQueue<E>
线程池技术 Excutors
为什么用线程池,线程创建、关闭释放资源 ---- 消耗程序性能
一次创建多个线程,做任务,随机获得一个线程,完成任务,将线程归还线程池
newFixedThreadPool(int nThreads) 固定线程数量线程池
newCachedThreadPool() 返回根据程序需要自动扩充大小 线程池 ----- 最常用
newSingleThreadExecutor() 返回单线程处理程序
shutdown与shutdownNow的比较
shutdown 完成当前线程池中所有任务 再关闭
shutdownNow 会对当前线程池中所有线程,调用interrupt 尝试打断当前线程,如果无法打断,会执行结束
------------------------------------------------------------------------------------------------------------------
OSI 七层体系结构: 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
*协议层次越高,越容易让人理解, 层次越低,数据越接近0 1
TCP/IP 四层 : 应用层、传输层、网际层、网络接口层
应用层、传输层
应用层:HTTP SMTP POP3 FTP TELNET
传输层:TCP(不允许丢包 三次握手) UDP(广播 允许丢包)
三次握手:
A 向 B 发送一个消息:能听到我说话吗
B 回复 A 消息:我能听到,你能听到我说话吗
A 回复 B :我能听到
TCP发送数据没有收到对方回应,选择重新发送 ---- 时间限制 超时
Socket 两台计算机之间一个连接 ---- 两台计算机可以通信
使用socket建立双方连接 -----传输协议需要自己编写 面向底层协议
socket 编写程序 可以模拟服务器,可以模拟客户端
服务器如何编写
* 使用socket进行通信过程中,如果调用in.readLine 但是对方没有写 ---- 程序一直等待 、out.print向对方发送信息 没有阻塞
socket 案例 ----- 模拟tomcat服务器
---------------------------------------------------------------------------------------
注解的使用 ---- 定义注解,利用反射解析注解内容 (案例:银行转账最大金额)
Servlet3.0 注解开发Servlet、异步技术、文件上传
动态代理 (案例:德华案例、银行取款 收取手续费用)
多线程:两种线程创建方式、四种状态、同步和锁、死锁、wait和notify (案例:卖票、生产蛋糕) ---- 使用JDK5 Lock和Condition 重写
socket编程 服务器怎么写 客户端怎么写
* 实际socket案例 按照协议发送内容 模拟tomcat 服务器 遵循HTTP协议