文章目录
-
- Servlet3.0
-
- Servlet 3.0的注解
-
- Servlet注解
- Filter注解
- Listener注解
- servlet3.0的web.xml
- Servlet3.0的文件上传
- Servlet3.0的异步处理
- Servlet3.0的组件可插性
- Servlet3.0的文件三大组件动态注册
Servlet3.0
Servlet 3.0的注解
Servlet3.0规范中允许Servlet、Filter与Listener三大组件时使用注解,而不用在web.xml进行注册了。Servlet3.0规范允许Web项目没有web.xml配置文件
Servlet注解
Servlet3.0规范中使用 @WebServlet() 注解来注册当前的Servlet类。该注解具有多个属性,常用属性的类型与意义如下表所示:
序号 | 属性名 | 属性类型 | 属性说明 |
---|---|---|---|
1 | urlPatterns | String[] | 相当于< url-pattern>的值 |
2 | value | String[] | 与urlPatterns 意义相同,但此属性名可以省略。不能与urlPatterns 同时使用 |
3 | name | String | 相当于< servlet-name>的值 |
4 | loadOnStartup | int | 相当于< loadOnStartup>的值,默认值为-1 |
5 | initParams | WebInitParam[] | WebInitParam也是个注解,name相当于< param-name>,value相当于< param-value> |
对应如下:
<servlet><servlet-name></servlet-name><servlet-class></servlet-class><init-param><param-name></param-name><param-value></param-value></init-param><load-on-startup></load-on-startup></servlet><servlet-mapping><servlet-name></servlet-name><url-pattern></url-pattern><url-pattern></url-pattern><url-pattern></url-pattern></servlet-mapping>
简单验证,输入some,可以跳转:
@WebServlet("/some")
public class ServletAnotion extends HttpServlet {
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("你好啊");}
}
完整版!
@WebServlet(urlPatterns = {
"/some", "/xxx", "/jjj"}, //属性urlpattern与属性value功能,只能使用一个,不能同时使用name = "some_servlet", //设置servletnameinitParams = {
@WebInitParam(name = "key1", value = "value1"),@WebInitParam(name = "key2", value = "value2")},loadOnStartup = 2 //启动时创建当前servlet实例,默认为-1
)
public class ServletAnotion extends HttpServlet {
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取当前servletnameServletConfig servletConfig = getServletConfig();String servletName = servletConfig.getServletName();System.out.println(servletName);//获取初始话参数Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();String value = servletConfig.getInitParameter(name);System.out.println(name + " " + value);}}
}
Filter注解
Servlet3.0规范中使用 @WebFilter() 注解过滤器类。该注解具有多个属性,常用属性的类型与意义如下表所示:
序号 | 属性名 | 属性类型 | 属性说明 |
---|---|---|---|
1 | urlPatterns | String[] | 相当于< url-pattern>的值 |
2 | value | String[] | 与urlPatterns 意义相同,但此属性名可以省略。不能与urlPatterns 同时使用 |
3 | servletNames | String[] | 相当于< servlet-name>的值 |
4 | filterName | String | 相当于< filter-name>的值 |
5 | dispatcherTypes | DispatcherType[] | DispatcherType是个枚举类,里面有FORWARD,INCLUDE,REQUEST,ASYNC,ERROR |
对应如下:
<filter><filter-name></filter-name><filter-class></filter-class></filter><filter-mapping><filter-name></filter-name><url-pattern></url-pattern><servlet-name></servlet-name><dispather></dispather></filter-mapping>
java代码:
//@WebFilter("/*")
//@WebFilter(servletNames = "some_servlet")
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.FORWARD)
public class FilterAnotion implements Filter {
@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("before");filterChain.doFilter(servletRequest, servletResponse);System.out.println("after");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {
}@Overridepublic void destroy() {
}
}
Listener注解
Servlet3.0规范中使用 @WebListener() 注解监听器类
相当于:
<listener><listener-class></listener-class></listener>
java代码:
@WebListener
public class ListenerAnotion implements ServletContextListener {
@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("应用启动");}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
servlet3.0的web.xml
注册servlet
若对于servlet采用了两种方式同时进行注册,则需要注意:
- 若两种方式的url-pattern值相同,则应用无法启动
- 若两种方式的url-pattern值不同,那么相当于servlet具有两个url-pattern
<servlet><servlet-name></servlet-name><servlet-class></servlet-class><init-param><param-name></param-name><param-value></param-value></init-param><load-on-startup></load-on-startup></servlet><servlet-mapping><servlet-name></servlet-name><url-pattern></url-pattern><url-pattern></url-pattern><url-pattern></url-pattern></servlet-mapping>
注册Filter
若对于Filter采用了两种方式同时进行注册,则需要注意:
无论url-pattern的值是否相同,其都是作为两个独立的Filter出现的
<filter><filter-name></filter-name><filter-class></filter-class></filter><filter-mapping><filter-name></filter-name><url-pattern></url-pattern><servlet-name></servlet-name><dispather></dispather></filter-mapping>
注册Listener
若对于Listener采用了两种方式同时进行注册,其仅仅相当于一个Listener
<listener><listener-class></listener-class></listener>
特别注意
注意:
< web-app/>中的属性metadata-complete的值若为true,则表示对三大组件的注册方式,只有web.xml中的注册起作用,将忽略注解的注册;若为false,则表示两种注册方式同时起作用。其值默认为false
Servlet3.0的文件上传
以前的文件操作很麻烦,需要去导第三方的jar包来做,servlet3.0提供了文件的上传
html页面:
记得开头要<%@ page isELIgnored=“false” %>
<form action="${pageContext.request.contextPath}/uploadServlet" method="post" enctype="multipart/form-data">文件:<input type="file" name="photo"><br><input type="submit" value="上传">
</form>
java代码:
@WebServlet("/uploadServlet")
@MultipartConfig //表明当前Servlet可以处理Multipart请求
public class Servlet2ANotion extends HttpServlet {
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取服务器保存上传文件的目录路径ServletConfig servletConfig = getServletConfig();String realPath = servletConfig.getServletContext().getRealPath("/image");//从请求中获取Multipart请求中的上传文件“部分”对象Part part = req.getPart("photo");//获取指定的头部属性String header = part.getHeader("Content-Disposition");//解析出原始文件名int index = header.lastIndexOf("=");String fileName = header.substring(index + 2, header.length() - 1);//完成文件上传part.write(realPath + "/" + fileName);}
}