こんにちわ、初心者プログラマーのRammyと申します。
現在webで使うツールを開発中なのですが、web上にある入力フォーム内に
入力された文字列について、

1.半角英数字及び_-.のみ入力可能にする(メールアドレス判断用)
2.半角数字のみ入力可能にする(電話番号などの判断用)
3.文字列の長さをチェックし、一定の長さを超えたら送信させない

以上の入力制限処理をJAVAで行いたいのです。
現在、空白チェックのみ、チェック用のBeansを作成し、その中に


public static boolean checkBlank(){
 if (kind == null || user_name == null
 || mail1 == null || mail2 == null
 || tel == null || subject == null || text == null ) {
 return false;
}

 if (kind .compareTo("") == 0 || user_name.compareTo("") == 0
 || mail1.compareTo("") == 0 || mail2.compareTo("") == 0
 || tel.compareTo("") == 0 || subject.compareTo("") == 0
 || text.compareTo("") == 0 ) {
 return false;
}
return true;
}

このように記述してありますが、Beans内に上記の1~3の機能をつけたし
たいのです。が、いったいどのように記述したらいいのかわかりません。
1・2に関しては、入力可能な文字をあらかじめ決めておいて、入力された
文字列を分解し、入力可能文字と一致するかどうか判断する、というイメージ
はできるのですが、どう書いたらいいものかわからないのです汗
3は、lengthメソッドをやはり使うのでしょうがどう書けばいいのか・・・汗

本当に初心者な質問で申し訳ないのですがご教授下さいませんでしょうか。
ヒントでもかまいませんのでご回答いただければ幸いです、宜しくおねがい
致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 横に判定するのではなく縦に判定すれば見通しがよくなると思います。


以下の例は、フォームから入力した文字列の長さと使用文字種を判定して結果を返すページとサーブレットの例です。

-----ページ-----

<html>
<head><title>Data Input</title></head>
<body>
<form action="http://localhost:8080/minnaservlet/171847" method="GET">
<script>
var name = new Array("kind", "user_name", "mail1", "mail2", "tel", "subject", "text");
for (var i = 0; i < name.length; i ++)
document.writeln(name[i] + "<input type='text' name='" + name[i] + "'><br>");
</script>
<input type="submit" value="send">
</form>
</body>
</html>

-----サーブレット-----

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class strcheck extends HttpServlet {

private boolean TelCheck(String s) {
if (!BlankCheck(s, 10)) return(false);
return(s.matches("[0-9]*"));
};

private boolean AddrCheck(String s) {
if (!BlankCheck(s, 20)) return(false);
return(s.matches("[[0-9][a-z][A-Z][-_.@]]*"));
};

private boolean BlankCheck(String s, int l) {
if (s == null) return(false);
if ((s.compareTo("") == 0) || (s.length() > l)) return(false);
return(true);
};

public void doGet(HttpServletRequest req, HttpServletResponse res) {

String kind = req.getParameter("kind");
String user_name = req.getParameter("user_name");
String mail1 = req.getParameter("mail1");
String mail2 = req.getParameter("mail2");
String tel = req.getParameter("tel");
String subject = req.getParameter("subject");
String text = req.getParameter("text");

try {res.setContentType("text/html");
PrintWriter PW = res.getWriter();
PW.println("<html><head><title>Check</title></head>");
PW.println("<body><h1>");

if (BlankCheck(kind, 1) && BlankCheck(user_name, 10) && AddrCheck(mail1) && AddrCheck(mail2) &&
TelCheck(tel) && BlankCheck(subject, 100) && BlankCheck(text, 100))
PW.println("Input OK");
else PW.println("Input NG");

PW.println("</h1><br></body></html>");

} catch (Exception ex) { System.out.println(ex.toString()+ "::Get"); };

};

}
    • good
    • 0

1,2の文字列のパターンチェックでしたら正規表現ライブラリを使いましょう。


超楽です。(正規表現を理解する必要がありますが。)

JavaWorld 2001/4月号,8月号に特集されていました。
Java関連で仕事をなされているのなら
周りの誰かが持っているでしょう。


3の長さチェックは、可能ならまずMAXLENGTHで制限して、
さらに文字列の長さをチェックすればいいでしょう。

参考URL:http://jakarta.apache.org/oro/index.html
    • good
    • 0

こんにちはRammyさん。



