5/13(목) EL
1. EL(Expression Language) 표현 언어
: 기존에 사용했던 표현식(출력식) <%= name %> 와 같이
JSP에서 표현하고자 하는 구문을 ${ name } 의 형식으로 작성하는 것
데이터들을 담을 수 있는 JSP Scope 내장 객체
1) application
: 한 애플리케이션 당 단 1개 존재함
여기에 담으면 애플리케이션 전역에서 사용 가능( jsp/servlet/java )
공유 범위가 가장 큼
2) session (HttpSession)
: 한 브라우저당 1개씩 존재함
여기에 담으면 jsp/servlet에서 사용 가능
3) request (HttpServletRequest)
: 요청시 생성되는 객체(1회성 느낌)
여기에 담으면 해당 request 객체를 포워딩 받는 응답 jsp에서만 사용 가능
공유범위가 다소 제한적
4) page
해당 그 페이지에서만 사용 가능
공유범위가 가장 작음 ( 한 페이지 )
- 위의 객체들에 데이터를 담고자 할 때 .setAttribute("키", value(담고자하는 값))
- 꺼내고자 할 때는 .getAttribute("키") : 담긴 값(처음에는 Object타입으로 반환)
- 삭제하고자 할 때 .removeAttribute("키") : 키,밸류 몽땅그리 삭제됨
1.EL 기본 문법
Scope영역에 담은 값 뽑아내는 방법
먼저, scope영역에 값 담기
// requestScope에 담기
request.setAttribute("classRoom", "I강의장");
request.setAttribute("student", new Person("홍길동", 23, '남'));
// sessionScope에 담기
HttpSession session = request.getSession();
session.setAttribute("academy", "KH정보교육원");
session.setAttribute("teacher", new Person("강보람", 20, '여'));
// requestScope와 sessionScope에 같은 키값으로 담기
request.setAttribute("scope", "request");
session.setAttribute("scope", "session");
// applicationScope에 담기
ServletContext application = request.getServletContext();
application.setAttribute("scope", "application");
방법 1. 스크립틀릿 사용법
<h3> 1. 기존에 하던 방식대로 스크립틀릿과 표현식(출력식)을 이용해서 각 scope에 담겨있는 값 뽑아서 화면에 출력</h3>
<%
String classRoom = (String)request.getAttribute("classRoom");
Person student = (Person)request.getAttribute("student");
String academy = (String)session.getAttribute("academy");
Person teacher = (Person)session.getAttribute("teacher");
%>
<p>
학원명 : <%= academy %> <br>
강의장 : <%= classRoom %> <br>
강사 : <%= teacher.getName() %>, <%= teacher.getAge() %>, <%= teacher.getGender() %>
수강생 정보
<ul>
<li>이름 : <%= student.getName() %></li>
<li>나이 : <%= student.getAge() %></li>
<li>성별 : <%= student.getGender() %></li>
</ul>
</p>
방법 2. EL 사용법
<h3> 2. EL을 이용해서 보다 쉽게 JSP Scope 객체에 저장된 값 출력하기</h3>
<p>
getAttribute를 통해 값을 뽑을 필요 없이 el을 이용하면 키값 제시해서 바로 접근 가능 <br>
내부적으로 해당 scope에 get~~~을 자동적으로 활용ㅇ하여 해당 키 값의 밸류 값을 읽어옴 <br>
EL은 JSP Scope 영역을 구분하지 않고 해당 키값을 검색해서 존재하는 경우 밸류값을 가져옴
</p>
<p>
학원명 : ${ academy } <br>
강의장 : ${ classRoom } <br>
강사 : ${ teacher.name }, ${ teacher.age }, ${ teacher.gender }
<!-- 객체안의 밸류값을 뽑아오고 싶으면 .필드명으로 입력해주면 됨(내부적으로 getter메소드가 실행되므로 따로 getter 메소드 실행 안해도 됨)
단, Person 클래스에 getter 메소드 존재해야함!-->
</p>
수강생 정보
<ul>
<li>이름 : ${ student.name }</li>
<li>나이 : ${ student.age }</li>
<li>성별 : ${ student.gender }</li>
</ul>
EL 특징
단, EL 사용시 내장 객체에 저장된 키 값이 동일할 경우
<p> scope값 : ${ scope }</p>
<!-- EL은 공유범위 제일 작은 순서대로 해당 키 값을 검색
page => request => session => application
만일 해당 키 값이 모든 영역에 존재하지 않을 경우 : 아무것도 출력 안됨(오류 x, null 출력) -->
특정 scope 지정해서 키 값에 접근 가능
<%
// pageScope에 담기
pageContext.setAttribute("scope", "page");
%>
pageScope에 담긴 값 : $ { scope } 또는 $ { pageScope.scope } <br>
requestScope에 담긴 값 : $ { requestScope.scope } <br>
sessionScope에 담긴 값 : $ { sessionScope.scope } <br>
applicationScope에 담긴 값 : $ { applicationScope.scope } <br>
<!--
여러 스코프에 동일한 키 값의 속성을 기록했다면 명시적으로 스코프를 지정해서 접근
-->
존재하지 않는 키값 : ${ test } 또는 ${ requestScope.test } <br><br> <!-- 아무것도 출력 안됨 -->
<%
Person p = new Person(); // 각 필드에 초기값 세팅( null, 0 , ' ')
pageContext.setAttribute("p",p);
%>
이름 : ${ p.name } <!-- 아무것도 출력 안됨 -->
2.EL(Param)
: jsp에서 서블릿 거쳐서 항상 또다른 jsp로 넘어갔음
하지만 jsp에서 또다른 jsp를 바로 url로 요청도 가능
그 때 요청시 전달할 값 전달 가능! (권장 x, 디렉토리 구조가 노출)
<입력단>
<form action="views/1_EL/02_elParam.jsp">
<fieldset>
<input type="text" name="pname" placeholder="제품명을 입력하세요"><br>
<input type="number" name="pcount" placeholder="수량을 입력하세요"><br>
<input type="text" name="option" placeholder="옵션1"><br>
<input type="text" name="option" placeholder="옵션2"><br>
<button type="submit">02_EL(Param)</button>
</fieldset>
</form>
<출력단>
** 기존 방식
<!--
<%
String pname = request.getParameter("pname");
String [] options = request.getParameterValues("option"); // 배열로 받아오는 것
%>
-->
** 새로운 방식
<p>
해당 페이지 요청시 전달값은 내부적으로 param 영역에 저장되어 있음 <br>
param : 해당 페이지 요청시 전달된 값을 받아올 때 사용
paramValues : 해당 페이지 요청시 전달된 값들을 배열로 받아올 때 사용
</p>
<h2> 주문내역</h2>
<p>
상품명 : ${ param.pname } <br>
수량 : ${ parmam.pcount } <br>
옵션 1 : ${ paramValues.option[0] } <br> <!-- 배열중 첫번째 인덱스값 가져오기 -->
옵션 2 : ${ paramValues.option[1] }
</p>
3. EL(연산자)
기본 숫자 세팅
request.setAttribute("big", 10);
request.setAttribute("small", 3);
request.setAttribute("sOne", "안녕");
request.setAttribute("sTwo", new String("안녕"));
request.setAttribute("pone", new Person("홍길동", 20, '남'));
request.setAttribute("pTwo", new Person("홍길동", 20, '남'));
request.setAttribute("p", null);
ArrayList<String> list1 = new ArrayList<>();
request.setAttribute("list1", list1);
ArrayList<String> list2 = new ArrayList<>();
list2.add("test");
request.setAttribute("list2", list2);
1) 산술 연산
scriptlet 방식 : <%= (int)request.getAttribute("big") + (int)request.getAttribute("small") %>
el 방식 : ${ big + small };
<p>
10 + 3 = ${ big + small } <br>
10 - 3 = ${ big - small } <br>
10 x 3 = ${ big * small } <br>
10 / 3 = ${ big / small } 또는 ${ big div small } <br>
10 % 3 = ${ big % small } 또는 ${ big mod small }
</p>
2) 숫자간 대소 비교 연산
<p>
10 > 3 = ${ big > small } 또는 ${ big gt small } <br> <!-- greater than -->
10 < 3 = ${ big < small } 또는 ${ big lt small } <br> <!-- little than -->
10 > 3 = ${ big >= small } 또는 ${ big ge small } <br> <!-- grater or equal -->
10 < 3 = ${ big <= small } 또는 ${ big le small } <!-- little or equal -->
</p>
3) 동등 비교 연산
big과 small 이 같습니까: ${ big == small } 또는 ${ big eq small } <br>
big과 small이 같지 않습니까: ${ big != small } 또는 ${ big ne small } <br>
sOne과 sTwo가 같습니까: ${ sOne == sTwo } 또는 ${ sOne eq sTwo } <br>
pOne과 pTwo가 같습니까: ${ pOne == pTwo } 또는 ${ pOne eq pTwo } <!-- 주소값 비교로 false나옴 -->
4) 객체가 null인지 또는 비어있는지 체크 (empty)
p가 null 입니까 : ${ p == null } 또는 ${ empty p } <br>
p가 null 아닙니까 : ${ p != null } 또는 ${ !empty p } <br>
list1이 비어있습니까 : ${ empty list1 } <br>
list2이 비어있습니까 : ${ empty list2 }
5) 논리연산자
${ true && true } 또는 $ { true and true } <br>
${ true || true } 또는 $ { true or false }
4. JSP Action Tag
JSP를 이루는 구성인자
1) 스크립팅 원소 : jsp페이지에서 자바코드를 직접 기술 할 수 있게 하는 기능
ex) 스크립틀릿, 표현식(출력식) 등등
2) 지시어 : jsp페이지 정보에 대한 내용을 표현한다거나 다른 jsp 페이지 포함할때 사용
jsp의 기능을 확장시키는 라이브러리 등록할 때도 사용
ex) page지시어, include지시어, taglib지시어
3) JSP 액션태그 ( 표준 액션 태그, 커스텀 액션 태그 )
: XML 기술을 이용해서 기존의 JSP 문법을 확장하는 기술을 제공하는 태그
- 표준 액션 태그 (Standard Action)
: jsp 페이지에서 바로 사용 가능(별도의 연동 없이)
표준액션 태그는 모든 태그명 앞에 jsp: 라는 접두어 붙음
include 지시어
: 다른 페이지를 포함하고자 할 때 사용
<기존 방식 include 지시어 >
- 특징 : include한 페이지에 선언된 변수를 여기서도 사용 가능(변수 공유)
- 단점 : 이 페이지에서 동일한 이름의 변수로 선언 불가
<%-- <%@ include file = "footer.jsp" %> --%>
<%-- include한 페이지의 year변수 값 : <%= year %> --%> <br><br>
<%-- <% String year = "1995"; %> --%>
<JSP 표준 액션 태그 이용한 방식>
- 특징 1 : include한 페이지에 선언된 변수를 사용 못함(변수공유 x => 동일한 이름으로 재선언 가능)
- 특징 2 : 포함을 시키되 include할 페이지로 값 전달할 수 도 있음
<jsp:include page = "footer.jsp" /> <br><br>
<jsp:include page = "footer.jsp">
<jsp:param name = "owner" value="gildong" />
</jsp:include>
<hr>
<jsp:include page = "footer.jsp">
<jsp:param name = "owner" value="boram" />
</jsp:include>
- 커스텀 액션 태그 (Custom Action)
: jsp 페이지에서 바로 사용 불가능 (라이브러리 설치 후 사용하고자 하는 jsp페이지에 연동 해야됨)
커스텀 액션태그는 모든 태그명 앞에 jsp: 이외의 접두어 붙음
제공되고 있는 대표적인 유용한 라이브러리가 있음(jstl)
Author And Source
이 문제에 관하여(5/13(목) EL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@alsrnr45/513목-자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)