使用Servlet3.0新特性进行web开发小demo

简介: 在上一篇文章中我们使用了SpringMVC结合Servlet3.0的新特性进行web开发。在这一篇文章中我们用最原始的Servlet的方式来进行一个简单的web开发的工作。

在上一篇文章中我们使用了SpringMVC结合Servlet3.0的新特性进行web开发。在这一篇文章中我们用最原始的Servlet的方式来进行一个简单的web开发的工作。在我们之前的web开发中我们会在web.xml中进行Servlet、Filter、初始化参数等信息的配置。在Servlet3.0中为我们提供了一个接口:javax.servlet.ServletContainerInitializer。我们可以在这个接口的实现类中进行Servlet、Filter等信息的配置。它的作用和web.xml是很像,可以用来取代web.xml。和ServletContainerInitializer可能同时使用的还有一个javax.servlet.annotation.HandlesTypes注解,这个注解可以把指定的类和它的子类作为参数传入到ServletContainerInitializer的onStartup方法中,可以让我们进行一些其他的扩展功能。主要功能代码如下:

javax.servlet.annotation.HandlesTypes注解指定的类:

package com.zkn.servlet3.initializer;

import javax.servlet.ServletContext;

/**
 * Created by zkn on 2017/10/30.
 */
public interface WebApplicationContextInitializer {
    /**
     * 容器初始化的时候做一些其他动作
     *
     * @param servletContext
     */
    void onStartup(ServletContext servletContext);
}
package com.zkn.servlet3.initializer;

import javax.servlet.ServletContext;

/**
 * Created by zkn on 2017/10/30.
 */
public class ContextWebApplicationContextInitializer implements WebApplicationContextInitializer {
    /**
     * 容器初始化的时候做一些其他动作
     *
     * @param servletContext
     */
    @Override
    public void onStartup(ServletContext servletContext) {
        System.out.println("我是ContextWebApplicationContextInitializer");
    }
}
package com.zkn.servlet3.initializer;

import javax.servlet.ServletContext;

/**
 * Created by zkn on 2017/10/30.
 */
public class ServletWebApplicationContextInitializer implements WebApplicationContextInitializer {
    /**
     * 容器初始化的时候做一些其他动作
     *
     * @param servletContext
     */
    @Override
    public void onStartup(ServletContext servletContext) {
        System.out.println("我是ServletWebApplicationContextInitializer");
    }
}

实现javax.servlet.ServletContainerInitiali接口的类

package com.zkn.servlet3;

import com.zkn.servlet3.filter.DemoFilter;
import com.zkn.servlet3.initializer.WebApplicationContextInitializer;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.lang.reflect.Modifier;
import java.util.EnumSet;
import java.util.Set;

/**
 * Created by zkn on 2017/10/30.
 */
@HandlesTypes(WebApplicationContextInitializer.class)
public class StartServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> classSet, ServletContext servletContext) throws ServletException {
        if (classSet != null && !classSet.isEmpty()) {
            classSet.forEach(e -> {
                //不是接口,也不是抽象类
                if (!e.isInterface() && !Modifier.isAbstract(e.getModifiers()) &&
                        WebApplicationContextInitializer.class.isAssignableFrom(e)) {
                    try {
                        WebApplicationContextInitializer webApplication = (WebApplicationContextInitializer) e.newInstance();
                        webApplication.onStartup(servletContext);
                    } catch (InstantiationException e1) {
                        e1.printStackTrace();
                    } catch (IllegalAccessException e1) {
                        e1.printStackTrace();
                    }
                }
            });
        }
        //添加Servlet
        ServletRegistration.Dynamic dynamicServlet = servletContext.addServlet("demoServlet", new DemoStartServlet());
        //请求路径
        dynamicServlet.addMapping("/demo");
        //Servlet InitParam
        dynamicServlet.setInitParameter("demo", "demo");
        dynamicServlet.setLoadOnStartup(1);
        //添加过滤器
        FilterRegistration.Dynamic dynamicFilter = servletContext.addFilter("filter", new DemoFilter());
        dynamicFilter.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "demoServlet");
    }
}
在ServletContainerInitializer 的实现类中我们指定了Servlet、Filter、并且指定了Servlet的启动顺序。

