본문 바로가기
Today I learned

1월3일

by soheemon 2019. 1. 3.


*쿠키와 세션

웹은 Statement less라는 단점을 가지고 있다.

<페이지 페이지마다 1회성 연결을 맺는다.>

이 단점을 보완하기 위해 쿠키와 세션을 사용한다.


사용자를 구별하려면 구별하는 정보가 있어야 하는데

쿠키: 클라이언트에 저장한다

세션: 서버에 저장한다.


세션을 쓸 가능성이 높다. 세션이 쓰기가 편리하기 때문.

=내장객체 중 session scope가 있기 때문.

=쿠키는 client에 저장되므로 변조가 될 가능성도 고려합시다.


쿠키는 client에 저장하고 저장용량이 한정되어있다.

=세션을 많이 쓰지만 쿠키도 알아둡시다.


*쿠키와 세션(2)

쿠키 기술은 전달한 데이터를 웹 브라우저로 보냈다가 웹 서버 쪽으로 되돌려 받는 방법을 사용한다.

첫번째 웹 컴포넌트가 웹 브라우저로 HTML 문서를 보낼 때 전달한 데이터를 함께 보내며, 웹 브라우저는 데이터를 저장해 두었다가 두번째 웹 컴포넌트를 호출할 때 URL과 함께 웹서버로 보낸다.


세션 기술은 웹 브라우저를 거치지 않고 웹서버에 있는 데이터 영역을 통해 데이터를 전달하는 방법이다.

첫번째 웹 컴포넌트가 웹 서버 쪽에 데이터를 저장해 놓고 그 데이터를 읽기 위해 필요한 세션 아이디만 웹 브라우저로 보내며, 웹 브라우저는 아이디를 저장해 두었다가 두번째 웹 컴포넌트를 호출할 때 웹서버로 보낸다.


*쿠키


*새로운 쿠키데이터를 저장하는 방법

1)Cookie 클래스의 객체를 만든다.

2)addCookie 메서드를 호출해야 한다.


Cookie cookie = new Cookie("AGE", "26"); //Age는 쿠키이름, 26은 수치.


response객체의 addCookie메서드를 호출하면, client측으로 쿠키를 보내게 된다.

<!JSP페이지에서는 response 내장 객체지만, 서블릿 클래스에서는 doGet, doPost메서드를 호출시 전달인자로 Cookie 객체를 넘겨야 한다.>


Cookie클래스는 javax.servlet.http패키지에 속하며,

클래스의 객체를 만들 때는 쿠키의 이름과 값을 파라미터로 넘겨줘야 한다.

파라미터는 모두 String 타입이 되어야 하므로

쿠키의 값이 String이 아닐 경우 String 데이터로 만들어줘서 넘겨줘야 한다.


메서드를 통해 웹브라우저로 전송된 쿠키를 실제로 저장하는 일은 웹 브라우저가 하도록 되어 있다.

웹 브라우저가 쿠키를 저장할 때 웹서버의 주소도 함께 저장해 놓는다.


*쿠키 데이터를 읽는 방법 - 웹브라우저가 보낸 모든 쿠키를 가져오기.


웹브라우저는 웹서버가 특별한 요청을 하지 않더라도,

URL에 포함된 웹서버의 주소에 해당하는 모든 쿠키를 찾아서 request에 포함시켜서 보낸다.

쿠키를 받는 일은 getCookies라는 메서드를 이용한다.

getCookies메서드는 JSP페이지에서는 request 내장변수에 대해 호출해야 하고,

서블릿클래스에서는 doGet, doPost메서드를 호출시 전달인자로 넘겨야 한다.

메서드는 웹 브라우저가 보낸 모든 쿠키를 Cookie 배열로 만들어서 return 하기 때문에 return 값을 다음과 같은 Cookie 배열 변수에 받아야 한다.


Cookie cookies[] = request.getCookies(); // 웹브라우저가 보낸 모든 쿠키를 Cookie 배열로 만들어서 return하는 메서드


*쿠키 데이터를 읽는 방법 - 쿠키 목록에서 특정 쿠키 찾기


아쉽게도, request.getCookies()메서드가 return한 Cookie배열에서 특정 쿠키를 찾기 위해서는 배열에 있는 Cookie객체를 하나씩 가져다 이름을 비교해서 찾을 수 밖에 없다.

