第3.61课 上课 Servlet深入介绍, Servlet3.1介绍
3_61

Servlet深入介绍
Servlet3.1介绍
Servlet3.*版本和Servlet2.5版本的区别
注解:
在3.0之前,每增加一个Servlet、Filter、Listenrer都需要修改web.xml。
在3.0之后,不需要,可以通过注解(Annotation)来实现配置。
文件上传:
使用Servlet3.0以上版本可以自动实现文件上传,不需要第三方jar包
在之前需要第三方jar包
开发Servlet3.0的程序需要的开发环境支持
JDK 1.6+
Tomcat 7+
注解介绍
注解和web.xml配置的加载顺序:
1.Servlet的配置如果同时存在于web.xml和注解,合并两个配置,如果配置的参数有相同,web.xml的为准。
2.监听器加载的时候,先加载web.xml文件中配置,然后才加载注解配置的。
3.过滤器的加载按照名字排序顺序加载。
4.当一个类同时存在注解配置和web.xml配置的时候,web.xml中配置无效。
@WebServlet = servlet和servlet-mapping标签
设置方式一:

package com.yayadou.demo;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
设置方式二:
/**
* @WebServlet 配置Servlet的请求映射
* urlPatterns 对应 请求名
* loadOnStartup 对应servlet加载时机
* initParams 对应servlet初始化参数
* @WebInitParam 对应具体的参数key 和 value
*/
@WebServlet(
urlPatterns = { "/a.do" },
loadOnStartup=1,
initParams = {
@WebInitParam(name = "charset", value = "UTF-8"),
@WebInitParam(name = "version", value = "1.0")
})
public class ServletA extends HttpServlet {
private static final long serialVersionUID = 1L;
private String charset = null;
private String version = null;
public void init(ServletConfig config) throws ServletException {
System.out.println("--ServletA--init--------");
charset = config.getInitParameter("charset");
version = config.getInitParameter("version");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
response.setContentType("text/html;charset="+charset);
response.getWriter().write("欢迎大驾光临"+username);
}
}
@WebFilter = filter和filter-mapping标签
package com.yayadou.demo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
/**
* 基于Annotation 实现的Filter过滤器
* urlPatterns 配置需要过滤的请求名
* servletNames 配置需要过滤的servlet类名
*/
@WebFilter(
urlPatterns = { "/a.do" },
servletNames={"com.yayadou.demo.ServletB"},
initParams = {
@WebInitParam(name = "charset", value = "UTF-8")
})
public class CharsetEncodingFilter implements Filter {
private String charset = null;
public void init(FilterConfig config) throws ServletException {
System.out.println("--CharsetEncodingFilter---init-----------");
charset = config.getInitParameter("charset");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("--CharsetEncodingFilter---doFilter--1---------");
request.setCharacterEncoding(charset);
chain.doFilter(request, response);
response.setCharacterEncoding(charset);
System.out.println("--CharsetEncodingFilter---doFilter--2---------");
}
public void destroy() {
System.out.println("--CharsetEncodingFilter---destroy-----------");
}
}
@WebListener = listener标签
package com.yayadou.demo;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 基于Annotation实现的监听器
*/
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("---------应用程序启动------------");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("---------应用程序关闭------------");
}
}
WebInitParam : 传递初始化参数到Servlet或者Filter里面
2.5的时候,需要修改web.xml文件传初始参数
3.0的时候,只需使用注解,即可传递参数到Servlet和Filter
Annotation
Annontation是Java5开始引入的新特征。
中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。
Annontation像一种修饰符一样,应用 类型、构造方法、方法、成员变量上。
注解是以“@注释名”在代码中存在的,还可以添加一些参数值。
元数据的作用,大致可分为三种:
编写文档,通过代码里标识的元数据生成文档;
代码分析,通过代码里标识的元数据对代码进行分析;
编译检查,通过代码里标识的元数据让编译器能实现基本的编译检查。
介绍JDK1.5内在的常用注释。
@Override 限定重写父类方法;
@Deprecated 用于表示程序元素(类, 方法)已过时;
@SuppressWarnings 抑制编译器警告。
Annotaion是一种特殊的接口
Annotation的优势:
使java程序可以自描述
Annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息
Annotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径
Annotaion不能影响程序代码的执行 (编写原则)
无论增加、删除annotation,代码都始终如一的执行
Annotation有可能在运行时抛出异常
常见的Annotation

SOURCE,CLASS 和 RUNTIME
在使用Retention时必须要提供一个RetentionPolicy的枚举类型参数。
RetentionPolicy有三个枚举内容:SOURCE ,CLASS, RUNTIME
SOURCE:
表示Annotation类型信息只保留在源码.java文件中。
CLASS:
表示Annotation类型信息保留在源码中,同时会保留在编译好的.class文件里面,但是在执行的时候,不会把这些信息加载到虚拟机(JVM)中去。
@Retention的 默认值 是 CLASS。
RUNTIME:
表示在源码.java文件 、.class文件和在执行的时候会把这些信息加载到JVM中去。
浙公网安备 33010602011771号