KOSTA

KOSTA 교육(Cookie, Session, Expression Language, JSTL, Filter)

코린이 연대기 2021. 4. 1. 10:18

배운 내용

  1. Cookie(쿠키)
  2. Session(세션)
  3. Expression Language(익스프레션 언어)
  4. JSTL(JSP Standard Tag Library)
  5. 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()는 남긴다.