Day66 실습프로젝트(Servlet)
Servlet
UpdateServlet 만들기
- 웹브라우저에서 상세조회 View 단계에서 수정 버튼을 만든다.
viewServlet 수정하기
- 기존 단순 조회 태그에서 변경가능한 form태그로 변환한다.
1 2 3 4 5 6 7 8 9
out.println("<form action='/board/update'>"); out.printf(" 번호: <input readonly name='no' type='text' value='%d'><br>\n", board.getNo()); out.printf(" 제목: <input name='title' type='text' value='%s'><br>\n", board.getTitle()); out.printf(" 내용: <textarea name='content'>%s</textarea><br>\n", board.getContent()); out.printf(" 작성일: <input readonly type='text' value='%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS'><br>\n", board.getCreatedDate()); out.printf(" 조회수: <input readonly type='text' value='%d'><br>\n", board.getViewCount()); out.printf(" 작성자: <input readonly type='text' value='%s'><br>\n", board.getWriter().getName()); out.println(" <button>변경</button>"); out.println("</form>");
UserUpdateServlet 만들기
- user 정보를 파라미터로 받아와 새로운 유저객체를 만든다.
userDao.update(user)로 SQL server에 변경을 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13
User user = new User(); user.setNo(Integer.parseInt(req.getParameter("no"))); user.setName(req.getParameter("name")); user.setEmail(req.getParameter("email")); user.setPassword(req.getParameter("password")); user.setTel(req.getParameter("tel")); if (userDao.update(user)) { sqlSessionFactory.openSession(false).commit(); out.println("<p>변경 했습니다.</p>"); } else { out.println("<p>없는 회원입니다.</p>"); }
ProjectUpdateServlet 만들기
- project member를 확인하는 메서드를 만들고
ViewServlet에서 참여한 멤버에 대한 체크박스를 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
private boolean isMember(List<User> members, User user) { for (User member : members) { if (member.getNo() == user.getNo()) { return true; } } return false; } //service메서드 out.println(" <ul>"); List<User> users = userDao.list(); for (User user : users) { out.printf(" <li><input %s name='member' value='%d' type='checkbox'> %s</li>\n", isMember(project.getMembers(), user) ? "checked" : "", user.getNo(), user.getName()); } out.println(" </ul>");
project 정보를 받아와서 새로운 project객체를 만든다
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
Project project = new Project(); project.setNo(Integer.parseInt(req.getParameter("no"))); project.setTitle(req.getParameter("title")); project.setDescription(req.getParameter("description")); project.setStartDate(Date.valueOf(req.getParameter("startDate"))); project.setEndDate(Date.valueOf(req.getParameter("endDate"))); String[] memberNos = req.getParameterValues("member"); if (memberNos != null) { ArrayList<User> members = new ArrayList<>(); for (String memberNo : memberNos) { members.add(new User(Integer.parseInt(memberNo))); } project.setMembers(members); } if (!projectDao.update(project)) { out.println("<p>없는 프로젝트입니다.</p>"); out.println("</body>"); out.println("</html>"); return; } projectDao.deleteMembers(project.getNo()); if (project.getMembers() != null && project.getMembers().size() > 0) { projectDao.insertMembers(project.getNo(), project.getMembers()); } sqlSessionFactory.openSession(false).commit(); out.println("<p>변경 했습니다.</p>");
BoardUpdateServlet 만들기
- Board는 작성일과 작성자의 정보에 대해 추가적인 검증이 필요하다.
boardDao.update(user)로 SQL server에 변경을 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
User loginUser = (User) ((HttpServletRequest) req).getSession().getAttribute("loginUser"); int boardNo = Integer.parseInt(req.getParameter("no")); Board board = boardDao.findBy(boardNo); if (board == null) { out.println("<p>없는 게시글입니다.</p>"); out.println("</body>"); out.println("</html>"); return; } else if (loginUser == null || loginUser.getNo() > 10 && board.getWriter().getNo() != loginUser.getNo()) { out.println("<p>변경 권한이 없습니다.</p>"); out.println("</body>"); out.println("</html>"); return; } board.setTitle(req.getParameter("title")); board.setContent(req.getParameter("content")); boardDao.update(board); sqlSessionFactory.openSession(false).commit(); out.println("<p>변경 했습니다.</p>");
DeleteServlet 만들기
- 기존의 form태그에 버튼을 추가한다.
- type=’button’을 명시하여 submit 기능을 제거하고 다른 동작을 하게 할 수 있다.
onclick으로 버튼 클릭 시 해동을 추가 할 수 있다. location.href는 클릭시 이동할 url을 가르킨다.
1
out.printf("<button type='button' onclick='location.href=\"/project/delete?no=%d\"'>삭제</button>\n", project.getNo());
파라미터로 받은 no로 SQL서버에 Dao.delete를 수행한다.
1 2 3 4 5 6 7 8 9
int projectNo = Integer.parseInt(req.getParameter("no")); projectDao.deleteMembers(projectNo); if (projectDao.delete(projectNo)) { sqlSessionFactory.openSession(false).commit(); out.println("<p>삭제 했습니다.</p>"); } else { out.println("<p>없는 프로젝트입니다.</p>"); }
HeaderServlet 만들기
- 중복된 코드 head를 servlet클래스로 만든다.
- req.getRequestDispatcher(“/header”).include(req, res)을 통해서 HeaderServlet을 불러온다.
((HttpServletResponse) res).setHeader(“Refresh”, “1;url=/project/list”) 이 필요한 부분은 추가한다.
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 32 33 34 35 36
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println(" <meta charset='UTF-8'>"); out.println(" <title>Title</title>"); out.println(" <link href='/css/common.css' rel='stylesheet'>"); out.println("</head>"); out.println("<body>"); out.println("<header>"); out.println(" <a href='/'><img src='/images/home.png'></a>"); out.println(" <h1>프로젝트 관리 시스템</h1>"); out.println(" <nav>"); out.println(" <ul>"); out.println(" <li class='btn btn-default'><a href='/user/list'>회원</a></li>"); out.println(" <li class='btn btn-default'><a href='/project/list'>프로젝트</a></li>"); out.println(" <li class='btn btn-default'><a href='/board/list'>게시글</a></li>"); out.println(" </ul>"); out.println(" </nav>"); User loginUser = (User) ((HttpServletRequest) req).getSession().getAttribute("loginUser"); out.println(" <div class='login-state pos-right'>"); if (loginUser == null) { out.println(" <a href='/auth/form' class='btn btn-primary'>로그인</a>"); } else { out.printf(" <a href='/user/view?no=%d' class='btn btn-light'>%s</a>\n", loginUser.getNo(), loginUser.getName()); out.println(" <a href='/auth/logout' class='btn btn-secondary'>로그아웃</a>"); } out.println(" </div>"); out.println("</header>"); }
동적으로 HTML관리하기
form.html 수정
기존의 정적인 form.html을 동적인 form으로 생성한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
@WebServlet("/user/form") public class UserFormServlet extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("text/html;charset=UTF-8"); PrintWriter out = res.getWriter(); req.getRequestDispatcher("/header").include(req, res); out.println("<h1>회원 등록</h1>"); out.println("<form action='/user/add'>"); out.println(" 이름: <input name='name' type='text'><br>"); out.println(" 이메일: <input name='email' type='email'><br>"); out.println(" 암호: <input name='password' type='password'><br>"); out.println(" 연락처: <input name='tel' type='tel'><br>"); out.println(" <input type='submit' value='등록'>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); } }
index.html 수정
index.html을 HomeServlet으로 변환한다.
1 2 3 4 5 6 7 8 9 10 11 12 13
@Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("text/html;charset=UTF-8"); PrintWriter out = res.getWriter(); req.getRequestDispatcher("/header").include(req, res); out.println("<h1>환영합니다!</h1>"); out.println("<p>이 사이트는 팀 프로젝트를 관리하는 서비스를 제공합니다.</p>"); out.println("</body>"); out.println("</html>"); }
LoginOutServlet만들기
- Session을 초기화 한다.
sendRedirectd을 통해 기존 버퍼에 있던 res을 삭제하고 버퍼에 새롭게 답고 리턴한다.
1 2 3 4 5 6 7 8 9 10
@WebServlet("/auth/logout") public class LogoutServlet extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { ((HttpServletRequest) req).getSession().invalidate(); ((HttpServletResponse) res).sendRedirect("/"); } }
쓰레드풀 관리하기
쓰레드 풀의 개념
쓰레드 풀의 활용
쓰레드 풀에 추가하기
쓰레드 풀에 제거하기
HTTP 메서드 | 기능 | 특징 | 멱등성 | 안전성 |
---|---|---|---|---|
GET | 서버에서 데이터를 조회 | URL의 쿼리 스트링에 데이터를 포함하여 전송, 서버에서 리소스를 가져와 표시 | 멱등적 | 안전 |
POST | 서버에 데이터를 전송하여 처리 (리소스 생성) | 요청 본문에 데이터를 포함하여 전송, 리소스를 생성하거나 서버 상태 변경 | 비멱등 | 비안전 |
HEAD | 서버에서 응답 헤더만 확인 | GET과 동일하지만 본문은 반환하지 않음 | 멱등적 | 안전 |
PUT | 서버에 데이터를 업로드하거나 리소스를 갱신 | 리소스를 생성하거나 대체, 리소스가 존재하지 않으면 새로 생성함 | 멱등적 | 비안전 |
DELETE | 서버에서 특정 리소스를 삭제 | 리소스를 삭제하지만 삭제가 보장되지는 않음 | 멱등적 | 비안전 |
OPTIONS | 서버가 지원하는 메서드 목록을 확인 | 서버에서 사용할 수 있는 HTTP 메서드와 통신 옵션을 확인할 때 사용 | 멱등적 | 안전 |
TRACE | 요청 경로 추적 (디버깅 목적) | 서버가 받은 요청을 그대로 응답으로 반환, 주로 디버깅에 사용됨 | 멱등적 | 안전 |
CONNECT | 서버와 클라이언트 간에 터널링 설정 (주로 HTTPS) | 클라이언트와 서버 간의 SSL 터널링을 설정하여 보안 연결을 위한 터널을 생성 | 비멱등 | 비안전 |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.