JSP

JSTL (JSP Standard Tag Library)과 EL (Expression Language)

태로미 2023. 4. 13. 00:14

 

 

 

 

 

 

 

 

📍    JSTL (JSP Standard Tag Library)

–   자카르타에서 제공하는 자주 사용되는 필요한 기능들을 모아놓은 커스텀 태그 라이브러리.

–   프로그래밍 시 필요한 대부분의 기능을 처리할 수 있기 때문에 실무에서의 JSTL 사용 빈도는 높음.

–   용도에 따라 사용하는 기능이 달라지는데 크게 5가지로 분류됨.

     1 )   core             :   기본적인 기능들을 제공.

     2 )   function

     3 )   fmt               :   format의 약자,  형식화에 관한 기능들을 제공.

     4 )   xml              :   XML처리에 좀 더 편한 기능을 제공.

     4 )   sql               :   SQL처리에 좀 더 편한 기능을 제공.

 

 

 

 

 

▸   라이브러리 설치

–   톰캣에서 Taglibs에서 Jar Files 3개를 다운 받음.  EL만 필요한데 편의상 3개 다 다운 받음.

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

📍    EL (Expression Language)

–   JSP 스크립트 태그와 out.print()를 대신하여 JSP값들을 좀 더 편리하게 출력하기 위해 제공되는 언어.

–   변수값과  연산자 (산술 / 비교 / 논리)와 내장 객체도 제공함.


$ {변수 / 연산 / 객체 / 객체.변수}

 

 

 

 

 

▸   EL의 내장객체

내장 객체 설명
   pageScope    Page 영역에 존재하는 객체를 참조할 때 사용.
   requestScope    Request 영역에 존재하는 객체를 참조할 때 사용.
   sessionScope    Session 영역에 존재하는 객체를 참조할 때 사용.
   applicationScope    Application 영역에 존재하는 객체를 참조할 때 사용.
   param    파라미터 값을 얻어올 때 사용.
   paramValues    파라미터 값을 배열로 얻어올 때 사용.
   header    Header 정보를 얻어올 때 사용.
   headerValues    Header 정보를 배열로 얻어올 때 사용.
   cookie    쿠키 객체를 참조할 때 사용.
   initParam    컨텍스트의 초기화 파라미터를 의미.
   pageConxext    PageContext 객체를 참조할 때 사용.

 

 

 

 

 

 

 

 

 

 

▸   EL 표현식의 정보 전달 및 저장

 


📃   paramTest.jsp


•   form 형식 작성

<form action="paramTestPro.jsp" method="post">
	ID : <input type="text" name="id"> <br>
	AGE : <input type="text" name="age"> <br>
    
	Menu1 : <input type="text" name="menu"> <br>
	Menu2 : <input type="text" name="menu"> <br>
	
	<input type="checkbox" name="hobbys" value="게임"> 게임
	<input type="checkbox" name="hobbys" value="요리"> 요리
	<input type="checkbox" name="hobbys" value="운동"> 운동
	
	<input type="submit" value="전송">
</form>

–   기본적으로 ID와 AGE을 작성하고 name 속성이 같은 Menu1과 Menu2,  체크박스 타입까지 추가함.

–   '전송' 버튼으로 paramTestPro.jsp 페이지로 이동.

 

 

 


📃   paramPro.jsp


1.   JSP코드로 전달 정보 저장 & 출력

<%
    // 한글처리
    request.setCharacterEncoding("UTF-8");

    // 파라미터로 전달 정보 저장
    String id = request.getParameter("id");
    int age = Integer.parseInt(request.getParameter("age"));
	
    // 배열로 한 번에 저장
    // String manu1 = request.getParameter("manu");
    // String manu2 = request.getParameter("manu");
    String[] menu = request.getParameterValues("menu");

    // 체크박스타입 배열에 정보 저장
    String[] hobbys = request.getParameterValues("hobbys");
%>


id : <%=id %> <br>
age : <%=age %> <br>
 
menu1 : <%=menu[0] %> <br>
menu2 : <%=menu[1] %> <br>

<hr>

<%if(hobbys != null){
	for(int i=0; i<hobbys.length; i++){ %>
		취미<%=i+1 %> : <%=hobbys[i] %>

<%	} 
}
%>
코드 분석
7
  –   age 데이터는 int타입으로 저장하고 싶으므로 파라미터로 정보를 받아와서
       Integer.ParseInt로 문자열 데이터를 정수형으로 변환한 후 int타입 변수 age에 저장함.

10~15
  –   파라미터로 넘어온 정보를 변수 하나하나에 저장할 수도 있지만,
       배열을 생성하여 request 객체의 getParameterValues로 name 속성값으로 받아와 한 번에 저장 가능.

27~33
  –   표현식은 JSP 반복문 코드로 모든 배열의 요소에 접근할 수 있음.

 

 

2.   EL 표현식으로 전달 정보 출력

id(el)       : ${id } <br>

id(el-param) : ${param } <br>

id(el)       : ${param.id } <br>
age(el)      : ${param.age } <br>

age(el)+100  : ${param.age + 100 } <br>

menu1(el) : ${paramValues.menu[0] } <br>
menu2(el) : ${paramValues.menu[1] } <br>

