CDI(Weld)基础<2> JSF+CDI+JPA项目示例

2023-10-29

CDI可以理解为Spring,但其中的一些功能比spring更强大,灵活。本章是个简单的项目示例。推荐有一定基础的看。

1.JPA定义(MVC--M)

@Entity
public class User {

   private @NotNull @Length(min=3, max=25) @Id String username;
   private @NotNull @Length(min=6, max=20) String password;

   public String getUsername() { return username; }
   public void setUsername(String username) { this.username = username; }
   public String setPassword(String password) { this.password = password; }
}
Bean Validation 里面注解可参考http://my.oschina.net/zhaoqian/blog/118458

2.定义一个managedBean(MVC-C)

@Named(' Credentials') 
@RequestScoped
public class CredentialsBean{

    private String username;
    private String password;

    @NotNull @Length(min=3, max=25)
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }

    @NotNull @Length(min=6, max=20)
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}

3.jsf登录页面(MVC-V)

<h:form>
   <h:panelGrid columns="2" rendered="#{!login.loggedIn}">
      <f:validateBean>
         <h:outputLabel for="username">Username:</h:outputLabel>
         <h:inputText id="username" value="#{credentials.username}"/>
         <h:outputLabel for="password">Password:</h:outputLabel>
         <h:inputSecret id="password" value="#{credentials.password}"/>
      </f:validateBean>
   </h:panelrid>

   <h:commandButton value="Login" action="#{login.login}" rendered="#{!login.loggedIn}"/>
   <h:commandButton value="Logout" action="#{login.logout}" rendered="#{login.loggedIn}"/>
</h:form>

4.定义2个qualifier注解

我们要用session scope bean 维护当前登录用户信息,并提供给上下文的其他Bean使用.

首先定义2个qualifier。用于登录,JPA EntityManager。

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, PARAMETER, FIELD})
public @interface LoggedIn {}

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, PARAMETER, FIELD})
public @interface UserDatabase {}

A:我们需要适配一个类型安全的EntityManager:,作为资源存在于项目中,JPA就可以以inject的方式注入调用。代码如下:

class UserDatabaseProducer {

 	@Produces 
	@UserDatabase 
	@PersistenceContext 
    	static EntityManager userDatabase;
}

5.开发SessionScope

@SessionScoped @Named
public class Login implements Serializable {

   @Inject Credentials credentials;

   @Inject @UserDatabase EntityManager userDatabase;

   private User user;

   public void login() {
      List<User> results = userDatabase.createQuery(
         "select u from User u where u.username = :username and u.password = :password")
         .setParameter("username", credentials.getUsername())
         .setParameter("password", credentials.getPassword())
         .getResultList();

      if (!results.isEmpty()) {
         user = results.get(0);
      }
      else {
         // perhaps add code here to report a failed login
      }
   }

   public void logout() {
      user = null;
   }

   public boolean isLoggedIn() {
      return user != null;
   }

   @Produces @LoggedIn User getCurrentUser() {
      return user;
   }
}

现在,其他的Bean就可以随意的注入  qualifiers为:@LoggedIn,type为: User的资源。

如下代码调用:

public class ViewUserBean {

   @Inject @LoggedIn User currentUser;
   @Inject @UserDatabase EntityManager docDatabase;
    
   public void viewUser() {
      //........todo
   }
}
在页面:
<h:panelGroup rendered="#{login.loggedIn}">
   signed in as #{currentUser.username}
</h:panelGroup>

最后写出一段相关在实际项目中使用的resources。

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Resources {

	/**
	 * We are using a non JTA managed persistence context, so we cannot inject an EntityManager with @PersistenceContext,
	 * as this would try to inject a container managed EntityManager.
	 */
	@PersistenceUnit
	private EntityManagerFactory entityManagerFactory;

	@Produces
	@RequestScoped
	protected EntityManager createEntityManager() {

		return entityManagerFactory.createEntityManager();
	}

	protected void closeEntityManager(@Disposes EntityManager entityManager) {

		if ( entityManager.isOpen() )
			entityManager.close();
	}

	// if you using JTA,you can used this
	// @Produces
	// @PersistenceContext
	// EntityManager em;

	@Produces
	public Logger produceLog(InjectionPoint injectionPoint) {

		return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
	}
}
在其他Bean就可以直接@inject这样注入使用。会非常方便。

