본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 63일차 (2023-08-22) 자바 프로그래밍_62. forward/include/refresh/redirect 다루기_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 8. 23.
## 62. forward/include/refresh/redirect 다루기

- 오류 메시지 출력에 forward 및 refresh 사용하기
- 상단 메뉴 및 하단 정보 출력에 include 사용하기
- 등록 완료 후 목록 페이지로 이동할 때 redirect 사용하기

 

ㄴ /Users/사용자명/git/bitcamp-study/report/app-60-server/src/main/java/bitcamp/report/handler/BoardFormServlet.java 파일 복사

=>

ㄴ 복사한 파일 인텔리제이에 붙여넣기

 

BoardListServlet.java

ㄴ form.jsp -> form 으로 변경

=>

ㄴ BoardFormServlet.java 파일 복사

=>

ㄴ 복사한 파일을 같은 위치에 HeaderServlet 이라는 이름으로 붙여넣기

=>

HeaderServlet.java

ㄴ url 패턴을 header 로 설정하기

=>

HeaderServlet.java

ㄴ 해당 코드들 제거

=>

HeaderServlet.java

ㄴ <div> 태그 추가

=>

HeaderServlet.java

ㄴ 상단 메뉴 만들기

=>

네이버 클라우드 로고 가져오기

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

=>

ㄴ [F12] 혹은 [option] + [command] + [i] 을 이용하여 개발자 도구 열기

ㄴ Elements 탭 선택

=>

ㄴ 해당 키 선택한 후 네이버 클라우드 로고 선택

=>

ㄴ 우측에서 로고 링크 찾기

=>

ㄴ 해당 이미지 링크 복사하기

=>

HeaderServlet.java

ㄴ 복사한 이미지 링크를 <img> 태그에 붙여넣기

=>

HeaderServlet.java

ㄴ 나머지 메뉴들도 링크 추가해주기

=>

HeaderServlet.java

ㄴ <div> 태그와 <img> 태그에 style 추가해주기

=>

ㄴ App 실행

=>

=>

HeaderServlet.java

ㄴ 배경색 변경하기

=>

 

BoardListServlet.java

ㄴ 웹 브라우저에서 /header URL로 요청이 들어왔을 때 RequestDispatcher를 사용하여 다른 서블릿 또는 JSP로 제어를 전달 가능하도록 함

ㄴ inclue 메서드는 현재 서블릿의 출력을 유지한 채로 다른 리소스의 출력을 포함시킴

    ㄴ 즉, 다른 리소스에서 출력한 내용이 현재 서블릿의 출력에 이어서 클라이언트로 전송됨

=>

BoardListServlet.java

ㄴ 변수 선언할 필요 없이 직접 대입

 

 

ㄴ HeaderServlet 을 복사하여 같은 위치에 FooterServlet 이라는 이름으로 붙여넣기

=>

FooterServlet.java

ㄴ 경로 footer 로 변경해주기

=>

FooterServlet.java

ㄴ <p> 태그 문구 및 style 추가

ㄴ <address> 태그 문구 및 style 추가

=>

ㄴ App 실행

=>

=>

FooterServlet.java

ㄴ <div> 태그에 style 추가

    ㄴ text-align:center => 가운데 정렬

=>

=>

FooterServlet.java

ㄴ background-color => 배경색

ㄴ color =>  글씨 색

ㄴ padding => 내부 여백(요소의 경계(border)와 내용(content) 사이의 공간)

ㄴ margin => 외부 여백(요소의 외부 여백)

=>

 

BoardListServlet.java

ㄴ FooterServlet 의 출력 결과를 합치도록 함

=>

ㄴ board 의 목록 출력 시 header 와 footer 가 함께 출력됨을 확인

=>

=>

ㄴ header 와 footer 출력이 포함되어 실행됨을 확인

 

BoardDetailServlet.java

ㄴ header 와 footer 포함하여 출력하도록 설정해주기

 

BoardFormServlet.java

ㄴ header 와 footer 포함하여 출력하도록 설정해주기

=>

=>

=>

ㄴ 글 목록에 header 와 footer 가 적용됨을 확인

