Java JSF导航参数依赖关系

Java JSF导航参数依赖关系,java,jsf,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 @SuppressWarnin

我试图在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>

名称:#{overviewController.details.Name}
城市:#{overviewController.details.City}
此处引导控件的链接:

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

我的印象是,当通过EL访问overviewController时,ManagedBean将被构造,而在@PostConstruct中,细节将被初始化。但是我没有得到任何结果,而且overviewController甚至还没有构建。
我将进一步回答我的问题,我问如何实现基于多个参数或排序的搜索?

嗯,我不知道您的方法
getIntegerParam
实际上是如何工作的,但我通常实现这样的处理查询参数

Edit:我不确定在设置了
userId
属性之后是否真的会调用
init()
(我通常直接从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
}

至于您的具体问题,您的
@PostConstruct
被错误地声明为
私有
,而不是
公共

至于您的具体功能需求,这不是完全正确的方式。您需要在目标页面中设置一个
,将用户ID请求参数设置为支持bean中的
UserDetails
属性

user.xhtml


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;
    }

}
概览控制器

private UserDetails details; // Getter+setter
另见:

是用
@ManagedBean(name=“OverviewController”)
@Named(“OverviewController”)
注释的
OverviewController
类吗?此外,可能还应该有一个范围注释,例如
@RequestScoped
。这不是必需的。如果没有声明名称,JSF将使用类名,用小写字母转换类的第一个字母,并将其作为bean的名称。好的,那么
getIntegerParam
方法定义在哪里?是的。定义了所有需要的方法。此外,我创建了一个PhaseListener,我看到除了恢复(1)和渲染(6)之外,没有任何阶段被调用。我认为,这是因为发送GET请求。但我不知道还有什么别的选择。谢谢!你知道为什么我示例中的@PostConstruct从未被调用吗?因为你声明它为
private
而不是
public
。我还有一个问题。我放弃了您的示例,但得到以下警告:警告:JSF1090:组件j_idt26的导航案例未解决。我猜我没有正确使用viewParam标记,对吗?页面中的某个地方a
没有正确的
结果值。相应组件具有客户端ID
j_idt26
。签入生成的HTML源代码以追溯Facelet源代码中的原始罪犯。这与
无关。