写点什么

Javaweb 核心之注解开发 Servlet

作者:楠羽
  • 2022 年 9 月 24 日
    福建
  • 本文字数:1992 字

    阅读完需:约 7 分钟

4 注解开发 Servlet

4.1 Servlet3.0 规范

4.2 注解开发入门案例

4.2.1 自动注解配置

1)配置步骤

第一步:创建 JavaWeb 工程,并移除 web.xml





第二步:编写 Servlet


public class ServletDemo1 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Servlet Demo1 Annotation"); }}
复制代码


第三步:使用注解配置 Servlet



第四步:测试


2)注解详解

/** * WebServlet注解 * @since Servlet 3.0 (Section 8.1.1) */@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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.2.2 手动创建容器

1)前置说明

在使用 Servlet3.1 版本的规范时,脱离了 web.xml 进行注解开发,它除了支持使用注解的配置方式外,还支持纯手动创建 Servlet 容器的方式。要想使用的话,必须遵循它的编写规范。它是从 Servlet3.0 规范才开始引入的,加入了一个新的接口:


package javax.servlet;
import java.util.Set;
/** * 初始化Servlet容器必须实现此接口 * 它是Servlet3.0规范提供的标准接口 * @since Servlet 3.0 */public interface ServletContainerInitializer { /** * 启动容器时做一些初始化操作,例如注册Servlet,Filter,Listener等等。 * @since Servlet 3.0 */ void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;}
复制代码


同时可以利用 @HandlesTypes 注解,把要加载到 onStartup 方法中的类字节码传入进来,@HandlesTypes 源码如下:


/** * 用于指定要加载到ServletContainerInitializer接口实现了中的字节码 * @see javax.servlet.ServletContainerInitializer * @since Servlet 3.0 */@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface HandlesTypes {
/** * 指定要加载到ServletContainerInitializer实现类的onStartUp方法中类的字节码。 * 字节码可以是接口,抽象类或者普通类。 */ Class[] value();}
复制代码

2)编写步骤

第一步:创建工程,并移除 web.xml




第二步:编写 Servlet


public class ServletDemo1 extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); }
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Servlet Demo1 Annotation manual"); }}
复制代码


第三步:创建初始化容器的类,并按照要求配置


public class MyServletContainerInitializer implements ServletContainerInitializer {
@Override public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException { }}
复制代码


在脱离 web.xml 时,要求在 src 目录下包含一个 META-INF 目录,位置和及字母都不能改变,且严格区分大小写。在目录中创建一个名称为javax.servlet.ServletContainerInitializer的文件,里面写实现了ServletContainerInitializer接口的全限定类名。如下图所示:



第四步:编写注册 Servlet 的代码



第五步:测试



发布于: 刚刚阅读数: 3
用户头像

楠羽

关注

还未添加个人签名 2022.08.04 加入

还未添加个人简介

评论

发布
暂无评论
Javaweb核心之注解开发Servlet_Servlet_楠羽_InfoQ写作社区