ㄴ [새 글] 선택

=>

ㄴ 글 입력 폼에도 header 와 footer 가 적용됨을 확인

=>

ㄴ 글 입력 및 파일 선택 후 [등록] 선택

=>

ㄴ 등록 성공되어 목록에 출력됨

=>

ㄴ 글 상세보기에도 header 와 footer 가 적용됨을 확인

 

 

forward 를 잘못 사용한 경우

ㄴ out.println("<p>등록 성공입니다!</p>"); 대신 forward 코드 추가해주기

=>

=>

ㄴ 해당 오류가 발생하는 이유는 요청을 POST 로 했는데 header 와 footer 에는 doPost 메서드가 선언되어있지 않기 때문

=>

FooterServlet.java

ㄴ doPost 메서드 추가해주는 방법 이용

 

headerServlet.java

ㄴ service 메서드는 doGet, doPost 모두 받을 수 있으므로 doGet 대신 service 로 변경해주기

 

BoardAddServlet.java

ㄴ /board/list 경로에 category 를 추가해주기

 

BoardListServlet.java

ㄴ doGet 메서드 대신 service 메서드로 변경해주기

=>

ㄴ App 재실행

=>

=>

=>

ㄴ [새 글] 선택

=>

ㄴ 글 입력 후 [등록] 선택

=>

ㄴ forward 로 할 경우 새 글이 정상적으로 등록되지만 url 경로가 add 로 되는 문제가 발생!

 

 

BoardAddServlet.java

ㄴ sendRedirect 를 이용하도록 하자

=>

ㄴ 글 입력 후 [등록] 선택

=>

ㄴ 새로운 글이 정상적으로 등록되며, url 도 정상적으로 이동됨

=>

=>

=>

BoardAddServlet.java

ㄴ 해당 코드는 제거해도 됨 (아래와 같은 기능이므로)
=>

BoardAddServlet.java

ㄴ setHeader 를 이용해 리프레시

ㄴ 1초 뒤 list 로 이동하도록 함

=>

ㄴ 255자 이상의 제목을 넣어 오류 발생 시키도록 함

=>

ㄴ 1초 뒤 목록으로 이동됨을 확인

 

 

BoardAddServlet.java

ㄴ BoardAddServlet 에도 header 와 footer 적용해주기

=>

ㄴ App 재실행

=>

 

 

 

ㄴ BoardAddServlet.java 파일을 복사하여 같은 위치에 ErrorServlet 라는 이름으로 붙여넣기

 

 

BoardListServlet.java

ㄴ service => doGet 메서드로 변경

 

ErrorServlet.java

ㄴ @WebServlet 애노테이션에 경로를 /error 로 변경

=>

ErrorServlet.java

ㄴ @MultipartConfig 애노테이션은 필요 없으므로 제거
=>

ErrorServlet.java

ㄴ doPost 대신 service 로 변경해주기

=>

ErrorServlet.java

ㄴ 해당 코드 제거

=>

ErrorServlet.java

ㄴ 해당 코드 제거

=>

ErrorServlet.java

ㄴ 해당 코드 추가

=>

ErrorServlet.java

ㄴ 해당 코드 제거

=>

ErrorServlet.java

ㄴ 해당 코드 제거

=>

ErrorServlet.java

ㄴ 해당 코드 추가

 

BoardAddServlet.java

ㄴ 해당 코드 제거

=>

BoardAddServlet.java

ㄴ 해당 코드 제거

=>

BoardAddServlet.java

ㄴ 해당 코드 추가

ㄴ forward 이용하기

=>

BoardAddServlet.java

ㄴ rollback 기능 추가

=>

BoardAddServlet.java

ㄴ 해당 코드 제거

=>

BoardAddServlet.java

ㄴ 해당 코드 제거

=>

ㄴ 제목을 255자 이상으로 입력하여 오류 발생 시키기

=>

 

BoardAddServlet.java

ㄴ 해당 코드 추가

    ㄴ request 객체에 "error" 속성을 설정하여 에러 정보를 저장

    ㄴ request 객체에 "message" 속성을 설정하여 오류 메시지를 저장

    ㄴ request 객체에 "refresh" 속성을 설정하여 리프레시 링크를 저장

 

 

