Command button with EL method argument does not invoke action method

ぐ巨炮叔叔 提交于 2019-12-08 12:05:53

问题


I am trying to delete a database entry by sending the primary key "userId" as EL method argument via a command button to my managed bean.

My current code looks like

Bean:

@ManagedBean
@RequestScoped
public class HibernateUserHandling 
{
...
public void deleteUser(String userIdViaXhtml)
{
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    session.createQuery("DELETE FROM AddressDetails WHERE USERID = :userIdViaXhtml");
    session.createQuery("DELETE FROM UserDetails WHERE USERID = :userIdViaXhtml");

    session.getTransaction().commit();
    session.close();
}
...
}

View:

    <html>
    <body>
        <ui:composition template="./generalTemplate.xhtml"
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets">
        <ui:define name="content">
            <h:outputStylesheet library="css" name="cssHibernate.css" />
                <h:form id="main">
                    <h:dataTable value="#{hibernateDataOutput.persons}" var="list"
                                styleClass="order-table"
                                headerClass="order-table-header"
                                rowClasses="order-table-odd-row,order-table-even-row">
                        ...
                            <f:facet name="header">Delete</f:facet>
                            <h:commandButton id="userId" action="#{hibernateUserHandling['deleteUser(list.userId)']}" image="delete.jpg" />
                        </h:column>
                    </h:dataTable>
                    ...
                </h:form>
            </ui:define>
        </ui:composition>
    </body>
</html>

I tested more ways, e.g. via getting the value to a seperate variable in the bean like in a inputText, but nothing worked.

I think I got a totally wrong basic approach.

I get the following error:

/hibernate.xhtml @39,137 action="#{hibernateUserHandling.deleteUser(list.userId)}" Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]

Stack trace:

    javax.faces.view.facelets.TagAttributeException: /hibernate.xhtml @39,137 action="#{hibernateUserHandling.deleteUser(list.userId)}" Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]
            at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:232)
            at com.sun.faces.facelets.tag.jsf.ActionSourceRule$ActionMapper2.applyMetadata(ActionSourceRule.java:104)
            at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81)
            at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.doNewComponentActions(ComponentTagHandlerDelegateImpl.java:402)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:159)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at com.sun.faces.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:103)
            at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:178)
            at com.sun.faces.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:395)
            at com.sun.faces.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:366)
            at com.sun.faces.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:108)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
            at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
            at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
            at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
            at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:308)
            at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:367)
            at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
            at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
            at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
            at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
            at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
            at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
            at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:769)
            at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
            at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
            at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
            at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
            at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
            at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)
            at java.lang.Thread.run(Thread.java:619)
    Caused by: javax.el.ELException: Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]
            at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:146)
            at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:172)
            at org.apache.el.lang.ExpressionBuilder.createMethodExpression(ExpressionBuilder.java:223)
            at org.apache.el.ExpressionFactoryImpl.createMethodExpression(ExpressionFactoryImpl.java:57)
            at com.sun.faces.facelets.tag.TagAttributeImpl.getMethodExpression(TagAttributeImpl.java:222)
            ... 61 more
    Caused by: org.apache.el.parser.ParseException: Encountered " "(" "( "" at line 1, column 35.
    Was expecting one of:
        "}" ...
        "." ...
        "[" ...
        ">" ...
        "gt" ...
        "<" ...
        "lt" ...
        ">=" ...
        "ge" ...
        "<=" ...
        "le" ...
        "==" ...
        "eq" ...
        "!=" ...
        "ne" ...
        "&&" ...
        "and" ...
        "||" ...
        "or" ...
        "*" ...
        "+" ...
        "-" ...
        "/" ...
        "div" ...
        "%" ...
        "mod" ...

            at org.apache.el.parser.ELParser.generateParseException(ELParser.java:2142)
            at org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:2024)
            at org.apache.el.parser.ELParser.DeferredExpression(ELParser.java:113)
            at org.apache.el.parser.ELParser.CompositeExpression(ELParser.java:40)
            at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:114)
            ... 65 more

回答1:


Your Facelet composition is wrong. Anything outside <ui:composition> is ignored in final view and the template client content needs to go inside <ui:define>. You have the <h:form> outside the template definition <ui:define>, so it is not included in the final view and hence the buttons don't have any form to submit and they just won't seem to work at all.

Rearrange your Facelet template client as follows:

<ui:composition template="./generalTemplate.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:define name="content">
        <h:outputStylesheet library="css" name="cssHibernate.css" />
        <h:form id="main">
            <h:dataTable value="#{hibernateDataOutput.persons}" var="list"
                         styleClass="order-table"
                         headerClass="order-table-header"
                         rowClasses="order-table-odd-row,order-table-even-row">
                <h:column>
                    <f:facet name="header">Delete</f:facet>
                    <h:commandButton id="userId" action="#{hibernateUserHandling.deleteUser(list.userId)}" image="delete.jpg" />
                </h:column>
            </h:dataTable>
        </h:form>
    </ui:define>
</ui:composition>        

See also:

  • commandButton/commandLink/ajax action/listener method not invoked or input value not updated
  • How to include another XHTML in XHTML using JSF 2.0 Facelets?

Unrelated to your concrete problem, the Hibernate code is flawed. But that's subject to a different question.


Update: as per the stacktrace which you edited afterwards in the question,

Caused by: javax.el.ELException: Failed to parse the expression [#{hibernateUserHandling.deleteUser(list.userId)}]

Apparently your environment does not support EL 2.2 at all. You need to make sure that the web.xml is declared conform Servlet 3.0 API and that you're deploying to a Servlet 3.0 compatible servlet container (e.g. Tomcat 7, Glassfish 3, JBoss AS 6, etc).

See also:

  • How to call a method with a parameter in JSF



回答2:


hibernate code is not correct. Modify your method as

public void deleteUser(String userIdViaXhtml)
{
    Session session = sessionFactory.openSession();
    session.beginTransaction();

    Query query = session.createQuery("DELETE FROM AddressDetails WHERE USERID = :userIdViaXhtml");
    query.setString("userIdViaXhtml",userIdViaXhtml);
    query.executeUpdate();

    session.createQuery("DELETE FROM UserDetails WHERE USERID = :userIdViaXhtml");
    query.setString("userIdViaXhtml",userIdViaXhtml);
    query.executeUpdate();

    session.getTransaction().commit();
    session.close();
}

Tip: handle exceptions for proper rollback and dont write this code directly in JSF managed bean make use of DAO pattern.

  1. DAO @ Wiki
  2. J2EE DAO Pattern


来源:https://stackoverflow.com/questions/9278986/command-button-with-el-method-argument-does-not-invoke-action-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!