쿠키의 이름은 Cookie객체에 있는 getName이라는 메서드를 호출해 구할 수 있다.


for(cookie singleCookie: cookies){

String name = singleCookie.getName();//쿠키의 이름을 가져온다.

}


원하는 Cookie객체를 찾은 다음에는 객체에 대해 getValue메서드를 호출해서 쿠키값을 가져 올 수 있다.


String cookieValue = "";

for(cookie singleCookie: cookies){


String cookieName = singleCookie.getName();//쿠키의 이름을 가져온다.

if(cookieName.equals("userName")){

cookieValue = singleCookie.getValue(); //userName이라는 쿠키를 찾으면, 그 값을 가져온다.

}

}


*쿠키를 수정하는 방법

웹 브라우저에 저장되어 있는 쿠키의 값을 수정하기 위해서는

새로운 쿠키를 저장할 때와 마찬가지로 Cookie 객체를 만들어서 addCookie 메서드에 넘겨주면 된다.


*쿠키를 삭제하는 방법

쿠키 기술에서 데이터를 삭제하는 방법은 기능이 따로 있는 것이 아니라 

쿠키의 남은 수명을 0으로 설정하는 방법을 사용해야 한다.


쿠키의 수명을 지정하기 위해서는 addCookie 메서드를 호출하기 전에 Cookie 객체에 대해

setMaxAge라는 메서드를 호출하면 되며, 메서드에서 쿠키의 남은 수명을 초단위로 넘겨줘야 하기 때문에

1시간 후에 쿠키가 지워지도록 만들려면 다음과 같은 값을 넘겨줘야 한다.


cookie.setMaxAge(3600); //쿠키의 최대 수명(초단위)

cookie.setMaxAge(0);//쿠키를 바로 삭제하도록 만든다.

cookie.setMaxAge(01);//웹브라우저가 끝날때 쿠키가 삭제되도록 만든값


//쿠키 사용 예제

<%@page import="java.net.URLEncoder"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

//DB에 저장된 사용자 계정정보라고 가정한다. 즉, 가입된 회원의 id와 pw 그리고 name이다.

String m_id = "kosta";

String m_pass = "1234";

String m_name ="홍길동"; 

String name = URLEncoder.encode(m_name, "utf-8"); //URL을 통해 이동하면 한글이 깨지기때문에 인코딩 한다.


  //form에서 입력받은 id와 pass를 가져온다.

String id = request.getParameter("id");

String pass =request.getParameter("pass");

//전달인자로 건네받은id,pass가 DB에 존재하는 회원정보와 일치한다고 할때,

//name이라는 id를 가진 쿠키를 생성하고, 그 value로 name을 저장한다.

//response 객체에 생성한 쿠키를 추가 한 후,

//main.jsp페이지로 Redirect한다.


if(id.equals(m_id) && pass.equals(m_pass)) { //id, pw가 일치하면 쿠키생성하고 response객체에 저장

Cookie cookie = new Cookie("name", name);//key and value

response.addCookie(cookie);

response.sendRedirect("main.jsp");

}

else {

response.sendRedirect("loginForm.jsp"); //일치하지 않았을때엔 다시 loginForm으로 보낸다.

}

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>


</body>

</html>



//main.jsp

<%@page import="java.net.URLDecoder"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

 //client가 보내온 cookie들을 받아오기 위해 cookies 리스트 변수를 선언하고, request의 getCookies 메서드를 사용한다.

Cookie[] cookies = request.getCookies();

String name = "";

//cookies리스트에서 쿠키의 id명이 'name'인 쿠키의 value값을 가져온다.

//encoding한 한글을 decoding해서 받아주기 위해 URLDecoder클래스의 decode메서드를 사용한다.

for(Cookie cookie : cookies) {

if(cookie.getName().equals("name")) {

name = URLDecoder.decode(cookie.getValue(), "utf-8");

}

}

if(name == null) {

response.sendRedirect("loginForm.jsp"); // main페이지에서 id가 name인 쿠키가 null일경우, 

// 로그인하지 않았다고 생각하여 로그인페이지로 리다이렉트

}

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<%=name %>님 반갑습니다.!

<a href="logout.jsp">로그아웃</a>

</body>

</html>



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

<%


Cookie[] cookies = request.getCookies();

String name = "";


