当前位置: 首页 > 知识库问答 >
问题:

未调用JSF CommandButton操作(另一示例)

葛炜
2023-03-14

我以https://stackoverflow.com/a/3180885/242042中的示例为例,只是根据我的需要对其进行了调整。

这是我的豆子:

@ManagedBean
@ViewScoped
public class ParticipantBean implements
    Serializable {

    private boolean edit;

    private List<Participant> list;

    private Participant participant = new Participant();

    @Inject
    private transient ParticipantDAO participantDAO;

    public void add() {

        System.out.println("Calling add");
        participantDAO.save(participant);
        init();
    }

    public void delete(final Participant participant) {

        participant.getAudit().cancel();
        participantDAO.save(participant);
        init();
    }

    public void edit(final Participant participant) {

        this.participant = participantDAO.get(participant.getId());
        edit = true;
    }

    public void fire() {

        System.out.println("fired");
    }

    public List<Participant> getList() {

        return list;
    }

    public Participant getParticipant() {

        return participant;
    }

    @PostConstruct
    public void init() {

        list = participantDAO.getAll();
        participant = new Participant(); // Reset placeholder.
    }

    public boolean isInEdit() {

        return edit;
    }

    public void saveParticipant() {

        System.out.println("Calling save");
        participantDAO.save(participant);
        System.out.println("Done Calling save");
        init();
        edit = false;
    }
}

和我的JSF文件

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Really simple CRUD</title>
    </h:head>
    <h:body>
        <h3>List items</h3>
        <h:form rendered="#{not empty participantBean.list}">
            <h:dataTable value="#{participantBean.list}" var="item">
                <h:column><f:facet name="header">ID</f:facet>#{item.id}</h:column>
                <h:column><f:facet name="header">Name</f:facet>#{item.name}</h:column>
                <h:column><h:commandButton value="edit" action="#{participantBean.edit(item)}" /></h:column>
                <h:column><h:commandButton value="delete" action="#{participantBean.delete(item)}" /></h:column>
                <h:column><h:commandButton value="fire" action="#{participantBean.fire}" /></h:column>
            </h:dataTable>
        </h:form>
        <h:panelGroup rendered="#{empty participantBean.list}">
            <p>Table is empty! Please add new items.</p>
        </h:panelGroup>
        <h:panelGroup rendered="#{!participantBean.inEdit}">
            <h3>Add item</h3>
            <h:form>
                <p>Name: <h:inputText value="#{participantBean.participant.name}" /></p>
                <p><h:commandButton value="add" action="#{participantBean.add}" /></p>
                <p><h:commandButton value="fire" action="#{participantBean.fire}" /></p>
            </h:form>
        </h:panelGroup>
        <h:panelGroup rendered="#{participantBean.inEdit}">
            <h3>Edit item #{participantBean.participant.id}</h3>
            <h:form>
                <p>Name: <h:inputText value="#{participantBean.participant.name}" /></p>
                <p><h:commandButton value="save" action="#{participantBean.saveParticipant}" /></p>
                <p><h:commandButton value="add" action="#{participantBean.add}" /></p>
                <p><h:commandButton value="fire" action="#{participantBean.fire}" /></p>
            </h:form>
        </h:panelGroup>

    </h:body>
</html>

所以它是相当相似的,但我不明白的是为什么它不想在“编辑”上调用操作。(即我在SystemOut.log上看不到任何内容)

我正在查看答案https://stackoverflow.com/A/13327382/242042,看看是否有什么值得使用的地方,但我发现“system.out.println()”事件甚至没有被激发。控制就在那里。

我注意到的一件事是commandbuttonsinedit时重新加载屏幕

我也消除了“prime faces”,并且正在WebSphere9.0.0.3上进行测试。代码在https://github.com/trajano/jee/tree/no-prime-faces中

我也尝试过重新排序表单,这样编辑块就在这样的表单中,但它仍然没有触发操作。

    <h:form rendered="#{not empty participantBean.list}">
        <h:dataTable value="#{participantBean.list}" var="item">
            <h:column><f:facet name="header">ID</f:facet>#{item.id}</h:column>
            <h:column><f:facet name="header">Name</f:facet>#{item.name}</h:column>
            <h:column><h:commandButton value="edit" action="#{participantBean.edit(item)}" /></h:column>
            <h:column><h:commandButton value="delete" action="#{participantBean.delete(item)}" /></h:column>
        </h:dataTable>
        <h:panelGroup rendered="#{participantBean.inEdit}">
           <h3>Edit item #{participantBean.participant.id}</h3>
            <p>Name: <h:inputText value="#{participantBean.participant.name}" /></p>
            <p><h:commandButton value="save" action="#{participantBean.saveParticipant}" /></p>
            <p><h:commandButton value="add" action="#{participantBean.add}" /></p>
        </h:panelGroup>
    </h:form>

我还尝试用这种方式编写edit()来获取原始列表中的参与者,这样它就会拥有正确的乐观锁@version

    public void edit(final Participant participant) {

        this.participant = participant;
        edit = true;
    }

共有1个答案

廖夜洛
2023-03-14

在JSF2.2中,在不同的包中有两个注释,名为@viewscoped

  • javax.faces.bean.viewscoped更正一个
  • javax.faces.view.viewscoped在JSF 2.2中引入的不正确的一个(我写问题时使用的就是这个)

按照@Jasper de Vries的注释将其限制为JSF2.2。注释需要更改为

@javax.inject.Named
@javax.faces.view.ViewScoped
 类似资料:
  • 我在使用JSF2.0时遇到了问题。命令按钮不调用bean,我已经阅读了balusc应答commandbutton/commandlink/ajax action/listener方法未调用或输入值未更新,但我认为我不会遇到这些情况,这就是我使用的代码: 更新1:

  • 本文向大家介绍Python面向对象实现一个对象调用另一个对象操作示例,包括了Python面向对象实现一个对象调用另一个对象操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python面向对象实现一个对象调用另一个对象操作。分享给大家供大家参考,具体如下: 我先总结一下python中的类的特点: 1.类中所有的方法的参数中都必须加self,并且是第一个参数 2.__init__方法用

  • 解决方案(更新): 我认为任何操作都会导致react-redux-link调用mapState函数,但是当一个操作没有改变任何事情时,情况就不是这样了。 我有一个localStorage模块,它分派操作,但不更改状态,而是写入localStorage。该模块具有容器中使用的选择器,但在状态实际更改之前不会调用这些选择器,因此只有在调度另一个更改状态的操作后,UI才会正确显示。 问题 当我把商店放在

  • 本文向大家介绍PHP使用SOAP调用API操作示例,包括了PHP使用SOAP调用API操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP使用SOAP调用API操作。分享给大家供大家参考,具体如下: 注:出现提示:Fatal error: Class 'SoapClient' not found的情况,可参考《PHP Class SoapClient not found解决方法》

  • 我正在用Sherlock设置一个带有3个项目/图标的动作栏。在ICS模拟器上运行时,我只能看到2个图标。而且:没有溢出菜单(那些3点图标)!我只会在按下手机的功能表按钮时看到第三个图标。 我是否必须强制溢出图标,如果是,我如何才能这样做?

  • 问题内容: 我需要将子组件放在primefaces子表页脚(p:columngroup type =“ footer”)中,但是标准子表渲染器不提供这种机会。所以我重写了org.primefaces.component.SubTableRenderer来添加子级渲染: } 当我将一些子组件放在p:column组中时: 呈现按钮并且onClick事件可以正常调用,但是按钮的操作和f:setPrope