Servlet/JSP로 도서관리 프로그램 만들기

oasis·2023년 7월 8일
1
비트교육과정에서 도서 관리 프로그램을 만들면서 배웠던 내용을 정리해봤다.
최근 2~3주간은 서블릿, JSP, JavaScript 를 중심으로 배웠다.
또 HTML <form>태그에서 어떻게 서버와 ajax 통신을 주고받는지에 대해서도 공부했다.
공부하면서 헷갈렸거나 개념을 짚고 넘어가야할 부분을 정리해보았다.


01. JSTL


<c:forEach>

  • JSP 페이지에서 반복 작업을 수행하는 데 사용
  • 객체 집합의 요소에 접근하여 원하는 작업 수행 가능
  • 속성
    • var: 현재 반복 요소를 저장할 변수의 이름을 지정
    • items: 반복할 객체 집합을 지정
    • begin: 반복의 시작 인덱스를 지정
    • end: 반복의 끝 인덱스를 지정
    • step: 반복의 증가 단계를 지정
  • c는 JSTL의 코어 라이브러리를 의미한다.
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>



02. Servlet - url


✨ 포워딩

현재의 요청을 다른 페이지로 전달하는 것

  • 사용자의 요청에 따라 작업을 처리한 후 결과를 표시하는 경우 사용할 수 있음
  • RequestDispatcher 객체 - 포워딩 수행
    • 현재 요청을 다른 리소스(서블릿, JSP)로 전달하는 기능 제공
    • 클라이언트는 새로운 페이지의 URL 알 수 없음(이전 요청의 URL이 표시됨)
  • 서버 내부에서 이루어지는 작업으로, 클라이언트는 이를 인지하지 못하고 요청한 페이지로 이동
  • 클라이언트의 요청과 응답이 서버 내에서 전달되기 때문에, 서버 내부의 데이터와 상태를 공유할 수 있음

✨ 리다이렉트

클라이언트에게 새로운 URL로 이동하도록 요청하는 방식

  • 클라이언트와 서버 간에는 새로운 요청과 응답이 이루어지므로, 서버 내부의 데이터와 상태가 공유되지 않음
  • 클라이언트에게 응답 시 새로운 URL로 이동하라는 명령을 보냄
  • 새로운 URL로 새로운 GET 요청을 생성하여 이동
  • 클라이언트의 브라우저 주소창에는 이동한 페이지의 URL이 표시



03. HTML


<form> - GET vs. POST

<form action="/MemberSample/BlmController?cmd=register" method="post">
    <table>
        <tr><th colspan="4" id="form">도서등록</th></tr>
        <tr><th>구분</th><th class="data_ui" colspan="2">데이터입력</th><th>비고</th></tr>
        <tr>
            <td>도서번호</td>
            <td colspan="2">
            	<input type="text" id="book_seq" name="book_seq" disabled="disabled">
            </td>
            <td id="message">자동생성</td></tr>
            
        <tr>
        	<td>ISBN</td>
        	<td colspan="2">
        		<input type="text" id="isbn" name="isbn">
        	</td>
        	<td>
        		<input type="hidden" id="flag" value="false">
        	</td>
        </tr>
        <tr>
        	<td>도서명</td>
        	<td colspan="2">
        		<input type="text" id="book_title" name="book_title">
        	</td><td></td>
        </tr>
        <tr>
        	<td>저자/역자</td>
        	<td colspan="2">
        		<input type="text" id="author" name="author">
        	</td><td></td>
        </tr>

        <tr>
        	<td>출판일</td>
        	<td colspan="2">
        		<input type="text" id="publish_date" size="35" name="publish_date">
        	</td>
        	<td></td>
        <tr>
        <tr>
        	<td>도서위치</td>
        	<td colspan="2">
        		<select name="book_position" disabled="disabled">
        			<option value='BS'>--도서 위치--
        			<option value='BS-001' selected>일반서가
        			<option value='BS-002'>예약서가
        			<option value='BS-'>회원
        		</select>
        	</td>
        	<td>기본값삽입</td>
        <tr>
        <tr>
        	<td>도서상태</td>
        	<td colspan="2">
        		<select name="book_status" disabled="disabled">
        			<option value='BM'>--도서 상태--
        			<option value='BM-001' selected>도서대출서비스
        			<option value='BM-002'>도서수선
        			<option value='BM-003'>도서저장고
        		</select>
        	</td>
        	<td>기본값삽입</td>
        <tr>
        <tr>
        	<td colspan="4" id="sending">
        		<input type="submit" value="도서등록"> 
        		<input type="reset">
        		<a href="/MemberSample/Blmcontroller?cmd=list"><button type="button">도서리스트</button></a>
        	</td>
        </tr>
    </table>