Beansは使った事無いのでわかりませんが、文字列のチェックならこんな感じでいかがでしょう?

1.メールアドレスのチェック

public boolean chkMail(String str){
 byte temp[] = str.getBytes();
 boolean atmark = false;

 if ( temp[0] < 97 || 122 < temp[0] ) return false;
 for ( int i = 1; i < temp.length; i++) {
  if ( 97 <= temp[i] && temp[i] <= 122 || temp[i] == 45) {
   ;
  } else if ( 64 == temp[i] ) {
   if (atmark == true ) {
    return false;
   } else {
    atmark = true;
   }
  } else if (atmark == true && 46 == temp[i] ){
   ;
  } else {
   return false;
  }
 }
 if (atmark == false ) return false;
 return true;
}

2.半角数字のチェック

public boolean chkNumber(String str){
 byte temp[] = str.getBytes();
 for ( int i = 0; i < temp.length; i++) {
  if ( 48 <= temp[i] && temp[i] <= 57){
   ;
  } else {
   return false;
  }
 }
 return true;
}

3.文字数のチェック

public boolean chkLength(String str){
 if ( 文字数 <= str.length() ) {
  return false;
 }
 return true;
}

これは適当に作った物なんでもっといい方法とかあると思います。
漢字が入力された場合とかも全然考慮に入れてません。
参考程度にとどめてもらえればよいかと思います。
それでは、がんばってください。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【jQuery】いい文字数カウンターを探してます

jQuery(JavaScript)初心者です。
<input>や<textarea>など、フォームの文字数カウンターを探しているのですが、意外といいのが見つからず、お尋ねします。
次のような文字数カウンターのプラグインをご存じでしたら教えてください。

1)改行は数えない
2)キーボードを使わずマウスだけでコピペしても反応してくれる

Twitterのも、教えてgooのも、上記を満たしていないのでけっこう難しいんでしょうかね…

お詳しい方、よろしくお願いします。

Aベストアンサー

<textarea onchange="alert(this.value.replace(/\r|\n|\r\n/, '').length);"></textarea>

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Q文字数カウントの質問です!

こんにちわ

Excel,PPT,Pdfの文字数のカウントを行っているのですが、
なにかこう、自動でやってもらえるのはないのでしょうか。

今は手作業で数取機を使ってカチカチやってます。
文字カウントだけで手が疲れます。。。

Wordは文字数カウントが「ツール」⇒「文字カウント」でできるのですが、
Excel,PPT,PDFの文字数カウントはどうすればいいのでしょうか。

文字カウントをマクロで一度挑戦しようとして本買ってあきらめました。

PDFは一度Wordに出力して上記の文字数カウンターを使っていますが、
このWordの文字数カウンターもイマイチなんですよね。。。

Excel PPT Pdf の文字数カウントを
簡単にしたいのですが何かいいのはありませんでしょうか。

それぞれでもいいので教えてください!
一番こまっているのはPDFとパワーポイントの文字数カウントです。
(とくにパワーポイントの文字数カウントです。)

Aベストアンサー

こんにちは。

私はここの文字数カウンターを使っています。

http://www.officecount.jp/

有料なのですが3,675円で使用できますよ。
文字数カウントされた文字がどこなのか見やすくPDFでわかります。

ワード、エクセル、パワーポイント、PDFの全部いけます。

無料のお試しがあるので、試されてはいかがでしょう。

参考URL:http://www.officecount.jp/

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

QWordの文字数について。

ワードを開くとまずはじめに、ステータスバーに約○○文字と表示されます。
そして文章をクリックすると文字数が普通にあらわれます。
この「約」ってなんですか?
どっちが本当の文字数なんでしょうか。
ちなみにはじめに表示される約の文字数よりも、
クリックしたときの文字数の方が多いですよね。

それで、本当のところ文字数はいくらあるのだろうと思いまして、
【文字数カウント】というホームページで調べたところ、
ワードよりも文字数が増えていたのですが。。。。

本当の文字数はいったい。。。。。

どれを信じればいいのでしょうか

ちなみにWord 2007 を使用しています

Aベストアンサー

直接の回答ではありません

Word2007で文字カウントを見る方法です

校閲タブ>左側の文章校正グループの「文字カウント」で細かく見ることができます。

Qreturn {c : c, h : h}について

