포스트

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 라이센스를 따릅니다.