WEBアプリの HTML 側の発射台の FORM と INPUT の属性の関係の整理

現在最も信頼性の高い HTML や JavaScript のオンラインドキュメントは MDN です。

なので、例えば FORM に関して Google で調べる場合には最初に MDN のキーワードを入れて調べます
MDN FORM

▼ MDN Web Docs
https://developer.mozilla.org/ja/docs/Web/HTML/Element/form

ここで出てくる 属性 の内容がとても重要になりますが、『古くなっている仕様』も記述(警告)されている事がとても大事です。

以下は現在必要な情報しか取り出していませんが、例えば『accept』という属性は必要無いという事が解ります。

FORM 属性の解説ページのリンク

🧡 accept-charset

💘 action

     サーバのデータの送り先 を指定します。

🧡 enctype

💘 method

    get か post を指定します。

🧡 novalidate

💘 target

    サーバーがデータを送るウインドウの name を指定します。

method="get"

サーバーへのデータの送り方の違いで get と post は大きく違います。

デモページ

テストページ
<script>
function checkForm() {
	if ( !confirm( "送信しますか?" ) ) {
		return false;
	}
	return true;
}
</script>
<form action="https://www.google.co.jp/search" onsubmit="return checkForm();" target="_blank">
	<input type="text" name="q" required list="pg">
	<datalist id="pg">
	<option value="PHP">
	<option value="Java">
	<option value="SQL">
	</datalist>

	<input type="submit" name="send" value="送信">
</form>


GET で送る場合は、リンクと同じ

ブラウザで URL が作成されてからサーバに送られます。ですから、同じ URL を作成できるのならば A 要素の href 属性に指定して呼び出す事が可能です。

❌ 欠点1
この結果、サーバー側で送った元のチェック( 排除 )を行っていない場合はどこからでも自由にデータを受け取ってしまうので、サーバー運営上はあまり好ましくありません。

❌ 欠点2
さらに、URL を介してデータを渡すので無制限にデータを送れません。それはファイルのアップロードはできない事を意味します。

❌ 欠点3
リンクと同じ扱いなので、ブラウザがキャッシュとして保存してしまうので、サーバ側でキャッシュを使わないようにしないと『ウェブアプリケーション』として動作しない事がよくあります。

アプリケーションの テスト中は GET で処理しておけば、QueryString 部分がアドレスバーに表示されて解りやすいかもしれません

POST 時のデータをブラウザで確認

POST メソッドでも、ブラウザの『デベロッパーツール』を使うと参照可能です。

FORM と 送信データ

通常では、FORM 内に定義された3つの要素からデータをサーバへ送る事ができます。

INPUT 要素
SELECT 要素
TEXTAREA 要素

但し、INPUT 要素ではとても多くの種類( type )があり、タイプによってはブラウザのみで動作するものもあります。また、name 属性の無いタイプは、サーバ側でデータを識別できないので送られません。

※ INPUT 要素の disabled 属性があるとサーバーへは送られなくなります

type="submit"

このタイプはサーバ送信用のボタンとなり、クリックする事によってサーバへデータを送ります。( JavaScript を使用すると、このボタン無しでも送る事ができます )

さらにこのボタンに使用できる FORM 用の属性を利用すると、FORM に設定していた属性を上書きする事ができます。

⭐ formaction
⭐ formenctype
⭐ formmethod
⭐ formnovalidate
⭐ formtarget

form="フォームのid"

データをサーバに送るコントロールに、form 属性を指定すると、FORM 要素の中に含めないでも FORM と関連づけできるようになっています。

<script>
function checkForm() {
	if ( !confirm( "送信しますか?" ) ) {
		return false;
	}
	return true;
}
</script>
<form id="frm" action="https://www.google.co.jp/search" onsubmit="return checkForm();" target="_blank"></form>

<input type="text" name="q" required list="pg" form="frm">
<datalist id="pg">
<option value="PHP">
<option value="Java">
<option value="SQL">
</datalist>

<input type="submit" name="send" value="送信" form="frm">




PHP

Java8 : ArrayList と 配列

単純な配列定義とデータ作成と表示

まずは配列の作成です。型として int ( プリミティブ )、String ( 文字列クラス )、User ( ユーザ作成クラス )の三種類でそれぞれ配列を作成してデータをセットして表示しています。データのセット方法としては、ループで配列一つ一つにセットする方法と、初期化子を使う方法と二つです。

表示には拡張 for を使用しています。

▼ 出力結果
0,1,2,
0,1,2,
a,b,c,
a,b,c,
a,b,c,
a,b,c,

【ASCIIコード表

a は 97(0x61) からです


public class Main {

	// 適当なユーザクラス
	static class User {
		public String stringValue; 
		public User(String stringValue) {
			this.stringValue = stringValue;
		}
	}

