Map – Hash Map
- Map 인터페이스로 구현한 대표적 Map 컬렉션
- key와 value로 이루어진 자료 구조
- Key는 순서가 없으며 중복도 허용되지 않음(중복된 key 값이 들어오면 value 값만 덮어씀)
- Collection interface를 구현하지 않기 때문에 기존과는 조금 다른 method를 사용
- Hash Map에서 단일값을 검색할 경우 key를 통해 value를 찾음
- index가 없기 때문에 내용을 하나씩 꺼내는 방법을 제공
- keySet : key값만 가져와서 value값을 찾음
- entrySet : key와 value를 같이 가져와서 각각 뽑
- 모든 값을 가져 올 경우는 두가지 방법을 사용
- 모든 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>
'코딩도전기 > MVC' 카테고리의 다른 글
프론트 컨트롤러(DispatcherServlet) (0) | 2023.12.14 |
---|---|
Servlet (0) | 2023.12.14 |
CODO Day25_JAVA_MVC(Linked List/Set Collection(HashSet)) (0) | 2023.03.08 |
CODO Day24~25_JAVA_MVC(Generic) (0) | 2023.03.07 |
CODO Day23~24_JAVA_MVC(Collection Framework - ArrayList/Vector) (0) | 2023.03.06 |