</form>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String cmd = request.getParameter("cmd");
		cmd = cmd == null ? "list" : cmd;
		String url = "./manager/book_list.jsp";
		BlmService blm = new BlmService();
		boolean isRedirect = false;
		

		if (cmd.equals("list")) {
			ArrayList<BookCopy> list = blm.searchBookAll();
			request.setAttribute("list", list);

		} else if (cmd.equals("regist")) {
			BookCopy copy = new BookCopy();
			copy.setIsbn(request.getParameter("isbn"));
			copy.setTitle(request.getParameter("book_title"));
			copy.setAuthor(request.getParameter("author"));
			copy.setPublisher(request.getParameter("publisher"));
			String date = request.getParameter("publish_date");
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

			try {
				Date now = df.parse(date);
				copy.setPublishDate(new Timestamp(now.getTime()));
			} catch (ParseException e) {
				e.printStackTrace();
			}
			blm.registBook(copy);
			url = "./BlmController?cmd=list";

		}

		if (!isRedirect) {
				RequestDispatcher rd = request.getRequestDispatcher(url);
				rd.forward(request, response);
		} else {
			response.sendRedirect(url);
		}
}

여기에서 form 태그를 GET으로 바꾸면 동작하지 않는데, 그 이유는..

  1. form 태그는 기본적으로 POST 요청을 한다.
  2. POST요청은 HTTP Request body에 데이터를 담아 서버에 요청을 보낸다.
  3. GET요청은 url 쿼리스트링에 파라미터를 담아 서버에 요청을 보낸다.
  4. 반면 POST 요청시엔 disabled되어 있는 태그도 요청 본문에 포함된다.
  • get 요청을 하면 cmd=regist가 url에 포함되지 않는다..
  • form 태그에 들어간 input value가 쿼리 파라미터로 들어가기 때문이다..
  • 그래서 등록이 되지 않는다…



JAVA


SimpleDateFormat

날짜와 시간을 원하는 형식으로 포맷하거나 파싱하기 위해 사용하는 자바 클래스

  • parse() : 문자열로 된 날짜를 Date 객체로 파싱
  • fotmat() : Date 객체를 문자열로 포맷

TimeStamp

날짜와 시간을 나타내는 자바 클래스

  • java.util.Date 클래스 상속받음
  • 밀리초까지 정밀한 값 가짐
  • DB에서 날짜와 시간을 저장하거나 조회할 때 사용함
  • DategetTime() 메소드: 객체가 나타내는 날짜와 시간을 1970년 1월 1일 기준으로한 밀리초로 반환

타입 캐스팅(형변환)

  1. 명시적 타입 캐스팅

    • 수동으로 타입 변환
    • 더 큰 데이터 타입을 더 작은 데이터 타입으로 변환할 때 주로 사용
    타입 변수 = (타입) 표현식;
    double d = 3.14;
    int i = (int) d; // 명시적 타입 캐스팅
  2. 암시적 타입 캐스팅

    • 작성자가 명시적으로 지정하지 않아도 자동으로 타입 변환
    • 더 작은데이터 타입을 더 큰 데이터 타입으로 변환할 때 주로 사용
    작은_타입 변수 = 큰_타입_표현식;
    int i = 42;
    double d = i; // 암시적 타입 캐스팅

0개의 댓글