EL 시작전 문제
https://drive.google.com/drive/folders/1uHumdQakO7YC89ZfQeIyGcoGufJGvhdj?hl=ko
의 jsp기초 EL부분을 다운받자
prodList.jsp를 실행하고 하드코딩이 아닌 반복문으로 구현해보자
view는 prodId값에 맞는 화면이 보이도록 구현해보자.
실행결과
스크립트 언어
스크립트 언어(scripting language)란 응용 소프트웨어를 제어하는
컴퓨터 프로그래밍 언어를 가리킨다. 스크립트 프로그래밍 언어라고도 한다.
스크립트 언어는 응용 프로그램과 독립하여 사용되고
일반적으로 응용 프로그램의 언어와 다른 언어로 사용되어
최종사용자가 응용 프로그램의 동작을 사용자의 요구에 맞게 수행할 수 있도록 해준다.
여기서 응용 프로그램의 언어는 java다. html은 마크업언어다.
EL(Expression Language 표현언어)
표현언어는 스크립트 언어로서 스크립트 요소 중 하나이다.
java와 함께 사용되어 개발자가 JSP의 스크립트 요소를 보완하는 역할을 한다.
표현언어는 JSP에서 다음과 같은 기능을 제공한다
- JSP의 네 가지 기본 객체(page,request,session,application)가 제공하는 영역의 속성 사용
- 쿠키,기본 객체의 속성 등 JSP의 기본객체 제공
- 수치연산,관계연산,논리 연산자 제공
- 자바 클래스 메서드 호출
- 람다식을 이용한 함수 정의와 실행
- 정적 메서드 실행
- 스트림 API를 통한 컬렉션 처리
람다,정적메서드, 스트림 등은 자바랑 크게 다를 것없다.
EL 실습
${expr} 를 기본으로 하고
${expr.attr1} 또는 ${expr["attr1"]}과 같은 형태로 사용한다
영역의 속성 사용 및 기본객체 사용
기본적으로 EL은 ${}안에 쓰여진 내용을 출력한다
01el_basic.jsp
<%@page import="com.study.common.util.UserList"%>
<%@page import="com.study.login.vo.UserVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<title>el</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<%
session.setAttribute("name","한창희");
UserVO user=new UserVO();
user.setUserId("a001");
user.setUserName("한창희");
user.setUserPass("1004");
user.setUserRole("member");
request.setAttribute("user",user);
//setAttribute는 Object를 담을 수 있다.
%>
이름 : ${name } <br>
user : ${user } <br>
userID : ${user.userId} <br>
userPass : ${user.userPass } <br>
없는속성 EL로 : ${useraaaaaa } <!-- 아무것도안나옴 --> <br>
<%-- 프로퍼티가 틀리면:${user.nonono } 에러난다 --%>
<hr>
기본객체 접근하기 <br>
요청 URI : <%=request.getRequestURI() %> <br>
요청 URI : ${pageContext.request.requestURI} <br>
쿠키 접근: ${cookie.JSESSIONID.value }
<!-- pageContext, pageScope, requestScope,sessionScope,applicationScope,param
paramValues,header,headerValues,cookie,initParam 외울필요 없다.
-->
<hr>
문자열 출력 <br>
${"이것은 문자여" }
</body>
</html>
기본객체의 속성에 값을 담으면 EL로 사용할 수 있다.
또 기본 객체들도 EL로 사용할 수 있다.
request.setAttribute("user",어떤 값 또는 객체);
...그 후 화면에 출력하고 싶을 곳에서 사용
${user}
EL의 수치연산자
EL에서 '+'는 기본적으로 산술연산만 지원한다.
JAVA에서 처럼 문자열더하기 등을 지원하지않는다.
${"문자" +1}은 JAVA에서는 "문자1"이지만 EL은 에러를 발생한다.
그럼 ${"10"+1}은 에러가 날거같지만 "10"을 long으로 변환한 후 연산을 수행한다.
${"0.1"+1}은 "0.1"을 double로 바꾼 후 연산을 수행한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
${"10"+1} <br>
${0.1+1 } <br>
${"0.1"+1 }<br>
<br>
${30/3 }<br>
<%--EL의 +는 기본 산술연산자 ${"문자"+1 } 은 "문자"를 long타입으로 바꾸지 못 해 에러가 난다--%>
</body>
</html>
EL 비교연산자,논리연산자, empty연산자
비교연산자인 == != < > <= => 등은 eq, ne, lt, gt, le, ge로 대신할 수 있다.
논리연산자인 && || !를 써도 되지만 각각 and or not으로도 쓸 수 있다.
또 empty <값>으로 값이 비어있는지의 여부도 조사할 수 있다.
empty는 null, "", 길이0배열, 빈 컬렉션 일 때 true를 리턴한다.
03el_eq.jsp
<%@page import="java.util.HashMap"%>
<%@page import="com.study.login.vo.UserVO"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<title></title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<%
request.setAttribute("han", null);
request.setAttribute("ch", new HashMap());
%>
<pre>
${500==500 } ${500 eq 500 }
${1000 !=500 } ${1000 ne 500 }
${1000>500 } ${1000 gt 500 }
${1000<500 } ${1000 lt 500}
${1000>=500 } ${1000 ge 500 }
${1000<=500 } ${1000 le 500}
${true && true } ${true and true }
${true || false } ${true or false }
${!true } ${not true }
${ not empty han }
${empty ch } <!-- 컬렉션은 아무것도 안담겨있으면 empty -->
${1000>500 ? "한창희" : "" }
</pre>
<!-- <pre>태그는 태그 안에서의 형식을 맞춤.. 즉 엔터나 뛰어쓰기 등 적용 -->
</body>
</html>
EL컬렉션
EL에서 컬렉션 객체의 선언은 list=[], map={"":o} , set={} 처럼 한다.
또 컬렉션을EL로 사용하면 해당 원소들을 전부 출력해준다.
04el_collection.jsp
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="com.study.login.vo.UserVO"%>
<%@page import="com.study.common.util.UserList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<title></title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<!-- 04el_collection
list=[], map={"":o} , set={} -->
${[1,2,3,4,5]} <br>
${{"a":1,"b":2 }}<br>
${{1,2,3,4,5} } <br>
<hr>
<%
List<UserVO> userList=new UserList().getUserList();
request.setAttribute("userList", userList);
Map<String,UserVO> userMap=new UserList().getUsersMap();
request.setAttribute("userMap", userMap);
%>
list : ${userList } <br>
map : ${userMap } <br>
</body>
</html>
※안에 담긴 UserVO내용이 출력되는 건 UserVO에서 toString을 재정의했기 떄문이다.
EL 세미콜론과 변수할당
EL에서도 변수할당을 할 수 있다.
${a="나는 a에요"}
이렇게 선언하고 나서 EL변수 a를 사용 할 수 있다.
다만 문제는 위의 변수 선언식 자체도 출력이 된다는 것이다.
변수만 할당하고 출력 하지 않게 하기위해선 ';' 을 사용하면 된다
${A ; B} 형식에서 ; 앞 A는 아무것도 출력되지않고 B만 출력된다
05el_semicolon.jsp
<%@page import="com.study.common.util.UserList"%>
<%@page import="com.study.login.vo.UserVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<title></title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
05el_semicolonAssign.jsp
<!-- ; 앞에는 출력을 안해요
a=1 같은 할당연산자는 el에서 출력을 해요
a=1하고 출력하고싶진 않을때 ;을 붙이면 됩니다
-->
<pre>
${10;"asd" }
${a=1;''}
${a }
<%
UserVO user=new UserVO("a","name","pass","student");
request.setAttribute("user", user);
%>
${a=user;'' }
${a.userRole }
</pre>
</body>
</html>
사실 EL의 가장 큰 무기는 EL단독으로 사용하기보단
JSP태그를 보완하는 용도로 사용할 때이다.
다음에 배울 JSTL과 같이 EL을 사용한다면
처음에 만든 prodList.jsp, prodView.jsp를 좀 더 직관적이고 편리하게 만들 수 있다.