如:  @Inject EntityManager em; 

        @Inject Logger log;

本章用于CDI项目演示。

转载于:https://my.oschina.net/zhaoqian/blog/226997

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CDI(Weld)基础<2> JSF+CDI+JPA项目示例 的相关文章

  • 华为手机连电脑当摄像头用_华为手机摄像头还能这样用!300页文档轻松电子化,堪称职场法宝...

    华为手机摄像头还能这样用 300页文档轻松电子化 堪称职场法宝 我们生活中经常会使用相机记录一些美好的瞬间 可是你知道吗 华为手机摄像头还能这样用 300页的纸质文档可轻松电子化 堪称职场法宝 使用过华为手机的朋友们 应该都知道华为手机的拍
  • 三极管使用详解

    扣扣技术交流群 460189483 PNP型的三极管使用方法 常见的三极管为9012 s8550 9013 s8050 单片机应用电路中三极管主要的作用就是开关作用 其中9012与8550为pnp型三极管 可以通用 其中9013与8050为
  • Ubuntu需要运行networkmanager的解决方法

    问题 在使用ubuntu时无法联网 打开网络设置发现如下情况 解决方法 打开终端 输入su 获取管理员权限 然后输入systemctl start NetworkManager service 完成后即可正常联网了 新问题 每次开机后都需要
  • 元器选型攻略之 电感

    电子元器件领域电阻 电容 电感被称为 三剑客 其中电感又被称为 渣男 什么是电感 提到电感 离不开电感线圈这个名词 即用绝缘导线绕制而成的电磁感应元件 要理解电感 首先了解几个名词 感生 变化 改变 让我们回到高中课本 1 当一个导体相对磁
  • 论文笔记:Deep Representation Learning for Trajectory Similarity Computation

    ICDE 2018 1 intro 1 1 背景 用于计算轨迹相似性的成对点匹配方法 DTW LCSS EDR ERP 的问题 轨迹的采样率不均匀 如果两个轨迹表示相同的基本路径 但是以不同的采样率生成 那么这些方法很难将它们识别为相似的轨
  • Qt 之 QSS(样式表语法)

    简述 Qt样式表 以下统称QSS 的术语和语法规则几乎和CSS相同 如果你熟悉CSS 可以快速浏览以下内容 样式规则 QSS包含了一个样式规则序列 一个样式规则由一个选择器和声明组成 选择器指定哪些部件由规则影响 声明指定哪些属性应该在部件
  • 以XML形式访问远程接口获得数据

    JDK提供了供我们访问url获得数据的类 核心类主要是URL URLConnection等 详见JDK API 下面以XML形式实现两者通信 Servlet端发送信息 Java代码 protected void doGet HttpServ
  • Unity3D官方教程——Survival Shooter学习记录

    unity 官方教程Survival Shooter 学习笔记 1 准备工作 新建项目并导入官方商店的Survival Shooter资源 在Assets下新建文件夹 Scence并在新文件夹内保存当前新场景命名为Main 2 背景和背景音
  • allegro设置禁止铺铜区的方法

    allegro设置禁止铺铜区的方法 Cadence Allegro 16 6 关于shape分割的一种方法 Allegro 铺铜设置 使用Shape Keepout设置禁止铺铜区 操作方法是Setup Areas Shape Keepout
  • 数据可视化python,绘制饼图,代码和解析

    饼图样式 使用matplotlib pyplot pie绘制 代码描述 import matplotlib pyplot as plt import pandas as pd 定义饼状图的标签 标签是列表 timeData pd read
  • Leetcode刷题(14. 最长公共前缀)

    Leetcode刷题 14 最长公共前缀 一 题目 二 代码 C 三 提交记录 四 备注 一 题目 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀 返回空字符串 示例 1 输入 flower flow flight 输出
  • 延长线段ab到c的画法有几种_垂直与平行的画法

    点击蓝字关注我们 垂直与平行的画法 现在中考对作图要求越来越高 作图是对我们应用数学基本定理 性质以及动手能力的一种考察 问题的关键在于学生平时忽视了定理 性质的重要性 甚至初三念完了书还是新的 通过作图 对定理和性质进行理解记忆 问题1
  • 使用Python爬取不同类别的豆瓣电影简介

    使用Python爬取不同类别的豆瓣电影简介 之前做过一点文本分类的工作 从豆瓣上爬取了不同类别的数千条电影的简介 爬取目标 我们爬取的目标是 豆瓣影视 打开豆瓣网 随便点击一部电影 即可看到电影的介绍 评论等信息 我们需要爬取的是电影的简介
  • sed与awk读书笔记[sed篇]

    简介 个人基础及笔记重点 sed基础 常用参数包括 寻址包括 常用命令包括 标志flags 正则表达式 sed高级这一章要详细讲解要不迷惑性太大举例 N命令 D命令 跳转命令aba 跳转命令ata hHgGx利用保持空间的命令 熟悉例子 最
  • Idea工具的使用

    文章目录 一 IDEA的使用 二 IDEA工具的快捷键以及一些简单的设置 1 字体设置 2 快速生成main方法 psvm 3 快速生成System out println sout 4 注意 IEDA是自动保存 不需要ctrl s 5 删
  • Python+Opencv 提取图片中某种颜色组成的图形

    主要目标识别图中红色的裂缝 尝试了几种不同的方法 最后发现比较每一点的RGB差值可以很好的解决这个问题 也就是提取图片中的红色相关信息 处理结果如下 实现的代码如下 注意opencv读入的图片通道顺序是bgr import cv2 impo
  • AWG线规对照表

    AWG American Wire Gauge 是美国电线标准的简称 AWG值是导线直径 以英寸计 的单位 其中 4 0表示0000 3 0表示000 2 0表示00 1 0表示0 例如 常用的电话线直径为26AWG 约为0 4mm 下表是
  • 停更一次博客

    明天微机原理复习 下周补两次博客
  • scala 的模式匹配与类型系统

    主要内容 1 scala模式匹配 2 scala类型系统 scala模式匹配 scala中的模式匹配与java中的switch case很类似 但是不同的是java中switch case只能匹配值 而scala模式匹配更强大 还可以对类型
  • execjs._exceptions.ProcessExitedWithNonZeroStatus

    报错如下图 提示我292的换行符有问题 刚开始我以为是我服务器的nodejs环境没有配好 就忽略了换行错误 后面发现nodejs已经配置好了 才转过来正视这个问题 在gitlab的textview里发现了端倪 在pycharm里面根本发现不

