使用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



相关文章
|
3月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
158 62
|
2月前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
3月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
269 45
|
3月前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
55 7
|
3月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
66 2
|
3月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
87 1
|
3月前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
3月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
111 2
WK
|
3月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
168 0
|
3月前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
34 0

热门文章

最新文章

  • 1
    Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
    21
  • 2
    AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
    19
  • 3
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
    53
  • 4
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
    279
  • 5
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 6
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
    37
  • 7
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
    27
  • 8
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
    20
  • 9
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
    53
  • 10
    springSecurity学习之springSecurity过滤web请求
    59