for(Cookie cookie : cookies) {

if(cookie.getName().equals("name")) {

name = cookie.getValue(); //name이라는 쿠키가 없으면 로그인페이지로 리다이렉트 하기위해서 name에해당하는 값을 넣는다.

cookie.setMaxAge(0); //우선, name이라는 쿠키가 있으므로, 쿠키를 만료시킨다.

response.addCookie(cookie); //클라이언트에 설정을 변경한 쿠키를 전송한다.

}

}

if(name == null) {

response.sendRedirect("loginForm.jsp"); //로그인되어있지 않은 사용자(즉, name이라는 쿠키가 없는 사용자)가 접근했을경우

     //redirect 해준다.

}


%>

</head>

<body>


</body>

</html>

참고 = 개발자도구 > Application 탭 > Cookies > ServelURL에서 쿠키정보를 확인 할 수 있다.


*세션

**서블릿 클래스에서 세션을 사용하는 방법 - request에서 세션 객체를 가져온다, 세션에 id와 value를 부여한다.

서블릿 클래스에서 세션을 시작하기 위해서는 doGet, doPost 메서드의 HttpServletRequest 파라미터에 대해

getSetSession이라는 메서드를 호출해야 한다.

메서드는 세션 정보를 포함하는 javax.servlet.http.HttpSession타입의 객체를 리턴한다.


HttpSession session = request.getSession(); //세션을 시작하는 메서드.


getSession 메서드가 리턴한 HttpSession객체에 대해 setAttribute라는 메서드를 호출하면 세션 데이터 영역에 데이터를 저장할 수 있다.


session.setAttribute("id", "soheemon"); //id라는 세션id에 soheemon이라는 값을 할당한다.


**서블릿 클래스에서 세션을 사용하는 방법(2) - getSession메서드를 호출시 세션이 없으면 새로생성, 있으면 기존정보 return

setAttribute메서드는 같은 이름의 데이터가 있으면 기존 값을 지우고 새로운 값을 저장하므로 

데이터 수정 기능을 구현하기 위해서도 사용할 수 있다.

세션 데이터 영역에 저장된 데이터는 같은 웹 애플리케이션 디렉터리에 있는 다른 웹 컴포넌트에서 읽을 수 있으며 

이때 HttpSession 객체가 필요한데, 이 경우 getSession메서드를 이용해서 객체로 구할 수 있다.


메서드는 진행중인 세션이 없을때는 새로운 세션을 시작하지만,

이미 진행중인세션이 있을 때는 세션 정보를 HttpSession 객체로 만들어서 리턴한다.


HttpSession session = request.getSession();


**서블릿 클래스에서 세션 기술을 사용하는 방법(3) - session객체에서 getAttribute메서드를 사용하면 id에 해당하는 value를 가져 올 수 있다.

   - removeAttribute메서드를 호출하면 세션 데이터를 삭제 할 수 있다.

HttpSession 객체에 대해 getAttribute라는 메서드를 호출하면 세션 데이터 영역의 데이터를 가져 올 수 있다.

getAttribute메서드는 데이터 id를 전달인자로 받고, return값으로 해당 id를 가진 value를 return한다.

<!주의 할 점은 Object타입을 return 하므로 반드시 캐스팅이 필요하다.>


String str = (String) session.getAttribute("id");


HttpSession객체를 이용하면 세션 데이터를 삭제 할 수 있는데 이때 removeAttribute메서드를 호출해서 할 수 있다.


**서블릿 클래스에서 세션 기술을 사용하는 방법(4)

세션을 이용해서 할 일을 모두 마치고 나면 invalidate라는 메서드를 호출해서 세션을 끝낼수 있다.


session.invalidate()


*JSP페이지에서 세션 기술을 사용하는 방법

서블릿 클래스에서 새로운 세션을 시작하거나 진행중인 세션을 계속 하기 위해 getSession메서드를 호출해야 한다.

JSP페이지에셔는 JSP페이지가 서블릿 클래스로 변환될 때 메서드를 호출하는 코드가 자동으로 추가되기 때문에 getSession 메서드를 호출할 필요가 없다.(!)

HttpSession session = request.getSession(); 할 필요 없이 그냥 바로 사용하면 된다. 코드가 자동으로 추가된다.!


대신 Session 내장 변수를 사용하면 세션 데이터 영역에 데이터를 저장할 수도 있고 Scope에 따라서 Scope에 있는 데이터를 읽어오거나 삭제할 수도 있다.