ErrorServlet.java

ㄴ 넘어온 message 값이 null 이라면 해당 메시지를 출력하도록 함

 

 

BoardAddServlet.java

ㄴ 게시글 등록 오류가 발생할 경우 2초 뒤에 list 로 이동하도록 함

=>

ErrorServlet.java

ㄴ message 대신 refresh 이용하기

    ㄴ 서버에서 클라이언트로 응답을 보낼 때 HTTP 헤더 중 하나인 "Refresh" 헤더를 설정하는 부분

    ㄴ 이 헤더는 브라우저에게 일정 시간마다 페이지를 리프레시하도록 요청하는 역할을 함

=>

새로운 글 등록 시도 (오류 발생 시키기)

=>

=>

BoardAddServlet.java

ㄴ /board/ 제거해주기

=>

BoardAddServlet.java

ㄴ / 제거해주기

=>

ㄴ 오류 발생 시 1초 뒤 정상적으로 list 로 이동함

=>

BoardAddServlet.java

ㄴ 해당 코드는 필요 없으므로 제거

     ㄴ 현재 클라우드 스토리지 서비스를 사용하여 파일 업로드 및 관리를 수행하고 있음

 

 

BoardAddServlet.java

ㄴ board.getCategory()를 request.getParameter("category") 로 변경해줌

 

 

BoardDeleteServlet.java

package bitcamp.report.handler;

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 bitcamp.report.vo.Board;
import bitcamp.report.vo.Member;

@WebServlet("/board/delete")
public class BoardDeleteServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Member loginUser = (Member) request.getSession().getAttribute("loginUser");
    if (loginUser == null) {
      response.sendRedirect("/auth/form.html");
      return;
    }

    int category = Integer.parseInt(request.getParameter("category"));

    Board b = new Board();
    b.setNo(Integer.parseInt(request.getParameter("no")));
    b.setWriter(loginUser);
    b.setCategory(category);

    try {
      if (InitServlet.boardDao.delete(b) == 0) {
        throw new Exception("해당 번호의 게시글이 없거나 삭제 권한이 없습니다.");
      } else {
        InitServlet.sqlSessionFactory.openSession(false).commit();
        response.sendRedirect("list?category=" + request.getParameter("category"));
      }

    } catch (Exception e) {
      InitServlet.sqlSessionFactory.openSession(false).rollback();

      request.setAttribute("error", e);
      request.setAttribute("message", e.getMessage());
      request.setAttribute("refresh", "2;url=list?category=" + request.getParameter("category"));

      request.getRequestDispatcher("/error").forward(request, response);
    }
  }

}

 

BoardUpdateServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import bitcamp.report.vo.AttachedFile;
import bitcamp.report.vo.Board;
import bitcamp.report.vo.Member;

@WebServlet("/board/update")
@MultipartConfig(maxFileSize = 1024 * 1024 * 10)
public class BoardUpdateServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Member loginUser = (Member) request.getSession().getAttribute("loginUser");
    if (loginUser == null) {
      response.sendRedirect("/auth/form.html");
      return;
    }

    try {
      Board board = new Board();
      board.setWriter(loginUser);
      board.setNo(Integer.parseInt(request.getParameter("no")));
      board.setTitle(request.getParameter("title"));
      board.setContent(request.getParameter("content"));
      board.setCategory(Integer.parseInt(request.getParameter("category")));

      String uploadDir = request.getServletContext().getRealPath("/upload/board/");
      ArrayList<AttachedFile> attachedFiles = new ArrayList<>();

      for (Part part : request.getParts()) {
        if (part.getName().equals("files") && part.getSize() > 0) {
          String filename = UUID.randomUUID().toString();
          part.write(uploadDir + filename);
          AttachedFile attachedFile = new AttachedFile();
          attachedFile.setFilePath(filename);
          attachedFiles.add(attachedFile);
        }
      }
      board.setAttachedFiles(attachedFiles);

      if (InitServlet.boardDao.update(board) == 0) {
        throw new Exception("게시글이 없거나 변경 권한이 없습니다.");
      } else {
        if (attachedFiles.size() > 0) {
          // 게시글을 정상적으로 변경했으면, 그 게시글의 첨부파일을 추가한다.
          int count = InitServlet.boardDao.insertFiles(board);
          System.out.println(count);
        }

        InitServlet.sqlSessionFactory.openSession(false).commit();
        response.sendRedirect("list?category=" + request.getParameter("category"));
      }

    } catch (Exception e) {
      InitServlet.sqlSessionFactory.openSession(false).rollback();

      request.setAttribute("error", e);
      request.setAttribute("message", e.getMessage());
      request.setAttribute("refresh", "2;url=list?category=" + request.getParameter("category"));

      request.getRequestDispatcher("/error").forward(request, response);
    }
  }

}

 

