当前位置: 代码迷 >> 综合 >> servlet3.0
  详细解决方案

servlet3.0

热度:81   发布时间:2024-02-27 15:09:12.0

文章目录

    • 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采用了两种方式同时进行注册,则需要注意:

  1. 若两种方式的url-pattern值相同,则应用无法启动
  2. 若两种方式的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);}
}

Servlet3.0的异步处理

Servlet3.0的组件可插性

Servlet3.0的文件三大组件动态注册