session.setAttribute("id","soheemon");//session내장객체를 사용하는것이다! request에서 getSession메서드를 호출하는 코드는 서블릿으로 변환될때 추가된다.


*쿠키를 사용할 수 없는 웹 환경에서는 URL 뒤에 세션 아이디를 붙여서 전송하는 방법을 사용하면 된다.

세션 아이디를 전송하는 방법은 본래의 URL을 가지고 새로운 URL을 만드는 방법이기 때문에 URL 재작성 매커니즘이라고 부른다.


http://localhost:8080/brain04/subscribe/Agreement.jsp; jsessionid=8088A1AAA61960F0B113E331A1460089



//세션을 활용한 장바구니 예제

//로그인 이후 사용자가 상품을 여러개 담을수 있다.

//담은 상품 정보를 세션으로 관리 하는 예제.


selProduct.jsp = 최초 1회 prodList라는 id에 prodList(ArrayList)를 연결한다.

그 후 사용자는 상품명을 클릭하면 productname을 parameter로 add.jsp에 forward 된다.


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>

<%

request.setCharacterEncoding("utf-8");

String username = request.getParameter("username");


session.setAttribute("username", username);

List<String> prodList = null;


if(session.getAttribute("prodList") == null && prodList == null) {

prodList = new ArrayList();//리스트 생성

session.setAttribute("prodList", prodList);//세션에 prodList라는 이름으로 prodList객체를 넣는다.

} //최초 1회 생성.


//사용자가 로그인 하자마자 세션에 기본 list를 저장합니다.

%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<HTML>

<HEAD>

<title>ch06 : selProduct.jsp</title>

</head>


<body>

<div align="center">

<H2>상품선택</H2>

<HR>

${username } 님 환영합니다!!!!

<HR>

<form name="form1" method="POST" action="add.jsp">

<SELECT name="product">

<option>사과</option>

<option>귤</option>

<option>파인애플</option>

<option>자몽</option>

<option>레몬</option>

</SELECT>

<input type="submit" value="추가"/>

</form>

<a href="checkOut.jsp">계산</a>

</div>

</body>

</html>


add.jsp : 세션scope에 존재하는 prodList객체를 prodList변수로 받아와서, 사용자가 선택한 product를 add 해준다.

<! 이때 add한 내용은 세션에 저장이 안된다고 생각하여 session.setAttricute했지만, 그럴 필요가 없었다.

왜냐하면 prodList는 세션 영역에 객체로 존재하고 있고 우리는 그 객체에 접근하기위해 참조변수 하나를 생성해서 접근하고 있기 때문이다.>


<%@page import="java.util.List"%>

<%@page import="java.util.ArrayList"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

 

    <%! List<String> prodList = null; %> 

    

    <%

    request.setCharacterEncoding("utf-8");

    String product = request.getParameter("product");

        //product를 세션의 list에 저장합니다.

       prodList = (ArrayList<String>) session.getAttribute("prodList");

        prodList.add(product);

        //session.setAttribute("prodList", prodList); 안해줘도 된다. 세션안의 List는 하나다.

//참조해서 접근한다고 생각하자. 그래서 변수로 받아와서 사용 할 수 있다.

    

    %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<a href="javascript:history.back()">뒤로가기</a>

<%=product %>

</body>

</html>


checkOut.jsp = 세션영역에 존재하는 prodList를 가져와서 화면에 전부 출력해준다.

그 후, prodList를 invalidate해준다. 

//의문 = invalidate는 어떤과정인가. 단지 id와 객체의 연결을 끊는건가?


<%@page import="java.util.List"%>

<%@page import="java.util.ArrayList"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>


    <%! List<String> prodList = null; %> 

    <%

//request.setCharacterEncoding("utf-8");

//String product = request.getParameter("product");

    //product를 세션의 list에 저장합니다.

   prodList = (ArrayList<String>) session.getAttribute("prodList");

    

    for(String tmp : prodList){

    out.println(tmp);

    }

    session.invalidate();

    %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

</body>

</html>



*표현언어 = EL = expression language

표현언어란 같은 식을 중심으로 코드를 기술하는 언어이다.

예를들어, 여태까지 작성해왔던 JSP코드를 생각해보자.

수많은 스크립트릿코드로 인해 코드가 굉장히 복잡해지고 가독성이 떨어졌었다.

이를 위해, JAVA코드를 JSP에서 태그처럼 사용할 수 있도록 만들어진 문법이다. 


