在Web应用程序中,提供用户界面(UI)通常只是工作的一半。 许多应用程序都有后端服务支持的要求。 后端服务的一些示例是调度程序进程(批处理),侦听队列并在消息进入时作出响应,或者是简单的事情,例如存储供整个应用程序使用的信息。 这些全局数据通常需要在所有Servlet类(对于每个请求处理器)之间共享。 在这里,我将向您展示如何在基于Servlet的应用程序中以及在何处添加此类后端服务。

在开始之前,我想解释一下Servlet应用程序如何存储数据变量(毕竟所有后端服务只是Java对象)。 您可以在3个主要区域中添加和共享数据(我们有时将这些区域称为不同的“空间”,“范围”或“上下文”)。 您可能还会将每个区域都视为具有唯一键和数据值的哈希映射。

  1. 应用程序范围 –这是为您的Web应用程序实例分配的全局,应用程序范围的存储映射空间。 每个Web应用程序都有其独特的空间。 即使将相同的WAR文件部署到域服务器中,它们每个都将获得自己的空间。 您可以通过实现javax.servlet.ServletContextListener接口来获取此空间。 此接口还具有两个回调方法,当您的应用程序启动(初始化)或关闭(销毁)时将调用它们。 使用这些方法,您可以执行自己的一次性应用程序或服务设置和清理逻辑。 您可以使用ServletContext#setAttribute(key, value)方法存储任何Java对象。 此存储在外部不是持久性的,而仅在服务器内存中。 因此,添加的内容越多,所需的内存就越多(通常您只想保留对服务对象的引用,因此通常不会出现内存问题)。 这是您应该在其中创建后端服务并对其进行初始化,然后将实例添加到该空间中的位置,以便稍后可以检索它。

    您还可以使用Singleton Pattern创建一个Application范围的上下文区域,以将您自己的业务服务作为空间保存,但是如果需要在Web应用程序环境中对其进行初始化,则仍然需要ServletContextListener

  2. 请求范围 –这是单个HTTP请求过程存储映射空间,仅针对特定请求或临时退出。 该地图空间也不是持久的。 您可以通过处理一种HTTP操作方法来访问Servlet代码中的该空间。 您将使用HttpServletRequest#setAttribute(key, value)方法添加数据。 通常,这些存储的数据用于传递到VIEW处理层(例如JSP)以构造HTML输出。 您已经看过我的一些预览文章,该文章在Servlet组件中使用了该文章。

    还要注意,在处理请求的Servlet方法内部,您还将可以使用HttpServletRequest#getServletContext()#getAttribute(key)方法访问上述“应用程序空间”方法。

  3. 会话范围 –这是一个特殊的空间,您可以在其中跟踪特定的用户与应用程序的交互,作为一系列的会话请求,或称为用户会话。 请记住,HTTP请求是无状态的,因此,如果要存储一些数据以在多个请求之间共享,则将需要此空间,但是对于每个客户端浏览器用户,它们应该是隔离的。 通常在应用程序中实现用户登录和资源限制时使用。 您可以使用Serlvet类中的HttpServletRequest#getSession(true)#setAttribute(key, value)方法添加到此空间。 每次针对该特定客户端用户, application服务器将自动为您返回相同的会话对象或空间。

但是,处理用户会话可能很棘手,因此您必须花时间并仔细设计应用程序,以实现需要的适当解决方案。 我将在未来写一篇单独的文章,介绍如何使用Session作用域,但是现在,我可以向您展示如何使用内部自定义服务初始化Web应用程序的示例。 您可以在我的servlet3-example中找到此代码。

package zemian.servlet3example.web;import javax.servlet.ServletContext;
import zemian.servlet3example.service.Application;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import zemian.service.logging.Logger;@WebListener
public class WebAppStartup implements ServletContextListener {private static final Logger LOGGER = new Logger(WebAppStartup.class);@Overridepublic void contextInitialized(ServletContextEvent event) {LOGGER.debug("WebApp is starting up.");Application app = Application.getInstance();app.init();// Store the app instances.        event.getServletContext().setAttribute(Application.SERVLET_CONTEXT_KEY, app);LOGGER.info("WebApp initialized.");       }@Overridepublic void contextDestroyed(ServletContextEvent event) {Application app = Application.getInstance();app.destroy();LOGGER.info("WebApp destroyed.");}
}

有了这个,我可以轻松地在Application类中添加任何自定义业务后端服务,然后让任何Servlet代码访问它。 注意,我使用的是Servlet 3的@WebListener批注,因此不需要配置。 您只需将WAR应用程序打包在一起,它将被EE应用程序服务器检测到!

翻译自: https://www.javacodegeeks.com/2015/01/ee-servlet-3-how-to-setup-backend-services-in-a-web-application.html

EE Servlet 3:如何在Web应用程序中设置后端服务相关推荐

