作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,我已经解决了,但我觉得我的解决方案是一个糟糕的解决方案。有更好的办法吗?
我有一个页面,在上面放置了表单,它显示了某个对象的属性,如示例所示(省略了明显的细节)。
票务.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/
我是一名优秀的程序员,十分优秀!