我正在创建一个 JSF 应用程序。我有一些来自数据库的项目(例如产品),我想创建一个 JSF 页面来编辑特定项目,即:
- 它应该显示选定的项目属性并允许用户编辑它们,
- 我希望能够通过某些链接查看此项目,
- 我希望 JSF 以某种方式记住我正在编辑特定项目(例如,在编辑其数据后,它应该显示该项目页面)
我在存储/传递正在编辑的项目的 ID 时遇到问题。我看到在示例 JSF CarDemo 应用程序中,它们存储在 session 中查看的项目(汽车)。我不想这样做,因为我希望用户能够在单独的浏览器选项卡中编辑不同的元素。
我尝试了几种方法:
- 在 URL 中使用一些(例如
itemId
)GET 参数,但是在编辑数据(to-view-id
中的字段)后很难返回到项目页面faces-config.xml 只能包含常量), - 使用一些支持 bean 托管属性并在每个超链接和表单中传递它的值(通过添加隐藏字段)
我仍然无法消除的问题是,如果在编辑某些项目属性后我尝试保存它们并且验证(例如 f:validateLength
)失败,页面会重新加载但正在编辑的项目的 ID丢失了。我认为创建 Web 应用程序(例如用户版、商店产品版)时这是非常标准的任务,因此肯定应该有一些解决方案。
提前致谢。
最佳答案
相关信息:
参见 this answer有关允许在保留 ID 的同时进行编辑的示例代码(如果您使用的是 JSP 而不是 Facelets,该信息应该仍然适用)。参见 this answer了解您可能想使用的更多技术。参见 this answer用于在 URL 中保留参数的选项。
要解决您的问题,请创建一个请求范围的 bean 来执行以下操作:
//pseudo-stubs
//request scope: #{editor}
public class Editor {
public Integer getId();
public void setId(Integer id);
public String save();
}
(您可以根据需要添加其他属性。)
当您通过 faces-config
中的注入(inject)导航到页面时,从请求参数填充 id:
<managed-bean>
<managed-bean-name>editor</managed-bean-name>
<managed-bean-class>foo.Editor</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>id</property-name>
<property-class>java.lang.Integer</property-class>
<value>#{param.id}</value>
</managed-property>
//etc
使用隐藏域来保存id:
<h:inputHidden value="#{editor.id}" />
<h:commandLink action="#{editor.save}" value="save" />
任何时候提交表单,都会发送这个值;如果验证失败,隐藏字段仍将使用 id 值呈现。如果验证成功,editor
bean 将在调用 save
之前使用 id 填充。
关于java - 在 JSF 中实现项目编辑页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1812580/