[Servlet&JSP]formから複数の値をまとめて変更する

## 今回も前回の続きでformで入力して一覧に表示させた後に、さらにチェックボタンを使用してまとめて変更を行う。

### 前回も続きになっているので、先にそちらの記事をみるとわかりやすいかもしれません↓

#### [[サーブレット&JSP]ArrayListを使って文字を表示させる](https://qiita.com/take14/items/3c2fee036bc0731785d9)

#### [[サーブレット&JSP]formからcheckボタンでまとめて削除する](https://qiita.com/take14/items/3c2fee036bc0731785d9)

### formから上原さんと鈴木さんを選択する。
![スクリーンショット 2022-06-27 8.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675188/1e18bf42-415e-56c6-d9f8-ca27633e6d1e.png)

### 変更内容を入力する。今回はテスト1とテスト２を入力
![スクリーンショット 2022-06-27 8.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675188/18c01f36-eef7-7c3a-ad12-e0c7792f5fb6.png)

###  まとめて変更を行うことができた。
![スクリーンショット 2022-06-27 8.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675188/d3ff230b-cf93-e0ff-4fce-6d6b76905ad4.png)

```java:marutihenkou.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
 <%@ page import="beans.User,java.util.ArrayList" %>
    <%ArrayList<User> userList = (ArrayList<User>)session.getAttribute("userlist");%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="marutihenkou" method="get">
<% for(int i = 0; i < userList.size(); i++) { %>
<%out.print(i+1); %>
<%= userList.get(i).getName()%>
<input type="checkbox" name="change" value="<%=i%>"><br>

<% } %>
<input type="submit" value="まとめて変更">
</form>


</body>
</html>

```

1. 変更したい人の選択してmaturihenkou.java(サーブレット)に値を送る。→doGet

```java:marutihenkou.java
package サーブレット;

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

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 beans.User;

/**
 * Servlet implementation class marutihenkou
 */
@WebServlet("/marutihenkou")
public class marutihenkou extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public marutihenkou() {
        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.setContentType("text/html; charset=utf-8");
		
		String[] change = request.getParameterValues("change");
		int[] numchange = new int[change.length];
		
		for(int i = 0; i < change.length; i++) {
			numchange[i] = Integer.parseInt(change[i]);
		}
		
		HttpSession session = request.getSession();
		
		session.setAttribute("まとめて変更処理", numchange);
		
		RequestDispatcher rd = request.getRequestDispatcher("marutihenkoucontents.jsp");
		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.setContentType("text/html; charset=utf-8");
		
		String [] name = request.getParameterValues("name");
		String [] number = request.getParameterValues("number");
		int[] numnumber = new int[number.length];
		
		HttpSession session = request.getSession();
		ArrayList<User> userlist = (ArrayList<User>)session.getAttribute("userlist");
		for(int i = 0; i < number.length; i++) {
			numnumber[i] = Integer.parseInt(number[i]);
			 User u = new User();
			 u.setName(name[i]);
			 userlist.set(numnumber[i],u);
				
		 }
		session.setAttribute("userlist", userlist);
		
		RequestDispatcher rd = request.getRequestDispatcher("display.jsp");
		rd.forward(request, response);
		
	}

}

```
1. jspから選択された値を配列値で受け取りたいので、getParameterValuesメソッドを使用する。
2. int型の配列を作成する。変数名はnumchange。配列の長さはフォームで選択された長さ。今回は0,1
3. Integer.paseIntメソッドを使用して文字列から数値型に変更 。
4. numchange変数をセッションスコープに保存する。marutihenkoucontent.jspへフォワード

```java:marutihenkoucontent.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ page import="beans.User,java.util.ArrayList" %>
     <%  ArrayList<User> userList = (ArrayList<User>)session.getAttribute("userlist");%>
    <%  int [] numchange = (int[])session.getAttribute("まとめて変更処理"); %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>変更前</h3>
<% for(int i = 0; i < numchange.length;i++){ %>
				<%=numchange[i]+1%>
				<%=userList.get(numchange[i]).getName()%>
			<%}%>
		
		
		<h4>-----------------------------------</h4>
<h3>変更後</h3>
<% for(int u = 0; u < numchange.length;u++){ %>			
		<form action="marutihenkou"  method="post">
		<h3>変更内容を入力して下さい</h3>
	    <%=numchange[u]+1 %>
		<input type="text"  name="name"><br>
		<input type="hidden"  name="number" value="<%=numchange[u]%>"><br>
		
		
<%}%>
<input type="submit" value="送信">
		</form>


</body>
</html>

```
1. フォームで選択した値が変更前に表示される
2. 変更後に変更内容を記述する。その時に変更したい番号もnameと一緒に送る必要がある
3. marutihenkou.java(サーブレット)に送信 doPost

  
```java:marutihenkou.java
package サーブレット;

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

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 beans.User;

/**
 * Servlet implementation class marutihenkou
 */
@WebServlet("/marutihenkou")
public class marutihenkou extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public marutihenkou() {
        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.setContentType("text/html; charset=utf-8");
		
		String[] change = request.getParameterValues("change");
		int[] numchange = new int[change.length];
		
		for(int i = 0; i < change.length; i++) {
			numchange[i] = Integer.parseInt(change[i]);
		}
		
		HttpSession session = request.getSession();
		
		session.setAttribute("まとめて変更処理", numchange);
		
		RequestDispatcher rd = request.getRequestDispatcher("marutihenkoucontents.jsp");
		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.setContentType("text/html; charset=utf-8");
		
		String [] name = request.getParameterValues("name");
		String [] number = request.getParameterValues("number");
		int[] numnumber = new int[number.length];
		
		HttpSession session = request.getSession();
		ArrayList<User> userlist = (ArrayList<User>)session.getAttribute("userlist");
		for(int i = 0; i < number.length; i++) {
			numnumber[i] = Integer.parseInt(number[i]);
			 User u = new User();
			 u.setName(name[i]);
			 userlist.set(numnumber[i],u);
				
		 }
		session.setAttribute("userlist", userlist);
		
		RequestDispatcher rd = request.getRequestDispatcher("display.jsp");
		rd.forward(request, response);
		
	}

}


```
1. formで入力された値を配列値で受け取る
2. int型の配列　numnumber 変数を作成
3. セッションからArrayListを呼び出す
4. numberの数だけfor文を回して文字列型から数値型へ変更する。あとで値を上書きするときに何番目の値かを指定する時に使用する。
5. Userインスタンスを作成して、nameをセットする
6. ArrayListに値をセットする(int,インスタンス)