web.xml配置还是比较麻烦,这次使用注解方式

编写servlet

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. @WebServlet(value = "/test2")
  8. public class ServletTest2 extends HttpServlet {
  9. @Override
  10. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. request.setCharacterEncoding("UTF-8");
  12. response.setContentType("text/html;charset=utf-8");
  13. System.out.println("雷霆嘎巴无情哈拉少");
  14. response.getWriter().write("雷霆嘎巴无情哈拉少");
  15. }
  16. }

运行效果


刚才的@WebServlet注解是3.0提出的,那么 3.0还有哪些规范

文档: https://download.oracle.com/otndocs/jcp/servlet-3.0-fr-eval-oth-JSpec/

  • 一个容器在启动的时候会去找 ServletContainerInitializer 实例对象,该 实例对象 必须放在

    META-INF/services 目录下中一个文件名称叫 javax.servlet.ServletContainerInitializer 里面

  • javax.servlet.ServletContainerInitializer

  1. com.min.demo2.MyServletContainerInitializerTest
  • 编写一个servlet

  1. import javax.servlet.ServletException;
  2. import javax.servlet.http.HttpServlet;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import java.io.IOException;
  6. public class MyServletTest3 extends HttpServlet {
  7. @Override
  8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. request.setCharacterEncoding("UTF-8");
  10. response.setContentType("text/html;charset=utf-8");
  11. System.out.println("MyServletTest3--------------");
  12. response.getWriter().write("大威天龙");
  13. }
  14. }
  • 编写 ServletContainerInitializer 的实现类

  1. import com.min.demo3.MyServletTest3;
  2. import javax.servlet.ServletContainerInitializer;
  3. import javax.servlet.ServletContext;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.ServletRegistration;
  6. import java.util.Set;
  7. public class MyServletContainerInitializerTest implements ServletContainerInitializer {
  8. @Override
  9. public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException { //启动时执行
  10. //System.out.println("MyServletContainerInitializerTest-------------");
  11. //servletContext.addServlet(名称,new出来的Servlet对象);
  12. //servletContext.addFilter();
  13. //servletContext.addListener();
  14. //添加上自己定义的servlet
  15. ServletRegistration.Dynamic dynamic = servletContext.addServlet("aaa", new MyServletTest3());
  16. //设置启动顺序
  17. dynamic.setLoadOnStartup(1);
  18. //设置访问路径
  19. dynamic.addMapping("/demo3");
  20. }
  21. }
  • 运行效果

@HandlesTypes

@HandlesTypes(value={aaa.class}) 可以传入一个接口的字节码对象,在执行 onStartup 的时候,会把这个字节码接口对应的所有抽象类 、子接口、 实现类都获取到, 并且放在 set集合里面 保存起来

  1. package com.min.demo2;
  2. import com.min.demo3.MyServletTest3;
  3. import javax.servlet.ServletContainerInitializer;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRegistration;
  7. import javax.servlet.annotation.HandlesTypes;
  8. import java.util.Set;
  9. @HandlesTypes(value = {IHello.class}) // 可以传入一个接口的字节码对象
  10. public class MyServletContainerInitializerTest implements ServletContainerInitializer {
  11. // 在执行 onStartup 的时候,会把这个字节码接口对应的所有抽象类 、子接口、 实现类都获取到, 并且放在 set集合里面 保存起来
  12. @Override
  13. public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
  14. //System.out.println("MyServletContainerInitializerTest-------------");
  15. //servletContext.addServlet(名称,new出来的Servlet对象); 添加一个servlet
  16. //servletContext.addFilter(); 添加一个 filter
  17. //servletContext.addListener(); 添加一个listener
  18. //添加上自己定义的servlet
  19. ServletRegistration.Dynamic dynamic = servletContext.addServlet("aaa", new MyServletTest3());
  20. //设置启动顺序
  21. dynamic.setLoadOnStartup(1);
  22. //设置访问路径
  23. dynamic.addMapping("/demo3");
  24. for (Class<?> aClass : set) {
  25. System.out.println(aClass);
  26. }
  27. }
  28. }
  • 编写一个IHello 接口
  1. package com.min.demo2;
  2. public interface IHello {
  3. }
  • 编写一个子接口
  1. package com.min.demo2;
  2. public interface IHello_SON extends IHello {
  3. }
  • 编写一个实现类
  1. package com.min.demo2;
  2. public class IHello_Impl implements IHello{
  3. }
  • 编写一个抽象类
  1. package com.min.demo2;
  2. public abstract class IHello_Abstract implements IHello {
  3. }
  • 重启tomcat,观察打印结果