표현언어는 JSP 규격서가 처음 만들어질 때부터 있던 문법이 아니라 새롭게 추가된 문법이며, 이 문법을 이용하면 데이터를 출력하는 코드를 함축적이고 간결하게 구사할 수 있어 코드의 가독성과 유지보수 용이성에 큰 도움이 된다.


*연산자와 피연산자의 조합을 ${ }로 둘러싸서 표현한다.


*표현언어와 스크립트릿코드의 차이점

표현언어: ${cnt + 1}

스크립트릿 코드: <%= cnt + 1 %>


가 있을때 스크립트릿에서 사용한 cnt는 JAVA변수의 이름이며

표현언어에서 사용한 cnt는 Attribute의 이름으로 해석된다.

*Attibute란 setAttribute, getAttribute 메서드를 통해 저장되고 관리되는 데이터를 의미한다.


*표현언어와 스크립트릿코드의 차이점 예제

<%

       int sum = 0;

       for (int cnt = 1; cnt <= 100; cnt++)

              sum += cnt;

       request.setAttribute( ”RESULT ”, new Integer(sum));

       RequestDispatcher dispatcher =

                          request.getRequestDispatcher( ”HundredResult.jsp ”);

       dispatcher.forward(request, response);

%>


스크립트릿 코드: 1부터 100까지 더한 결과는?<%= request.getAttribute( ”RESULT ”) %> -> RESULT라는 Attribute를 변수로 변환해야 한다.
표현언어: 1부터 100까지 더한 결과는? ${RESULT} -> 바로 Attribute에서 찾는다고 보면 된다.


*데이터 이름 하나로만 구성된 EL식

데이터 이름 하나로만 구성된 EL식은 가장 간단한 형태의 EL식이다.

EL식 안에 기술되는 데이터 이름은 애트리뷰트 이름으로 해석된다.


*EL식이 특정 Attribute를 찾는 방법

EL식에 있는 데이터 이름을 해석하는 순서는 사용범위가 좁은 Attribute부터 점점 더 사용 범위가 넓은 Attribute순으로 진행된다.


*찾는 순서

Page -> Request -> Session -> Application


*순서와 상관없이 범위를 지정하여 Attribute를 접근하기 위해서는 다음과 같이 표시한다.

${requestScope.RESULT}

${pageScope.RESULT}


*EL의 내장객체


*Param 내장객체: 은 웹브라우저에서 <form>엘리먼트를 통해 입력된 데이터를 가져올때 사용하는 내장객체이다.


객체 사용방법

1)객체의 이름 뒤에 마침표를 찍고 사용

2)객체의 이름뒤에 대괄호를 입력하고 그안에 작은 따옴표로 데이터의 이름을 씀


1)${param.NUM}

2)${param["COLOR"]}



*paramValues 내장객체: <form>엘리먼트를 통해 똑같은 이름의 데이터가 여러개 입력될 경우

객체 사용방법

1)객체의 이름 뒤에 마침표를 찍고, 다음에 데이터 이름을 표시하고 그다음 대괄호 안에 인덱스를 표시한다.

2)객체의 이름 뒤에 대괄호를 표시하고 첫번째 대괄호에 "데이터이름"을 표시하고 그다음 대괄호 안에 [인덱스]를 표시한다.


1)${paramValues.ANIMAL[0]}

2)${paramValues[ ”ANIMAL ”][1]}


*Cookie 내장 객체

EL식이 가져오는 것은 쿠키의 값이 아니라 쿠키 객체이다.

특정 쿠키객체의 value출력

${cookie.name.value} 


*empty 연산자

Empty라는 단어 형태의 엠프티 연산자는 데이터의 존재 여부를 확인하는 단항 연사자이며, 

피연산자인 데이터 이름은 empty 연산자 뒤에 써야 한다.


<%@page contentType= ”text/html; charset=euc-kr ” %>
<HTML>
        <HEAD><TITLE>엠프티 연산자</TITLE></HEAD>
        <BODY>
                안녕하세요, ${empty param.ID ? ”guest ” : param.ID}
        </BODY>
</HTML>


*표현언어 예제


//데이터 형태에 따라서

각각 표현언어로 받아서 출력해보자.

<%@page import="java.util.Map"%>

<%@page import="java.util.HashMap"%>

<%@page import="kostaServlet.Member"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>


<% 