指定的Servlet如下:

package com.zkn.servlet3;

import com.alibaba.fastjson.JSON;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
 * Created by zkn on 2017/10/30.
 */
public class DemoStartServlet extends HttpServlet {
    /**
     * 处理GET请求
     *
     * @param request
     * @param response
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        Enumeration<String> parameters = request.getParameterNames();
        String paramterName;
        List<String> parameterValue = new ArrayList<>();
        parameterValue.add("请求参数:");
        if (parameters != null) {
            while (parameters.hasMoreElements()) {
                paramterName = parameters.nextElement();
                parameterValue.add(paramterName + "=" + request.getParameter(paramterName) + ";");
            }
        }
        String resultString = JSON.toJSONString(parameterValue);
        try {
            PrintWriter printWriter = new PrintWriter(response.getOutputStream());
            printWriter.write(resultString);
            printWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("我是Servlet,我被初始化了、、、、、");
        super.init(config);
    }
}
指定的Filter如下:

package com.zkn.servlet3.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * Created by zkn on 2017/10/30.
 */
public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器!");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行一个过滤器!");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("销毁过滤器!");
    }
}

但是现在我们缩写的功能还不能生效呢,要想使它生效的话,我们还需要进行一些简单的配置:在META-INF下面建立一个services的文件夹,在这个文件夹下面创建一个javax.servlet.ServletContainerInitializer文件,这个文件的内容如下:com.zkn.servlet3.StartServletContainerInitializer。内容就是我们缩写的ServletContainerInitializer的实现类的类路径。到此我们的一系列准备工作是完成了,下面我们在TomCat中启动一下,一些启动日志如下所示:


从上面的日志中我们可以看出来:HandlesTypes中所指定的类的先与过滤器被初始化,过滤器先与Servlet被初始化。还有一点需要注意的是,因为HandlesTypes所指定的类是做为StartServletContainerInitializer中的onStartup方法的参数的,但是这个参数的类型是set类型的,所以HandlesTypes指定的类的顺序可能是乱的,如果我们想让它们顺序指定的话,我们还需要手动的指定一个初始化的顺序。

下面让我们写一个请求来测试一下:

http://localhost:8080/demo?userName=%E5%BC%A0%E4%B8%89&address=wwwe2323


完整代码路径如下:https://github.com/zhangconan/JavaWeb/tree/master/Servlet3Web



相关文章
|
22天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1月前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
29 7
|
1天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
7天前
|
JSON Java fastjson
Spring Boot 底层级探索系列 04 - Web 开发(2)
Spring Boot 底层级探索系列 04 - Web 开发(2)
16 0
|
7天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
10天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
11天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
19天前
|
安全 前端开发 Java
Java Web开发知识点学习总结
Java Web开发涉及Java基础、Servlet、JSP、数据库操作(SQL+JDBC)、MVC设计模式、Spring框架、Hibernate ORM、Web服务(SOAP&RESTful)、安全认证(HTTP Basic/Digest/OAuth)及性能优化(缓存、异步、负载均衡)。
18 3
|
22天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
27天前
|
前端开发 JavaScript 数据管理
描述一个使用Python开发Web应用程序的实际项目经验,包括所使用的框架和技术栈。
使用Flask开发Web应用,结合SQLite、Flask-SQLAlchemy进行数据管理,HTML/CSS/JS(Bootstrap和jQuery)构建前端。通过Flask路由处理用户请求,模块化代码提高可维护性。unittest进行测试,开发阶段用内置服务器,生产环境可选WSGI服务器或容器化部署。实现了用户注册登录和数据管理功能,展示Python Web开发的灵活性和效率。
14 4