gpt4 book ai didi

jsf-2 - 仅使用 @RequestScoped 编辑 JPA 实体的最佳 JSF 编码模式

转载 作者:行者123 更新时间:2023-12-04 05:29:52 25 4
gpt4 key购买 nike

我在一个项目中,我会写很多这样的页面,所以我想使用最有效的(编写)编码模式。

背景:过去我使用 CODI 的 @ViewAccessScoped 来保存请求之间的状态,最近我开始使用 Flash 范围对象来保存状态。我不能使用 JSF @ViewScoped,因为我使用 CDI,而且它们不能很好地配合使用。所以我想看看我是否可以只用@RequestScoped 支持bean 来做到这一点。

页面是这样设计的(p 命名空间是 Primefaces):

            <f:metadata>
<f:viewParam name="ID" value="#{backing.id}" />
</f:metadata>

....

<h1>Edit Object Page</h1>

<h:form id="formObj" rendered="#{backing.accessOK}">

<p:panelGrid columns="2">

<h:outputLabel value="Field #1:"/>
<p:inputText value="#{backing.record.field1}" />

(more input fields)

<h:outputLabel value="Action:" />
<h:panelGroup>
<p:commandButton value="Save"
action="#{backing.save}"
/>
<p:commandButton value="Cancel" action="backing.cancel" />
</h:panelGroup>

</p:panelGrid>
<p:messages showDetail="true" showSummary="true" />

</h:form>

如果页面被请求,方法 访问OK() 有能力保持 h:表格从被渲染。相反, p:留言显示为 人脸留言 (s) 访问OK() 方法关心设置。

bean 的模式 支持看起来像这样:
@Named
@RequestScoped
public class Backing {

private long id;
private SomeJPAEntity record;
private Boolean accessOK;

public long getId() { return id; }

public void setId(long value) { id = value; }

public boolean accessOK() {
if (accessOK != null) return accessOK;

if (getRecord() == null) {
// add a FacesMessage that explains the record
// does not exist
return accessOK = false; // note single =
}

// do any other access checks, such as write permissions

return accessOK = true;
}

public SomeJPAEntity getRecord() {
if (record != null) return record;

if (getId() > 0) record = // get the record from DB
else record = new SomeJPAEntity();

return record;
}

public String execute() {

if (!accessOK()) return null; // bad edit

// do other integrity checks here. If fail, set FacesMessages
// and return null;

if (getId() > 0) // merge the record back into the data base
else // persist the record

}

}

这是这个模型的问题所在。单击保存按钮时, 的新实例支持建好了,然后有很多调用 获取记录() 之前的 setter/getter 设置ID() 调用setter。所以 中的逻辑获取记录() 中断,因为它不能依赖 编号 属性在调用时有效。

当这是 @ViewAccessScoped (或 ViewScoped )支持 bean,然后是 编号 记录使用 处理表单时已经设置了属性。命令按钮 .或者,您可以将这些属性保存在闪存中,但这有其自身的问题,我想避免。

那么有没有办法让这个编程模型在规范中工作呢?

更新:

我有一个变通方法,凭经验允许它在不诉诸闪存或 View 范围变体的情况下工作。如上所述,在处理表单时,会有许多对 的调用。获取记录() 在第一次调用 之前setId() .然后最后 保存()方法被调用。

我所做的是修改 setId() 如下:
public void setId(long value) {
id = value;
record = null;
}

这迫使 获取记录() 重新计算(即获取/构建)属性 记录 ,然后后续调用工作。特别是 保存()在正确初始化对象的情况下输入方法,包括 的内容记录实体。我不知道之前对 的所有调用是什么获取记录() 是为了。

在这一点上,我也不知道我可以依赖的是是否所有写入到 中的值。记录实体将从 转移用户界面输入 之后的组件获取ID() 已设置。如果是这样,那么我可以使用这种模式。这是由规范控制还是只是靠运气?

有什么意见或建议吗?

最佳答案

我认为你可以对 CODI(或者更确切地说是即将到来的 DeltaSpike)感到安全,我在 Tomcat 中都使用得很好。他们将支持几乎所有。

Deltaspike 现在正在开发 JSF 模块,并且有很多事件,当该 brew 完成时,我相信您会对此感到满意。 deltaspike 的每个模块都可以单独生产,尽管该项目仍在孵化中。

现在对于您的实际问题,我无法提出您尚未提出的任何建议。

但我想知道,这其中的一种情况是否有人可能会关心 f:viewParam 上的绑定(bind)? ?我不确定,因为我几乎从未使用过绑定(bind)。

关于jsf-2 - 仅使用 @RequestScoped 编辑 JPA 实体的最佳 JSF 编码模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12773078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com