Java JSF导航参数依赖关系
我试图在JSF中实现这个简单的示例:有一个user.xhtml页面,可以使用id参数(user.xhtml?id=3/user.xhtml?id=12)访问该页面。根据id,页面应显示具有指定id的用户的信息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
@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
或
没有正确的结果值。相应组件具有客户端IDj_idt26
。签入生成的HTML源代码以追溯Facelet源代码中的原始罪犯。这与
无关。