KOSTA 교육(Cookie, Session, Expression Language, JSTL, Filter)
배운 내용
- Cookie(쿠키)
- Session(세션)
- Expression Language(익스프레션 언어)
- JSTL(JSP Standard Tag Library)
- Filter(필터)
1. Cookie(쿠키)
HTTP 프로토콜의 문제점을 해결하기 위해 클라이언트측에 데이터를 저장하여 사용하는 방법이다.
쿠키 데이터 전달
- 첫 번째 웹 컴포넌트가 웹 브라우저로 HTML 문서를 보낼 때 전달한 데이터를 함께 보내며, 웹 브라우저는 데이터를 저장해 두었다가 두 번째 웹 컴포넌트를 호출할 때 URL과 함께 웹 서버로 보낸다.
- 파라미터는 String으로 넘겨준다.
Cookie 생성 / Cookie 전달 / Cookie 배열
Cookie 삭제
Cookie 예시
loginForm.jsp
- 로그인 Form을 만들어 submit시 loginProc.jsp로 이동한다.
loginProc.jsp
- Cookie 학습에 용이하게 로그인 할 임의의 고객 정보를 자체 생성하였다.
- form에 입력한 값을 가져오기 위해 getParameter를 통해 id, pass 변수에 담는다.
- if문으로 둘다 같으면 Cookie를 생성는데 이 때 로그인된 name으로 Cookie를 생성하고 addCookie를 통해 쿠키를 보낸다.
- 여기서는 로그인이 완료되었다면 name을 가진 Cookie가 생성될 것이다.
main.jsp
- 로그인 시마다 Cookie를 생성하기 때문에 (DB가 연동되었다는 가정 하에) 배열을 선언하여 Cookies 배열에 하나씩 넣어줄 것이다.
- if문으로 cookies가 null이 아니라면 출력을 해주기 위해 for문을 사용하여 cookies[i].getName()이 name과 같으면 Decoder를 해서 UTF-8로 변환하여 출력하고 Cookies가 없거나 JSESSIONID면 다시 loginForm.jsp로 돌아가게 한다.
- 그리고 로그인을 하면 로그아웃을 할 수 있도록 a태그를 통해 이동하게 한다.
logout.jsp
- 위와 과정은 동일하지만 Cookie를 삭제해주어야 하기 때문에 name을 찾고 setMaxAge(0);을 선언하여 Cookie를 종료한다. 이 때 서버에서는 addCookie를 response를 해주어야한다.
로그인
Cookie 생성
- 로그인시 Cookie 생성
로그아웃
- 로그아웃시 Cookie 삭제
2. Session(세션)
HTTP 프로토콜의 문제점을 해결하기 위해 서버측에 데이터를 저장하여 사용하는 방법이다.
세션 데이터 전달
- 첫 번째 웹 컴포넌트가 웹 서버 쪽에 데이터를 저장해 놓고 그 데이터를 읽기 위해 필요한 세션 아이디만 웹 브라우저로 보내며, 웹 브라우저는 아이디를 저장해 두었다가 두 번째 웹 컴포넌트를 호출할 때 웹 서버로 보낸다.
Servlet에서 사용할 때 예시
session 저장 / 호출
session 삭제 / 정지
Session 예시
loginForm.jsp
- Form 태그로서 submit 하면 loginProc.jsp로 이동한다.
loginProc.jsp
- form에서 입력한 name을 getParameter로 가져오고 if문이 만족한다면 setAttribute로 name을 session에 저장한다.
main.jsp
- name을 가져오기 위해 강제 캐스팅을 하여 name에 선언하고 name이 null이라면
loginForm.jsp로 돌아간다. - 로그아웃을 누르면 logout.jsp로 갈 수 있도록 a태그로 선언하였다.
- login과 동일하게 name에 getAttribute로 name을 넣고 null이라면 loginForm.jsp로 이동하고 null이 아니라면 session.invalidate()로 session에서 제외시킨다.
3. Expression Language(익스프레션 언어)
같은 식을중심으로 코드를 기술하는 언어로서 연산자와 피연산자의 조합을 ${식}로 둘러싸서 표현한다.
- 애트리뷰트를 이용하여 사용된다. 여기서 애트리뷰트란 setAttribute, getAttribute, removeAttribute 메서드를 통해 저장되고, 관리되는 데이터를 의미한다.
데이터 이름 해석 순서
- 사용 범위가 좁은 순에서 넓은 애트리뷰트 순으로 해석된다.
데이터 이름 해석
- 내장객체 애트리뷰트는 위의 방식으로 EL식을 작성한다.
- 하지만 애트리뷰트만 작성해도 알아서 찾아 해석해준다.
Parameter 예시
- param은 웹 브라우저에서 <FORM> 태그를 통해 입력된 데이터를 가져올 때 사용한다. 보통 왼족의 경우를 많이 사용한다.
EL 예제
el 예제
- setAttribute()로 name을 kosta로 선언
- Member 객체를 m에 담아 setName을 홍길동으로 담고 setAttribute()로 member를 m으로 선언
- HashMap<String, String>map을 객체로 선언하고 put으로 담은 후 setAttribute로 baseball에 map을 선언
el 예제
- 스크립트릿
단순 name을 kosta로 선언하였기 때문에 getAttribute를 선언하여 출력한다.
EL
name만 선언하면 동일한 값이 출력된다. - 스크립트릿
Member 객체(자바 빈)에서 가져왔기 때문에 Member로 형변환을 해주고 getAttribute로 member를 가져온 후 getName()을 이용하여 출력한다.(setName으로 name을 선언해주었기 때문)
EL
member(자바 빈).name으로 출력한다. - 스크립트릿
HashMap으로 형변환을 해주고 getAttribute로 baseball을 가져온 다음 get으로 samsung인 Key값을 가져오면 출력된다.
EL
baseball.samsung으로 출력한다.
결과 값
4. JSTL(JSP Standard Tag Library)
JSP에서 사용 가능한 표준 태그 라이브러리이며 보다 편리하게 코드를 구현하고 가독성을 높일 수 있다.
- 다양한 태그를 제공함으로서 코드를 깔끔하게하고 가독성을 높인다.
- HTML의 코드의 복잡성을 해결하기 위해 등장하였다.
- 간단한 로직의 구사(변수 선언, if, for문)
- 다른 JSP 페이지 호출(<c:redirect>, <c:import>)
- 날짜, 시간, 숫자의 포맷
- Tomcat lib 폴더에 라이브러리를 추가하여야 한다.
- core 태그와 fmt 태그로 기능이 나뉜다.
라이브러리 추가
JSTL 예제(CORE)
c 태그 사용 전 세팅
- 라이브러리를 추가했다는 전제 하에 <%@ taglib %>에 위의 내용을 추가하여 사용한다. prefix = “c” 는 태그에서 사용할 접두사 역할을 한다.
set / out 예제
- set은 setAttribute와 동일한 역할을 수행하며 vard에 변수 이름, value에는 저장할 값을 나타낸다.
- out은 value에 변수 이름을 선언하여 출력해주는 역할을 한다.
<c:foreach> 예제
- 횟수가 정해져 있을 때 foreach문의 경우 begin과 end값을 선언한다.
- 구구단의 경우 1부터 9까지 정해져 있기 때문에 해당 foreach문을 사용하여 <li>를 이용하여 출력한다.
구구단 결과 값
- 횟수가 정해져 있지 않을 때 foreach문의 경우는 대체적으로 LIST객체에 담겨져있는 값을 출력할 때 사용하게 된다.
- list에 값이 있다는 가정 하에 생성된 list를 foreach로 출력한다.
- var은 <c:set var>에서 배웠듯 변수를 정할 때 사용한다. item은 집합체를 선언할 때 사용한다. 그래서 setAttribute한 list를 담는다.
- 그리고 테이블 별로 m에 넣은 list들을 하나씩 출력하면 되겠다.
list 결과 값
<c:redirect>, <c:param> 예제
- redirect는 response.sendRedirect() 메소드와 동일한 기능을 제공한다.
- url에는 이동할 경로를 넣어주면 이동한다.
- param은 해당 parameter값을 가져가는 역할을 한다.
- fruit의 name을 가진 orange를 url 주소로 함께 가져간다.
<c:if> 예제
- set으로 fruit 변수에 parameter.fruit를 저장한다.
- if문은 test에 조건식을 명시해준다. 그리고 해당 예시에서는 out으로 출력했지만 다른 조건에 맞는 출력을 해도 되겠다. 여기서 조건은 fruit가 apple이면 fruit를 출력하지만 orange이기 때문에 출력되지 않는다.
- <c:if>에서는 else를 따로 사용할 수가 없다. 그래서 존재하는 것이 <c:choose>이다.
<c:choose> / <c:when> / <c:otherwise>
- choose when을 사용하면 if else문을 사용할 수 있다.
- when test에 조건절을 사용하여 if문을 작성하고 choose 내부에 다른 when을 사용하여 else if를 나타낸다. 그리고 otherwise를 통해 else를 나타낸다.
- 여기선 fruit를 orange로 param을 넘겼기 때문에 else if에 해당되는 두 번째 when절에서 출력이 된다.
JSTL 예제(FMT)
fmt 태그 사용 전 세팅
- prefix에 fmt를 선언하여 사용할 세팅을 한다.
<fmt:formatDate> 예제
- 현재 날짜와 비교하기 위하여 set으로 현재 시간을 선언하였다.
- formatDate로 pattern을 설정하여 출력이 가능하다.
현재 시간 결과 값
<fmt:formatNumber> 예제
- formatNumber로 type과 currencySymbol을 주어 숫자 단위를 정할 수 있다.
숫자 결과 값
<fmt:formatNumber> 예제
- 각 value에 소숫점을 나타낼 숫자, 퍼센트을 선언한다.
- pattern은 #에는 표시할 숫자를, 0으로 소숫점 자리수를 나타낸다.
- type에는 percent를 선언하여 %로 출력되게 선언한다.
소수점, 퍼센트 결과 값
5. Filter(필터)
말그래도 여과기의 역할을 한다.
- package에 filter로 생성하여 webFilter를 통해 filter를 적용시킬 파일의 경로를 선정한다.
- 코드의 중복을 최소화 시키고 유지보수를 편리하게 할 수 있게 도와준다.
필터의 위치
- 초기화된 필터는 웹 브라우저와 웹 컴포넌트 사이에 위치하게 된다.
- 웹 브라우저가 웹 컴포넌트를 호출했을 때 대신 필터가 호출될 것이고, 필터는 필요한 사전작업을 수행한 다음에 웹 컴포넌트를 호출할 것이다.
필터 생성
- 총 세개의 메소드로 init은 객체 초기화시, destroy는 종료할 때, doFilter는 직접적으로 호출되는 메소드이다.
- FilterChain은 Chain으로 Filter를 묶어줘서 여러가지 여과를 할 수 있도록 해준다.
Filter 예제
login이 되었을 때 공통적으로 name을 확인하여 login이 되었는지 확인하는 코드가 중복되는 상황이다.
Filter 예제
- setAttribute한 name을 name에 담고 null이면 다시 loginForm.jsp로 넘기는 코드가 중복되고 있다.
- 로그아웃의 경우 session을 없애야 하기 때문에 invaldate()는 남긴다.