
TO DO LIST 페이지 제작
- index.jsp 페이지 제작

<c:forEach items="${list}" var="todo" varStatus="stat">
1) 전송받은 값 list 를 하나씩 꺼내 todo 에 저장하고 그 외적인 정보는 stat 이름으로 받는다.
2) 전송 받을 때마다 반복문이 돌아가 c:forEach 안의 태그들이 list에 저장된 요소들을 tr 태그로 출력한다.
a 태그의 href="delete?idx=${stat.index}" 링크를 통해서도 데이터 전송이 가능하다. 이때 url에 전부 표시되는 건 get 방식이다.
colgroup 은 테이블의 크기를 지정해주는 태그이다.
- ListController 컨트롤러 제작


form 태그로 들어오는 url "/add" 는 post 방식으로 들어온다.
a 태그의 링크로 들어오는 "/delete" 는 get 방식으로 들어온다.
ArrayList 를 다루는 실질적인 처리 모델 클래스는 ListModel 을 만들어 준다.
doGet 메서드와 doPost 메서드의 중복은 메서드를 따로 빼서 작업이 가능하게 할 수 있다.
- ListModel 모델 제작

private static ArrayList<String> list = new ArrayList<String>(10);
1) static 으로 선언해줘야 입력할 때마다 새로 복사본(객체)이 생성되는 것을 방지할 수 있다. static은 원본(클래스)영역에서 변경되기 때문이다.
2) 여기서 지정한 갯수 10은 더 늘어날 수도 줄어들 수도 있다.
getList() 메서드는 list 객체를 불러오는 getter 메서드이다.
addList() 메서드는 ArrayList 에 입력한 todo 파라미터를 넣을 수 있다. 이때 ArrayList의 add(넣을 값) 메서드를 이용한다.
add(index,넣을 값) 을 사용할 수도 있다.
delList() 메서드는 ${stat.index} 파라미터를 넣어 해당 인덱스의 내용을 지울 수 있다. 이때 ArrayList의 remove(index) 메서드를 이용한다.
list.remove(index) : 지운값 반환
list.remove(value) : 지웠는지 여부 반환 ( true/false )
이라고 하지만 정작 ArrayList와 차이점은 없고 List 메서드 추가사용 정도이다.
- list.jsp 페이지 제작

여기서는 index.jsp 대신 list.jsp 페이지를 만들었다. 즉 web.xml 에서 찾아볼 수 없어 컨트롤러의 @WebServlet 를 찾도록 구현했다.
<c:if test="${list.size()==0}"> JSTL 태그를 이용하여 전송받은 list의 갯수가 0이면 할 일을 입력하라는 문구가 뜨게 하였다.
갯수가 0개가 아니면 입력한 todo와 그밖의 정보들이 나오도록 하였다.
수정 버튼을 클릭 시 발생하는 update() 함수를 통해 location.href 로 파라미터를 전달하였다.
- ListController 컨트롤러 제작

여기서는 doGet 메서드와 doPost 메서드를 dual(req,resp) 메서드에서 처리하도록 하였다.
req.setCharacterEncoding("UTF-8") 는 UnsupportedEncodingException 예외가 발생한다. (일반 예외)
여기서는 throws 를 통해 던져주었다.
( 예외를 받은 곳에서도 IOException 을 throws 하였기 때문에 UnsupportedEncodingException 가 상속하는 IOException 을 던졌다. )
dis.forward(req, resp) 는 ServletException 예외가 발생한다. (일반 예외)
마찬가지로 throws 를 통해 던져주었다.
if(addr.equals("/")) 에서 요청한 내용들을 forward 를 통해 던질 수 있도록 하였다.
그 외의 다른 조건들은 resp.sendRedirect(ctx) 로 컨택스트 경로를 넣어 URL Mapping이 "/" 로 이동하게 만들었다. 그러면 if(addr.equals("/")) 조건이 실행되어 요청한 내용들을 forward 를 통해 던진다.
이렇게 하면 URL 경로가 잘못설정되어 내용 삭제 후 새로고침으로 인해 생기는 오류들을 막을 수 있다.
- VectorModel 모델 제작

clearList() 메서드는 Vector 클래스 객체 list가 우선 비워졌는지 isEmpty()로 확인 후 비워지지 않았으면 clear() 메서드를 이용하여 전체 비우는 메서드이다.
setList() 메서드는 Vector 클래스의 set(index,수정할 값) 메서드를 이용하여 해당 인덱스의 값을 수정할 값으로 바꿔주는 메서드이다.
private static Vecter 로 백터 객체에 static 을 사용하는 이유는 Vector 에 List 를 누적하여 저장하기 위함이다.
만약 static 을 사용하지 않으면 메서드 호출시 매번 새로운 백터 객체를 생성하여 누적되지 않는다.
- index.jsp 페이지 제작

<c:forEach items="${list}" var="item"> 로 받아온 list 파라미터를 하나씩 item 에 담아 key와 value 값을 출력하도록 하였다.
<a href="remove?key=${item.key}"> 를 통해 "/remove" 가 넘어가면 key 파라미터의 값을 전송하도록 하였다.
- ScoreController 컨트롤러 제작

실질적인 처리모델 ScoreModel 을 통해 받은 파라미터 값을 처리하여 전송하도록 구현하였다.
이때 "/list" 에서 forward 를 통해 Request, Response 객체를 전송하도록 만들었다.
그래서 다른 조건에는 resp.sendRedirect(context경로+"/list") 로 이동하도록 유도하였다.
- ScoreModel 모델 제작


Map은 key-value 로 구성되어있기 때문에 타입도 2개를 받는다.
insert() 메서드를 만들어 데이터를 추가하도록 하였다.
이때 Map 은 Collection 인터페이스를 구현하지 않아서
add() 대신 put() 메서드를 이용한다.
( size() 메서드는 이름과 역할이 동일하다 )
데이터를 지울 때는 우선 map.get(key) 로 들어온 매개변수 key의 value 값이 있는지 확인하고 존재하면 map.remove(key) 로 key 를 지워준다.
데이터를 출력받는 방법은 다양하다

데이터 출력 방법 1) 모든 key 를 set 으로 가져와 iterator 을 하는 방법
이때 iter.next() 로 꺼내진 것을 변수 key 에 담고
map.get(key) 로 value 값을 가져와 변수 val 에 담는다.


데이터 출력 방법 2) key-value 한 쌍으로 map을 set 으로 가져와 iterator 을 하는 방법
이 때 제네릭은 <Entry<String, Integer>> 를 사용한다.
key-value 를 set 으로 바꾸는 메서드는 map.entrySet() 이다.
iter.next() 통해 넣은 값은 Entry<String, Integer> 타입의 entry 변수에 넣어준다.


데이터 출력 방법 3) JSTL 태그 이용
HashMap 객체 map 을 반환하여 "list" 파라미터에 넣어 보낸 뒤
c:forEach 태그로 반복문을 돌려 &{item.key} , &{item.value} 로
key 와 value 를 출력해준다.
출저 : https://mangkyu.tistory.com/51
출저 : https://kotlinworld.com/329
URL Mapping 은 서블릿을 동작시키기 위해서 실제 자바클래스명을 사용하는 대신 서블릿 요청을 위한 문자열을 서블릿 클래스와 매핑시키는 것을 말한다. 즉, 보안을 위해 해당 값이 다른 값을 가리키도록 하여 실제 서블릿 클래스를 공개하지 않도록 하는 것이다.
URL Mapping 없이 서블릿 호출은 불가능하다.
데이터를 담는 자바 파일(클래스)은 private 로 필드를 지정해야 한다.