没有调用Action bean

时间:2014-07-21 14:57:38

标签: ajax jsf mojarra

我使用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;
    }

1 个答案:

答案 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()返回一个字符串。但这似乎是错误的做法。