  1. 如何在Web应用程序中使用TWAIN驱动程序的自定义功能?

    如何在Web应用程序中使用TWAIN驱动程序的自定义功能?接下来跟着小编一起来看看如何去实现. 本文适用于以下产品: Dynamic Web TWAIN v7 以上 ImageCapture Suit ...

  2. 如何在 Java 应用程序中设置 HicariCP 连接池

    在本教程中,我们将介绍 HikariCP 并展示如何在 Java 应用程序中设置 HicariCP 连接池.在我们的应用程序中,我们向 MySQL 数据库发出请求. HikariCP是可靠的高性能 J ...

  3. 如何在Android应用程序中实现后台服务?

    在Android应用程序中实现后台服务,可以通过继承Service类来实现.下面是一个简单的示例代码: 首先,在AndroidManifest.xml文件中注册服务: <manifest xml ...

  4. java web 使用https_如何在Web应用程序中实现HTTPS登录页面?

    小编典典 首先,您需要为服务器启用SSL.对于Tomcat,您需要生成一个openSSL密钥库,并将以下连接器添加到server.xml: keystoreFile="mykeystore& ...

  5. java 登录 https_java – 如何在Web应用程序中实现HTTPS登录页面?

    首先,您需要为您的服务器启用SSL.对于Tomcat,您需要生成一个openSSL密钥库,并将以下连接器添加到server.xml: keystoreFile="mykeystore&quo ...

  6. linux python matplotlib 使用,关于Linux:如何在Python的matplotlib中设置“后端”?

    我是matplotlib的新用户,我的平台是Ubuntu 10.04 Python 2.6.5 这是我的代码 import matplotlib matplotlib.use('Agg') impor ...

  7. 百家与g对比oogle_如何在Java Web应用程序中集成G​​oogle reCAPTCHA

    百家与g对比oogle I never liked Captchas because the burden was always on end user to understand the lette ...

  8. Spring Boot Web应用程序中注册 Servlet 的方法实例

    Spring Boot Web应用程序中注册 Servlet 的方法实例 本文实例工程源代码:https://github.com/KotlinSpringBoot/demo1_add_servlet ...

  9. 解决web应用程序[]中的Servlet[dispatcherServlet]引发了load()异常

    今天在学习springMVC入门程序的时候,遇到了如下问题: ```java 24-Nov-2021 11:57:27.506 信息 [RMI TCP Connection(3)-127.0.0.1] ...

最新文章

  1. 排序算法之直接插入排序
  2. c8051单片机注意事项:
  3. DedeCms织梦彩色标签云(tag)随机颜色和字体大小
  4. linux 环境变量_如何管理你的 Linux 环境变量 | Linux 中国
  5. wordpress4.9服务器迁移
  6. 【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表
  7. Quartz调用大全
  8. 虚拟化技术(1)——介绍
  9. ISA Server 2006防火墙安装与管理指南(含企业版NLB与CARP的配置)
  10. 从Exchange 通往Office 365系列(五)部署MailBox服务器
  11. Oracle作业5——多表查询、子查询
  12. <C语言>数据文件自动生成(多模块进阶)
  13. 面试官都震惊,你这网络基础可以啊!
  14. GD32使用ST的HAL库和GD官方库的一些体会
  15. 众元教育H3CSE20200603班-IPsec
  16. easydarwin php,Windows版本EasyDarwin
  17. 操作系统实验七(银行家算法)
  18. python用schedule库实现定时功能,可每天定时运行程序。
  19. Visual Studio日文乱码解决方法
  20. 下拉菜单Spinner用法

热门文章

  1. 新闻发布项目——实体类(newsTb)
  2. gophp解释器_【干货】Gisp 解释器 Golang 辅助开发工具
  3. thinking-in-java(19)枚举类型
  4. java hipster!_通过Java Hipster升级Spring Security OAuth和JUnit测试
  5. java查找链表中间元素_如何通过Java单次查找链表的中间元素
  6. 抽取大小: 高斯sigma_无服务器:SLAppForge Sigma入门
  7. mycat和应用程序集成_企业应用程序集成简介
  8. 春春幼儿园堆积木大赛_春云边车
  9. sts集成jboss_如何为JBoss Developer Studio 8设置集成和SOA工具
  10. Apache Camel 3只有2个月的路程