Servlet3.0特性

在Servlet3.0中可以使用注解来替代配置文件

即:在Servlet3.0中,可以没有web.xml文件

  • 如何知道当前使用的是哪个版本?
    • 在web.xml中有一个属性 version=”“它是可以标识当前是哪个版本。
  • 版本对应关系
    • servlet2.5—- javaee5.0—– tomcat 5.x/tomcat6—-jdk1.5
    • servlet3.0—–javaee6.0—-tomcat7.0—–jdk1.6

特性一之使用注解来替换配置文件

  • @WebServlet(“/hello”)用于配置servlet
  • @WebFilter(“/*”)用于配置Filter
  • @WebListener 用于配置Listener
  • 关于这些注解的一些细节
    • 以@WebServlet(“/hello”)为例
    • 注意:属性urlpatterns与values它们是描述访问当前servlet的路径,但它们不能一起出现,只能只用一个。
<servlet>
    <servlet-name></servlet-name>    ----String name() default "";
    <servlet-class></servlet-class>
    <init-param>-----WebInitParam[] initParams() default{};
        <param-name></param-name>
        <param-value></param-value>
    </init-param>
    <load-on-startup></load-on-startup>----int loadOnStartup() default -1;
</servlet>
  • 在servlet中怎样获取初始化参数
  • ServletConfig对象获取
  • *

特性二之servlet3.0中的文件上传

  • 浏览器端
    • method = post
    • encType=”multipart/form-data”
    • 使用<input type="file" name="f">
  • 服务器端
    • servlet3.0 完成
      • 要在servlet添加@MultipartConfig, 表示接收multipart/form-data请求
      • 在Servlet中要想得到上传信息,通过request对象获取一个part对象
        • part part = request.getPart();
        • part.write(String filename);
        • 问题1:关于上传文件中文名称乱码问题
          • 因为上传是post请求,直接使用post乱码解决方案就可以 request.setCharaterEncoding(“utf-8”);
        • 关于获取上传文件名称
          • 通过Part获取一个header
          • String cd = part.getHeader(“Content-Disposition”);
          • 在这个header中包含了上传文件名称,直接截取就可以。
          • String filename = cd.substring(cd.lastIndexOf(“\”) + 1,cd.length()-1);
        • 如果多文件上传怎么处理
          • request.getParts();

特性三之servlet3.0中异步处理

  • 本质是在服务器端开启一个线程,来完成其它的操作
  • 必须在注解添加一项
    • @WebServlet (value = “/reg”,asyncSupported = true)
    • asyncSupported = true ,代表当前servlet支持异步操作
  • 需要一个异步 上下文对象,通过这个对象,可以获取request,response对象
    • AsyncContext context = reg.startAsync();
    • 还可以对异步上下文进行监听,在它的监听器方法中有一个onComplete,可以用来判断结束。

动态代理

代理模式

  • 代理模式作用:
    • 屏蔽真是行为的访问,让程序更加安全
    • 可以对真实行为的调用进行控制
  • 代理模式实现
    • 代理类与被代理类要实现同一接口或继承同一个类
    • 在代理类里,持有被代理对象
    • 在代理类中调用被代理的行为 ‘’
  • AOP:面向方面的编程
    • AOP的底层实现就是通过动态代理来做到的

动态代理

  • 它就是在代理模式基础上发展的,他不再是对单一的类型进行代理,而是可以对任意的一个实现了接口的类的对象做代理。

动态代理实现

  • 有两种方式
    • 通过jdk中提供的Proxy类来实现
      • 这种方式要求,被代理类必须实现接口。即只能为接口做代理
    • 通过cglib来实现
      • 它不要求实现接口

第一种代码实现

  • java.lang.reflect Proxy
  • public class Proxy extends Object implements Serializable
  • Proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类、
  • Proxy类的一个方法
    • newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h);
    • 参数:
      • loader
        • 要求,传递的是被代理类的类加载器ClassLoader
        • 类加载器的获取:得到其Class对象。在Class类中提供了一个getClassLoader()
      • interfaces
        • 要求:得到被代理对象所实现的接口的所有Class对象
        • 获取所有实现接口的Class对象:得到其Class 对象,在Class类中提供一个方法,getInterface();它返回的是一个Class[].就代表所实现接口的所有Class对象。
      • h
        • 它的类型是InvocationHandler,这是一个接口。
        • InvocationHandler,是代理实例的调用处理程序 实现的接口。

猜你喜欢

转载自blog.csdn.net/u011301372/article/details/80959117