일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- conda 가상환경 설정 오류
- 려려
- time wait port kill
- 실행중인 포트 죽이기
- conda 기초 설정
- conda base 활성화
- 3000 port kill
- window netstat time wait 제거
- conda base 기본 설정
- Today
- Total
모도리는 공부중
21.01.20. JSP&Servlet - 메세지 개별 삭제, FrontController 구현 본문
21.01.20. JSP&Servlet - 메세지 개별 삭제, FrontController 구현
공부하는 모도리 2021. 1. 20. 12:00지금은 메세지가 쌓이면 계속 아래로 길어지는 상태이므로 이걸 다르게 보이고 싶다면 페이징 기법을 직접 공부해서 넣어보도록 합시다.
기능 작동이 잘하는지 체크.
그리고 전체삭제버튼까지 잘 먹히고 있다.
오늘은 개별삭제 기능을 위해 5개정도 만들고 시작합니다.
반복문을 돌면서 삭제하는 라인으로 이동.
<% for (int i = 0; i < list.size(); i++) { %>
<tr>
<td><%= i+1 %></td>
<td><%= list.get(i).getSend_name() %></td>
<td><%= list.get(i).getContent() %></td>
<td><%= list.get(i).getDay() %></td>
<td>
<a href="RemoveOneMessageService">삭제</a>
</td>
</tr>
<% } %>
개별삭제를 위해 a태그를 이용해 새로운 서블릿을 만들어 하이퍼링크를 걸 수 있도록 해준다.
삭제하게 만들 조건을 어떻게 걸 것인가, 그게 중요하다. 잘못 선택하면 엄한 다른 메세지가 삭제되는 문제를 일으킬 수 있다. 그럼 뭐가 좋을까? 우리는 이미 설정해놓은 녀석이 있다. 바로 시퀀스 넘버.
list.get(i)번째에 있는 getNum을 찾아서 넘겨줘야 한다. 우리가 맨 처음 배웠던 get방식을 이용하는 것이다.
<a href="RemoveOneMessageService?num=<%= list.get(i).getNum() %>">삭제</a>
저장 후 새로고침해서 확인해보면 각 삭제별로 밑줄이 쳐져있고
개발자도구를 확인하면 각 삭제마다 고유번호가 새겨진 것을 확인할 수 있다.
그럼 이 고유번호를 이용해서 우리는 개별삭제서블릿을 만들어보도록 합시다.
package com.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 com.model.MessageDAO;
@WebServlet("/RemoveOneMessageService")
public class RemoveOneMessageService extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int num = Integer.parseInt(request.getParameter("num"));
// 각 삭제별로 고유번호가 넘어오므로 String형 숫자를 int형으로 변환해준다.
MessageDAO dao = new MessageDAO();
int cnt = dao.removeOne(num);
if (cnt > 0) {
System.out.println("메세지 개별 삭제 성공");
} else {
System.out.println("메세지 개별 삭제 실패");
}
response.sendRedirect("main.jsp#two");
}
}
고유번호를 이용해서 db에 저장된 메세지를 지우는 코드 작성.
public int removeOne(int num) {
int cnt = 0;
getConnection();
String sql = "delete from web_message where num=?";
try {
psmt = conn.prepareStatement(sql);
psmt.setInt(1, num);
cnt = psmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close();
}
return cnt;
}
잘 삭제된 것을 확인할 수 있다.
각각의 클래스에서 입력한 것은 server를 통해 각각의 servlet으로 이동한다. servlet이 따로 생성되어있다보니 이것이 늘어나면 늘어날수록 컴퓨터는 무거워진다. 특히 servlet은 더 많이 무겁게 만들 것이다. 왜?
servlet은 HttpServlet을 상속받는다. 이것 안에는 파란색으로 적힌 것들(get, post 등등등)이 담겨있는데 그만큼 무겁다는것을 의미한다. servlet이 많으면 많아질수록 컴퓨터에 차지하는 용량이 커진다. 해결방법은 무엇이 있을까?
Front Controller로 한 번에 받아서 처리해준다. 로그인은 Loginservice, 회원가입은 JoinService를 요청한다. 어떤 url을 요청하든 모두 Front Controller로 넘어가게 하는 약속을 만드는데 이름에 *.do를 이용한다.
이 부분에 대한 실습을 위해 src에 또 폴더를 만들어서 진행해봅시다.
package com.front;
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;
@WebServlet("/FrontController")
public class FrontController extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("프론트컨트롤러 호출완료");
}
}
테스트 삼아 실행.
현재 문제는 FrontController를 입력해줘야만 여기로 넘어올 수 있는 상태이다. 우리는 어떤 url을 입력들어오든 전부 여기로 옮겨오게 할 것이므로 바꿔주자.
@WebServlet(".do")
어떤것을 입력하든 다 여기로 넘어오도록,
@WebServlet("*.do")
*를 추가해준다.
.do로만 끝나면 프론트컨트롤러로 넘어오도록 설정이 끝났다. 이제 url뒤가 .do로 끝나게 입력되었다면 모두 이 서블릿으로 넘어오게 될 것이다.
해당 라인으로 이동해서
회원가입과 로그인 모두 .do를 붙여서 frontcontroller로 넘어가게 만든다.
<form action="LoginService.do" method="post"> <!--여긴 로그인 액션-->
<form action="JoinService.do" method="post"> <!--이건 회원가입 액션-->
package com.front;
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;
@WebServlet("*.do")
public class FrontController extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("프론트컨트롤러 호출완료");
// 사용자가 요청한 전체 URI → /MessageSystem/*.do
String requestURI = request.getRequestURI();
System.out.println(requestURI);
}
}
사용자가 어디서 이곳으로 넘어왔는지 확인해주는 requestURI를 이용해서 잘 넘어오는지 확인.
String path = request.getContextPath();
System.out.println(path);
String resultURL = requestURI.substring(path.length()+1);
// /MessageSystem과 *앞에 있는/를 날리기 위해 +1
System.out.println(resultURL);
이제 여기에서 각각의 기능이 구현되도록 만들어줍시다. 우리가 이미 만들어놓은 JoinService에 있는 코드를 그대로 복사해서 FrontController에 작성해놓은 코드 하단에 if문을 추가하여 해당 코드를 붙여넣기해준다.
if (resultURL.equals("JoinService.do")) {
// 회원가입
request.setCharacterEncoding("EUC-KR");
String email = request.getParameter("email");
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
MemberDTO dto = new MemberDTO(email, pw, tel, address);
MemberDAO dao = new MemberDAO();
int cnt = dao.join(dto);
if (cnt > 0) {
System.out.println("회원가입 성공");
} else {
System.out.println("회원가입 실패");
}
response.sendRedirect("main.jsp");
}
결과 :
DB에도 잘 삽입되어 회원가입이 성공한 것을 확인할 수 있다.
로그인서비스도 마찬가지로 만듭니다.
} else if (resultURL.equals("LoginService.do")) {
// 로그인
String email = request.getParameter("email");
String pw = request.getParameter("pw");
MemberDTO dto = new MemberDTO(email, pw);
MemberDAO dao = new MemberDAO();
MemberDTO info = dao.login(dto);
if (info != null) {
System.out.println("로그인 성공");
HttpSession session = request.getSession();
session.setAttribute("info", info);
} else {
System.out.println("로그인 실패");
}
response.sendRedirect("main.jsp");
}
로그인도 잘 진행되는지 확인.
문제없이 진행된다면 LoginService와 JoinService 서블릿은 이제 필요가 없으니 지워주도록 합시다.
회원정보수정도 이어서 진행합니다.
<form action="UpdateService.do" method="post">
FrontController로 돌아와서 UpdateService에 있는 코드를 복붙해준다.
} else if (resultURL.equals("UpdateService.do")) {
// 회원정보 수정
request.setCharacterEncoding("EUC-KR");
HttpSession session = request.getSession();
MemberDTO info = (MemberDTO) session.getAttribute("info");
String email = info.getEmail();
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
MemberDTO dto = new MemberDTO(email, pw, tel, address);
MemberDAO dao = new MemberDAO();
int cnt = dao.update(dto);
if (cnt > 0) {
System.out.println("회원정보수정 성공");
session.setAttribute("info", dto);
response.sendRedirect("main.jsp");
} else {
System.out.println("회원정보수정 실패");
response.sendRedirect("update.jps");
}
}
수정 잘 되는지 확인.
웹페이지 배너에도 문제없이 수정된 정보가 나오는 것을 확인할 수 있다.
이제 마지막 남은 로그아웃까지 구현해주도록 합시다.
main.jsp 코드 변경 (.do 추가)
<!-- Header -->
<header id="header" class="alt">
<a href="index.html" class="logo"><strong>Forty</strong> <span>by HTML5 UP</span></a>
<nav>
<% if (info == null) { %>
<a href="#menu">로그인</a>
<% } else { %>
<a href="LogoutService.do">로그아웃</a>
<a href="update.jsp">회원정보수정</a>
<% } %>
<!-- 로그인 후 Logout.jsp로 이동할 수 있는 -->
</nav>
</header>
LogoutService에 있는 코드 복붙 후 잘 삭제되었다는 것을 FrontController 콘솔창에서 확인할 수 있도록 syso코드 입력.
} else if (resultURL.equals("LogoutService.do")) {
// 로그아웃
HttpSession session = request.getSession();
session.removeAttribute("info");
System.out.println("로그아웃 완료");
response.sendRedirect("main.jsp");
}
서버를 재시작해서 로그인 후 로그아웃까지 진행해보면
로그아웃이 정상적으로 되면서 콘솔창에도 출력되는 것을 확인해볼 수 있다.
그럼 오늘 수업을 진행하면서 작성한 FrontController 코드를 전체 불러와서 확인해봅시다.
package com.front;
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 javax.servlet.http.HttpSession;
import com.model.MemberDAO;
import com.model.MemberDTO;
@WebServlet("*.do")
public class FrontController extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("프론트컨트롤러 호출완료");
// 사용자가 요청한 전체 URI → /MessageSystem/*.do
String requestURI = request.getRequestURI(); //클라이언트가 요청한 경로
System.out.println(requestURI);
String path = request.getContextPath(); //프로젝트이름만 잘라내기
System.out.println(path);
String resultURL = requestURI.substring(path.length()+1); // /MessageSystem과 *앞에 있는/를 날리기 위해 +1
System.out.println(resultURL);
if (resultURL.equals("JoinService.do")) {
// 회원가입
request.setCharacterEncoding("EUC-KR");
String email = request.getParameter("email");
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
MemberDTO dto = new MemberDTO(email, pw, tel, address);
MemberDAO dao = new MemberDAO();
int cnt = dao.join(dto);
if (cnt > 0) {
System.out.println("회원가입 성공");
} else {
System.out.println("회원가입 실패");
}
response.sendRedirect("main.jsp");
} else if (resultURL.equals("LoginService.do")) {
// 로그인
String email = request.getParameter("email");
String pw = request.getParameter("pw");
MemberDTO dto = new MemberDTO(email, pw);
MemberDAO dao = new MemberDAO();
MemberDTO info = dao.login(dto);
if (info != null) {
System.out.println("로그인 성공");
HttpSession session = request.getSession();
session.setAttribute("info", info);
} else {
System.out.println("로그인 실패");
}
response.sendRedirect("main.jsp");
} else if (resultURL.equals("UpdateService.do")) {
// 회원정보 수정
request.setCharacterEncoding("EUC-KR");
HttpSession session = request.getSession();
MemberDTO info = (MemberDTO) session.getAttribute("info");
String email = info.getEmail();
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
String address = request.getParameter("address");
MemberDTO dto = new MemberDTO(email, pw, tel, address);
MemberDAO dao = new MemberDAO();
int cnt = dao.update(dto);
if (cnt > 0) {
System.out.println("회원정보수정 성공");
session.setAttribute("info", dto);
response.sendRedirect("main.jsp");
} else {
System.out.println("회원정보수정 실패");
response.sendRedirect("update.jps");
}
} else if (resultURL.equals("LogoutService.do")) {
// 로그아웃
HttpSession session = request.getSession();
session.removeAttribute("info");
System.out.println("로그아웃 완료");
response.sendRedirect("main.jsp");
}
}
}
메세지 삽입, 메세지 전체삭제, 메세지 개별삭제는 숙제입니다. 여러분이 직접 구현해보세요.
'K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12 > JAVA' 카테고리의 다른 글
21.03.03. SPRING - (0) | 2021.03.03 |
---|---|
21.03.02. SPRING - (0) | 2021.03.02 |
21.01.19. JSP & Servlet - 메세지 전체삭제 (0) | 2021.01.19 |
21.01.18. JSP & Servlet - 회원정보수정, 메세지시스템 (0) | 2021.01.18 |
21.01.15. JSP & Servlet - 로그인시스템, 배너, 섹션, 회원정보수정 (0) | 2021.01.18 |