CDI——事件

参考:

CDI进阶第五步 CDI事件  简单的例子

CDI(Weld)高级<4> Event(事件)  很详细的有关CDI事件的讲解

CDI事件

主要就是两个点:

1、@Observes注解

2、Event<T>接口

正确的做法是写一个观察者类,在观察者类中的观察方法参数上加上@Observes注解就可以了。

 

还是拿之前的jboss quickstart项目来分析:

一个是新增,一个是显示,在同一个页面上不需要刷新页面实现页面数据动态更新。新增的时候调用fire通知显示后台的观察者,接收到事件,执行更新方法。

<br /> 新增
	<h:form>
		<h:panelGrid columns="2">
			<h:outputLabel value="name" for="name"/>
			<h:inputText value="#{myNewMember.name}" id="name"/>
			
			<h:outputLabel value="email" for="email"/>
			<h:inputText value="#{myNewMember.email}" id="email"/>
			
			<h:outputLabel value="phoneNumber" for="phoneNumber"/>
			<h:inputText value="#{myNewMember.phoneNumber}" id="phoneNumber"/>
			
			<h:commandButton action="#{myController.myRegister()}" value="register" />
		</h:panelGrid>
	</h:form>


<br /> 表格
<p:dataList value="#{myMembers}" var="_member" >
		<f:facet name="header">
			Member
		</f:facet>
		<p:panel header="#{_member.name}">
			<h:outputText value="#{_member.email}" class="removeBtn"/>
		</p:panel>
	</p:dataList>

 

新增后台:

定位:#{myNewMember.name}

fire:

使用指定的限定符触发事件并通知观察者。

@Model
public class MyController {

	@Inject
	private MyMemberRegistration myMemberRegistration;
	
	@Produces 	//动态注入
	@Named		//名称限定符
	private Member myNewMember;
	
	//注解,初始化执行一次
	@PostConstruct
	public void initMyMember() {
		myNewMember = new Member();
	}
	
	public void myRegister() throws Exception{		
		myMemberRegistration.myRegister(myNewMember);
		//清空 界面
		initMyMember();
	}
}


@Stateless
public class MyMemberRegistration {
	
	@Inject
	private EntityManager em;
	
	@Inject
	private Event<Member> event;
	
	public void myRegister(Member member) {
		em.persist(member);
		
		//通知观察者 执行带 @Observes 的方法 (重新获取数据库中的member)
		//使用指定的限定符触发事件并通知观察者。
		event.fire(member);	
	}
}

 

显示后台:

定位:#{myMembers}

注释稍微有点乱,别的不多看,主要就是 reGetMemberList 方法 @Observes,接收传递过来的事件,执行方法。

@RequestScoped
public class MyMemberListProducer {

	private List<Member> myMembers;

	@Inject
	private EntityManager em;

	@Produces	//动态注入 方法
	@Named
	public List<Member> getMyMembers() {
		return myMembers;
	}

	// 新增完以后 会通知观察者 重新获取数据 实现当前页面的刷新
	public void reGetMemberList(@Observes Member member) {
		getMemberList();
	}

	// 构造函数以后执行这里
	@PostConstruct
	public void getMemberList() {
		myMembers = memberList();
	}

	public List<Member> memberList() {
		CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
		CriteriaQuery<Member> query = criteriaBuilder.createQuery(Member.class); // createQuery的参数是Query返回值类型
		Root<Member> member = query.from(Member.class); // 参数是对应于order表的实体类,query.from类似于sql中的from语句,该方法的执行等价于sql中的from

		// 默认查询全部
		query.select(member); // query.select(root)则等价于select *
		TypedQuery<Member> tq = em.createQuery(query);
		List<Member> list = tq.getResultList();
		return list;
	}
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿姨不可以嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值