-1

フォームフィールドへの文字列の挿入を検証するために使用されるこの Java メソッドを作成しました。

public void validateDatacenterName(FacesContext context, UIComponent component, 
                         Object value) throws ValidatorException, SQLException {
  String l;
  String s = value.toString().trim();

  if (s.length() > 18) {
    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "  Value is too long! (18 digits max)", null));  
  }

  try {
    // l = Long.parseLong(s);
    // if (l > Integer.MAX_VALUE)
    // {
    //   throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
    //                    "  '" + l + "' is too large!", null));  
    // }
  } catch(NumberFormatException nfe) { 
    l = null; 
  }

  if (s != null) {
    if (ds == null) 
      throw new SQLException("Can't get data source");

    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs;
    int cnt = 0;
    try {
      conn = ds.getConnection();
      ps = conn.prepareStatement("SELECT count(1) from COMPONENTSTATS where COMPONENTSTATSID = ?");
      ps.setString(1, s);
      rs = ps.executeQuery();

      while(rs.next()) 
        cnt = rs.getInt(1);

      if (cnt > 0) {
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "  '" + s + "' is already in use!", null));                    
      }

    } catch(SQLException x) {
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "  SQL error!", null));                
    } finally {
      if (ps != null) 
        ps.close();
      if (conn != null) 
        conn.close();
    }                      
  } else {
    throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        s.isEmpty() ? "  This field cannot be empty!" : "  '" + s + "' is not a valid name!", null));         
  }

}

このコードを改善するにはどうすればよいですか? フォームバリデータを改善するために追加できるチェックはありますか?

どんな助けでも大歓迎です!

4

6 に答える 6

3
  • StackOverflow の読者は、あなたのアプリケーションを知らないため、あなたの説明から有効なデータ センター名が何かわかりません。数値であるという唯一の要件はありますか?

  • 値が数値であるはずなのに、なぜ を呼び出すコードをコメントアウトするのparseLong()ですか?

  • COMPONENTSTATS ですでに使用されている値をチェックすると、競合状態が発生します。つまり、そのチェックの後でも、挿入する前に他のアプリケーション スレッドが同じ値を挿入する可能性があります。UNIQUE制約を使用してデータベースの一意性を強制しないのはなぜですか?

  • s.isEmpty()あなたが知っているとき、あなたはどのようにあなたのelseブロックで呼び出すことができますかs == null?

  • このメソッドが javax.faces.validator.Validator を実装するクラスの一部である場合、メソッドに名前を付けるべきではありませんvalidate()か?

于 2012-12-27T15:53:27.030 に答える
2

本当に必要な場合にのみ、正規表現を使用してください。現在使用している検証では、標準的なString方法で十分です。

可能な限り、検証関連のタスクのメソッドを維持することを目指す必要があります。この目的のために、データベース呼び出しを別のメソッドに抽出する必要があります。

また、NullPointerExceptionここで起こるのを待っています:

throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        s.isEmpty() ? "  This field cannot be empty!" : "  '" + s + "' is not a valid name!", null));         

この時点snullNullPointerExceptionあなたが投げる前に投げられますValidatorException

于 2012-12-27T15:50:21.290 に答える
1

いくつかの提案:

  1. 許可された文字および/または記号のグループを定義することにより、 の構造Regexを検証するために使用しますStirng
  2. null チェック ロジックを の前に移動しますif(s.length() > 18)。If sisnullその句の結果はNullPointerException.
  3. null チェックを修正します。nullではないためif (s != null)許可s = ""され、空の文字列を検証しようとする else ステートメントが壊れます (NullPointerException検証メッセージを作成すると、結果が になります)。両方のケースで異なるロジックを実行する場合は、その検証を使用するif(s != null && !s.isEmpty())か、2 つに分割します。
于 2012-12-27T15:48:47.520 に答える
1

チェックする前if (s.length() > 18)に、 s の null をチェックする必要があると思います

if (s !=null && s.length() > 18)

また、文字列の空のチェックを行うことをお勧めしますs.isEmpty()

于 2012-12-27T15:47:07.470 に答える
1

私は正規表現で検証します。

残念ながら、正確な文字列を与える知識はありませんが、毎日使用している人は3秒でなくなると確信しています:)それが最善の方法であることはわかっています.

于 2012-12-27T15:35:07.867 に答える
1

Web で既に実装されている検証を検索するか、文字列に許可したい文字のリストを作成し、たとえば入力に他の文字が含まれていない正規表現を使用して入力をチェックします。

于 2012-12-27T15:41:06.560 に答える