- JSP 개발 경험 만들기
- 웹 사이트 개발 시 필수이자 기본
- 실력 향상
Front-End
- HTML
- CSS
- JavaScript
- Bootstrap 4
Back-End
- Java 1.8
- JSP
- MySQL 8.0
- Tomcat 9.0
1주차 (03/08 ~ 03/12) – 시작 페이지, 상품DB, 상품CRU
- 03/08 개발환경 설정 및 시작페이지 구현
- 03/09 상품DB 생성, 상품 목록, 상품 상세 정보 페이지 구현
- 03/10 상품 등록 및 이미지 등록 유효성 검사 구현
- 03/11 장바구니 페이지 구현
- 03/12 주문처리 페이지 구현
2주차 (03/13 ~ 03/18) – 예외 페이지, 로그기록, 사용자 페이지
- 03/13 예외처리 페이지 구현
- 03/14 로그 기록하기 구현
- 03/15 다국어 처리, 보안처리 구현
- 03/16 사용자 DB 생성, 로그인 페이지 구현
- 03/17 회원가입 및 회원 수정 페이지 구현
3주차 (03/19 ~ 03/24) – 게시판 MVC Model 1
- 03/19 게시판 DB 생성, 게시판 목록 페이지 구현
- 03/20 게시판 검색 기능 구현
- 03/21 게시판 수정, 삭제 구현
- 03/22 조회수 기능 구현
- 03/23 코드 재정리 및 마무리
일반 사용자가 로그인 했을 경우와 어드민 관리자 계정으로 로그인 했을 경우 상단에 상품 등록, 수정, 삭제 메뉴를 추가함(JSTL태그)
<c:choose>
<c:when test="${empty sessionId}">
<li class="nav-item"><a class="nav-link" href="<c:url value="/members/loginMember.jsp" />">로그인</a></li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/members/addMember.jsp" />">회원가입</a></li>
</c:when>
<c:otherwise>
<li style="padding-top: 7px; color: white"><%= sessionId %>[님]</li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/members/logoutMember.jsp" />">로그아웃</a></li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/members/updateMember.jsp" />">회원 수정</a></li>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${sessionId ne 'admin'}">
<li class="nav-item"><a href="${pageContext.request.contextPath}/product/products.jsp" class="nav-link">상품 목록</a></li>
</c:when>
<c:otherwise>
<li class="nav-item"><a href="${pageContext.request.contextPath}/product/products.jsp" class="nav-link">상품 목록</a></li>
<li class="nav-item"><a href="${pageContext.request.contextPath}/product/addProduct.jsp" class="nav-link">상품 등록</a></li>
<li class="nav-item"><a href="${pageContext.request.contextPath}/product/editProduct.jsp?edit=update" class="nav-link">상품 수정</a></li>
li class="nav-item"><a href="${pageContext.request.contextPath}/product/editProduct.jsp?edit=delete" class="nav-link">상품 삭제</a></li>
</c:otherwise>
</c:choose>
<li class="nav-item"><a class="nav-link" href="${pageContext.request.contextPath}/BoardListAction.do?pageNum=1">게시판</a></li>
로그인을 하지 않았다면 게시글을 읽지 못하도록 설정
<script type="text/javascript">
function checkForm() {
if(${sessionId == null}){
alert("로그인을 하셔야 작성 할 수 있습니다.");
return false;
}
//로그인이 되었다면
location.href="./BoardWriteForm.do?id=<%= sessionId %>";
}
function loginForm() {
if(${sessionId == null}){
alert("로그인을 해야 게시글을 볼 수 있습니다.");
return false;
}
}
</script>
상품을 등록 유효성 검사
/* 상품 등록 유효성 검사 */
function checkAddProduct(){
var productId = document.getElementById("productId");
var pname = document.getElementById("pname");
var unitPrice = document.getElementById("unitPrice");
var unitsInStock = document.getElementById("unitsInStock");
//상품 ID check
if(!check(/^P[0-9]{4,11}$/, productId,
"[상품 코드]\nP와 숫자를 조합하여 5~12자까지 입력하세요.\n" + "반드시 첫 글자는 P로 시작해주세요.")){
return false;
}
//상품명 check
if(pname.value.length < 4 || pname.value.length > 12){
alert("[상품명]\n최소 4자에서 최대 11자까지 입력해주세요.");
name.select();
name.focus();
return false;
}
###Board (게시판)
Command
public class BWriteCommand implements BCommand {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
BoardDAO bDao = BoardDAO.getInstance();
BoardDTO board = new BoardDTO();
board.setId(request.getParameter("id"));
board.setName(request.getParameter("name"));
board.setSubject(request.getParameter("subject"));
board.setContent(request.getParameter("content"));
SimpleDateFormat sFormat = new SimpleDateFormat("yyyy/MM/dd(HH:mm:ss");
String regist_day = sFormat.format(new Date());
board.setRegist_day(regist_day);
board.setHit(0);
board.setIp(request.getRemoteAddr());
//DB에 저장하는 메서드 호출
bDao.insertBoard(board);
}
}
Controller
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
actionDo(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
actionDo(request, response);
}
private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("actionDo");
BCommand com = null;
String viewPage = null;
//getRequestURI()는 요청된 전체 uri를 가져온다.
String uri = request.getRequestURI();
System.out.println("URI : " + uri);
//getContextPath()는 프로젝트명이 리턴된다.
String contextPath = request.getContextPath();
System.out.println("contextPath : " + contextPath);
//직접 실행되어야할 파일의 이름을 얻어내는 것이다.
String command = uri.substring(contextPath.length());
System.out.println("command : " + command);
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("UTF-8");
//command패턴에 따라서 분기를 하는 코드
//DB에 저장되어 있는 모든 게시글을 출력하는 부분
if(command.equals("/BoardListAction.do")) {
System.out.println("------------------------------");
System.out.println("/BoardListAction.do페이지 호출");
System.out.println("------------------------------");
com = new BListCommand();
com.execute(request, response);
System.out.println("BoardListAction의 execute() 실행 완료");
viewPage = "./board/list.jsp";
}
//회원의 로그인 정보를 가져오는 부분
else if (command.equals("/BoardWriteForm.do")) {
System.out.println("------------------------------");
System.out.println("/BoardWriteForm.do페이지 호출");
System.out.println("------------------------------");
com = new BWriteFormCommand();
com.execute(request, response);
System.out.println("BoardWriteForm의 execute() 실행 완료");
viewPage = "./board/writeForm.jsp";
}
//게시글을 쓰고 db에 저장하기
else if (command.equals("/BoardWriteAction.do")) {
System.out.println("------------------------------");
System.out.println("/BoardWriteAction.do페이지 호출");
System.out.println("------------------------------");
com = new BWriteCommand();
com.execute(request, response);
System.out.println("BoardWriteForm의 execute() 실행 완료");
viewPage = "/BoardListAction.do";
}
- MySQL TimeZone 예외 발생 MySQL의 TimeZone시간이 한국 시간으로 설정이 되어 있지 않을 경우에 발생하는 문제입니다. Mysql의 TimeZone의 시간 값을 한국 시각으로 설정하면 됩니다.
- 상품 등록 시 Image 업로드에 관한 예외 발생 이유는 이미지 업로드 시 이미지 저장 위치의 주소가 상대주소일 경우 발생하는 예외였습니다. 이미지 업로드 주소를 절대 주소로 수정하였습니다.
- 제일 자주 발생한 예외는 역시 오타로 인한 예외였습니다. 제일 해결하기 쉬우면서도 제일 어려운 부분입니다.
- MVC패턴을 적용하기가 스프링프레임워크에 비해 어렵다.
- JSP는 웹 페이지 영역 안에서 환경을 구성하는 느낌이 굉장히 강했지만 간단한 웹사이트를 구축하기엔 좋다고 생각했습니다.