在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,是代理实例的调用处理程序 实现的接口。