「ServletRequest」インターフェースの「getParameterNames」メソッド

「ServletRequest」インターフェースは、「HttpServletRequest」インターフェースの親のようです。つまりは、

public interface HttpServletRequest extends ServletRequest

という感じです。よくServletクラスで、doGet()メソッドやdoPost()メソッドで、

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
}

と、引数に使われてる「HttpServletRequest」インターフェイスなどは、「ServletRequest」インターフェイスを継承してるということで、親インターフェイスのメソッドなどをオーバーライドしてるってことですかね?

Java8のインタフェース実装から多重継承とMix-inを考える | ギークを目指して

getParameterNames() メソッドもそんなうちの1つっぽいです。

 

getParameterNames() メソッド

getParameterNames

java.util.Enumeration getParameterNames()

このリクエストに含まれているパラメータ名を表す String オブジェクトで構成される Enumeration を返します。 リクエストにパラメータが無い場合、空の Enumeration を返します。

    戻り値:
    • String オブジェクトで構成された Enumeration。String は各リクエストパラメータの名前。 パラメータが無い場合は空の Enumeration。 

う~ん、よく分からんですね。

 

実際にgetParameterNames()メソッドを利用してみる

というわけで、実際に使ってみる。

Eclipseを起動し、「ファイル(F)」>「新規(N)」>「動的 Web プロジェクト」を選択。

f:id:ts0818:20170905194116j:plain

「プロジェクト名(M):」を入力し、「次へ(N)>」をクリック。

f:id:ts0818:20170905194117j:plain

「次へ(N)>」をクリック。

f:id:ts0818:20170905194118j:plain

「完了(F)」をクリック。(ちなみに、「コンテキスト・ルート(R)」というのがプロジェクト名であり、サイト名にもなるようです、ただし、何かしらでURLに表示されるサイト名を変えてる場合もあります)

f:id:ts0818:20170905194119j:plain

続いて、ServletファイルとJSPファイルをそれぞれ1つ作成します。まずは、Servletファイルから。「新規(N)」>「サーブレット」を選択。

f:id:ts0818:20170905194120j:plain

Java パッケージ(K):」「クラス名(M):」を適当に入力。「次へ(N)>」をクリック。

f:id:ts0818:20170905194121j:plain

「次へ(N)>」をクリック。

f:id:ts0818:20170905194122j:plain

「完了(F)」をクリック。

f:id:ts0818:20170905194123j:plain

続いて、JSPファイル。「WebContent」を選択した状態で右クリックし、「新規(N)」>「JSP ファイル」を選択。

f:id:ts0818:20170905194124j:plain

「ファイル名(M):」を入力し、「次へ(N)>」をクリック。

f:id:ts0818:20170905194125j:plain

「新規 JSP ファイル(html)」を選択し、「完了(F)」。

f:id:ts0818:20170905194126j:plain

Servletファイル、JSPファイルがそれぞれ1つできました。

f:id:ts0818:20170905194127j:plain

そして、すみません、JavaBeanクラスも追加します。

f:id:ts0818:20170905194133j:plain

「パッケージ」、「名前(M):」を入力し、「インターフェイス(I):」の「追加(A)...」を選択。

f:id:ts0818:20170905194134j:plain

「Serializable - java.io」を選択肢、「OK」。

f:id:ts0818:20170905194130j:plain

「完了(F)」をクリック。

f:id:ts0818:20170905194135j:plain

JavaBeanクラスができました。

f:id:ts0818:20170905194136j:plain

 

 

ファイルの編集

ItemBean.java

package bean;

import java.io.Serializable;

public class ItemBean implements Serializable {
	private String itemId;
	private String itemName;
	private String price;
	private int quantity;

	public ItemBean() {}

	public ItemBean(String itemId, String itemName, String price, int quantity) {
		this.itemId = itemId;
		this.itemName = itemName;
		this.price = price;
		this.quantity = quantity;
	}


	public String getItemId() {
		return itemId;
	}

	public void setItemId(String itemId) {
		this.itemId = itemId;
	}

	public String getItemName() {
		return itemName;
	}

	public void setItemName(String itemName) {
		this.itemName = itemName;
	}

	public String getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = price;
	}

	public int getQuantity() {
		return quantity;
	}

	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}
}