私以外が作ったjavascriptプログラムでこのように書かれていました。

var h = null;
var c = null;
//省略
return {c : c, h : h}

このreturn文のところの意味を知りたいのです。
{x : x, y : y}という形式でプログラムすると、
どのような条件として判断されるのでしょうか?

このプログラムの意味が分かりませんでした。
もしよろしければ、教えて頂けませんか。
よろしくお願い致します。

Aベストアンサー

まず、Objectの表記方法はご存知ですか?
var o={a:1, b:2, c:"3"}
とかいう表記はObjectを表し、
alert(o.a)
という形で、プロパティを呼び出したり、という使い方があります。

なんてのは、「javascript オブジェクト初期化子」で検索していただくとして、


本題。
仕様上、functionは1個または0個の戻り値しか返せません。
  例:function f(){return 1;return 2;} はreturn 1が実行された時点で終了。
ですが、2個以上の戻り値が必要になることもあり、(人それぞれ?)
  例:角度を指定し、sin と cos の両方の値を返したい
    画像の縦と横のサイズを知りたい
そんなときに複数の値をプロパティとして持った一つのObjectにまとめてしまえば、
戻り値は一つですむ、という解決方法があったりします。(質問内容はこれにあたります)
配列で、なんていうのもあったり。


function f(t){return {s:Math.sin(t), c:Math.cos(t),t:Math.tan(t)}}
について、
var r=f(3.14)
alert(r.s)//sinの値を参照
alert(r.c)//cos
といったように使われます。私は使ったことないです。

独り言:あぁ、メモリの悲鳴が・・・

まず、Objectの表記方法はご存知ですか?
var o={a:1, b:2, c:"3"}
とかいう表記はObjectを表し、
alert(o.a)
という形で、プロパティを呼び出したり、という使い方があります。

なんてのは、「javascript オブジェクト初期化子」で検索していただくとして、


本題。
仕様上、functionは1個または0個の戻り値しか返せません。
  例:function f(){return 1;return 2;} はreturn 1が実行された時点で終了。
ですが、2個以上の戻り値が必要になることもあり、(人それぞれ?)
  例:角度を...続きを読む

Q文字数

なぜ、文字数カウンタ等の文字数を図るものとワードの文字数を計る機能は文字数が一致しないのでしょうか?
どちらも空白は文字に数えてないのにかなり差があります
わかる方、お願いします

Aベストアンサー

具体的に、

Something Strange - 文字数カウンタ
http://s17.clara.co.jp/~tobiuo/damelabo/mojicount.shtml

で、
Hello, World!!
を数えると、スペースを含めて14文字でした。


> どちらも空白は文字に数えてないのに

上記のサイトは含めているようですが、その辺の勘違いでは?
具体的に差異が出る例文を挙げてみては?

参考URL:http://s17.clara.co.jp/~tobiuo/damelabo/mojicount.shtml

Qreturn (A && B) || 0;

下記コードはどういう意味でしょうか?
・piyo[b] と piyo[b][a] または 0を返す?
・条件分岐もないのに?
・もしかして条件式を返す?
・あるいは、piyo[b] と piyo[b][a] を返す。または 0?
・ビット演算子?

hoge = function(a, b) {
 return (piyo[b] && piyo[b][a]) || 0;
};

Aベストアンサー

意味は「piyo[b][a]に入っている数値を安全に返したい」です

もしpiyo[b]が未定義ならpiyo[b][a]にアクセスしようとするとエラーになってしまいます
そのためまず、piyo[b] && piyo[b][a]で、piyo[b]が真、つまりオブジェクトならば、piyo[b][a]を評価します。
つまりpiyo[b] && piyo[b][a]はundefinedか、piyo[b][a]になることが期待できます

次に||0で、偽ならば0を返します
つまり、piyo[b]が未定義のときのundefinedや、piyo[b][a]が未定義のときのundefined、また、piyo[b][a]が0のときは偽と評価されるので0になります。

以上より、piyo[b] && piyo[b][a] || 0はpiyoの構造がある程度しっかりしてなくとも、安全に数値(初期値0)を返すことができます。
ただし、完璧に保証できるわけではありません。
例えば、piyo自体がnullやundefinedになる危険性がある場合はさらなるチェックが必要です。

