使用请求范围的bean

时间:2015-12-30 18:43:26

标签: jsf omnifaces querystringparameter viewparams

我有一些readonly 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。主页面模板上有两个全局<p:selectOneMenu>代表语言列表和一个选定的PrimeFaces主题列表。

当到达由上述请求范围的托管bean支持的页面后,如果语言或主题发生更改,则查询字符串参数id将丢失,除非将此bean指定为视图范围bean至少。

仅偶尔需要使用<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中。

0 个答案:

没有答案