취미1 : ${paramVaules.hobbys[0] } <br>
취미2 : ${paramVaules.hobbys[1] } <br>
취미3 : ${paramVaules.hobbys[2] } <br>
코드 분석
1
  –   el표현식의 null값은 '공백'문자로 출력됨.
  –   표현식처럼 form태그에서 전달 받은 name 속성 값을 입력하면 데이터 출력이 안됨.
  –   표현식에서는 null이 null로 나타나지만 el표현식의 null은 공백문자로 출력됨.
        →   사용자 입장에서 null 보다는 차라리 아무것도 안뜨는게 나음.
               null이뜨면 궁금해서 검색해보고 에러라는걸 알게 되면 프로그램에대한 신뢰도 하락.
        →   개발자 입장에선 원래 프로그램상 null값이 뜨면 에러가 발생하는데,
               el표현식으로 인해 null일 때 에러가 발생하지 않으면서 프로그램의 안정성이 올라감.


3
  –   파라미터로 받아온 정보를 모두 보여줌.

4
  –   파라미터로 받아온 'id'정보를 출력함.

8
  –   더하기 연산을 수행함으로써 해당 데이터가 정수인지 문자열인지 알 수 있음. 
        →   연결 연산자가 아닌 덧셈 연산자로 적용됨.

        →   즉,  el 표현식은 param데이터를 자동으로 캐스팅 (형변환)해줌.

10, 11
  –   메뉴정보는 총 2개.
  –   이렇게 저장하고자 하는 정보가 같은 name값으로 여러 개일때는 '배열'에 저장함.
       파라미터의 값을 배열로 얻어오는 el 표현식의 내장객체 paramValues 사용.

13~15
  •   체크박스타입 저장하기
  –   el표현식은 JSP코드로 반복하는 반복문 사용 불가.
       →   반복문 사용해서 배열에서 하나씩 데이터 꺼내오는걸 사용 못함.
       →   JSTL-foreach문을 사용하면 가능.

 

 

 

 

 

 

 

 

 

 

▸   EL 표현식의 연산자

 


📃   operatorTest.jsp


<h1>operatorTest.jsp</h1>

<form action="operatorTestPro.jsp" method="get">
	 숫자1 : <input type="text" name="num1"> <br>
	 숫자2 : <input type="text" name="num2"> <br>
	 ID : <input type="text" name="id"> <br>
	 
	 <input type="submit" value="전송">
</form>

 

 

 


📃    operatorTestPro 페이지


<h1>operatorTestPro.jsp</h1>

<!-- el표현식을 사용한 정보 출력 -->
숫자1 : ${param.num1 }, 숫자2 : ${param.num2 } <br>
<hr>

<!-- Operator - 산술연산 -->
숫자1 + 숫자2 = ${param.num1 } + ${param.num2 } <br>
숫자1 + 숫자2 = ${param.num1 + param.num2 }
<hr>

–   사용자가 입력한 num1과 num2값이 출력됨.

–   el 표현식은 산술연산이 가능. (el 표현식안에 작성)

–   산술 연산 시,  하나의 el표현식 안에서 2개의 변수를 더하는 연산을 실행해야 함.

   실행 결과

 

 

•   Pro페이지에서 바로 실행했을 때

–   원래라면 Form태그로부터 정보가 전달됐는데 전달된 정보가 없음.

–   param 데이터값들이 안보이는데 마지막 연산식에서는 '0'이 보임.
–   param 데이터가 전달되지 않은 상태에서 출력할 때 나오는 null값이 el 표현식에서는 공백으로 출력됨.
     근데 연산을 하면 int로 바뀌고 (자동 형변환) int타입의 기본 값 '0'으로 바뀐다는걸 알 수 있음.
      →   el 표현식의 특징 중 하나는 바로 null값을 만들지 않는 것.

 

 

•   양수인지 판단하기   — 삼항조건연산자

숫자1, 숫자2 모두 양수? <br>
${ (param.num1 > 0) && (param.num2 > 0) } <br>
${ (param.num1 > 0) && (param.num2 > 0)? "모두 양수" : "모두 양수 아님" } <br>
<hr>

–   논리연산자 사용하여 모두 양수인지 판단하기.
     →   삼항연산자 사용도 가능.
–   식의 가독성을 위해서 괄호로 묶어주면 좋음.

   실행 결과

 

 

•   숫자 데이터타입에 따른 양수,  음수,  0  판단

숫자 데이터타입에 따른 '양수', '음수' 구분 <br>
숫자1 = ${ param.num1 > 0? "양수" : param.num1 < 0? "음수" : 0 } <br>
숫자2 = ${ param.num2 > 0? "양수" : param.num2 < 0? "음수" : 0 }
<hr>

   실행 결과

 

 

•   아이디 유무에 따른 메세지 출력

아이디 : ${param.id } <br>

아이디 : ${(param.id == "")? "게스트" : param.id }님 안녕하세요! <br>
아이디 : ${(empty param.id)? "게스트" : param.id }님 안녕하세요! <br>
아이디 : ${(param.id.equals(""))? "게스트" : param.id }님 안녕하세요! <br>
아이디 : ${(param.id.eq(""))? "게스트" : param.id }님 안녕하세요! <br>
<hr>

–   test 페이지에서 사용자가 아이디를 입력한 경우,  '' ㅇㅇㅇ님,  안녕하세요!" 문구를 출력하고,

     아이디가 없는 경우 "게스트"님,  안녕하세요! 문구를 출력하게끔 삼항조건연산자를 사용함.

–   메세지에서 조건에 따라 바뀌는것은 아이디와 게스트이므로 해당 부분을 삼항 '조건' 연산자를 사용하여 출력해줌.

–   param.id가 String타입이기 때문에 equals() 메서드 사용 가능.
     사실상 동등연산자 (==)보다 equals("")가 좀 더 맞는 표현.
     →   조건식에 empty 연산자 사용 가능.
     →   비교연산자 eq("") 이렇게도 사용함.