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、动态代理、类加载器的更多相关文章

  1. Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式

    事务     什么是事务?         转账:             1.给张三账户减1000元             2.给李四账户加1000元 当给张三账户减1000元之后,抛出了异常,这 ...

  2. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  3. Java基础学习笔记二十八 管家婆综合项目

    本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...

  4. javaweb学习总结(二十八)——JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  5. JavaWeb学习笔记(十八)—— DBUtils的使用

    一.DBUtils概述 1.1 什么是DBUtils commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbuti ...

  6. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

  7. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  8. angular学习笔记(二十八-附1)-$resource中的资源的方法

    通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,$save,$delete,$remove,可以直接调用来保存该资源: 比如有一个$resour ...

  9. PHP学习笔记二十八【抽象类】

    <?php //定义一个抽象类.主要用来被继承 //如果一个类继承了抽象类,则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类) // abstract class Animal{ pub ...

  10. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

随机推荐

  1. Python基础之协程

    阅读目录 一 引子 二 协程介绍 三 Greenlet模块 四 Gevent模块 引子 之前我们学习了线程.进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU调度的最小单位. 按道 ...

  2. RabbitMQ持久化

    我们知道,如果消息接收端挂了,消息会保存在队列里.下次接收端启动就会接收到消息. 如果RabbitMQ挂了怎么办呢?这时候需要将消息持久化到硬盘 消息发送端:producer ........... ...

  3. 使用github 的相关博客

    基于hexo+github搭建一个独立博客     如何用Github的gh-pages分支展示自己的项目     使用git clone error: RPC failed     Git的使用-- ...

  4. 用 C# 编写 C# 编译器,先有鸡还是先有蛋?

    前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译 ...

  5. HTTP常见错误返回状态代码

    当⽤用户试图通过HTTP或FTP协议访问⼀一台运⾏行行主机上的内容时,Web服务器器返回⼀一个表示该请求的状态的数字代码.该状态代码记录在服务器器⽇日志中,同时也可能在Web 浏览器器或 FTP客户端 ...

  6. JS 面向对象 ~ 继承的7种方式

    前言: 继承 是 OO 语言中的一个最为人津津乐道的概念.许多 OO 语言都支持两种继承方式:接口继承 和 实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在 ...

  7. Mantis中文网

    Mantis中文网 | Mantis安装.Mantis使用.Mantis中文http://www.mantis.org.cn/ Mantis Bug Tracker | Demohttp://www. ...

  8. JS实现刷新页面后回到记录时滚动条的位置

    window.onbeforeunload = function () { var scrollPos; if (typeof window.pageYOffset != 'undefined') { ...

  9. BZOJ4241历史研究——回滚莫队

    题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...

  10. 使用@property

    @property装饰器就是负责把一个方法变成属性调用的,既能检查参数,又可以用类似属性这样简单的方式来访问类的变量 class Student(object): @property def scor ...