How to define form action in JSF?

49,941

Solution 1

The best solution for me is to use the default <button> tag instead. Since typical button styling is not being applied (in my case I am using Primefaces), I set it manually. Here's the whole result:

    <h:outputStylesheet library="primefaces" name="jquery/ui/jquery-ui.css" />
    <h:outputStylesheet library="css" name="login.css" />

    <div class="message">
        <c:if test="#{param.error == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}">
            <span class="error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span>
        </c:if>
    </div>



    <div class="login">
        <form action="../j_spring_security_check" method="post">
            <h:panelGrid columns="2">
                <h:outputText value="Username" />
                <h:inputText id="j_username" />
                <h:outputText value="Password" />
                <h:inputSecret id="j_password" />
            </h:panelGrid>

            <div class="submit">
                <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only">
                    <span class="ui-button-text">Login</span>
                </button>
            </div>
        </form>
    </div>

Solution 2

<h:form id="login" prependId="false"              onsubmit="document.getElementById('login').action='j_security_check';">

Solution 3

Your best chance is to use the onclick property of the button. This is an example with a primefaces commandButton, but it will also work for jsf components because it uses the (native) javascript onclick function.

<h:form>
<p:commandButton value="Submit" onclick="alert('JS!')" actionListener="#{tweetBean.addTweet()}" update=":tabView,:trends,:tweetsnr" /> 
</h:form>

Solution 4

Your action attribute should be an EL expression like follows:

action="#{managedBean.method}"
Share:
49,941
Lars Blumberg
Author by

Lars Blumberg

All-round software writer, in particular interested in writing web (Python/ReactJS) and mobile (Android/Java/Kotlin, iOS/ObjC/Swift/Capacitor). In the past I wrote native desktop applications (Windows, macOS) as well.

Updated on July 09, 2022

Comments

  • Lars Blumberg
    Lars Blumberg almost 2 years

    In order to replace the default Spring security login form I came up with this solution:

    <form name="f" action="../j_spring_security_check" method="POST" >
        <h:panelGrid columns="2">
            <h:outputText value="Username" />
            <h:inputText id="j_username" />
            <h:outputText value="Password" />
            <h:inputText id="j_password" />
        </h:panelGrid>
        <h:commandButton value="Login" />
    </form>
    

    But instead of plain <form> tag I would like to use <h:form> since Primefaces components only work within <h:form>. Using <h:form> the form action will be set automatically by JSF to the current page, not to the value set by me in the example above. Where to I have to code the action "../j_spring_security_check" now? I tried putting it into the <h:commandButton> as follows but that doesn't work:

    <h:form name="f">
        <h:panelGrid columns="2">
            <h:outputText value="Username" />
            <h:inputText id="j_username" />
            <h:outputText value="Password" />
            <h:inputText id="j_password" />
        </h:panelGrid>
    
        <h:commandButton value="Click here" action="../j_spring_security_check" />
    </form>
    

    It leads to the error message Unable to find matching navigation case with from-view-id '/login.xhtml' for action '../j_spring_security_check' with outcome '../j_spring_security_check'.

    Is it the only way to define a navigation case in faces-config.xml? I want to avoid using a bean for this simple use case.

    • Matt Handy
      Matt Handy about 13 years
      See this answer regarding h:commandButton action
    • Lars Blumberg
      Lars Blumberg about 13 years
      @Matt: Unfortunately the site ../j_spring_security_check to be called is not an XHTML site. The link that you provided presumes that.
  • Lars Blumberg
    Lars Blumberg about 13 years
    I would like to avoid defining a bean for my login bean since this bean would do nothing except returning the navigation case.
  • maple_shaft
    maple_shaft about 13 years
    Does actionListener attribute give you the same result? I think the PrimeFaces components require EL expressions for action as that was the only way I was able to get it to work. I had to create a LoginBean as well.
  • Lars Blumberg
    Lars Blumberg about 13 years
    Thanks for your feedback. I will use a bean as soon as our login form needs more functionality. For now I am satisfied with a usual <form> tag.
  • osgx
    osgx almost 11 years
    Is it possible to pass arguments to the method?
  • maple_shaft
    maple_shaft almost 11 years
    @osgx Only in EL 2.2 or later. Older application servers and web containers like Tomcat have an older version of EL bundled that will not allow you to pass method arguments.
  • osgx
    osgx almost 11 years
    Thanks! there are some samples here: stackoverflow.com/questions/3599948 How can I check the version of EL?
  • Lars Blumberg
    Lars Blumberg over 10 years
    @osgx: You can virtually update your EL version to 2.2. be using Oracle's EL which implements EL 2.2. See stackoverflow.com/questions/3284236/…
  • phse
    phse over 9 years
    if you don't need an id for <h:form> just use <h:form onsubmit="this.action='j_security_check';">