HeaderServlet.java

package bitcamp.report.handler;

import bitcamp.report.vo.Member;

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 java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/header")
public class HeaderServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    out.println("<div style='height: 50px;background-color:#c2e0f0;'>");
    out.println("<img src='https://www.ncloud.com/public/img/logo-m.png' style='height: 40px'>");
    out.println("<a href='/member/list'>회원</a>");
    out.println("<a href='/board/list?category=1'>게시글</a>");
    out.println("<a href='/board/list?category=2'>공지사항</a>");

    Member loginUser = (Member) request.getSession().getAttribute("loginUser");
    if (loginUser == null) {
      out.println("<a href='/auth/form.html'>로그인</a>");
    } else {
      out.printf("%s %s <a href='/auth/logout'>로그아웃</a>",
              (loginUser.getPhoto() == null ?
                      "<img style='height:40px' src='/images/avatar.png'>" :
                      String.format("<img src='http://urnfabxxeceu19010753.cdn.ntruss.com/member/%s?type=f&w=30&h=40&faceopt=true&ttype=jpg'>",
                              loginUser.getPhoto())),
              loginUser.getName());
    }

    out.println("</div>");
  }
}

 

HomeServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
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 bitcamp.report.vo.Member;

@WebServlet("/index.html")
public class HomeServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE html>");
    out.println("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<meta charset='UTF-8'>");
    out.println("<title>비트캠프</title>");
    out.println("</head>");
    out.println("<body>");
    
    request.getRequestDispatcher("/header").include(request, response);
    
    out.println("<h1>MyApp10</h1>");
    out.println("<p>개인 프로젝트 입니다.</p>");

    request.getRequestDispatcher("/footer").include(request, response);

    out.println("</body>");
    out.println("</html>");

  }
}

 

LoginServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
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 bitcamp.report.vo.Member;

@WebServlet("/auth/login")
public class LoginServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Member m = new Member();
    m.setPhone(request.getParameter("phone"));
    m.setPassword(request.getParameter("password"));

    Member loginUser = InitServlet.memberDao.findByPhoneAndPassword(m);

    if (loginUser != null) {
      // 로그인 정보를 다른 요청에도 사용할 수 있도록 세션 보관소에 담아 둔다.
      request.getSession().setAttribute("loginUser", loginUser);
      response.sendRedirect("/");
      return;
    }

    request.setAttribute("message", "회원 정보가 일치하지 않습니다.");
    request.setAttribute("refresh", "1;url=/auth/form.html");

    request.getRequestDispatcher("/error").forward(request, response);
  }
}

 

MemberAddServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import bitcamp.report.vo.Member;

