본문 바로가기
코딩도전기/MVC

CODO Day26_JAVA_MVC(Map – Hash Map)

by 코도꼬마 2023. 3. 9.

Map – Hash Map

  • Map 인터페이스로 구현한 대표적 Map 컬렉션
  • key와 value로 이루어진 자료 구조
  • Key는 순서가 없으며 중복도 허용되지 않음(중복된 key 값이 들어오면 value 값만 덮어씀)
  • Collection interface를 구현하지 않기 때문에 기존과는 조금 다른 method를 사용
  • Hash Map에서 단일값을 검색할 경우 key를 통해 value를 찾음
  • index가 없기 때문에 내용을 하나씩 꺼내는 방법을 제공
    • keySet : key값만 가져와서 value값을 찾음
    • entrySet : key와 value를 같이 가져와서 각각 뽑

 

Written by zer0box

 

  • 모든 값을 가져 올 경우는 두가지 방법을 사용 
    1. 모든 Key를 Set으로 가져와 key를 iterator()

 

          2. Map을 Set으로 가져와 key/value 단위로 iterator()

 

  • index
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style>
	table, th, td{
		border: 1px solid black;
		border-collapse: collapse;
		padding: 5px 10px;
	}
	button.regist{
		height: 50px;
	}
</style>
</head>
<body>
	<h3>점수 관리</h3>
	<form action="insert">
		<table>
			<tr>
				<th>이름</th>
				<td><input type="text" name="std_name"></td>
				<td rowspan="2"><button class="regist">등록</button></td>
			</tr>
			<tr>
				<th>점수</th>
				<td><input type="text" name="score"></td>
			</tr>
		</table>
	</form>
	<br/>
	<h3>리스트</h3>
	<table style="width:310px;">
		<colgroup>
			<col width="40%">
			<col width="30%">
			<col width="30%">
		</colgroup>
		<thead>
			<th>이름</th>
			<th>성적확인</th>
			<th>삭제</th>
		</thead>
		<tbody>
			<c:forEach items="${list}" var="key">
					<tr>
						<td style="text-align: center;">${key}</td>
						<td><button onclick="window.open('view?key=${key}','','width=225,height=100')">성적확인</button></td>
						<td style="text-align: center;"><a href="remove?key=${key}">삭제</a></td>
					</tr>
			</c:forEach>
		</tbody>
	</table>
	
	<!-- map의 전체 값 뽑아내기 4 -->
	<%-- <c:forEach items="${map}" var="item">
		<p>${item.key} : ${item.value}</p>
	</c:forEach> --%>
	<br/>
	<h3>검색하기</h3>
	<form action="search">
		<select name="option">
			<option value="name">이름</option>
			<option value="score">점수</option>
		</select>
		<input type="text" name="word"/>
		<input type="submit"/>
	</form>
</body>
<script>

</script>
</html>

 

  • ScoreController
package kr.co.web.controller;

import java.io.IOException;

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 kr.co.web.model.ScoreModel;

@WebServlet(urlPatterns = {"/insert","/list","/view","/remove","/search"})
public class ScoreController extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    		throws ServletException, IOException {
		proc(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    		throws ServletException, IOException {
		proc(req,resp);
	}

	private void proc(HttpServletRequest req, HttpServletResponse resp) 
    		throws IOException, ServletException {
		
		String uri = req.getRequestURI();
		String ctx = req.getContextPath();
		String addr = uri.substring(ctx.length());
		//System.out.println(uri + " / " + ctx + " / " + addr);
		
		ScoreModel model = new ScoreModel(req,resp);
		
		switch(addr) {
			case "/insert":
				model.insert();
				break;
				
			case "/list":
				model.list();
				break;
				
			case "/view":
				model.view();
				break;
				
			case "/remove":
				model.remove();
				break;
				
			case "/search":
				model.search();
				break;	
		}		
		
	}

}

 

  • ScoreModel
package kr.co.web.model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ScoreModel {
	
	HttpServletRequest req;
	HttpServletResponse resp;
	RequestDispatcher dis;
	
	//Map은 key와 value에 대한 타입을 두개 지정(key에는 90% String타입이 들어감)
	private static Map<String, Integer> map = new HashMap<String, Integer>();
	
	//모델에서 파라메터도 추출하고, 처리도 하고, view에 전송도 할 것임
	public ScoreModel(HttpServletRequest req, HttpServletResponse resp) {		
		this.req = req;
		this.resp = resp;		
	}

	public void insert() throws IOException {
		String std_name = req.getParameter("std_name");
		int score = Integer.parseInt(req.getParameter("score"));
		map.put(std_name, score);  //map에서는 put()을 이용해서 데이터를 넣음
		System.out.println("map의 크기 확인 : " + map.size());
		resp.sendRedirect(req.getContextPath()+"/list");
	}

	public void list() throws ServletException, IOException {
		//map의 전체 값 뽑아내기 1
		//key만 set으로 담아옴 >> iterator로 분리 >> key를 하나씩 꺼내 해당하는 값 찾아오기
		Set<String> keys = map.keySet();
		Iterator<String> iter = keys.iterator();
		
		while (iter.hasNext()) {
			String key = iter.next();
			int score = map.get(key); //중복값 있으면 덮어씀
			System.out.println(key + " : " + score);

		//map의 전체 값 뽑아내기 2
		//key:value를 한쌍(Entry)으로 set에 담아옴 >> iterator로 분리 >> key와 value를 각각 뽑아냄
		Set<Entry<String, Integer>> entrySet = map.entrySet();
		Iterator<Entry<String, Integer>> iter = entrySet.iterator();
		while(iter.hasNext()) {
			Entry<String, Integer>entry = iter.next();
			String key = entry.getKey();
			int score = entry.getValue();
			System.out.println(key + " : " + score);		
		}
		
		ArrayList<String> list = new ArrayList<String>();
		
		//map의 전체 값 뽑아내기 3
		//향상된 for 활용(많이 사용*)
		for(String key : map.keySet()) {
			//int score = map.get(key);
			//System.out.println(key + " / " + score);
			list.add(key);
		}
		
		//key만 따로 담아서 view에 보낼 예정(이름을 클릭하면 점수 나옴)
		dis = req.getRequestDispatcher("index.jsp");
		req.setAttribute("list", list);
		//req.setAttribute("map", map);
		dis.forward(req, resp);
	}
	
	public void view() throws ServletException, IOException {
		String key = req.getParameter("key");
		dis = req.getRequestDispatcher("score.jsp");
		req.setAttribute("name", key);
		req.setAttribute("score", map.get(key));
		dis.forward(req, resp);
	}

	public void remove() throws IOException {
		String key = req.getParameter("key");
		map.remove(key);
		resp.sendRedirect(req.getContextPath()+"/list");		
	}

	public void search() throws ServletException, IOException {
		String option = req.getParameter("option");
		String word = req.getParameter("word");
		//System.out.println(option + word);
		
		List<String> list = new ArrayList<String>();
		
		switch (option) {
		case "name":
			if(map.get(word) != null) {
				list.add(word);
			}
			break;

		case "score":			
			for(String key : map.keySet()) {
				if(Integer.parseInt(word) == map.get(key)) {
					list.add(key);
				}
			}
			
			break;
		}
		req.setAttribute("list", list);
		dis= req.getRequestDispatcher("index.jsp");
		dis.forward(req, resp);
	}
	
}

 

  • score
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style></style>
</head>
<body>
	${name}의 점수는
	${score}입니다.
	<button onclick="closeWin()">닫기</button>
</body>
<script>
	function closeWin() {
		self.close();
	}
</script>
</html>