ParamTestServlet.java

package servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import bean.ItemBean;

/**
 * Servlet implementation class ParamTestServlet
 */
@WebServlet("/ParamTestServlet")
public class ParamTestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ParamTestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		HttpSession session = request.getSession();
		RequestDispatcher rd;
		String url = "";

		List items = new ArrayList<>();
	  ItemBean item01 = new ItemBean("s0001", "そば", "280", 10);
	  ItemBean item02 = new ItemBean("s0002", "うどん", "280", 10);
	  ItemBean item03 = new ItemBean("s0003", "パスタ", "480", 10);
	  ItemBean item04 = new ItemBean("s0004", "ラーメン", "380", 10);

	  items.add(item01);
	  items.add(item02);
	  items.add(item03);
	  items.add(item04);

	  session.setAttribute("items", items);
	  url = "./index.jsp";
	  rd = request.getRequestDispatcher(url);
	  rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");

		HttpSession session = request.getSession();
		RequestDispatcher rd;
		String url = "";
		StringBuffer sb = new StringBuffer();

		Enumeration names = request.getParameterNames();
		while(names.hasMoreElements()) {
			String name   = (String)names.nextElement();
			String[] vals = request.getParameterValues(name);

			if(vals != null) {
				for(int i = 0; i < vals.length; i++) {
					sb.append(name);
					sb.append(":");
					sb.append(vals[i]);
					if("購入".equals(request.getParameter(name))) {
						sb.append(":");
						sb.append(request.getParameter(name + "list"));
						sb.append("個");
					}

					sb.append("
"); } } } session.setAttribute("param", new String(sb)); url = "./index.jsp"; rd = request.getRequestDispatcher(url); rd.forward(request, response); } }

index.jsp

<%@page import="bean.ItemBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
List<ItemBean> items = (List<ItemBean>)session.getAttribute("items");
String param = (String)session.getAttribute("param");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>getParameterNamesテスト</title>
</head>
<body>
<form action="./ParamTestServlet" method="POST">
  <input type="hidden" name="hoge" value="ほげぇ~">
  <input type="hidden" name="fuge" value="ふげぇ~">
  <input type="hidden" name="guhe" value="ぐへぇ~">
  <input type="hidden" name="bohe" value="ぼへぇ~">
  <input type="hidden" name="moge" value="もげぇ~">

  <table>
    <tr>
      <th>商品番号</th><th>商品名</th><th>値段</th><th>購入数</th><th>購入</th>
    </tr>
    <% for(ItemBean item: items) { %>
    <tr>
      <td><%= item.getItemId() %></td>
      <td><%= item.getItemName() %></td>
      <td><%= item.getPrice() %></td>
      <td>
        <select name="<%= item.getItemId() %>list">
        <% for(int num = 0; num < item.getQuantity(); num++) { %>
          <option value="<%= num %>"><%= num %></option>
        <% } %>
        </select>
      </td>
      <td>
        <% if(item.getQuantity() != 0) { %>
          <input type="submit" name="<%= item.getItemId() %>" value="購入">
        <% } %>
      </td>
    </tr>
    <% } %>
  </table>
</form>

<hr>
<% if(param != null) { %>
<%= param %>
<% } %>

</body>
</html>

サーバーで実行(今回はサーブレットファイルを選択した状態で右クリックし、「実行(R)」>「サーバーで実行」を選択。)

f:id:ts0818:20170905194140j:plain

「次へ(N)>」をクリック。

f:id:ts0818:20170905194141j:plain

「構成済み(C):」に実行したい「プロジェクト」が追加されているのを確認し、「完了(F)」をクリック。

f:id:ts0818:20170905194142j:plain

ブラウザで確認。

f:id:ts0818:20170905194137j:plain

個数を入力し、「購入」をクリック。

f:id:ts0818:20170905194139j:plain

HTMLで、name属性のあるもののvalueの値がすべて取れています。

f:id:ts0818:20170905194138j:plain

もしくは、URLとかについているgetパラメーター(『http://hoge.com?itemname=カラマーゾフの兄弟&itemauth=ドストエフスキー&price=680円』みたいな、「?」以降の文字列の、ここでは「itemname、itemauth、price」とかがパラメーター名)とかを取得できるってことですかね。