我使用JSF 2.0时遇到问题。命令按钮不会调用bean,我已经阅读了balusc回答commandButton/commandLink/ajax action/listener method not invoked or input value not updated,但我认为我没有遇到这些情况, 这是我正在使用的代码:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jstl/core">
....
<ui:repeat var="skill" value="#{skillsView.skills}">
<h:form>
<h:commandButton value="#{skill}"
action="#{skillsController.removeSkillFromPublication}" ajax="true">
<f:param name="theskill" value="#{skill}" />
</h:commandButton>
</h:form>
</ui:repeat>
</ui:composition>
更新1:
这是我的控制器
@Controller
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class SkillsController extends BController {
private static final Logger logger = LoggerFactory
.getLogger(SkillsController.class);
public void removeSkillFromPublication() {
logger.info("Deleting : " + getParameter("theskill"));
publicationService.removeSkillFromPublication(publicationDetailView
.getPublicationFullView().getId(), getParameter("theskill"));
skillsView.setSkills(publicationService
.getSkillsFromPublication(publicationDetailView
.getPublicationFullView().getId()));
}
}
我没有得到记录器也没有执行任务,我已经使用带有actionevent的控制器和actionevent工作的actionlistner进行了测试
更新2:
它正在改变技巧的SCOPE到WebApplicationContext.SCOPE_SESSION,任何人都知道为什么?!!
@Controller
@Scope(value = WebApplicationContext.SCOPE_SESSION)
public class SkillsView {
List<String> skills;
private String currentSkill;
public List<String> getSkills() {
return skills;
}
public void setSkills(List<String> skills) {
this.skills = skills;
}
public String getCurrentSkill() {
return currentSkill;
}
public void setCurrentSkill(String currentSkill) {
this.currentSkill = currentSkill;
}
答案 0 :(得分:1)
h:commandButton
属性action
要求您返回字符串
取自jsf-toolbox:
<强>动作强>
action属性接受支持bean操作方法的方法绑定表达式,以便在用户激活此组件时调用。 action方法必须是公共方法,没有返回String 的参数。返回的字符串表示操作的逻辑结果(例如“成功”,“失败”等),并由JavaServer Faces MVC框架用于确定下一个要显示的视图。 [粗体由我]
而是使用actionListener
属性:
<h:commandButton actionListener="${skillsController.removeSkillFromPublication()}" ajax="true">
<f:param name="theskill" value="#{skill}" />
</h:commandButton>
请注意,您必须更改方法签名才能将ActionEvent
作为参数:
public void removeSkillFromPublication(ActionEvent e) {
//...
请参阅工具箱:
<强>的ActionListener 强>
actionListener属性接受支持bean动作侦听器方法的方法绑定表达式,该方法将在用户激活此组件时得到通知。动作侦听器方法必须是具有 ActionEvent参数和void返回类型的公共方法。
或者,您可以让removeSkillFromPublication()
返回一个字符串。但这似乎是错误的做法。