随机推荐

  • 三路红外arduino循迹小车(两驱-----黑线循迹)

    原理 红外传感器检测到黑线 红外光被吸收 其对于的led将不亮 反之无黑线 红外光被反射接收 点亮led 源代码是我借鉴他人加以修改的 代码也很简单 缺点就是跑不快 一旦快了容易冲出巡线轨迹 define STOP 0 define FOR
  • SpringBoot+Netty+WebSocket 实现消息推送

    关于Netty Netty 是一个利用 Java 的高级网络的能力 隐藏其背后的复杂性而提供一个易于使用的 API 的客户端 服务器框架 Maven依赖
  • Zotero使用分享(一)——导入文献、管理文献、引用文献

    Zotero使用分享 一 导入文献 管理文献 引用文献 0 为什么要用文献管理工具 1 Zotero是什么 2 安装 3 添加资源到Zotero 3 1 通过文献DOI导入 3 2 从剪贴板中导入 3 3 利用EndNote导入 3 4 用
  • BindingException: Invalid bound statement (not found)

    org apache ibatis binding BindingException Invalid bound statement not found com UserInfoMapper listByRole 报错描述 程序一直可以正常
  • NTSC、PAL、SECAM三大制式简介

    NTSC PAL SECAM三大制式简介 NTSC PAL和SECAM是全球三大主要的电视广播制式 这三种制式是不能互相兼容的 例如在PAL制式的电视上播放NTSC的视频 则影像画面将不能正常显示 下面分别对这三种制式进行简要介绍 NTSC
  • Deeplabcut----(1)新建自己的训练(单只动物)

    Deeplabcut新建自己的训练 本教程最后使用Autodl云平台跑代码 本地电脑上只是进行数据标注 建议直接新建多动物训练 比单动物的项目能干的事多 也能对单动物进行预测 个人使用感觉还是mmpose预测新视频和图片的正确率更高 整个文
  • 阿里云服务器安装及部署canal

    阿里云服务器安装及部署canal 1 环境部署 1 1 mysql开启binlog模式 1 查看当前mysql是否开启binlog模式 SHOW VARIABLES LIKE log bin 如果log bin的值为OFF是未开启 为ON是
  • 多线程学习十九:生产者消费者

    异步模式之生产者 消费者 定义 与前面的保护性暂停中的 GuardObject 不同 不需要产生结果和消费结果的线程一一对应 消费队列可以用来平衡生产和消费的线程资源 生产者仅负责产生结果数据 不关心数据该如何处理 而消费者专心处理结果数据
  • Pandoc 实用教程

    Pandoc 是一种将各类文件互相转换的工具 例如 docx html markdown epub pdf 等 在一些 markdown 写作工具中 它常被用作导出工具的一种 Pandoc 的安装 安装方法有很多种 方案一 直接通过 Pan
  • CentOS6系统中在/etc/rc.local添加开机自启动项启动失败

    CentOS6系统中在 etc rc local添加开机自启动项启动失败 应项目要求需要在开机的时候启动自己的Redis程序 想当然的直接就往 etc rc local当中添加启动命令 结果重启之后发现什么都没有发生 一开始还以为是配置的问
  • SQL增删改查语句学习

    删除语句 语法 DELETE FROM 表名 WHERE 条件 例如 DELETE FROM studentchose WHERE sc id 202046 DELETE FROM studentchose WHERE sc id 2020
  • 基于springboot的校园疫情防控系统【毕业设计,源码,论文】

    想要源码或其他毕设项目 可以私信 摘 要 随着信息技术和网络技术的飞速发展 人类已进入全新信息化时代 传统管理技术已无法高效 便捷地管理信息 为了迎合时代需求 优化管理效率 各种各样的管理系统应运而生 各行各业相继进入信息管理时代 校园疫情
  • Linux下远程git服务器拉取代码发布jar包脚本

    一 yum安装 在Linux上是有yum安装Git 非常简单 只需要一行命令 yum y install git 二 maven安装 参考https www jianshu com p 51e4e84e02cd 三 编写脚本 脚本步骤如下
  • Echarts 地图使用,以及tooltip轮播使用

    一 首先下载Echarts npm install echarts save 二 引入Echarts 全局引入main js中 echarts 4 0 import echarts from echarts Vue prototype ec
  • sql注入-union select

    什么是SQL注入 SQL注入 Sql Injection 是一种将SQL语句插入或添加到应用 用户 的输入参数中的攻击 这些参数传递给后台的SQL数据库服务器加以解析并执行 哪里存在SQL注入 GET POST HTTP头部注入 Cooki
  • 第一次使用Arduino IDE(mac os) 配置合宙ESP32C3(9.9包邮)且烧录代码的历程

    目录 Arduino 配置ESP32 1 Arduino 请更新至最新版 2 科学上网 3 添加开发板管理URL 配置 1 连接开发板 2 Arduino IDE 的配置 3 烧录代码 Arduino 配置ESP32 1 Arduino 请
  • java实现pdf上传、下载、在线预览、删除、修改等功能

    资源下载 pdf上传 下载 在线预览 删除 修改功能源码 最近闲来无事 做了一个pdf的小功能 以供各位大神参考 下面是效果展示图 功能主页 点击上传PDF按钮 上传文件之后 在线预览 开发环境 jdk 1 8 mysql 5 7 开发工具
  • 蓝牙 bluetooth-之一

    蓝牙profile的作用 蓝牙子系统应用程序的交互通过蓝牙profile实现 profile有些文献将其解释为子协议 似乎不是很准确 我依然以profile称呼它 蓝牙profile定义了蓝牙子系统分层结构中的每一层需要具有的功能和特性 G
  • loss.backward() Segmentation fault 段错误

    在运行一个非常简单的深度学习程序的时候 发现运行一段时间会报错 段错误 经过定位发现是执行loss backward 的时候出现的问题 而源码明显是没有什么问题的 具体排查可以这样 gdb args python train py 然后发现
  • CDI(Weld)基础<2> JSF+CDI+JPA项目示例

    2019独角兽企业重金招聘Python工程师标准 gt gt gt CDI可以理解为Spring 但其中的一些功能比spring更强大 灵活 本章是个简单的项目示例 推荐有一定基础的看 1 JPA定义 MVC M Entity public