java注解开发

用xml配置文件方式是Servlet2.5版本规范的,经过逐步演变注解来时流行,因为更方便了,Servlet3.0以后也支持注解开发了。

自动注解实现步骤:
  1. 创建JavaWeb工程,并移除web.xml
  2. 编写Servlet,继承HttpServlet
  3. 重写get、post方法
  4. 在类上使用@WebServlet注解配置

演示:

@WebServlet("/webServletDemo")
public class WebServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("注解版Servlet运行");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
WebServlet源码详解:
/**
 * WebServlet注解
 * @since Servlet 3.0 (Section 8.1.1)
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {

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

    /**
     * 用于映射Servlet访问的url映射
     * 相当于xml配置时的<url-pattern>
     * value是一个数组,所以里面是可以有多个值
     */
    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 "";
}
手动注解:

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

public interface ServletContainerInitializer {
	// 启动容器时做一些初始化操作,例如注册Servlet,Filter,Listener等等。
    void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}

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

	// 用于指定要加载到ServletContainerInitializer接口实现了中的字节码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface HandlesTypes {

	// 指定要加载到ServletContainerInitializer实现类的onStartUp方法中类的字节码。
	// 字节码可以是接口,抽象类或者普通类。

    Class[] value();
}
实现步骤:
  1. 定义类继承HttpServlet
  2. 重写get、post
  3. 定义类实现ServletContainerInitializer接口
  4. 在src创建META-INF的包
  5. 在META-INF包下创建一个services的包
  6. 在services包下创建ServletContainerInitializer文件
  7. 文件内容为容器实现类的全类名
  8. 在容器实现类的onStartup方法中完成注册Servlet
  9. 启动测试
演示:

定义类继承HttpServlet

public class WebServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("手动注解开发");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

Register:
用来注册配置Servlet的功能类

public class Register implements ServletContainerInitializer {
// 定义类实现ServletContainerInitializer接口,在容器实现类的onStartup方法中完成注册Servlet

    @Override
    public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
        // 创建对象
        WebServletDemo02 ws2 = new WebServletDemo02();

        // 在servletContext对象中添加Servlet,并得到Servlet动态配置对象  第一个参数是名称,第一个是对象
        ServletRegistration.Dynamic registration = servletContext.addServlet("webServletDemo02", ws2);

        // 配置Servlet   相当于xml里的mapping 映射访问路径的
        registration.addMapping("/webServletDemo02");

        // 还可以添加加载时机
        registration.setLoadOnStartup(1);
    }
}

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

com.ServletDemo.Register
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzhuzhu.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值