2009-06-27 76 views
0

编写一个简单的JSF应用程序我在下面列出了一些问题: 我的entities.controller.EntityNameManager类包含一个方法getEntityNameSelectList(),我可以用它来填充一个ComboBox。这工作并显示所有实体,因为检索实体的方法没有where子句。 此方法是自动创建的。自定义getEntityNameSelectList()失败

现在我想要第二个类似的方法,它根据sessionscope中的变量过滤选项。为此,我复制了原始方法,将其重命名为getEntityNameSelectListByUser(User theUser),并将查询数据库的方法更改为确实通过UserId过滤的方法。

但是,当试图在浏览器中加载页面时,我收到一个错误,指出控制器类没有“EntityNameSelectListByUser”属性。我认为,因为我的新方法期望一个参数,它不能被发现。有没有办法让我知道参数或Sessionscope userid?

回答

0

对EL中参数的支持将被定为JSR 245(公告here;实现here)的下一个维护版本。


假设你不想等待JEE6,你有几种方法来克服这个限制。这些接近的是根据POJO管理的bean来定义的,因此适合它们适合您的EJB。

1.

执行在辅助bean的会话查找和函数调用:

public String getFoo() { 
    FacesContext context = FacesContext 
     .getCurrentInstance(); 
    ExternalContext ext = context.getExternalContext(); 
    String bar = (String) ext.getSessionMap().get("bar"); 
    return getFoo(bar); 
    } 

实施例结合:

#{paramBean.foo} 

2.

使用EL function(定义在TLD中,映射到公共静态方法):

public static String getFoo(ParamBean bean, String bar) { 
    return bean.getFoo(bar); 
    } 

实施例结合:

#{baz:getFoo(paramBean, bar)} 

3.

颠覆地图类调用函数(一个黑客位的和限定于一个参数):

public Map<String, String> getFooMap() { 
    return new HashMap<String, String>() { 
     @Override 
     public String get(Object key) { 
     return getFoo((String) key); 
     } 
    }; 
    } 

绑定示例:

#{paramBean.fooMap[bar]}