//String으로 넣기

request.setAttribute("name", "kosta");


//객체로 넣기

Member sohee = new Member();

sohee.setName("황소희");

request.setAttribute("member", sohee);

//HashMap 넣기

HashMap<String, String > map = 

new HashMap<String, String>();

map.put("sohee", "멍멍");

request.setAttribute("sounds", map);

%>

<!-- parameter로 값을 가지고 갈 수 있다. -->

<jsp:forward page="el_result.jsp">

<jsp:param value="apple" name="fruit"/>

</jsp:forward>



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>


</body>

</html>



<%@page import="java.util.HashMap"%>

<%@page import="kostaServlet.Member"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<% %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<!-- el태그와 getParamter메서드. -->

before :<%= request.getParameter("fruit") %> <br>

after : ${param.fruit} <br><br>

  //JAVA코드는 name이라는 Attribution을 변수로 반환후 가져와야하지만

 //EL은 Attribution이름으로 바로 접근하여 가져 올 수 있다.

before : <%= request.getAttribute("name")%> <br>

after : ${name} <br>


 //객체는 마찬가지로 member라는 Attribution에서 .으로 접근하여 name을 출력한다.

<!-- 캐스팅한 결과 까지니까 한번 더 감싸준다. -->

before : <%= ((Member)request.getAttribute("member")).getName() %> <br>

after : ${member.name} <br>

 //해쉬맵도 동일하다. 간편하다는것을 알 수 있다.

before : <%= ((HashMap)request.getAttribute("sounds")).get("sohee")%>

arter : ${sounds.sohee}

</body>

</html>




*JSTL

JSTL은 JSP표준 태그 라이브러리(JSP Standard Tag Library)의 약어이다.

=라이브러리는 여러 프로그램이 공통으로 사용하는 코드를 모아놓은 코드의 집합이다.

=JSTL도 라이브러리니까 라이브러리를 톰캣폴더에 넣고 tagLib지시자를 선언해야 합니다!

=접두어가 JSP라면 그것은 JSP의 공식태그이다. 나머지는 전부 커스텀태그라고 할 수 있다.


*JSTL으로 

간단한 프로그램 로직의 구사(자바의 변수 선언, if 문, for 문 등에 해당하는 로직)

다른 JSP 페이지 호출(<c:redirect>, <c:import>)

날짜, 시간, 숫자의 포맷

JSP 페이지 하나를 가지고 여러 가지 언어의 웹 페이지 생성

데이터베이스로의 입력, 수정, 삭제, 조회

XML 문서의 처리

문자열을 처리하는 함수 호출


*JSTL을 구성하는 작은 라이브러리들

코어: 일반 프로그래밍 언어에서 제공하는 것과 유사한 변수 선언. 실행 흐름의 제어 기능을 제공하고, 

  다른 JSP 페이지로 제어를 이동하는 기능도 제공

포매팅:숫자, 날짜, 시간을 포매팅하는 기능과 국제화, 다국어 지원 기능을 제공합니다

데이터베이스: 데이터베이스의 데이터를 입력/수정/삭제/조회하는 기능을 제공합니다.

JSP 페이지에서 접두어를 사용하기 위해서는 taglib지시자를 이용해서 라이브러리의 URI 식별자와 접두어를 연결할 수 있다.

Taglib 지시자는 다른 지시자와 마찬가지로 <%@로 시작해서 %>로 끝난다.


<%@taglib prefix= ”c ” uri= ”http://java.sun.com/jsp/jstl/core ” %>



*코어라이브러리 사용하기

<C:set> 커스텀 액션태그 사용방법 - 변수 선언하고 초기값 대입

<c:set>은 변수를 선언하고 나서 변수에 초기값을 대입하는 기능의 커스텀 액션태그이다.

JAVA의 예

int num = 100;//변수의 타입과 이름을 기술해야하며, 선택적으로 초기값을 기술할 수도 있다.


하지만 <C:set> 커스텀 액션태그 변수를 선언할 때는 변수의 타입을 쓰지 않는다.

<c:set var= ”num ” value= ”100 ” />


<C:set> 커스텀 액션태그의 value애트리뷰트 값에서는 EL식을 쓸 수도 있다.

<c:set var= ”sum ” value= ”${num1+num2} ” />


<C:set> 커스텀 액션태그 사용방법(2) - scope 지정하여 Attribute 선언

