0

このページがあります。2 つのフォームがあります。2 番目のフォームは ajax によってロード (レンダリング) されます。問題は、次のフォームのボタンが押されたときに、「アクション」で指定されたメソッドを実際に呼び出すのではなく、ページがリロードされることです。

XHTML

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                template="./../WEB-INF/employeeTemplate.xhtml"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns="http://www.w3.org/1999/xhtml">

    <ui:define name="content">
        finding user ...
        <h:form id="mainForm">
            <h:inputText id="userId" value="#{eFindUser.userId}" />
            <h:commandButton value="Render!" action="#{eFindUser.findUser}" >
                <f:ajax event="action" execute="userId" render="@all" />
            </h:commandButton>
        </h:form>        

        <h:panelGroup id="result">
            <h:panelGroup layout="block" rendered="#{eFindUser.notFound}" style="color:red">
                User not found
            </h:panelGroup>

            <h:form>
                <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" >

                    <h:inputHidden value="#{eFindUser.user}" />
                    <table>
                        <tr>
                            <td>Name</td> <td>#{eFindUser.user.name}</td>
                        </tr>
                        <tr>
                            <td>Balance:</td> <td>#{eFindUser.user.account.balance}</td>
                        </tr>

                        <tr>
                            <td><h:commandButton value="update balance" action="#{eFindUser.process()}" /></td>
                        </tr>
                    </table>


                </h:panelGroup>
            </h:form>                        
        </h:panelGroup>



    </ui:define>

</ui:composition>

バッキングビーン

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package backingbeans;

import entities.User;
import java.io.Serializable;
import java.util.Random;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.validation.constraints.NotNull;
import stateless.EmployeeFacade;

/**
 *
 * @author Martin
 */
    @ManagedBean(name="eFindUser")
    @ViewScoped
    public class EFindUserManagedBean implements Serializable{
        private static final long serialVersionUID = -7106162864352727534L;
        private boolean responseRendered = false;
        private boolean notFound = false;
        @NotNull
        private Long userId;
        private User user;

        @Inject
        private EUpdateBalanceManagedBean updateBalance;

        @Inject
        private EmployeeFacade employeeFacade;

        /**
         * Creates a new instance of EFindUserManagedBean
         */

        public EFindUserManagedBean() {
        }

        public void findUser() {
            if(new Random().nextDouble() < 0.3) {
                notFound = true;
                responseRendered = false;
            } else {
                notFound = false;
                responseRendered = true;
                user = employeeFacade.getUserById(3L);
            }

        }
        public boolean isResponseRendered() {
            return responseRendered;
        }

        public void setResponseRendered(boolean responseRendered) {
            this.responseRendered = responseRendered;
        }

    public boolean isNotFound() {
        return notFound;
    }

    public void setNotFound(boolean notFound) {
        this.notFound = notFound;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        System.out.println("blah");
        this.userId = userId;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        System.out.println("setting user");
        this.user = user;
    }


    public String process() {
        updateBalance.setUser(user);
        System.out.println("process");
        return "/employee/updateBalance.xhtml?faces-redirect=true";
    }

    }

最初の 'Render!' ラベルの付いたボタンをクリックすると、魅力的に機能します。2 番目のフォームがロードされ、作業の準備が整いました。次の「残高の更新」というラベルの付いたボタンをクリックすると、ページがリロードされますが、もちろんそうではありません。「/employee/updateBalance」にリダイレクトする必要があります。または、少なくともプロセス メソッドを呼び出す必要があります。

どうもありがとう

編集:@BalusCは正しいです、答えは前の質問にあります

4

2 に答える 2

0

<h:inputHidden>犯人は、2 番目の形式のタグで見つけることができます。

<h:form>
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" >
        <h:inputHidden value="#{eFindUser.user}" />
    </h:panelGroup>
</h:form>

ほとんどの場合、そのバインドされた値eFindUser.userは型であり、そのフォームを送信すると、JSF はユーザーの文字列表現をオブジェクトUserに割り当てる方法を知りません。User

したがって、JSF ライフサイクルに従って、アクション メソッドが呼び出されない場合、変換エラーが発生します。さらに、あなたがあなたの見解を持っていれば、あなたはそれを知っていただろう<h:messages>.

できることは次のとおりです。

  1. <h:inputHidden value="#{eFindUser.user}" converter="userConverter"/>実装されているように、コンバーターを入力に割り当てます@FacesConverter。詳細については、こちらをご覧ください
  2. にバインド<h:inputHidden>してString、コンバーターが不要になるようにします。<h:inputHidden value="#{eFindUser.user.userNickname}">またはInteger、同様の方法で にバインドします。
于 2013-05-06T11:12:16.203 に答える
0

<h:commandButton value="update balance" action="#{eFindUser.process()}" /> el式への 変更 に<h:commandButton value="update balance" action="#{eFindUser.process}" /> 「()」を含めることはできません</p>

于 2013-05-06T13:32:01.223 に答える