假设我有一个JSF支持bean,请求范围,它有一个List作为成员。 在支持bean中,我有一个绑定到页面上按钮的方法。
首次按下该按钮时,该方法使用EJB填充列表。 在后续按下按钮时,我不希望该方法调用DB。
所以,我添加了一张支票:
if(list == null || list.size() == 0)
//populate the list
否则,列表已经填充,因此无需调用DB。 这对于缓存机制是否令人满意?
答案 0 :(得分:1)
由于bean是请求范围,因此其成员仅在单个请求的生命周期内存在。因此,每次请求页面时都会获取数据。
您可以做的一件事是将缓存的数据放在不同的范围内(例如会话或应用程序)。
<managed-bean>
<managed-bean-name>expensiveBean</managed-bean-name>
<managed-bean-class>lifetime.ExpensiveBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>requestBean</managed-bean-name>
<managed-bean-class>lifetime.RequestBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>cachedAsset</property-name>
<property-class>lifetime.ExpensiveBean</property-class>
<value>#{expensiveBean}</value>
</managed-property>
</managed-bean>
示例代码:
public class RequestBean {
private ExpensiveBean cachedAsset;
public ExpensiveBean getCachedAsset() {
return cachedAsset;
}
public void setCachedAsset(ExpensiveBean cachedAsset) {
this.cachedAsset = cachedAsset;
}
}
这样,您可以轻松地引用请求范围bean中的数据,同时保持请求级别的工件分离。
某些框架添加了对页面范围的支持,从而使数据与视图的生命周期保持联系。根据您的需要,这可能是另一种选择。