我在JSF项目中使用Passthrough元素,需要做类似的事情:
<h:commandLink action="#{myBean.acao()}" value="click me">
<f:setPropertyActionListener target="#{myBean.object}" value="#{localObject}"/>
</h:commandLink>
但使用Passthrough元素可以更好地控制我的前端,如下所示:
<a href="#" jsf:action="#{myBean.acao()}">click me
<f:setPropertyActionListener target="#{myBean.object}" value="#{localObject}"/>
</a>
但显然这不起作用,我收到以下错误消息:
<f:setPropertyActionListener> Parent is not of type ActionSource, type is: com.sun.faces.component.PassthroughElement
有谁知道如何解决这个问题?
答案 0 :(得分:3)
看起来只是Mojarra版本中的一个错误。它适用于我当前最新的2.2.12版本。
您可以使用传递方法参数的EL 2.2功能来解决它。另见Invoke direct methods or methods with arguments / variables / parameters in EL。它确实可以在您的环境中使用#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#define MAX_PIDS 28
volatile pid_t *pids;
void kPid(int x)
{
int c;
for (c=0; c<10; c++) {
if (pids[c] == x)
{
int status = 0;
pids[c] = wait(&status);
}
else {
continue;
}
}
}
int main(int argc, char **argv)
{
int c;
pid_t pid;
pids = mmap(0, MAX_PIDS*sizeof(pid_t), PROT_READ|PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
memset((void *)pids, 0, MAX_PIDS*sizeof(pid_t));
for (c=0; c<10; c++) {
pid = fork();
if (pid == 0) {
exit(1);
} else if (pid < 0) {
perror("fork failed");
} else {
pids[c] = pid;
}
}
int t;
char test[50];
snprintf(test,sizeof(test),"ps -ef | grep defunct",pids[c]);
system(test);
printf("Kill child: ");
scanf("%d",&t);
kPid(t);
system(test);
exit(0);
}
显然没有抛出EL异常(在EL 2.2之前不支持此语法)。
#{myBean.acao()}
如果您绝对需要在动作侦听器事件期间调用setter,例如因为如果设置值无效,您想通过抛出<a href="#" jsf:action="#{myBean.acao(localObject)}">click me</a>
来控制action
的调用,请参阅Differences between action and actionListener,然后声明AbortProcessingException
。< / p>
jsf:actionListener