레아Leah 2021. 7. 2. 09:50
반응형

pom.xml 설정 

더보기
<!-- Servlet & JSP & JSTL -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

 

<흐름 읽기>

 

DB에 연결하는 부분

 

이 부분을 수정할 거에요

 

GuestbookMapper를 가져오고, 이것을 받아야 한다. 

=> GuestbookMapper mapper = session.getMapper(GuestbookMapper.class);

 

 

guestbookMapper.xml 수정 

select을 넣어주세요, 

 

 

 

컨트롤러에서 뷰단으로 데이터를 보내고 싶은 경우(=출력하고 싶은 경우)에는 모델을 사용해주세요. 

 

모델에 리스트

웹 화면에 위에처럼 보여야 한다.

 

화면이 보이지 않는다. 

 

 

첫화면으로 갔다가 방명록으로 가야 데이터가 출력된다. 

 

 

1) 글 등록 후 list로 가면 방금 쓴 글이 보이지 않는 것이 문제! 

-> 첫화면에서 list로 이동해야만 보인다. 이것을 해결해보자. 

 

 

해서는 안되는 것

다시 select을 하는 것과, 메소드 write에서 메소드 list를 호출하는 것은 뷰에서만 가능하다.

(콘트롤러에서는 불가, requestMapping이 붙어있는 것은 호출할 수 없다.)

 

 

해결방법 redirect(브라우저한테 재요청을 하도록 함) 

return과 다름(forward) : 처리한 결과를 가지고 그대로 view단으로 가는 것

 

return "redirect:JSP명;" 

 

 

return "redirect:list";를 사용하면 막바로 출력되는 것이 아니라 재호출되고 출력된다. 

 

요청하지 않은 list가 뜸 

return "writeForm";는 writeForm.jsp를 의미하지만 

return "redirect:list";는 jsp가 아니라 브라우저에 재요청을 하는 것이다. 

 

return "redirect:list;";

 

클라이언트에서 서버로 데이터를 보낼 때는 파라미터로 

서버에서 클라이언트로 보낼 때는 모델로! 

 

이렇게 하면 비밀번호까지 다 가져오게 된다.

 

guestbookMapper.xml 수정해주기 

 

 

  <%@ taglib %>

태그라이브러리: 태그 지시자

 

"글쓰기" 버튼을 누르면 onclick을 통해 "location.href='write';"

write로 이동! 

 

 

c:if, c:forEach를 이용하기 위해서는 태그라이브러리를 사용해야한다. 

 

 

[2교시]

 

<c:forEach>는 List, 배열 요소를 순서대로 반복해서 처리할 수 있는 태그

[참고] https://offbyone.tistory.com/368

 

JSTL - , 태그 사용법

는 List, 배열 요소를 순서대로 반복해서 처리할 수 있는 태그 입니다. 1. 이름 목록을 가진 ArrayList를 출력하는 예제 입니다. // 리스트를 만들어서 모델에 넣습니다. List nameList = new ArrayList (Arrays.a.

offbyone.tistory.com

 

 

 

var는 웹 화면에서 사용될 변수를 의미하며, items=${}는 컨트롤러 모델에 담겨있는 키를 넣는다. 

 

실행하면

 

-------> 이렇게 가는 것임 

 

 

출력결과가 이렇게 나온다. 

<table>위의 ${list}는 삭제해도 된다. 

 

 

<c:forEach>를 사용하기 위해서는  <%@ taglib%>가 상단에 있어야 한다. 

 

이렇게 사용하지는 않지만

<input type="button" value="삭제" onclick="del();">는 del()함수 호출 

 

삭제 버튼을 누를 시 어떤 애를 삭제할지 알려줘야한다. 

이때 유일한 값은 guestbooknum 

 

<input type="password" id="pwd${guestbook.guestbooknum}"> <= 이렇게 하면 유일한 값 

 

 

위와 같이 수정함으로써 del() 함수는 파라미터를 가진다. 

onclick = "del()${guestbook.guestbooknum})"

 

 

어렵다.................... 

(210908 복습중ㅋㅋㅋ 안어렵네 왜 어려워했지? ㅋㅋㅋ)

 

 

브라우저상에서는 안보이게 hidden

 

 

동적이기 때문에 소스코드에서는 확인할 수 없고, 개발자모드로 확인해야 한다. 

 

 

 

[3교시]

이것들은 값을 가져오는 것이 아니라 꽂을 용도

let delForm = document.getElementById("deleForm");
let pwd = document.getElementById("pwd" + num).value; //비밀번호를 담을 변수 
let guestbooknum = document.getElementById("guestbooknum");

 

 

 

 

 

지우고 다시 list 로 오는지

글번호와 비밀번호만 알면 글을 삭제할 수 있다.

 

 

메소드명이 아이디가 되고, 

 

오류없이 동작하는지 확인! 

 

이퀄의 오른쪽에 있으면 

이퀄의 왼쪽에 있으면 지울려고 하는 정보를 집어넣는 것 

 

for문이 어렵다면, 이퀄의 오른쪽에 있는 것이 items

 

<td>${guestbook.guestbooknum}</td>가 getter와 동일한 역할을 한다.

 

<c:forEach var="guestbook" items="${list}">에서 <td>${guestbook.guestbooknum}</td>가 getter의 역할을 해 값을 가져온다. 

 

 

 

redirect와 forward의 차이를 구분하기! 

forwarding은 모델을 쓸 수있지만 redirect는 브라우저에 재요청하는 것이기떄문에 모델을 쓰는 의미가 없다.

반응형