JSF导航参数依赖

时间:2012-01-09 00:50:46

标签: java jsf

我正在尝试在JSF中实现这个简单的示例:有一个user.xhtml页面可以使用 id 参数访问(user.xhtml?id = 3 / user.xhtml? ID = 12)。取决于id页面应显示具有指定ID的用户的信息。

@ManagedBean
@RequestScoped
public class OverviewController extends BaseController{

private UserDetails details;

@PostConstruct
@SuppressWarnings("unused")
private void init(){
    Integer userId = getIntegerParam(Constants.PARAMETER_USER); //this brings the value of the user parameter as an Integer
    if (userId != null){
        UserService userService = new UserService();
        details = userService .getDetails(userId);
    }
}

//GET & SET

}

在xhtml文件中,我有以下内容:

<div>
    Name: #{overviewController.details.name}
    City: #{overviewController.details.city}
</div>

指导控制的链接:

<h:link outcome = "user.xhtml" value = "details">
    <f:param name = "user" value = "2">
</h:link>

我的印象是,当通过EL访问overviewController时,ManagedBean将获得Constructed,而在@PostConstruct中,详细信息将被初始化。但我没有得到任何结果,并且overviewController甚至没有构造。 我正在进一步讨论我的问题,我问如何根据多个参数或排序进行搜索?

2 个答案:

答案 0 :(得分:1)

对于您的具体问题,您的@PostConstruct被错误地声明为private而不是public

至于你的具体功能要求,这不是完全正确的方法。您需要在目标页面中使用<f:viewParam>将用户ID请求参数设置为辅助bean中的UserDetails属性。

user.xhtml

<f:metadata>
    <f:viewParam id="param_id" name="id" value="#{overviewController.details}"
        converter="userDetailsConverter" converterMessage="Bad request, unknown user"
        required="true" requiredMessage="Bad request, use a link from within the system"
    />
</f:metadata>
<h:message for="param_id" />

UserDetailsConverter

@FacesConverter("userDetailsConverter")
public class UserDetailsConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (!(value instanceof UserDetails) || ((UserDetails) value).getId() == null) {
            return null;
        }

        return String.valueOf(((UserDetails) value).getId());
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || !value.matches("\\d+")) {
            return null;
        }

        UserDetails details = new UserService().getDetails(Integer.valueOf(value));

        if (details == null) {
            throw new ConverterException(new FacesMessage("Unknown user ID: " + value));
        }

        return details;
    }

}

OverviewController

private UserDetails details; // Getter+setter

另见:

答案 1 :(得分:0)

好吧,我不知道你的方法getIntegerParam实际上是如何工作的,但我通常会像这样实现处理查询参数。

编辑:我确定在设置init()属性之后是否真的会调用userId(我通常直接从setter调用它),但是在注入依赖项之后,可能应该调用@PostConstruct方法。

@ManagedBean
@RequestScoped
public class OverviewController extends BaseController {

    @ManagedProperty("#{param['userId']}")
    private String userId; // not sure if can automatically be parsed to Integer

    private UserDetails details;

    @PostConstruct
    private void init() {
        if (userId != null){
            UserService userService = new UserService();
            details = userService .getDetails(userId);
        }
    }

    // getter & setter for userId
}