## 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
ㄴ 상단 메뉴 만들기
=>
네이버 클라우드 로고 가져오기
=>
ㄴ [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 를 하드코딩하여 넣도록 함
'네이버클라우드 > JAVA 웹 프로그래밍' 카테고리의 다른 글
JAVA 64일차 (2023-08-23) 자바 프로그래밍_Servlet 정리 ex09~ex11 (0) | 2023.08.23 |
---|---|
JAVA 64일차 (2023-08-23) 자바 프로그래밍_62. forward/include/refresh/redirect 다루기(계속)_개인프로젝트 - 마트 관리 시스템 (0) | 2023.08.23 |
인텔리제이 설치 및 설정_윈도우(Windows) 기준 (0) | 2023.08.23 |
JAVA 63일차 (2023-08-22) 자바 프로그래밍_Servlet 정리 ex06~ex08 (0) | 2023.08.22 |
JAVA 62일차 (2023-08-21) 자바 프로그래밍_Servlet 정리_ex05 (0) | 2023.08.21 |