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

编写servlet

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

运行效果


刚才的@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

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

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

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

@HandlesTypes

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

package com.min.demo2;

import com.min.demo3.MyServletTest3;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.HandlesTypes;
import java.util.Set; @HandlesTypes(value = {IHello.class}) // 可以传入一个接口的字节码对象
public class MyServletContainerInitializerTest implements ServletContainerInitializer {
// 在执行 onStartup 的时候,会把这个字节码接口对应的所有抽象类 、子接口、 实现类都获取到, 并且放在 set集合里面 保存起来
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
//System.out.println("MyServletContainerInitializerTest-------------"); //servletContext.addServlet(名称,new出来的Servlet对象); 添加一个servlet
//servletContext.addFilter(); 添加一个 filter
//servletContext.addListener(); 添加一个listener //添加上自己定义的servlet
ServletRegistration.Dynamic dynamic = servletContext.addServlet("aaa", new MyServletTest3());
//设置启动顺序
dynamic.setLoadOnStartup(1);
//设置访问路径
dynamic.addMapping("/demo3");
for (Class<?> aClass : set) {
System.out.println(aClass);
}
}
}
  • 编写一个IHello 接口
package com.min.demo2;

public interface IHello {
}
  • 编写一个子接口
package com.min.demo2;

public interface IHello_SON extends IHello {
}
  • 编写一个实现类
package com.min.demo2;

public class IHello_Impl implements IHello{
}
  • 编写一个抽象类
package com.min.demo2;

public abstract class IHello_Abstract implements IHello {
}
  • 重启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. 算法图解...pdf

    电子书资源:算法图解 书籍简介   本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量.书中的前三章将帮助你打下基础,带你学习二分查找.大O表示法. ...

  2. Appium 自动化测试框架:关键字驱动+数据驱动

    1. 关键字驱动框架简介 2. 框架结构说明 3. 框架代码实现 action 包  page_action.py business_process 包 case_process.py data_so ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  4. 04- HTML常用标签

    HTML标签分类 通过上节博客我们知道了网页的组成:文字 图片 连接 视频 音频.在HTML页面中,带有"< >"符号的元素被称为HTML标签,如上面提到的 <H ...

  5. Linux中的DHCP服务

    目录 DHCP DHCP的报文类型 DHCP的部署 DHCP中继(DHCP代理) DHCP DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局 ...

  6. Windows PE 重定位表编程(枚举重定位地址)

    原理之前单独总结过,在这里: http://blog.csdn.net/u013761036/article/details/54051347 下面是枚举重定位信息的代码: // ReLocation ...

  7. 【python】Leetcode每日一题-丑数

    [python]Leetcode每日一题-丑数 [题目描述] 给你一个整数 n ,请你判断 n 是否为 丑数 .如果是,返回 true :否则,返回 false . 丑数 就是只包含质因数 2.3 和 ...

  8. Git(2)多人协同操作冲突

    一:多人协同操作冲突 拉取远程dev并在本地创建dev开发库,执行命令git checkout -b  dev  origin/dev  这里以同台机器不同窗口来模拟俩个用户操作同一分支同一文件(实际 ...

  9. 浅谈自动特征构造工具Featuretools

    简介 特征工程在机器学习中具有重要意义,但是通过手动创造特征是一个缓慢且艰巨的过程.Python的特征工程库featuretools可以帮助我们简化这一过程.Featuretools是执行自动化特征工 ...

  10. opencv——图像遍历以及像素操作

    摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...