	public static void main(String[] args) {

		// new で配列を作成する場合の配列の数(サイズ)
		int numArray = 3;

		// ********************************
		// プリミティブ
		// ********************************
		int[] arrayBasicInt = new int[numArray];
		for( int i = 0; i < numArray; i++) {
			arrayBasicInt[i] = i;
		}
		for (int value : arrayBasicInt) {
			System.out.print(String.format("%d,",value));
		}
		
		System.out.println();
		
		// ********************************
		// プリミティブの初期化
		// ********************************
		int[] arrayInitInt = {0,1,2};
		for (int value : arrayInitInt) {
			System.out.print(String.format("%d,",value));
		}

		System.out.println();
		
		// ********************************
		// クラス
		// ********************************
		String[] arrayBasicString = new String[numArray];
		for( int i = 0; i < numArray; i++) {
			arrayBasicString[i] = String.format("%c", i+97);
		}
		for (String value : arrayBasicString) {
			System.out.print(String.format("%s,",value));
		}

		System.out.println();
		
		// ********************************
		// クラスの初期化
		// ********************************
		String[] arrayInitString = {"a","b","c"};
		for (String value : arrayInitString) {
			System.out.print(String.format("%s,",value));
		}

		System.out.println();

		// ********************************
		// 一般クラスの
		// ********************************
		User[] arrayBasicUser = new User[numArray];
		for( int i = 0; i < numArray; i++) {
			arrayBasicUser[i] = new User(String.format("%c", i+97));
		}
		for (User value : arrayBasicUser) {
			System.out.print(String.format("%s,",value.stringValue));
		}

		System.out.println();
		
		// ********************************
		// 一般クラスの初期化
		// ********************************
		User[] arrayInitUser = {new User("a"),new User("b"),new User("c")};
		for (User value : arrayInitUser) {
			System.out.print(String.format("%s,",value.stringValue));
		}
		
	}

}


配列から ArrayList

いずれも、複数のデータを一つの型の中に持つ事ができる方法ですが、配列は作成された後変更する事ができないので、自分自身で実装する場合、通常は ArrayList に変換して使用する事になります。

Arrays.asList というクラスメソッドを用いて配列は List 型に変換できます。但し、そのままでは本来の目的である変更可能なコレクションでは無いので ArrayList のコンストラクタに再度渡して利用に値する ArrayList を取得します。

また、ArrayList には、forEach メソッドを使って一覧処理が可能です。拡張 for でも可能ですが、Map 型も同様に扱う事ができるので、最初は forEach で処理を作成しましょう。

▼ 出力結果
[令, 和, 元, 年]
[令, 和, 元, 年]
[令, 和, 元, 年]
令,和,元,年,
令,和,元,年,
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListCheck {

	public static void main(String[] args) {
		
		// ********************************
		// クラスの初期化
		// ********************************
		String[] arrayInitString = {"令","和","元","年"};
		System.out.println(Arrays.toString(arrayInitString));
		
		// ********************************
		// ArrayList に変換
		// ********************************
		List<String> interFace = Arrays.asList(arrayInitString);
		
		// ********************************
		// ① List を インターフェイス
		// に持つ ArrayList は List 型の
		// 変数に格納できる
		// ********************************

		// ********************************
		// ② Arrays.asList で取得された
		// List は 固定で変更できない
		// ( 配列と同じ特性 )
		// ********************************



		ArrayList<String> arrayListString = new ArrayList<String>(Arrays.asList(arrayInitString));
		System.out.println(arrayListString.toString());

		// ********************************
		// ③ 変更可能に変換する為に再度
		// ArrayList のコンストラクタへ
		// 渡して ArrayList を取得する
		// ********************************
	
	
	
		String[] arrayRebuildString = arrayListString.toArray(new String[0]);
		System.out.println(Arrays.toString(arrayRebuildString));

		// ********************************
		// ④ toArray メソッドで配列を
		// 作り直す事ができます
		// ********************************

	
	
		int size = arrayListString.size();
		for( int i = 0; i < size; i++ ) {
			String stringValue = String.format("%s,", arrayListString.get(i) );
			System.out.print(stringValue);
		}
		System.out.println();

		// ********************************
		// ⑤ ArrayList のメソッドを使用
		// してデータを取り出す
		// ********************************



		arrayListString.forEach(stringValue -> {
			stringValue = String.format("%s,", stringValue );
			System.out.print(stringValue);
		});
		System.out.println();

		// ********************************
		// ⑥ forEachメソッド を使用して
		// 結果をラムダ式で記述する
		// ********************************

		// ********************************
		// ⑦ HashMap の forEachメソッド
		// では、渡す値が二つになり、
		// かっこでくくる必要があります
		// ********************************

	}

}


ArrayList から配列の変換は、toArray メソッドで容易に行えます。


▼ 参考記事

配列の宣言・生成 ( Javaの道 )

配列とListの変換 ( 侍エンジニア塾ブログ )

toArray ( Oracle ArrayList )

Arrays.asList ( Oracle ) / fill / toString

Arrays.asList の罠 ( Qiita )

List⇔配列の相互変換 ( 侍エンジニア塾ブログ )

Java8のforEachとラムダ式を配列、List、Mapで使う ( 侍エンジニア塾ブログ )

拡張for文とJava8のforEachの使い方( 侍エンジニア塾ブログ )

インナークラス・メンバークラス ( Qiita )