参考:
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;
}
}