2. Servlet3.0注解方式 @WebServlet的更多相关文章

  1. Servlet3.0提供的@WebServlet注解引用参数详情介绍

    Servlet3.0提供的@WebServlet注解: servlet3.0所提供的@webservlet注解,用来将某个类注解为一个servlet类,简化了web.xml上的servlet配置, @ ...

  2. 6.28笔记-servlet3.0注解配置、文件上传、过滤器、监听器

    一.servlet3.0注解配置 使用javaEE6.0 支持servlet3.0 value的值就是访问路径 urlPatterns的值也是访问路径 @WebServlet(name="D ...

  3. Servlet3.0注解@WebInitParam和@WebServlet

    在以前的servlet中我们初始化一些参数都是配置在web.xml中的,自从servlet3.0之后给我们提供了注解@WebServlet和@WebInitParam,@WebServlet是用来配置 ...

  4. 无意之间发现的Servlet3.0新特性@WebServlet

    今天无意之间看到了一个注解,这个注解就是@WebServlet,@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Se ...

  5. servlet3.0注解loadOnStartup不起作用解决方案

    多次尝试3.0在源码中直接用注解配置loadOnStartup=1,即web应用启动时创建servlet实例,发现不起作用,但是在web.xml配置则可以正常运行.先上源码. package lee; ...

  6. 【IDEA】HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题

    IDEA一时爽,摸不着头的BUG火葬场 这个问题困扰我整整一天一夜,先是代码检查路径设置找不出问题,后面换tomcat版不行,抱着侥幸心理换IDEA版本意料之中还是没解决问题. 都快想秃了最后终于完美 ...

  7. Servlet3.0注解配置访问路径和urlParttern配置

    一.Servlet用注解配置访问路径 二.IDEA的tomcat相关配置 其中,第一点的配置文件,直接在IDEA的可视化操作界面修改就可以改掉配置文件中内容: 三.urlParttern配置 其中,* ...

  8. 配置Servlet3.0的方式和注意事项!

  9. 在tomcat上全手工部署Servlet3.0

    从头写java文件的方式,编译成CLASS文件,加强对SERVLET容器的理解. 稍后试试JAR和WAR包. 文件内容(跟以前用IDE的一样): HelloServlet.java: package ...

随机推荐

  1. UI自动化测试框架:PO模式+数据驱动

    1. PO 设计模式简介 2. 工程结构说明 3. 工程代码实现 page 包 action 包 business_process 包 util 包 conf 包 test_data 目录 log 目 ...

  2. Ionic5沉浸式状态栏 适配全面屏

    1. 在platforms/android/app/src/main目录中找到AndroidManifest.xml文件,修改文件中manifest → application → activity标 ...

  3. 硬件篇-03-SLAM移动底盘电气设计

      最近因为在忙毕设,专栏已经1个多月没更,对于托更我很抱歉.不过这几周真的没什么时间,Rick&Morty的最新集我到现在都还没看哈哈.     现在毕设已经搞得差不多了,水专栏文章的快乐生 ...

  4. Python脚本扫描给定网段的MAC地址表(scapy或 python-nmap)

    目录 用scapy模块写 用 python-nmap 模块写 python3.7  windows环境 以下两个都可以扫描指定主机或者指定网段的 IP 对应的 MAC 地址,然后保存到 csv 文件中 ...

  5. Tomcat漏洞集合

    目录 Tomcat的几大高危漏洞 Tomcat安全措施 Tomcat的几大高危漏洞 1.Tomcat后台弱口令上传war包(Tomcat管理弱口令页面Getshell) 2.Tomcat的PUT的上传 ...

  6. cmake VTK visual studio 2010

    使用cmake在configure之后,出现了以下错误,导致编译无法进行 The C compiler "cl" is not able to compile a simple t ...

  7. 【python】Leetcode每日一题-直方图的水量(接雨水)

    [python]Leetcode每日一题-直方图的水量(接雨水) [题目描述] 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1. 上面是由数组 ...

  8. Kafka Rebalance机制和选举策略总结

    自建博客地址:https://www.bytelife.net,欢迎访问! 本文为博客同步发表文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://w ...

  9. VMware 15 虚拟机黑屏问题

    方法一:关闭加速3D图形 点击虚拟机,右键设置,取消勾选后,再进行重启 方法二:用管理员运行cmd 输入如下命令,要使用管理员运行,然后重启电脑 netsh winsock reset 方法三:换成V ...

  10. Java线程的6种状态

    6种状态分别是: NEW.RUNNABLE.TERMINATED.WAITING.TIMED_WAITING.BLOCKED NEW:线程创建完毕 RUNNABLE:线程运行中,又分为READY + ...