6

入力フィールドが少なく、メニューが1つ選択されたフォームがあります。すべてのフィールドはrequired="true"、firstName、lastName、emailAddress、password、countryです。

テストケース#1:1)すべての入力フィールドに値を入力し、値を入力せずにfirstNameフィールドを残し
、国(例:米国)を選択してフォームを送信すると、firstNameフィールドに必要なエラーメッセージが表示されます。

2)値を入力せずにfirstNameフィールドを残して、フォームをそのままにしてから、国を選択して「1つ選択」し、フォームを送信します。firstNameフィールドとcountryフィールドのエラーメッセージが表示されますが、ドロップダウンのように「Select One」が表示されなかった場合は、米国(前の選択)が表示されます。

入力フィールドでも同じ問題がありますが、コンバーターで解決しました。これを解決する方法はありますか?私はstackoverflowにいくつかの投稿を投稿しましたが、それがmojarraのバグであることがわかりました。

これが私のコードです...

userRegistration.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" >      
 <h:body>
    <h:form id="registrationForm">     
    <h:messages layout="table" infoClass="infoMsgs" errorClass="errMsgs"/>

    <table>
        <tr>
            <td>First Name:</td>
            <td>
                <h:inputText size="40" maxlength="100" 
                             required="true" 
                             styleClass="#{component.valid ? '' : 'text_error'}"
                             value="#{registrationAction.firstName}" />
            </td>
        </tr>
        <tr>
            <td>Last Name:</td>
            <td>
                <h:inputText size="40" maxlength="100" 
                             required="true" 
                             styleClass="#{component.valid ? '' : 'text_error'}"
                             value="#{registrationAction.lastName}" />
            </td>
        </tr>
        <tr>
            <td>Email Address:</td>
            <td>
                <h:inputText size="40" maxlength="100" 
                             required="true" 
                             styleClass="#{component.valid ? '' : 'text_error'}"
                             value="#{registrationAction.emailAddress}" />
            </td>
        </tr>
        <tr>
            <td>Password:</td>
            <td>
                <h:inputSecret size="20" maxlength="15" 
                             required="true" 
                             styleClass="#{component.valid ? '' : 'text_error'}"
                             value="#{registrationAction.password}" />
            </td>
        </tr>
        <tr>
            <td>Country:</td>
            <td>
                <h:selectOneMenu id="yourCountry" name="yourCountry"    
                                 value="#{shortRegistrationAction.shortRegistrationForm.selectedCountry}"
                                 required="true" 
                                 styleClass="#{component.valid ? '' : 'text_error'}">
                    <f:selectItem itemValue="#{null}" itemLabel="-Select One-" />
                    <f:selectItems value="#{registrationAction.countryList}" />
                </h:selectOneMenu>
            </td>
        </tr>
        <tr>
            <td>&#160;</td>
            <td>
                <h:commandButton name="RegisterButton" id="RegisterButton" 
                                 styleClass="submitbutton"
                                 value="Register"
                                 action="#{registrationAction.registerUser}" />
            </td>
    </table>
    </h:form>
</h:body>
</html>

RegistrationAction.java

package com.ebiz.web.bean;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import com.ebiz.service.ICountryService;
import com.ebiz.service.IUserService;
import com.ebiz.vo.UserVO;
import org.apache.log4j.Logger;

@ManagedBean(name = "registrationAction")
@ViewScoped
public class RegistrationAction implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger log = Logger.getLogger(RegistrationAction.class);

    @ManagedProperty("#{countryService}")
    private ICountryService countryService;

    @ManagedProperty("#{userService}")
    private IUserService userService;

    private String firstName;
    private String lastName;
    private String emailAddress;
    private String password;
    private String selectedCountry;
    private List<String> countryList;

    @PostConstruct
    public void init(){
        countryList = countryService.getCountryList();
    }

    public void registerUser() {

        UserVO userVO = new UserVO();
        userVO.setFirstName(firstName);
        userVO.setLastName(lastName);
        userVO.setEmailAddress(emailAddress);
        userVO.setPassword(password);
        userVO.setCountry(selectedCountry);

        userService.registerUser(userVO);

    }
}

InputTextTrimmer.java

package com.ebiz.web.converter;

import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(forClass=String.class)
public class InputTextTrimmer implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        //return value != null ? value.trim() : null;
         if (value == null || value.trim().isEmpty()) {
             if (component instanceof EditableValueHolder) {
                 ((EditableValueHolder) component).setSubmittedValue(null);
                 ((EditableValueHolder) component).resetValue();
             }
             return null;
         }
         return value;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return (value == null) ? null : value.toString();
    }

}
4

2 に答える 2

0

次のBalusCブログ投稿をご覧ください。ajaxアップデートで未処理の入力コンポーネントをリセットする

プロジェクトにOmniFacesを追加し、そのResetInputAjaxActionListenerを利用できます。

したがって、コードをこれに更新する必要があります(あなたも使用する方が良いですf:ajax):

<h:commandButton name="RegisterButton" id="RegisterButton" 
    styleClass="submitbutton"
    value="Register"
    action="#{registrationAction.registerUser}">
    <f:ajax execute="@form" render="@form" />
    <f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener"/>
</h:commandButton>

また、このBalusCの 回答をご覧ください。検証エラーが発生した後、primefaces ajaxを使用してテキストフィールドにデータを入力するにはどうすればよいですか?

于 2012-11-21T06:42:25.660 に答える
0

長い調査の結果、JSF でこれを実装する方法が見つかりませんでした。したがって、jQueryを使用してクライアント側で処理しました。この答えは最善の解決策ではないかもしれませんが、少なくとも解決策が必要な人には役立ちます。

ここで、ドロップダウン値は古い値で表示されますが、ドロップダウンの検証エラーが表示されます。上記のxhtmlページで、ドロップダウンメニュー部分を調べると、

    <h:selectOneMenu id="yourCountry" name="yourCountry"    
                     value="#{shortRegistrationAction.shortRegistrationForm.selectedCountry}"
                     required="true" 
                     styleClass="#{component.valid ? '' : 'text_error'}">
             <f:selectItem itemValue="#{null}" itemLabel="-Select One-" />
             <f:selectItems value="#{registrationAction.countryList}" />
</h:selectOneMenu>

検証に失敗した場合に古い値を表示しても、styleClass は text_error になります。<h:body>タグを閉じた後、xhtml ページに次のコードを追加しました。すなわち ( </h:body>) この特定の xhtml ページのすべてのドロップダウンに対してのみ機能しますが、commonTemplate.xhtml のような一般的な場所に配置して、すべてのページで実行することができます。

 <script>
    //<![CDATA[
        jQuery(document).ready(function() {
            jQuery("select").each(function () {
                var dropDownClass = jQuery(this).attr('class');
                if(dropDownClass == 'text_error'){
                    jQuery(this).val('');
                }
              });
        });
    //]]>
    </script>
于 2012-11-22T05:29:41.400 に答える