2011-05-17 130 views
2

如何动态更改“value”属性的托管bean?例如,我有h:inputText,根据输入的文本,托管bean必须是#{studentBean.login}或#{lecturerBean.login}。在简化形式:jsf managedbean的动态更改

<h:inputText id="loginField" value="#{'nameofbean'.login}" /> 

我试图嵌入另一个EL表达式,而不是“nameofbean”:

value="#{{userBean.specifyLogin()}.login}" 

,但它并没有解决。

回答

4

多态性而应在模型中进行,而不是在视图中。

E.g.

<h:inputText value="#{person.login}" /> 

public interface Person { 
    public void login(); 
} 
在托管bean

public class Student implements Person { 
    public void login() { 
     // ... 
    } 
} 

public class Lecturer implements Person { 
    public void login() { 
     // ... 
    } 
} 

最后

private Person person; 

public String login() { 
    if (isStudent) person = new Student(); // Rather use factory. 
    // ... 
    if (isLecturer) person = new Lecturer(); // Rather use factory. 
    // ... 
    person.login(); 
    // ... 
    return "home"; 
} 

否则,您必须在每次添加/删除不同类型的Person时更改视图。这个不对。

+0

好的,但学生和讲师也必须具有特定的领域。我的意思是他们不得不实施个人界面,但**人 **,例如。我在** public interface Person中指定了适当的getter和setter Person {public T getToloko()... **,但是在托管bean中,当我想要访问它时 - #{registration.person.toloko},他们看到** toloko **作为一些** T **类(???)的例子,而不是Toloko。我该如何解决它? – kolobok 2011-05-21 12:10:42

+0

补充说明:人员类别重写了getter和setter。 – kolobok 2011-05-21 12:19:34

3

另一种方式:

<h:inputText id="loginField1" value="#{bean1.login}" rendered="someCondition1"/> 
<h:inputText id="loginField2" value="#{bean2.login}" rendered="someCondition2"/> 
+0

谢谢!我完全忘记了呈现的属性。 – kolobok 2011-05-18 08:50:58