1、Servlet 3.0

从2007年开始到2009年底,在这个时间段,软件开发开始逐步的演变,基于注解的配置理念开始逐渐出现,大量注解配置思想开始用于各种框架的设计中,例如:Spring3.0版本的Java Based Configuration,JPA规范,apache旗下的struts2和mybatis的注解配置开发等等。

Servlet3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。

  • 新增的注解支持
    • 用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明
  • 异步处理支持
    • Servlet 接受请求以后,将线程交给一个异步线程,自身则返回容器,直到业务处理完毕做出响应(异步线程拥有ServletRequest和ServletResponse对象的引用),最后才结束该 Servlet 线程。如此一来Servlet不再是一直处于阻塞状态等待业务处理完成。
    • 以前的Servlet接受到请求以后,由于可能要对数据进行处理,比如说跨网络的调用和数据库的操作,在等待过程中线程就被阻塞,资源得不到释放。
  • 可插性支持
    • 开发者可以通过插件的方式很方便的扩充已有 Web 应用的功能,而不需要修改原有的应用。

2、注解的使用

@WebServlet("/teacherServlet")
public class TeacherServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello annotation");
    }
}

仅需在类开头加一行@WebServlet("/teacherServlet")无需再配置xml文件,要注意加 /

3、注解详细

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {

    /**
     * 指定Servlet的名称。
     * 相当于xml配置中<servlet>标签下的<servlet-name>
     */
    String name() default "";

    /**
     * 用于映射Servlet访问的url映射
     * 相当于xml配置时的<url-pattern>
     */
    String[] value() default {};

    /**
     * 相当于xml配置时的<url-pattern>
     */
    String[] urlPatterns() default {};

    /**
     * 用于配置Servlet的启动时机
     * 相当于xml配置的<load-on-startup>
     */
    int loadOnStartup() default -1;

    /**
     * 用于配置Servlet的初始化参数
     * 相当于xml配置的<init-param>
     */
    WebInitParam[] initParams() default {};

    /**
     * 用于配置Servlet是否支持异步
     * 相当于xml配置的<async-supported>
     */
    boolean asyncSupported() default false;

    /**
     * 用于指定Servlet的小图标
     */
    String smallIcon() default "";

    /**
     * 用于指定Servlet的大图标
     */
    String largeIcon() default "";

    /**
     * 用于指定Servlet的描述信息
     */
    String description() default "";

    /**
     * 用于指定Servlet的显示名称
     */
    String displayName() default "";
}

4、手动创建Servlet容器

1)编写Servlet
public class PeopleServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("PeopleServlet");
    }
}
2)创建初始化容器的类
public class MyServletContainerInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        //servlet的创建和配置
        //1.创建PeopleServlet
        PeopleServlet peopleServlet = new PeopleServlet();
        //2.在ServletContext对象中添加Servlet,并将得到Servlet的动态配置对象
        ServletRegistration.Dynamic peopleServlet1 = servletContext.addServlet("peopleServlet", peopleServlet);
        //3.配置Servlet
        peopleServlet1.addMapping("/peopleServlet");
        peopleServlet1.setLoadOnStartup(1);
    }
}
3)创建文件
  1. 在src目录下创建WEB-INF文件夹 大小写不能改变
  2. 在WEB-INF下创建services文件夹
  3. 在services目录下创建 javax.servlet.ServletContainerInitializer 文件
  4. 在 javax.servlet.ServletContainerInitializer 文件中写入 MyServletContainerInitializer 的全限定类名 com.xxx.servlet.MyServletContainerInitializer
4)进行访问

http://localhost:8080/crm/peopleServlet