JSF websocket 更新 viewScope
JSF websocket update viewScope
我有一个名为 sampleBean 的 bean,其范围由 viewScope 限定。
此 bean 从数据库 (MySQL) 加载一些数据。
我的问题是一些记录在用户之间共享。
现在也许 [USER A] 删除了那个共享记录,我想更新其他用户的视图。
我无法将范围更改为 ApplicationScope,因为所有记录都共享给所有用户。
如何解决这个问题?
注意:我读了这个post但不明白如何解决这个问题。
注意 : 我使用 JavaEE 8 (webProfile) 的 Liberty 18.0.0.4
我用这个简单的代码解决了问题。 (我为你分享了这段代码)
public class Information {
private String name ;
private String family ;
// constructor
// Getter & Setter
// override equal and hashCode
}
这是一项简单的服务。 (我在这上面模拟了数据库class)
@Stateless
public class InformationService {
private static final List<Information> db = new ArrayList<>();
@Inject
@Push(channel = "infoChannel")
PushContext push;
@PostConstruct
public void init() {
Information userA = new Information("John", "Vankate");
Information userB = new Information("Julius", "Sampao");
db.add(userA);
db.add(userB);
}
public void remove(Information info) {
db.remove(info);
push.send("deleteInfo");
}
public List<Information> findAll() {
return db;
}
}
和简单的 JaxRs 资源:
@Path("/info")
@RequestScoped
public class InformationResources {
@EJB
private InformationService informationService;
@Path("/delete")
@POST
@Consumes("application/json")
public String send(Information information) {
informationService.remove(information);
return "Receive : " + information;
}
}
现在启动 JSF:
@Named
@ViewScoped
public class InformationBean implements Serializable {
private Information info ;
private List<Information> informationList ;
@EJB
private InformationService informationService ;
@PostConstruct
public void init() {
informationList = informationService.findAll();
info = new Information() ;
}
public void deleteInformation() {
informationService.remove(info);
}
public Information getInfo() {
return info;
}
public void setInfo(Information info) {
this.info = info;
}
public List<Information> getInformationList() {
return informationList;
}
public void setInformationList(List<Information> informationList) {
this.informationList = informationList;
}
}
和 xhtml :
<h:body>
<p:dataTable value="#{informationBean.informationList}" var="info" id="infoTable">
<p:column rowHeader="name">
<h:outputText value="#{info.name}"/>
</p:column>
<p:column rowHeader="family">
<h:outputText value="#{info.family}"/>
</p:column>
<p:column rowHeader="action">
<h:form>
<p:commandButton value="Delete" action="#{informationBean.deleteInformation}">
<f:setPropertyActionListener value="#{info}" target="#{informationBean.info}"/>
</p:commandButton>
</h:form>
</p:column>
</p:dataTable>
<hr/>
<f:websocket channel="infoChannel">
<p:ajax event="deleteInfo" update="infoTable"/>
</f:websocket>
</h:body>
我已经想到,PushContext 必须在 JSF beans 上实现,现在我明白可以在 service 或 business logic 层中实现它。
现在您可以从 JaxRs (Rest API) 中删除信息并从 p:dataTable
中删除记录而无需刷新页面。
注意:这个例子使用@ViewScoped
我有一个名为 sampleBean 的 bean,其范围由 viewScope 限定。
此 bean 从数据库 (MySQL) 加载一些数据。
我的问题是一些记录在用户之间共享。
现在也许 [USER A] 删除了那个共享记录,我想更新其他用户的视图。
我无法将范围更改为 ApplicationScope,因为所有记录都共享给所有用户。
如何解决这个问题?
注意:我读了这个post但不明白如何解决这个问题。
注意 : 我使用 JavaEE 8 (webProfile) 的 Liberty 18.0.0.4
我用这个简单的代码解决了问题。 (我为你分享了这段代码)
public class Information {
private String name ;
private String family ;
// constructor
// Getter & Setter
// override equal and hashCode
}
这是一项简单的服务。 (我在这上面模拟了数据库class)
@Stateless
public class InformationService {
private static final List<Information> db = new ArrayList<>();
@Inject
@Push(channel = "infoChannel")
PushContext push;
@PostConstruct
public void init() {
Information userA = new Information("John", "Vankate");
Information userB = new Information("Julius", "Sampao");
db.add(userA);
db.add(userB);
}
public void remove(Information info) {
db.remove(info);
push.send("deleteInfo");
}
public List<Information> findAll() {
return db;
}
}
和简单的 JaxRs 资源:
@Path("/info")
@RequestScoped
public class InformationResources {
@EJB
private InformationService informationService;
@Path("/delete")
@POST
@Consumes("application/json")
public String send(Information information) {
informationService.remove(information);
return "Receive : " + information;
}
}
现在启动 JSF:
@Named
@ViewScoped
public class InformationBean implements Serializable {
private Information info ;
private List<Information> informationList ;
@EJB
private InformationService informationService ;
@PostConstruct
public void init() {
informationList = informationService.findAll();
info = new Information() ;
}
public void deleteInformation() {
informationService.remove(info);
}
public Information getInfo() {
return info;
}
public void setInfo(Information info) {
this.info = info;
}
public List<Information> getInformationList() {
return informationList;
}
public void setInformationList(List<Information> informationList) {
this.informationList = informationList;
}
}
和 xhtml :
<h:body>
<p:dataTable value="#{informationBean.informationList}" var="info" id="infoTable">
<p:column rowHeader="name">
<h:outputText value="#{info.name}"/>
</p:column>
<p:column rowHeader="family">
<h:outputText value="#{info.family}"/>
</p:column>
<p:column rowHeader="action">
<h:form>
<p:commandButton value="Delete" action="#{informationBean.deleteInformation}">
<f:setPropertyActionListener value="#{info}" target="#{informationBean.info}"/>
</p:commandButton>
</h:form>
</p:column>
</p:dataTable>
<hr/>
<f:websocket channel="infoChannel">
<p:ajax event="deleteInfo" update="infoTable"/>
</f:websocket>
</h:body>
我已经想到,PushContext 必须在 JSF beans 上实现,现在我明白可以在 service 或 business logic 层中实现它。
现在您可以从 JaxRs (Rest API) 中删除信息并从 p:dataTable
中删除记录而无需刷新页面。
注意:这个例子使用@ViewScoped