@WebServlet("/member/add")
@MultipartConfig(maxFileSize = 1024 * 1024 * 10)
public class MemberAddServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Member m = new Member();
    m.setName(request.getParameter("name"));
    m.setPhone(request.getParameter("phone"));
    m.setPassword(request.getParameter("password"));
    m.setPosition(request.getParameter("position").charAt(0));

    Part photoPart = request.getPart("photo");
    if (photoPart.getSize() > 0) {
      String uploadFileUrl = InitServlet.ncpObjectStorageService.uploadFile("bitcamp-nc7-bucket-25",
          "member/", photoPart);
      m.setPhoto(uploadFileUrl);
    }

    try {
      InitServlet.memberDao.insert(m);
      InitServlet.sqlSessionFactory.openSession(false).commit();
      response.sendRedirect("list");

    } catch (Exception e) {
      InitServlet.sqlSessionFactory.openSession(false).rollback();

      request.setAttribute("error", e);
      request.setAttribute("message", "회원 등록 오류!");
      request.setAttribute("refresh", "2;url=list");

      request.getRequestDispatcher("/error").forward(request, response);
    }
  }
}

 

MemberDeleteServlet.java

package bitcamp.report.handler;

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("/member/delete")
public class MemberDeleteServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    try {
      if (InitServlet.memberDao.delete(Integer.parseInt(request.getParameter("no"))) == 0) {
        throw new Exception("해당 번호의 회원이 없습니다!");
      } else {
        InitServlet.sqlSessionFactory.openSession(false).commit();
        response.sendRedirect("/member/list");
      }

    } catch (Exception e) {
      InitServlet.sqlSessionFactory.openSession(false).rollback();

      request.setAttribute("error", e);
      request.setAttribute("message", e.getMessage());
      request.setAttribute("refresh", "2;url=list");

      request.getRequestDispatcher("/error").forward(request, response);
    }
  }

}

 

MemberDetailServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
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 bitcamp.report.vo.Member;

@WebServlet("/member/detail")
public class MemberDetailServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Member member = InitServlet.memberDao.findBy(Integer.parseInt(request.getParameter("no")));

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<meta charset='UTF-8'>");
    out.println("<title>회원</title>");
    out.println("</head>");
    out.println("<body>");

    request.getRequestDispatcher("/header").include(request, response);

    out.println("<h1>회원</h1>");

    if (member == null) {
      out.println("<p>해당 번호의 회원이 없습니다!</p>");
    } else {
      out.println("<form action='/member/update' method='post' enctype='multipart/form-data'>");
      out.println("<table border='1'>");
      out.printf("<tr><th style='width:120px;'>사진</th>"
          + " <td style='width:300px;'>"
          + (member.getPhoto() == null ? "<img style='height:80px' src='/images/avatar.png'>" :
            "<a href='https://kr.object.ncloudstorage.com/bitcamp-nc7-bucket-25/member/%s'>"
            + "<img src='http://urnfabxxeceu19010753.cdn.ntruss.com/member/%1$s?type=f&w=60&h=80&faceopt=true&ttype=jpg'>"
            + "</a>")
          + " <input type='file' name='photo'>" 
          + "</td></tr>\n", member.getPhoto());
      out.printf("<tr><th style='width:120px;'>번호</th>"
          + " <td style='width:300px;'><input type='text' name='no' value='%d' readonly></td></tr>\n",
          member.getNo());
      out.printf("<tr><th>이름</th>" 
          + " <td><input type='text' name='name' value='%s'></td></tr>\n",
          member.getName());
      out.printf(
          "<tr><th>전화번호</th>" 
              + " <td><input type='tel' name='phone' value='%s'></td></tr>\n",
          member.getPhone());
      out.printf("<tr><th>암호</th>" 
          + " <td><input type='password' name='password'></td></tr>\n",
          member.getName());
      out.printf(
          "<tr><th>직책</th>" 
              + " <td><select name='position'>\n"
              + " <option value='0' %s>관리자</option>\n"
              + " <option value='1' %s>일반직원</option></select></td></tr>\n",
          (member.getPosition() == '0' ? "selected" : ""),
          (member.getPosition() == '1' ? "selected" : ""));
      out.println("</table>");

      out.println("<div>");
      out.println("<button>변경</button>");
      out.println("<button type='reset'>초기화</button>");
      out.printf("<a href='/member/delete?no=%d'>삭제</a>\n", member.getNo());
      out.println("<a href='/member/list'>목록</a>\n");
      out.println("</div>");
      out.println("</form>");
    }

    request.getRequestDispatcher("/footer").include(request, response);

    out.println("</body>");
    out.println("</html>");

  }
}

 

MemberListServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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 bitcamp.report.vo.Member;

@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<meta charset='UTF-8'>");
    out.println("<title>회원</title>");
    out.println("</head>");
    out.println("<body>");

    request.getRequestDispatcher("/header").include(request, response);

    out.println("<h1>회원 목록</h1>");
    out.println("<div style='margin:5px;'>");
    out.println("<a href='/member/form.html'>새 회원</a>");
    out.println("</div>");
    out.println("<table border='1'>");
    out.println("  <tr><th>번호</th> <th>이름</th> <th>전화번호</th></tr>");
    out.println("</thead>");
    out.println("<tbody>");
    
    List<Member> list = InitServlet.memberDao.findAll();
    for (Member m : list) {
      out.printf("<tr>" 
          + " <td>%d</td>" 
          + " <td>"
          + "<img src='http://urnfabxxeceu19010753.cdn.ntruss.com/member/%s?type=f&w=30&h=40&faceopt=true&ttype=jpg'>"
          + "<a href='/member/detail?no=%d'>%s</a></td>"
          + " <td>%s</td></tr>\n", 
          m.getNo(), m.getPhoto(), m.getNo(), m.getName(), m.getPhone());
    }

    out.println("</tbody>");
    out.println("</table>");
    out.println("<a href='/'>메인</a>");

    request.getRequestDispatcher("/footer").include(request, response);

    out.println("</body>");
    out.println("</html>");
  }

}

 

MemberUpdateServlet.java

package bitcamp.report.handler;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import bitcamp.report.vo.Member;

@WebServlet("/member/update")
@MultipartConfig(maxFileSize = 1024 * 1024 * 10)
public class MemberUpdateServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Member member = new Member();
    member.setNo(Integer.parseInt(request.getParameter("no")));
    member.setName(request.getParameter("name"));
    member.setPhone(request.getParameter("phone"));
    member.setPassword(request.getParameter("password"));
    member.setPosition(request.getParameter("position").charAt(0));
    
    Part photoPart = request.getPart("photo");
    if (photoPart.getSize() > 0) {
      String uploadFileUrl = InitServlet.ncpObjectStorageService
          .uploadFile("bitcamp-nc7-bucket-25", "member/", photoPart);
      member.setPhoto(uploadFileUrl);
    }

    try {
      if (InitServlet.memberDao.update(member) == 0) {
        throw new Exception("회원이 없습니다.");
      } else {
        InitServlet.sqlSessionFactory.openSession(false).commit();
        response.sendRedirect("list");
      }

    } catch (Exception e) {
      InitServlet.sqlSessionFactory.openSession(false).rollback();

      request.setAttribute("error", e);
      request.setAttribute("message", e.getMessage());
      request.setAttribute("refresh", "2;url=list");

      request.getRequestDispatcher("/error").forward(request, response);
    }
  }

}

 

webapp > auth > form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>비트 캠프</title>
</head>
<body>


<div style='height: 50px;background-color:#c2e0f0;'>
  <img src='https://www.ncloud.com/public/img/logo-m.png' style='height: 40px'>
  <a href='/member/list'>회원</a>
  <a href='/board/list?category=1'>게시글</a>
  <a href='/board/list?category=2'>공지사항</a>
  <a href='/auth/form.html'>로그인</a>
</div>

<h1>로그인</h1>
<form action='/auth/login' method="post">
<table border='1'>
<tr>
  <th>전화번호</th> <td><input type='tel' name='phone'></td>
</tr>
<tr>
  <th>암호</th> <td><input type='password' name='password'></td>
</tr>
</table>
<button>로그인</button>
</form>

<div style='text-align:center;background-color:gray;color:white;padding:10px;'>
  <p style='font-size:90%;margin: 0px;'>비트캠프 + 매직에꼴 + 네이버클라우드@2023</p>
  <address style='font-size: x-small; font-style:italic;'>서울시 강남구 강남대로 94길 20, 삼오빌딩 5층</address>
</div>

</body>
</html>

ㄴ header 와 footer 를 하드코딩하여 넣도록 함