비트교육과정에서 도서 관리 프로그램을 만들면서 배웠던 내용을 정리해봤다.
최근 2~3주간은 서블릿, JSP, JavaScript 를 중심으로 배웠다.
또 HTML <form>태그에서 어떻게 서버와 ajax 통신을 주고받는지에 대해서도 공부했다.
공부하면서 헷갈렸거나 개념을 짚고 넘어가야할 부분을 정리해보았다.
<c:forEach>
var
: 현재 반복 요소를 저장할 변수의 이름을 지정items
: 반복할 객체 집합을 지정begin
: 반복의 시작 인덱스를 지정end
: 반복의 끝 인덱스를 지정step
: 반복의 증가 단계를 지정c
는 JSTL의 코어 라이브러리를 의미한다.<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
현재의 요청을 다른 페이지로 전달하는 것
- 사용자의 요청에 따라 작업을 처리한 후 결과를 표시하는 경우 사용할 수 있음
RequestDispatcher
객체 - 포워딩 수행
- 현재 요청을 다른 리소스(서블릿, JSP)로 전달하는 기능 제공
- 클라이언트는 새로운 페이지의 URL 알 수 없음(이전 요청의 URL이 표시됨)
- 서버 내부에서 이루어지는 작업으로, 클라이언트는 이를 인지하지 못하고 요청한 페이지로 이동
- 클라이언트의 요청과 응답이 서버 내에서 전달되기 때문에, 서버 내부의 데이터와 상태를 공유할 수 있음
클라이언트에게 새로운 URL로 이동하도록 요청하는 방식
- 클라이언트와 서버 간에는 새로운 요청과 응답이 이루어지므로, 서버 내부의 데이터와 상태가 공유되지 않음
- 클라이언트에게 응답 시 새로운 URL로 이동하라는 명령을 보냄
- 새로운 URL로 새로운 GET 요청을 생성하여 이동
- 클라이언트의 브라우저 주소창에는 이동한 페이지의 URL이 표시
<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
으로 바꾸면 동작하지 않는데, 그 이유는..
POST
요청을 한다.POST
요청은 HTTP Request body에 데이터를 담아 서버에 요청을 보낸다.GET
요청은 url 쿼리스트링에 파라미터를 담아 서버에 요청을 보낸다.POST
요청시엔 disabled되어 있는 태그도 요청 본문에 포함된다.cmd=regist
가 url에 포함되지 않는다..SimpleDateFormat
날짜와 시간을 원하는 형식으로 포맷하거나 파싱하기 위해 사용하는 자바 클래스
parse()
: 문자열로 된 날짜를 Date 객체로 파싱fotmat()
: Date 객체를 문자열로 포맷
TimeStamp
날짜와 시간을 나타내는 자바 클래스
java.util.Date
클래스 상속받음- 밀리초까지 정밀한 값 가짐
- DB에서 날짜와 시간을 저장하거나 조회할 때 사용함
Date
의getTime()
메소드: 객체가 나타내는 날짜와 시간을 1970년 1월 1일 기준으로한 밀리초로 반환
명시적 타입 캐스팅
타입 변수 = (타입) 표현식;
double d = 3.14;
int i = (int) d; // 명시적 타입 캐스팅
암시적 타입 캐스팅
작은_타입 변수 = 큰_타입_표현식;
int i = 42;
double d = i; // 암시적 타입 캐스팅