用于从各种 bean 调用一个方法的复合组件
Composit component used to call one method from various beans
我需要从多个 bean 中动态调用同名方法,我尝试了以下复合代码,如果不带参数传递它可以正常工作,但如果传递参数则代码不起作用。
<ui:composition>
<ui:param name="bean" value="#{managedBean}" />
<ui:param name="method" value="MoveMainListPointer" />
<o:methodParam name="methodfinal" value="#{bean[method]}" />
<p:commandButton action="#{methodfinal}" value="Submit" />
<br/>
</ui:composition>
后续调用成功
<pc:PinnacleToolBar managedBean="#{BeanName1}" />
<pc:PinnacleToolBar managedBean="#{BeanName2}" />
<pc:PinnacleToolBar managedBean="#{BeanName3}" />
但作为参数传递,
<ui:composition>
<ui:param name="bean" value="#{managedBean}" />
<ui:param name="method" value="MoveMainListPointer('First')" />
<o:methodParam name="methodfinal" value="#{bean[method]}" />
<p:commandButton action="#{methodfinal}" value="Submit" />
<br/>
</ui:composition>
public void MoveMainListPointer (MoveOptions M) {
gu.MovePointer( this, M, listHeader, detTable, detTableHeaderNames, mainArray, detailArray );
}
错误
method not found
发生。
请推荐。
在 EL (Expression Language) 中,您正在调用这样的方法:
someBean.MoveMainListPointer('First')
bean 中的方法如下所示:
public void MoveMainListPointer (MoveOptions M) {...}
现在来看EL中传递的参数:'First'
。单引号中的文本是一个字符串。您在 EL 中使用 String 作为参数调用该方法,实际上您想要在 bean 中使用一些 MoveOptions
来调用该方法。您应该注意到它们是不一样的(字符串是 而不是 MoveOptions
)。 EL搜索以String为参数的方法,不存在所以找不到方法
解决方案
如果您想使用字符串设置参数,请将 bean 中的方法更改为以下内容:
public void MoveMainListPointer(String strg) {
// instantiate the MoveOptions here based on the string value
}
(注意:由于用户没有输入MoveOptions
的代码,我无法提供如何做到这一点。)
此外,方法的约定是第一个字母小写 (see google conventions)。
根据@fuggerjaki61贴出的解决方案,最终代码如下:-
public static enum MoveOptions {
Save,
Edit,
Clear,
Delete,
Check,
Approve,
First,
Previous,
Next,
Last,
Goto,
Print,
Copy,
AdvanceSearch,
Knocking
}
public void moveMainListPointer (String wToDo) {
MoveOptions M = MoveOptions.valueOf(wToDo);
System.out.println("Option: " + M);
gu.MovePointer( this, M, listHeader, detTable, detTableHeaderNames, mainArray, detailArray );
}
控制
<ui:param name="bean" value="#{managedBean}" />
<o:methodParam name="MFS" value="#{bean.moveMainListPointer('Save')}" />
<ui:param name="MFSB" value="#{bean.lockSaveButton}" />
<p:commandButton id="btnSave" action="#{MFS}" value="Save" disabled="#{MFSB}"/>
<o:methodParam name="MFS" value="#{bean.moveMainListPointer('Edit')}" />
<p:commandButton id="btnEdit" action="#{MFS}" value="Edit" />
最后是电话
<pc:PinnacleToolBar managedBean="#{BeanName}" />
我需要从多个 bean 中动态调用同名方法,我尝试了以下复合代码,如果不带参数传递它可以正常工作,但如果传递参数则代码不起作用。
<ui:composition>
<ui:param name="bean" value="#{managedBean}" />
<ui:param name="method" value="MoveMainListPointer" />
<o:methodParam name="methodfinal" value="#{bean[method]}" />
<p:commandButton action="#{methodfinal}" value="Submit" />
<br/>
</ui:composition>
后续调用成功
<pc:PinnacleToolBar managedBean="#{BeanName1}" />
<pc:PinnacleToolBar managedBean="#{BeanName2}" />
<pc:PinnacleToolBar managedBean="#{BeanName3}" />
但作为参数传递,
<ui:composition>
<ui:param name="bean" value="#{managedBean}" />
<ui:param name="method" value="MoveMainListPointer('First')" />
<o:methodParam name="methodfinal" value="#{bean[method]}" />
<p:commandButton action="#{methodfinal}" value="Submit" />
<br/>
</ui:composition>
public void MoveMainListPointer (MoveOptions M) {
gu.MovePointer( this, M, listHeader, detTable, detTableHeaderNames, mainArray, detailArray );
}
错误
method not found
发生。
请推荐。
在 EL (Expression Language) 中,您正在调用这样的方法:
someBean.MoveMainListPointer('First')
bean 中的方法如下所示:
public void MoveMainListPointer (MoveOptions M) {...}
现在来看EL中传递的参数:'First'
。单引号中的文本是一个字符串。您在 EL 中使用 String 作为参数调用该方法,实际上您想要在 bean 中使用一些 MoveOptions
来调用该方法。您应该注意到它们是不一样的(字符串是 而不是 MoveOptions
)。 EL搜索以String为参数的方法,不存在所以找不到方法
解决方案
如果您想使用字符串设置参数,请将 bean 中的方法更改为以下内容:
public void MoveMainListPointer(String strg) {
// instantiate the MoveOptions here based on the string value
}
(注意:由于用户没有输入MoveOptions
的代码,我无法提供如何做到这一点。)
此外,方法的约定是第一个字母小写 (see google conventions)。
根据@fuggerjaki61贴出的解决方案,最终代码如下:-
public static enum MoveOptions {
Save,
Edit,
Clear,
Delete,
Check,
Approve,
First,
Previous,
Next,
Last,
Goto,
Print,
Copy,
AdvanceSearch,
Knocking
}
public void moveMainListPointer (String wToDo) {
MoveOptions M = MoveOptions.valueOf(wToDo);
System.out.println("Option: " + M);
gu.MovePointer( this, M, listHeader, detTable, detTableHeaderNames, mainArray, detailArray );
}
控制
<ui:param name="bean" value="#{managedBean}" />
<o:methodParam name="MFS" value="#{bean.moveMainListPointer('Save')}" />
<ui:param name="MFSB" value="#{bean.lockSaveButton}" />
<p:commandButton id="btnSave" action="#{MFS}" value="Save" disabled="#{MFSB}"/>
<o:methodParam name="MFS" value="#{bean.moveMainListPointer('Edit')}" />
<p:commandButton id="btnEdit" action="#{MFS}" value="Edit" />
最后是电话
<pc:PinnacleToolBar managedBean="#{BeanName}" />