JSTL (JSP Standard Tag Library)과 EL (Expression Language)
📍 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("") 이렇게도 사용함.