虽然很久没有单独的使用Servlet技术了,但是本着温故而知新的态度,整理记录一下笔记。
注:tomcat7以上才支持Servlet3.0
注解支持Servlet、Filter、Listener无需在web.xml中进行配置
@WebServlet注解
作用:声明Servlet组件(无需配置web.xml)。
主要属性:
属性 | 类型 | 描述 |
name | String | 指定Servlet的name属性。等价于<servlet-name>标签。如果没有显示指定,默认当前类的全限定名 |
value | String[] | 等价于urlPatterns属性。两个属性不能同时使用。 |
urlPatterns | String[] | 指定一组URL匹配模式,等价于<url-pattern>标签。 |
loadOnStartup | int | 指定Servlet加载顺序,等价于<load-on-startup>标签。 |
initParams | WebInitParam[] | 指定一组初始化参数。等价于<init-param>标签。 |
asyncSupported | boolean | 声明Servlet是否支持异步操作,等价于<async-supported>标签。 |
decription | String | 该Servlet的描述信息,等价于<description>标签。 |
displayName | String | 该Servlet显示名,通常配合工具使用,等价于<display-name>标签。 |
简单的示例:
/**
* name-Servlet的名称
* urlPatterns-URL的匹配模式
* description-Servlet的描述
* asyncSupported-是否支持异步
* */
@WebServlet(name="myServlet", urlPatterns="/servletTest", description="示例", asyncSupported=false)
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* <p>映射get请求
* */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("haha");
super.doGet(req, resp);
}
/**
* <p>映射post请求
* */
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hehe");
super.doPost(req, resp);
}
/**
* <p>销毁方法
* */
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
}
/**
* <p>初始化方法
* */
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
}
@WebFilter注解
作用:声明过滤器(Filter)组件(无需配置web.xml)。
基本属性:
属性 | 类型 | 描述 |
filterName | String | 指定过滤器的name属性,等价于<filter-param>属性 |
value | String[] | 等价于urlPatterns属性,但是不能同时使用 |
urlPatterns | String[] | 指定一组URL匹配模式,等价于<url-pattern> |
servletNames | String[] | 指定过滤器将作用于哪些Servlet,是@WebServlet中name属性的值,或者是web.xml中<servlet-name>的值 |
initParams | WebInitParam[] | 指定一组初始化参数。等价于<init-param>标签。 |
asyncSupported | boolean | 声明Filter是否支持异步操作,等价于<async-supported>标签。 |
decription | String | 该Filter的描述信息,等价于<description>标签。 |
displayName | String | 该过滤器显示名,通常配合工具使用,等价于<display-name>标签。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值:ASYNC、ERROR、FORWARD、INCLUDE和REQUEST |
简单的示例:
/**
* filterName-过滤器名称
* urlPatterns-uri匹配规则
* */
@WebFilter(filterName="myFilter", urlPatterns="/*")
public class MyFilter implements Filter {
/**
* <p>初始化方法
* */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
/**
* <p>具体过滤逻辑
* */
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
}
/**
* <p>销毁方法
* */
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
@WebListener注解
作用:声明监听器组件(无需配置web.xml)。
基本属性:
只有一个可选的默认属性-value。用于描述当前Listener。
简单的示例:
/**
* <p>声明监听器,实现监听HTTP会话的创建和销毁(HttpSessionListener)
* value-可选的默认属性,用于描述当前监听器
* */
@WebListener(value="描述信息")
public class MyListener implements HttpSessionListener {
/**
* <p>通知正在收听的对象,session已经被加载及初始化
* */
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
/**
* <p>通知正在收听的对象,session已经被载出销毁
* */
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
}
@WebInitParam属性
作用:该注解不单独使用。配合@WebServlet或@WebFilter使用,为它们指定初始化参数。等价于web.xml中<servlet>和<filter>的子标签<init-param>。
基本属性:
属性 | 类型 | 是否可选 | 描述 |
name | String | 否 | 指定参数名。等价于web.xml中的<param-name>标签 |
value | String | 否 | 指定参数的值。等价于web.xml中的<param-value>标签 |
description | String | 否 | 关于参数的描述。等价于<description>标签 |
简单的示例:
/**
* <p>指定一个初始化参数 username 值为zhangsan
* */
@WebServlet(name="myServlet", urlPatterns="/servletTest",
initParams= {@WebInitParam(name="username", value="zhangsan")})
public class MyServlet extends HttpServlet {
// .......省略
}
对文件上传的支持
@MultipartConfig注解
作用:配合Servlet实现文件上传。
要点:必须和Servlet一起使用;从request对象中获取Part对象(里面封装了上传的文件信息)。
基本属性:
属性 | 类型 | 是否可选 | 描述 |
fileSizeThreshold | int | 是 | 当数据量大于该值时,内容将被写入文件 |
location | String | 是 | 存放上传的文件地址 |
maxFileSize | long | 是 | 允许上传的文件最大值。默认为-1,表示没有限制 |
maxRequestSize | long | 是 | 针对该multipart/form-data请求的最大数量,默认为-1,表示没有限制。 |
简单的示例:
@MultipartConfig(location="D:/test")
@WebServlet(name="myServlet", urlPatterns="/servletTest")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* <p>映射post请求
* */
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//myFile为文件参数名 Part操作上传的文件
Part part = req.getPart("myFile");
//part.write(""); //将文件写入目标地址
// .... 省略
}
}
异步处理
作用:解决阻塞式调用。
说明:在以前的servlet中,如果作为控制器的servlet调用了一个较为耗时的业务方法,则servlet必须等到业务执行完后才会生成响应,这使得这次调用成了阻塞式调用,效率比较差。
在@WebServlet和@WebFilter中有asyncSupported属性(异步机制仅可应用于Servlet和过滤器组件),就是开启是否支持异步(默认为false,即没有开启异步支持)。
简单的示例(Filter异步调用方式和Servlet一样):
@WebServlet(name="myServlet", urlPatterns="/servletTest")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* <p>映射post请求
* */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过request获得AsyncContent对象 ***重点方法
AsyncContext asyncContext = request.startAsync();
//设置异步调用超时时长
asyncContext.setTimeout(30*3000);
//启动异步调用的线程 ***重点方法
asyncContext.start(new Thread() {
@Override
public void run() {
//TODO 异步处理的业务线程类(当然是可以另起线程类或线程池的)
}
});
//异步监听器 可选 ****重点方法
asyncContext.addListener(new AsyncListener() {
//异步调用超时触发
@Override
public void onTimeout(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
}
//异步调用开始触发
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
}
//异步调用出错时触发
@Override
public void onError(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
}
//异步调用完成时触发
@Override
public void onComplete(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
}
});
// ......省略其它操作 如response
}
}