gpt4 book ai didi

java - 当用户返回表单时,如何告诉 Facelets 页面应加载什么对象?

转载 作者:行者123 更新时间:2023-12-02 08:16:21 25 4
gpt4 key购买 nike

我遇到了一个问题,我已经解决了,但我觉得我的解决方案是一个糟糕的解决方案。有更好的办法吗?

我有一个页面,在上面放置了表单,它显示了某个对象的属性,如示例所示(省略了明显的细节)。

票务.java:

@Entity
public class Ticket {
@Id
private Long id;
private String title;
private byte priority;
// Getters, setters...
}

TicketController.java

@RequestScoped
public class TicketController {
private Ticket ticket = new Ticket();
// Getters, setters...

public String doUpdateTicket() {
Ticket t = ticketEJB.getTicketById(ticket.getId());
t.setTitle(ticket.getTitle());
t.setPriority(ticket.getPriority());
ticketEJB.updateTicket(t);
ticket = t;
return "view.faces";
}
}

edit.xhtml(只是表单,其他一切都是样板文件)

<h:form>
<h:inputHidden value="#{ticketController.ticket.id}" />
<h:panelGrid columns="2">
<h:outputLabel value="ID"/>
<h:outputLabel value="#{ticketController.ticket.id}"/>
<h:outputLabel value="Title: "/>
<h:inputText value="#{ticketController.ticket.title}"/>
<h:outputLabel value="Priority: "/>
<h:inputText value="#{ticketController.ticket.priority}" />
<h:commandButton value="Submit"
action="#{ticketController.doUpdateTicket}" />
</h:panelGrid>
</h:form>

还有 TicketEJB,它负责获取这些票证、持久化等。

因此,我在表单中创建一个隐藏输入,然后(在托管 bean 中)使用提供的 id 找到票证,然后手动将托管 bean 的 ticket 对象中的所有字段复制到获取的票证,然后坚持下去...这涉及到违反DRY原则(我在Ticket中添加字段时已经偶然发现了一个bug,但忘记将其复制到doUpdateTicket()中。

那么,也许有更好的方法来做到这一点?

最佳答案

只需在 View 作用域 bean 的 preRenderView 期间从 EJB 获取原始票证,而不是自己创建一个新票证。假设工单 ID 作为请求参数传递,名称为 id:

编辑.xhtml

<f:metadata>
<f:viewParam name="id" value="#{ticketController.id}" />
<f:event type="preRenderView" listener="#{ticketController.preLoad}" />
</f:metadata>
...

TicketController

@ManagedBean
@ViewScoped
public class TicketController {
private Long id;
private Ticket ticket;

@EJB
private TicketEJB ticketEJB;

public void preLoad() {
ticket = ticketEJB.getTicketById(id);
}

public String doUpdateTicket() {
ticketEJB.updateTicket(ticket);
return "view.faces";
}

// ...
}

唯一的区别是输入字段不会空白。但这不就是“编辑”表单背后的整个想法吗?然后这个问题也可以立即得到解决。

哦,还有你的

<h:outputLabel value="#{ticketController.ticket.id}"/>

确实需要成为

<h:outputText value="#{ticketController.ticket.id}"/>

关于java - 当用户返回表单时,如何告诉 Facelets 页面应加载什么对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349435/

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