5/13(목) EL

28390 단어 jspjsp

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 &gt; 3 = ${ big > small } 또는 ${ big gt small } <br> <!-- greater than --> 
    10 &lt; 3 = ${ big < small } 또는 ${ big lt small } <br> <!-- little than -->
    10 &gt; 3 = ${ big >= small } 또는 ${ big ge small } <br> <!-- grater or equal -->
    10 &lt; 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)

좋은 웹페이지 즐겨찾기