Javaweb学习笔记——(二十八)——————Servlet3.0、动态代理、类加载器
web最后一天:完了。
Servlet3.0
一、要求
1.MyEclipse10.0或以上版本
2.发布到Tomcat7.0或以上版本
二、步骤
1.创建JavaEE6.0应用
三、概述
*注解代替web.xml配置文件
*异步处理
*对上传的支持
四、注解代替配置文件
1.删除web.xml
2.在Serlvet类上添加@WebServlet(urlPatterns={"/AServlet"})
总结:
*注解好处:配置信息少
*注解缺点:不方便修改
3.在Filter类上添加@WebFilter(urlPattern="/AFilter")
4.在Listener类上添加@WebListener
五、异步处理
1.什么是异步处理
在服务器没有结束响应之前,浏览器是看不到响应内容,只有响应结束时,浏览器才能显示结果,
现在异步处理的作用:在服务器开始响应后,浏览器就可以看到响应内容,不用等待服务器响应结束
2.实现异步的步骤
*得到AsyncContext,它异步上下文对象
AsyncContext ac = request.startAsync(request, response);
*给上下文一个Runnable对象,启动它。(给上下文一个任务,让它完成)
ac.start(new Runnable() {
public void run() {
...
}
});
*@WebServlet(urlPatterns="/AServlet", asyncSupporte=true)
*response.setContentType("text/html;charset=utf-8");
*IE如果不能正常输出,这说明响应体大小不足512B,那么你需要多输出点内容。
*AsyncContext#complete():通知Tomcat我们异步线程已经执行结束了。这让Tomcat才会及时的断开与浏览器的连接。
六、上传支持
1.上传
*上传对表单的要求:
>method="post"
>enctype="multipart/form-data",它的默认值是:application/x-www-form-urlencoded
><input type="file" name="不能为空"/>
*上传Servlet的使用:
>requset.getParameter()不能再用
>requset.getInputStream()使用它来获取整个表单的数据
*commons-fileUpload
>创建工厂
>解析器
>使用解析器来解析request对象,得到List<FileItem>
=========================
Servlet3.0对上传提供了支持
*表单不变
*在Servlet中不需要再使用commons-fileUpload,而是使用Servlet3.0提供的上传组件接口
========================
上传的步骤:
*使用request.getPart("字段名"),得到Part实例
*Part:
>String getContentType():获取上传文件的MIME类型
>String getName():获取表单项的名称,不是文件名称
>String getHeader(String header):获取指定头的值
>long getSize():获取上传文件的大小
>InputStream getInputStream():获取上传文件的内容
>void write(String fileName):把上传文件保存到指定路径下
*默认Servlet是不支持使用上传组件:需要给Servlet添加一个注释:@MultipartConfig
它没有提供获取上传文件名称的方法:
*这需要我们自己从Content-Disposition头中截取。
动态代理:
1.只学一个方法:
方法的作用:在运行时,动态创建一组指定的接口的实现类对象(在运行时,创建实现了指定的一组接口的对象)
interface A {
}
interface B {
}
Objcet obejct = 方法(new Class[]{A.class, B.class})
object 它实现了A和B两个接口
Objcet proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[]interfaces, InvocationHandler h);
1.方法作用:动态创建实现了interfaces数组中所有指定接口的实现类对象
参数:
1.ClassLoader:类加载器
*它是用来加载器的,把.Class文件加载到内存,形成Class对象
2.Class[] interfaces:指定要实现的接口们
3.InvocationHandler:代理对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。
---------------------------------------------------
2.动态代理作用
最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活
-------------------------------------------------
InvocationHandler
public Object invoke(Objcet proxy, Method method, Object[] args);
这个invoke()方法在什么时候调用
1.在代理对象被创建就时?错误
2.在调用代理对象所实现接口中的方法时?正确
*Object proxy:当前对象,即代理对象。在调用谁的方法
*Method method:当前被调用的方法(目标方法)
*Object[] args:实参
--------------------------------------------------
目标对象:被增强的对象
代理对象:需要目标对象,然后在目标对象上添加了增强后的对象
目标方法:增强的内容
代理对象 = 目标对象 + 增强
类加载器
1.什么是类加载器
*把.class文件加载到JVM的方法区中,变成一个Class对象
2.得到类加载器
*Class#getClassLoader()
3.类加载器的分类
*引导:类库
*扩展:扩展jar包
*系统:应用下的class,包含开发人员写的类,和第三方的jar包,classpath下的类
系统类=加载器的上层领导:扩展
扩展类加载器的上层领导:引导
引导没上层,它是BOSS
4.类加载器的委托机制
*代码中出现了这么一行:new A();
>系统发现了自己加载的类,其中包含了new A(),这说明系统去加载A类
>系统会给自己的领导通知:让扩展去自己的所属加载A类
>扩展会给自己的领导通知:让引导去自己的地盘加载A类
>引导自己真的去rt.jar
中寻找A类
*如果找到了,那么加载,然后返回A对应的Class对象给扩展,扩展也会它这个Class返回给系统,结束了。
*如果没找到:
>引导给扩展返回一个null,扩展会去自己的所属,去寻找A类
*如果找到了,那么加载之,然后返回A的对应的Class对象给系统,结束了
*如果没找到
>扩展返回一个null给系统了,系统去自己的地盘(应用程序下)加载A类
*如果找到了,那么加载之,然后返回这个Calss,结束了
*如果没找到,抛出异常ClassNotFoundException
5.类的解析过程
class MyApp{//被系统加载
main(){
A a = new A();//也由系统加载
String s = new String();//也由系统加载
}
}
class String {//引导
private Integer i;//直接引导加载
}
=========================================
6.自定义类加载器
*继承ClassLoader
*重写findClass()
========================================
7.Tomcat的类加载器
Tomcat提供了两种类加载器
*服务器类加载器:${CATALINA_HOME}\lib,服务器类加载器,它负责加载这个下面的类
*应用类加载器:${CONTEXT_HOME}\WEB-INF\lib、${CONTEXT_HOME}\WEB-INF\classes、应用类加载器它负责加载这两个路径下的类
引导
扩展
系统
特性:
服务器类加载器:先自己动手,然后再去委托
应用类加载器:先自己动手,然后再去委托
Javaweb学习笔记——(二十八)——————Servlet3.0、动态代理、类加载器的更多相关文章
- Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式
事务 什么是事务? 转账: 1.给张三账户减1000元 2.给李四账户加1000元 当给张三账户减1000元之后,抛出了异常,这 ...
- Java学习笔记二十八:Java中的接口
Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
- javaweb学习总结(二十八)——JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- JavaWeb学习笔记(十八)—— DBUtils的使用
一.DBUtils概述 1.1 什么是DBUtils commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbuti ...
- angular学习笔记(二十八-附2)-$http,$resource中的promise对象
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
- angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
- angular学习笔记(二十八-附1)-$resource中的资源的方法
通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,$save,$delete,$remove,可以直接调用来保存该资源: 比如有一个$resour ...
- PHP学习笔记二十八【抽象类】
<?php //定义一个抽象类.主要用来被继承 //如果一个类继承了抽象类,则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类) // abstract class Animal{ pub ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
随机推荐
- 堡垒机paramiko模块
paramiko简介: 模拟ssh客户端,使用ssh协议,基于sftp协议等做批量管理.例如处理用ssh登陆一千台机器执行同一个命令,或下载上传文件等需求 基于用户名密码登录执行命令: import ...
- Mac下的效率工具autojump
(转) IDE 用起来总是得不到满足,Mac 适合搞开发,我也十分喜欢 Mac 系统,当然可以说喜欢 Unix/Linux 系统.今天在 .zshrc 文件中添加了这么几行快捷命令: alias go ...
- copy 和 deepcopy的区别
import copy a = [1, 2, 3, 4, ['a', 'b']] b = a # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变 c = copy.copy(a) # 浅复制, ...
- PHP性能优化:in_array和isset 在大数组查询中耗时相差巨大,以及巧妙使用array_flip
今天在PHP业务开发中,发现了一个问题. 两个较大数组(20万+元素),遍历其中一个$a,另一个数组$b用于查找元素. 比如 foreach($a as $val){ if(in_array($xx, ...
- ABP大型项目实战(2) - 调试与排错 - 日志 - 查看审计日志
这是<ABP大型项目实战>系列文章的一篇. 项目发布到生产环境后难免会有错误. 那么如何进行调试和排错呢? 我看到俱乐部里有人是直接登陆生产服务器把数据库下载到开发机器进行调试排错 ...
- AI要被祭天了!删Bug,删着删着把全部代码都删了
近日,美国版的“大众点评”,本想训练 AI 来消除 bug,结果它把所有内容删除了... Yelp 在其最新更新的 App 中写道: “我们为本周使用该app遇到问题的用户致歉.我们训练了一个神经网络 ...
- OpenStack-Neutron(5)
一. Neutron 概述 SDN(software-defined networking)软件定义网络,其所具有的灵活性和自动化优势使其成为云时代网络管理的主流. Neutron的设计目标是实现“网 ...
- 初次使用Mybatis
目录 mybatis简介 导入jar包 创建数据库以及数据库表 创建实体类 创建mapper.xml文件 配置mybatis 测试mybatis 三种查询方式 selectOne selectList ...
- Lodop的TABLE中format格式化的使用
LODOP中的ADD_PRINT_TABLE支持很多函数和计算方法,可以用tdata对table表格里额数据进行计算,用format对结果进行格式化.这个format只能和tdata搭配使用,不能单独 ...
- Lodop打印控件传入css样式、看是否传入正确样式
Lodop中可以传入页面存在的css样式,也可以是拼接后的新样式,例如本博客的其他博文:Lodop打印如何隐藏table某一列 需要打印的页面,样式不一定都是行内样式,style样式单独写在页面上,或 ...