我有一些只读 bean,它们不需要在回发时维护它们的状态。因此,这些 bean 可以在请求范围内,例如,
@Named
@RequestScoped
public class Bean extends LazyDataModel<Entity> {
@Inject
private Service service;
private Entity entity; // Getter & setter.
public Bean() {}
@Override
public List<Entity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
setRowCount(service.rowCount().intValue());
return service.getList(first, pageSize);
}
}
Entity
作为查询字符串参数提供,该参数在模板客户端上定义如下。
<ui:define name="metaData">
<f:metadata>
<o:viewParam name="id" value="#{bean.entity}"/>
</f:metadata>
</ui:define>
传递的参数id
由一个自定义的隐式 JSF 转换器转换,标记为
@FacesConverter(forClass = Entity.class)
然而,这个 bean 仅出于一个原因需要转换为视图范围的 bean。母版页模板上有两个 global<p:selectOneMenu>
代表语言列表和选定 PrimeFaces 主题列表。
当到达由上述请求范围托管 bean 支持的页面后更改语言或主题时,查询字符串参数id
将明显丢失,除非该 bean 至少被指定为视图范围 bean。
使用 a 更改语言或主题<p:selectOneMenu>
只是偶尔需要。应该以某种方式排除仅针对此功能的视图范围 bean。
当语言或主题在各自<p:selectOneMenu>
的 s 中偶尔更改时,有没有办法以某种方式将此 bean 保持为请求范围的 bean,同时保留查询字符串参数?
额外的 :
这两个<p:selectOneMenu>
由两个各自的会话范围 bean 支持。更改语言或主题的请求由<p:remoteCommand>
.
最后的请求,在将发生的语言或主题设置为当前会话后重定向,如下所示。
public String themeAction() {
themeBean.setTheme(Theme.valueOf(theme)); // Theme is an enum. theme is a request parameter which is supplied by a <p:remoteCommand>.
return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true&includeViewParams=true";
}
当前 bean 是一个请求范围的 bean,它ThemeBean
是一个会话范围的 bean,它已被注入到当前的请求范围的 bean 中。