使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第2部分

在本文中,我们将重点介绍CDI和Servlet 3.0。 您可以在此处看到第1部分。

让我们从CDI开始。

当我开始撰写源自该系列的文章时,我并没有考虑撰写CDI。 真诚地说,我以前从未使用过。 这篇文章的想法是使用jedis和servlet创建一个对象。 但是,当我编写应用程序时,我只是讨厌实例化bean的想法。 在我的日常工作中,我使用Spring进行依赖项注入和其他操作,但是对于此帖子,我不想添加。 因此,我决定尝试CDI,而在应用程序中添加和使用它的简单性让我感到非常惊讶。

那么,什么是CDI?

CDI是上下文和依赖注入的首字母缩写,是在javaee平台上解决DI的javaee规范。 因此,一旦在项目中将其激活,就可以使用@Inject批注轻松注入依赖项。 在CDI上,一切都是豆子,
并且几乎所有的类都可以注入。

如何激活CDI?

如果我们在Java EE应用程序服务器中运行应用程序,则只需在META-INF文件夹中添加一个空的beans.xml。 但是在诸如tomcat之类的服务器中,我们需要添加更多文件和配置:

  1. 在lib文件夹中添加weld-servlet.jar。 您可以从Weld网站获取它;
  2. 在META-INF下创建一个文件context.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
    <Manager pathname=""/> <!-- disables storage of sessions across restarts -->
    <Resource name="BeanManager"
    auth="Container"
    type="javax.enterprise.inject.spi.BeanManager"
    factory="org.jboss.weld.resources.ManagerObjectFactory"/>
    </Context>
  3. 在web.xml上添加一些焊接配置:
    <listener><listener-class>org.jboss.weld.environment.servlet.Listener</listener-class></listener><resource-env-ref><resource-env-ref-name>BeanManager</resource-env-ref-name><resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type></resource-env-ref>
  4. 然后,我们只需要在META-INF或WEB-INF上添加一个空的beans.xml。

之后,我们准备开始使用CDI进行编码。

在上一篇文章中,我们创建了一个UserDAO类,在这些方法中,我们使用Jedis类的实例执行Redis命令。 使用@Inject批注将该实例注入到UserDAO对象中。 我们可以在下面看到:

public class UserDAO {@Inject Jedis jedis;//....
}

如我们所见,注入Jedis类的实例非常简单。 如果Jedis类具有不带参数的构造函数,则将其直接注入。 但事实并非如此,因此我们使用了带有@Produces注释方法的类。 这表明这是生产者方法。 在我们的示例中,我们还使用了JedisPool,从中可以获取Jedis连接。 在这种情况下,我们有两个生产者:

  1. 对于JedisPool
  2. 其他用于Jedis连接。

Jedis生产者有一个通过@Inject注入的JedisPool实例,我们可以在下面看到它们:

JedisPoolFactory:

public class JedisPoolFactory {private String host = "localhost";private JedisPool jedisPool;@Singletonpublic @Produces JedisPool getJedisPool(){jedisPool = new JedisPool(new JedisPoolConfig(), host);return jedisPool;}public void detroy(@Disposes JedisPool jedisPool){jedisPool.destroy();}
}

在代码中,我们看到方法getJedisPool带有@Produces注释,表示它是JedisPool实例的生产者。 在这段代码中,我们还看到了另外两个注释。

  1. @Singleton –说返回的实例是一个单例,这意味着将只有一个此类的实例;
  2. @Disposes –指示销毁JedisPool实例时应调用哪个方法;

现在我们可以看到JedisConnectionFactory

public class JedisConnectionFactory {@Injectprivate JedisPool jedisPool;@Produces public Jedis getJedis(){return jedisPool.getResource();}public void returnResource(@Disposes Jedis jedis){System.out.println("Returning jedis Connection");jedisPool.returnResource(jedis);}}

要获取Jedis实例,该类需要一个JedisPool实例。 JedisPool是通过@Inject注入的,它是由我们在上一个代码中看到的producer方法创建的。 它还有一个@Disposes ,它仅将连接返回到Pool。

因此,通过这种方式,我们可以将Jedis实例注入DAO。 然后在其他类中,我们仅使用@Inject ,就像在Service和Servlet类中看到的那样:

//UserService
@RequestScoped
public class UserService {@InjectUserDAO userDAO;
//...
}//Servlet - UserController
public class UserController extends HttpServlet {private static final long serialVersionUID = 1L;@Inject UserService userService;
//...
}

在此示例中,我们可以看到在应用程序中添加和使用CDI有多么简单。