よってこのコードからは、piyoは二次元数値配列であってほしいのだけど、添字が事前にわからないため、最初は一次元配列としてしか初期化していなくて、あとから追加していく形、でも取得するときは、まだ追加されていないときでも、安全に0を返したいのだと分かります。

意味は「piyo[b][a]に入っている数値を安全に返したい」です

もしpiyo[b]が未定義ならpiyo[b][a]にアクセスしようとするとエラーになってしまいます
そのためまず、piyo[b] && piyo[b][a]で、piyo[b]が真、つまりオブジェクトならば、piyo[b][a]を評価します。
つまりpiyo[b] && piyo[b][a]はundefinedか、piyo[b][a]になることが期待できます

次に||0で、偽ならば0を返します
つまり、piyo[b]が未定義のときのundefinedや、piyo[b][a]が未定義のときのundefined、また、piyo[b][a]が0のときは偽と評価されるの...続きを読む

QWORDで文字数、行数が指定どおりにならない

WORDで文字数、行数を以下のように指定しても、指定どおりにならないのですが、どうしたら指定どおりになるのでしょうか?

「ファイル」で「ページ設定」を選択、「文字数と行数」タブを選択、「文字数と行数の指定」項で「文字数と行数を指定する」を選択、「文字数」項と「行数」項を具体的に指定。

WORDでは、それぞれの文字のサイズが異なるので、一行当たり32文字と言っても、その行に含まれる文字の数は当然異なってくると思うのですが、そうだとすると、文字数の指定は、実際には何を指定しているのでしょうか?

また、行数については、指定どおりになっても良いと思うのですが、これも指定どおりにならないのは何故でしょうか?

Aベストアンサー

> WORDでは、それぞれの文字のサイズが異なるので、一行当たり32文字と言っても、その行に含まれる文字の数は当然異なってくると思うのですが、そうだとすると、文字数の指定は、実際には何を指定しているのでしょうか?

「ページ設定」の「文字数と行数」タブにある「フォントの設定」ボタンを押して表示される「フォント」ダイアログで指定したフォントとサイズが基準です。

従って、入力した文字列のフォントサイズを変更すれば、サイズに応じて文字数や行数が減少することがあります。

この対策として、文字列の「文字間隔」を狭くしたり、「行間」を「ページ設定」の「行間隔」と同じ行間隔に「固定値」として設定することができます。

ちなみに、2003までのWordでは、前者は「書式」→「フォント」の「文字幅と間隔」タブ、後者は「書式」→「段落」→「インデントと行間隔」タブで設定します。

Qreturn falseが効かない

formで申し込みのステップ中に、selectで必須選択させる部分があり、値があれば、次に進むように考えています。
選択していない場合、アラート自体は表示しますが、ダイアログをOKすると、結局は次のページでsubmitしてしまいます。
本当は、止めたいのですが、、、。
気になる点としては、select部分を表示する場合としない場合があり、DBからの値によって、phpで表示しているくらいでしょうか。
javascriptを書く位置をいろいろ変えても結果はかわりません。
エラーもでません。
何か重大な間違いなどあるのでしょうか?。
<head>
<script Language="JavaScript">
<!--
function check(){
var flag = 0;
if(document.form.camp.options[document.form.camp.selectedIndex].value == ""){
flag = 1;
}
if(flag==1){
alert('選択されていません'); // 選択されていない
document.form.camp.focus();
return false; // 送信を中止

}

}

// -->
</script>
</head>
(~いろいろあって、、~)

<form name="form" method="post" action="damy.php" onSubmit="check()">
<select name="camp" id="camp">
<option value="">--選択してください--</option>
<option value="あ">あ</option>
<option value="い">い</option>
<option value="う">う</option>
</select>
(~いろいろあって、、~)
<input type="submit" value="次に進む">
/form>

formで申し込みのステップ中に、selectで必須選択させる部分があり、値があれば、次に進むように考えています。
選択していない場合、アラート自体は表示しますが、ダイアログをOKすると、結局は次のページでsubmitしてしまいます。
本当は、止めたいのですが、、、。
気になる点としては、select部分を表示する場合としない場合があり、DBからの値によって、phpで表示しているくらいでしょうか。
javascriptを書く位置をいろいろ変えても結果はかわりません。
エラーもでません。
何か重大な間違いなどある...続きを読む

Aベストアンサー

onSubmit="check()" を
onSubmit="return check()"
としてみてください


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報