<c:set> 액션을 이용하면 page 데이터 영역뿐만 아니라 request, session, application 데이터 영역에 애트리뷰트를 저장하는 것도 가능하다.


<c:set> 태그에 scope라는 애트리뷰트를 추가하고 page, request, session, application 중 하나를 애트리뷰트 값으로 지정하면 된다.

<c:set var= ”PRICE ” value= ”15000 ” scope= ”request ” />

Scope 애트리뷰트에 request라는 값을 지정하고 나서 forward 메서드를 통해 다른 JSP 페이지를 호출하면 그 JSP 페이지 안에서도 <c:set>커스텀 액션태그로 선언된 변수를 사용할 수 있다.


*<C:set> 커스텀 액션태그 사용방법(3) -  

<c:set> 액션을 이용해서 선언한 변수는 자바 변수와 달리 page, request, session, application 데이터 영역에 애트리뷰트로 저장되기 때문에 인위적으로 삭제해야 할 필요가 있는데 이 경우 <c:remove> 커스텀 액션을 사용하면 된다.

<c:remove var= ”num ” /> = page 지정해서 삭제
<c:remove var= ”code ” scope= ”request ” /> = scope지정해서 삭제


<%@page import="kostaServlet.Member"%>

<%@page import="java.util.List"%>

<%@page import="java.util.ArrayList"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<!-- 지시자를 안쓰면 인식을 못합니다. -->

<%

String hello = "Hello";

%>

<c:set var='msg' value="Helo2"/>

<c:out value = '${msg}'> </c:out>

<!-- forEach 많이 씁니다!-->

<ul>

<c:forEach var='i' begin='1' end='9'>

<li>4 * ${i} = ${4 * i}</li>

</c:forEach>

</ul>

<!-- DAO에서 list를 가져왔다고 가정합니다. -->

<!-- 반복회수가 정해져있지 않을때. -->

<%

List<Member> list = new ArrayList<>();

list.add(new Member("aa","aa","aa",19));

list.add(new Member("bb","bb","bb",29));

//해당객체를 EL태그로 가져오려면 반드시 이렇게 써야 한다.

request.setAttribute("list", list);

%>

<table border='1'>

<tr>

<th> 아이디 </th>

<th> 비번 </th>

<th> 이름 </th>

<th> 나이 </th>

</tr>

<!-- 반복해야 하는 부분을 forEach 쓴다. forEach 정말 중요하다. -->

<c:forEach var="member" items="${list}">

<tr>

<th> ${member.id} </th>

<th> ${member.pass} </th>

<th> ${member.name} </th>

<th> ${member.age} </th>

</tr>

</c:forEach>

<c:redirect url="jstl_exam2.jsp">

<c:param name="fruit" value="apple"/>

</c:redirect>

</table>

</body>

</html>



<%@page import="java.util.Date"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<!-- parameter 받아보자. -->

<c:set var="fruit" value="${param.fruit}"/>

<!-- apple을 감싸는 따옴표와 test를 감싸는 따옴표는 다른것을 사용해야 한다. -->

<c:if test='${fruit == "apple"}'>

<c:out value ='${fruit}'></c:out>

</c:if>

<!-- 다중조건 choose when otherwise-->

<c:choose>

<c:when test="${fruit == 'apple'}">

<c:out value="${fruit}: 사과"></c:out>

</c:when>

<c:when test="${fruit == 'orange'}">

<c:out value="${fruit}: 오렌지"></c:out>

</c:when>

<c:otherwise>

<c:out value="${fruit}: 기타과일"/>

</c:otherwise>

</c:choose>

<c:set var="now" value="<%= new Date() %>"/>

before : ${now} <br>

after : <fmt:formatDate value="${now}" pattern="yyyy-MM-dd"/>

<c:set var="don" value="50000000000000"/>

before : <c:out value="${don}: 원"/>

after : <fmt:formatNumber value="${don}" type="currency" currencySymbol="$"/>

<fmt:formatNumber value="0.9" type="percent"/>

<fmt:formatNumber value="3.1438832" pattern="#.00"/>

</body>

</html>




*필터와 래퍼








































'Today I learned' 카테고리의 다른 글

1월10일  (0) 2019.01.10
1월7일  (0) 2019.01.07
2019년 1월2일  (0) 2019.01.02
12월28일  (0) 2019.01.02
12월14일  (0) 2018.12.27

댓글