Servlet 3.0

我们在新servlet上的主要区别在于我们不需要在web.xml中声明它们,现在我们可以简单地通过使用注释来设置servlet设置。 在示例中构建的servlet中,我们使用了注释来设置servlet的url映射。 以前已经开发过servlet的人都知道这是我们需要在web.xml上添加的配置之一。 我们可以在下面的servlet中看到它:

@WebServlet("/UserController")
public class UserController extends HttpServlet {private static final long serialVersionUID = 1L;@Inject UserService userService;
//...//.. doGet
//.. doPost}

在上面的代码中,我们说的是servlet将响应/ UserController路径。 使用此注释,我们可以添加更多配置,例如:

@WebServlet(value="/UserController", name="userServlet")

在上面的代码中,我们声明了映射和servlet名称。 还有其他注释可以简化servlet api的使用,例如@ WebInitParam,@ WebListener和@WebFilter 。 我们不会谈论它们,但是您可以找到关于它们的大量资源。 另外,由于Servlet 3.0,因此支持异步处理。

今天就这样。 欢迎任何意见或建议。

  • 您可以在此处找到源代码。

参考: 使用Servlet 3.0,Redis / Jedis和CDI的简单CRUD –第2部分,来自XICO JUNIOR'S WEBLOG博客的JCG合作伙伴 Francisco Ribeiro Junior。

翻译自: https://www.javacodegeeks.com/2013/11/simple-crud-using-servlet-3-0-redisjedis-and-cdi-part-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Safari支持Service Worker,PWA还有多久爆发?

作者 | 彭星 编辑 | 尾尾 在之前的文章《PWA 将带来新一轮大前端技术洗牌&#xff1f;》中&#xff0c;我们回顾了 Web 在移动时代遭遇的两大枷锁&#xff0c;并就PWA是否能真正弥补 Web 劣势进行了分析&#xff0c;同时&#xff0c;提出“根据当前的发展趋势&#xff0c;PWA…

安装python3 及virtual与virtualenvwrapper

安装python3 下载python源码包 网址&#xff1a;https://www.python.org/downloads/release/python-362/ 下载地址&#xff1a;https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz 安装python前的库环境&#xff0c;非常重要 yum install gcc patch libffi-devel py…

响应式设计与前端工程性

一&#xff1a;响应式的几个基本知识 字体选择 有衬线和无衬线&#xff0c;那种字体看自己的美学意识和考虑 透视比例与体验一致性保证&#xff08;人眼的位置&#xff09; 行高&#xff0c;字体大小&#xff0c;间距&#xff0c;要根据整个展示范围的透视比例合理的去规划pc 离…

aspx写入mysql_Asp.net用户登陆数据库验证与注册写入数据库

1.思路与效果图Index.aspx注册注册成功登陆登陆验证通过进入内容页1登陆没通过验证思路&#xff1a;首先建一个Sqlserver数据库Student,再建一个student表(name,pwd)存放用户名和密码。然后注册功能的实现&#xff1a;通过数据库插入信息到表的Sql语句来实现&#xff0c;成功提…

在WildFly中将Apache Camel和Spring添加为jboss模块

这些天&#xff0c;我在玩Wildfly &#xff0c; Apache Camel和Spring 。 在EAR / WAR之间进行通信的一种简单方法是使用Camel的direct-vm组件。 有或没有骆驼&#xff0c;有很多方法可以实现这一目标。 骆驼在WildFly中就像一个饰物&#xff0c;不需要任何额外的配置。 骆驼很…

页面体验提升小技巧—渐进式图片

前端性能方面有许多可优化的点&#xff0c;而这些优化带来的就是用户体验的提升。今天我们要聊的东西并不能给性能带来提升&#xff0c;但却能在一定程度上提升用户的体验。 参考博客 场景&#xff1a;在访问页面的时候如果图片较大或者网速慢的情况我们会看到图片加载起来是有…

php mysql无限分类排序_PHP 无限级分类、排序

lyk625358header(content-type:text/html;charsetutf-8);echo "";//-无限级排序,自己优化改良的,清除上次调用此函数后留下的静态变量的值$arr array(array(id>2,cname>分类2,parent_id>1),array(id>9,cname>分类9,parent_id>8),array(id>1,cn…

Java方法中的参数太多,第5部分:方法命名

在上一篇文章 &#xff08;有关处理Java方法中过多参数的系列文章的 第4部分 &#xff09;中&#xff0c;我将方法重载视为一种向客户提供需要较少参数的方法版本或构造函数的方法。 我描述了该方法的一些缺点&#xff0c;并建议从方法重载中摆脱出来以使用不同名称的方法至少可…

微信小程序搭配小白接口,自己没有服务器也能开发哦

这里将重点介绍&#xff0c;在自己没有服务器的情况下&#xff0c;如何在微信小程序里直接调用小白接口。 前提 假设你已经开通微信小程序&#xff0c;如果还没有&#xff0c;可前往微信公众平台开通&#xff1a;https://mp.weixin.qq.com 假设你已经开通小白接口&#xff0c…

LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置

1、题目描述 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值&#xff0c;返回 [-1, -1]。 示例 1: 输入: nums [5,7,7,8,8,10], targ…

怎么将自己做好的网站发布到互联网上呢?

如何将自己的网站上传到网站空间。 1.需要有一个上传网站的软件&#xff0c;在这里推荐大家使用 FTP全称是flashfxp这个软件&#xff0c;这个功能功能齐全而且操作简单。大家可以先去下载一下这个软 件 2. 打开FTP&#xff0c;界面如下 3.我们要点击链接按钮&#xff0c;然后FT…

vue动态生成下拉框_vue+elementui 动态创建下拉框

v-for"(domain, index) in dynamicValidateForm.domains":label"‘站点‘ index":key"domain.id">v-for"item in testData":key"item.id":label"item.testName":value"item.id":disabled"item…

[贝聊科技]网页端「应用跳转」技术实现演变

本文作者&#xff1a;Mr.Luo &#xff0c;贝聊前端经理。本文同时发布于作者 个人博客 。 由于网页传播的便捷性&#xff0c;从网页向APP导流几乎是所有APP厂商都会采用的推广手段&#xff0c;具体来说就是在网页上提供一些触发点&#xff08;例如按钮、链接&#xff09;&#…

常见Java错误的十大列表(前100名!)

前10名名单非常受欢迎&#xff0c;有趣且内容丰富。 但是有很多&#xff01; 如何选择合适的&#xff1f; 这是一个元前10名列表&#xff0c;可帮助您找到前10名的前10名列表。 在更令人讨厌的笔记上&#xff1a; SELECT TOP 10 mistake FROM source1 UNION ALL SELECT TOP 10…

Ubuntu 16.04 下octave的使用入门

SciLab和octave是开源的且免费的矩阵计算工具&#xff0c;二者都有希望成为矩阵计算的新宠。相比之下&#xff0c; octave与MatLab的兼容性更高。octave遵循GPL协议&#xff08;GNU General Public License&#xff09;&#xff0c;用户可以单独发行octave或者包含在其产品中发…

hydra mysql 爆破_Hydra(爆破神器)使用方法

文本框 textarea 动态显示行数(简单文本编辑器)工作需求做一个文本编辑器简单的. 右边输入文字,左边会显示相应的代码行.清空也会变为1. 废话不多说上代码,自己理解. python中set使用In [2]: a set() # 常用操作1 In [3]: a Out[3]: set() In [4]: type(a) Out[4]: set In [5]…

消除switch语句以获得更好的代码结构

消除switch语句以获得更好的代码结构 代码演化1&#xff1a;纯switch function counter(state 0, action) {switch (action.type) {case INCREMENT:return state 1case DECREMENT:return state - 1default:return state} }用三元运算符代替 const counter (state 0, ac…

HTTP请求中POST与GET的区别

一、原理区别 一般我们在浏览器输入一个网址访问网站都是GET请求;在FORM表单中&#xff0c;可以通过设置Method指定提交方式为GET或者POST提交方式&#xff0c;默认为GET提交方式。 HTTP定义了与服务器交互的不同方法&#xff0c;其中最基本的几种&#xff1a;GET&#xff0c;P…

Linux服务器配置---安装vsftpd

安装vsftpd 大多数Linux系统都使用vsftpd&#xff0c;因此这里我们也安装vsftpd 1、安装vsftpd [rootlocalhost phpMyAdmin]# yum install -y vsftpd Loaded plugins: fastestmirror, refresh-packagekit, security Installed: vsftpd.i686 0:2.2.2-11.el6_4.1 …

Java方法中的参数太多,第1部分:自定义类型

我认为构造函数和方法中冗长的参数列表是Java开发中的另一个“ 危险信号 ”&#xff0c;就逻辑和功能而言&#xff0c;它们不一定是“错误的”&#xff0c;但通常暗示当前或将来出现错误的可能性很高。 在一小部分帖子中&#xff0c;我介绍了一些可用于减少方法或构造函数的参数…