sku*_*sel 5 jsf-2 managed-bean
这可能是一种架构问题,但它仍然必须有一个"最佳实践解决方案"或一个公认的标准.
我在谈论需要在网站上显示的某种静态数据,例如产品目录,菜单和菜单项列表,面包屑块列表等.我想这个选项在使用任何标准CMS时都可用.
但是我想在这个问题上使用纯JSF解决方案.
所以,回到这个问题,我的阐述源于以下原则:
数据不应该在facelets中进行硬编码,因此我使用数据库来保存值,就像在下面的db脚本中一样(在我的例子中是MYSQL):
CREATE TABLE CatalogueGroup (
CatalogueGroupName VARCHAR(100) NOT NULL PRIMARY KEY,
URLPath VARCHAR(200) NOT NULL,
ParentGroupName VARCHAR(100) DEFAULT NULL,
FOREIGN KEY (ParentGroupName) REFERENCES CatalogueGroup(CatalogueGroupName) ON UPDATE CASCADE ON DELETE SET NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)然后我想使用实体类保存在@ManagedBean中并将其显示在视图中,如
public class CatalogueGroup implements Serializable {
private String catalogueGroupName;
private List<CatalogueGroup> children = new ArrayList<CatalogueGroup>();
private CatalogueGroup parentGroup;
//other stuff of this bean
}
@ManagedBean
@SessionScoped
public class CatalogueBean implements Serializable {
private CatalogueGroup catalogue;//loaded via CatalogueGroupDAO with condition parentGroup == null
//other stuff of this bean
}
//snippet of xhtml view for a two-level catalogue
<ul><h:outputText value="#{catalogueBean.catalogue.catalogueGroupName}" />
<ui:rereat value="#{catalogueBean.catalogue.children}" var="group">
<li><h:outputText value="#{group.catalogueGroupName}" /></li>
</ui:repeat>
</ul>
Run Code Online (Sandbox Code Playgroud)上述设置有效,但感觉它是一个尴尬的.所以,我想向jsf社区提出以下开放的"最佳实践"问题:
@SessionScope将被加载一次并重新显示在每个视图或豆@RequestScoped豆,将每一页显示数据库的访问.@RequestScoped只需要使用bean;非常有趣,但也许是一个开放领域的问题。
首先,范围取决于您为目录提供的实用程序。@ViewScoped如果您想将数据链接到特定视图或者@SessionScoped您的目标是实现购物篮之类的东西,我建议您仔细阅读。
对于递归函数,我认为您应该避免在纯视图( xhtml )层中进行这种做法,并使用像Primefaces或Richfaces这样的库,它们具有用于您想要执行的操作的内置组件。使用它们时,您只需在托管支持 bean 内以编程方式处理它们的逻辑结构。
最后,对于目录限制,我建议您仅加载要从数据库中使用的内容。这样,服务器-数据库或服务器-客户端连接就不会过载。您可以有一个@SessionScopedbean 来管理当前登录用户的会话,并且根据该 bean,您可以向数据库询问某些值或其他值。
另外,您还必须关心您的目录,如果您在会话期间对其进行大量修改,也许@ViewScopedbean 是更好的选择,因为每次请求视图时都会重新加载它。如果您@SessionScoped为此使用 bean,则必须手动添加每个更改,以便在会话期间保持其更新。
"load the whole catalogue and limit its children in views with rendered=false"
如果你按照我说的方式去做,那是一项你不必做的工作。如果您正在管理复杂的树并向视图中引入更多逻辑,则有条件地评估每个树节点可能会很困难。当然,您应该尽可能避免这种情况。
即使你已经找到了解决方案,这就是我的主要想法。
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |