* JSP의 구성요소
1. 디렉티브 : JSP 페이지에 대한 설정 정보를 지정할 때 사용
<%@ page
<%@ include
2. 스크립트 요소 : java 코드를 사용하기 위함
<% %>, <%= %>, <%! >
* 표현식 : <%= %> *
3. 기본 객체 : 웹 프로그램에 필요한 기능을 제공하는 내장 객체
request, response, out, application, pageContext, session, ...
4. 표현언어(EL)
5. JSTL(액션태그)
* [ 접근 제한자 ]
같은 클래스 같은 패키지 자식 클래스 다른 패키지
private o x x x
default o o x x
1. 표현 언어란?
- JSP에서 사용가능한 스크립트 언어
- EL의 주요 기능
• JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용
• 집합 객체에 대한 접근 방법 제공
• 수치 연산, 관계 연산, 논리 연산자 제공
• 자바 클래스 메서드 호출 기능 제공
• 표현언어만의 기본 객체 제공
- 표현 언어는 표현식보다 간결하고 편리하기 때문에 많이 사용한다.
<%-- 표현식 --%>
<%= member.getAddress().getZipcode() %>
<%-- 표현 언어 --%>
${member.address.zipcode}
* 자바 코드로 문서를 출력할 때 사용한 방식 = 표현식
* 표현언어에서 오해하지 말아야 할 것!! 자바코드처럼 필드에 접근하여 가져오는 것이 아니다!!
getAddress() 가 아닌 address 로만 적어서 자바코드처럼 필드에 접근하여 가져오는 것으로
오해할 수 있지만!! 그게 아니다!! getAddress( ) 로 가져오는 것인데 그냥 표현만 address로 하는 것 뿐!!
get 메서드로 접근하여 가져오는 것이다.
[ 1. EL의 구성 ]
- ${expr} 형식은 구문을 분석할 때 곧바로 값을 계산한다.
* 일단은 이 ${expr} 형식만 알아두자!! #{expr} 형식은 잘 사용안함
- #{expr} 형식은 실제로 값이 사용될 때 값을 계산한다.
• JSP 템플릿 텍스트에서는 사용 불가 (잘 사용되지 않음)
<%-- 기본형 --%>
${expr}, #{expr}
<%-- EL의 예시 --%>
<jsp:include page="/module/${skin.id}/header.jsp" flush="true" />
<b>${sessionScope.member.id}</b>님 환영합니다.
<%
Member m = new Member( );
m.setName("이름1");
%>
<c:set var="m" value="<%= m %>" />
<c:set var="name" value="${m.name}" /> <%--이 시점에는 바로 값 계산 --%>
<% m.setName("이름2"); %>
${name} <%-- name의 값은 "이름1" --%>
<c:set var="m" value="<%= m %>" />
<!-- 위의 코드 c 는 액션태그 -> 변수를 지정해준다.
이 코드는 표현식으로 나타낸 것이고 이코드를 바로 다음 아래줄처럼 표현언어로 적은 것이다. -->
<c:set var="name" value="#{m.name}" /> <%-- 이 시점에는 값 생성하지 않음 --%>
<% m.setName("이름2"); %>
${name} <%-- 구문을 분석할 때 값 계산, "이름2" 출력 --%>
<%-- JSP의 템플릿 텍스트에서 #{expr}을 사용하면 에러 발생 --%>
#{sessionScope.name.id}님 환영합니다.
*
<jsp:include page = `"/module/" +<%=skin.getId()%>+"/header.js"` flush="true"/> 코드와
<jsp:include page="/module/${skin.id}/header.jsp" flush="true" /> 코드는 같은 코드이다.
* >${sessionScope.memeber.id} 코드는
session 객체 안에 들어있는 member라는 속성값 안에 들어있는 id 값을 출력하라 라는 뜻이다.
* 위의 코드 c 는 액션태그 -> 변수를 지정해준다.
이 코드는 표현식으로 나타낸 것이고 이코드를 바로 다음 아래줄처럼 표현언어로 적은 것이다.
2. EL 기초
[ 1. EL의 데이터 타입과 리터럴 ]
- EL은 불리언(Boolean) 타입, 정수 타입, 실수 타입, 문자열 타입, 그리고 널 타입의 5가지 타입을 제공한다.
${10}은 정수, ${10.1}은 실수
[ 2. EL 기본 객체 ]
< 설명 >
* pageContext : 페이지 영역에 해당하는 기본 객체
<%
pageContext.setAttribute("name","홍길동");
pageContext.setAttribute("id","hong");
%>
${pageScope.name} // "홍길동" 출력
${pageScope.id} // "hong" 출력
<%= request.getParameter("id") %> // "hong"
${param.id} // "hong"
- 위의 두 코드는 같은 것을 의미하는 코드 -
pageScope 객체는 pageContext에 저장된 Attribute key, value 값을 매핑하여 저장한 map 객체..?
* request 객체에서 parameter로 넘어온 값을 param 이라는 객체가 가지고 있게 된다.
<!-- useELObject.jsp 코드 -->
<%@ page contentType = "text/html; charset=utf-8" %>
<%
request.setAttribute("name", "최범균");
%>
<html>
<head><title>EL Object</title></head>
<body>
<!-- <%= pageContext.getRequest().getRequestURI() %>
이 코드를 EL로 적으면 아래의 코드이다. -->
요청 URI: ${pageContext.request.requestURI}<br>
<!-- <%= request.getAttribute("name") %>
이 코드를 표현언어(EL)로 적으면 아래의 코드처럼 된다. -->
request의 name 속성: ${requestScope.name}<br>
<!-- <%= request.getParameter("code") %> 이 코드는 표현식으로 적은 것이고
이것을 EL로 표현하면 아래의 코드가 된다.-->
code 파라미터: ${param.code}
</body>
</html>
[ 3. 객체 접근 ]
- EL 언어는 객체에 저장된 값에 접근할 때 점(.)이나 대괄호([])를 사용한다.
${coockie.ID.value}
${coockie.name} == ${cookie['name']}
[ 4. 객체 탐색 ]
${pageScope.NAME}
${name} <!-- page,request,session,application 영역을 차례대로 검사해서 이름이 name의 속성값 사용 -->
* ${pageScope.NAME} 코드를 더 간단하게 적으면 바로 아래에 있는 ${name} 코드가 된다.
* ${name} 코드에서 name이 page 객체에 있는 속성값인지, request 객체에 있는 값인지 어디에 있는 값인지 따로 표시를 안해줘도 알아서 자동으로 page, request, session, application 영역을 차례대로 확인하면서 name 이라는 속성값이 있는지 검사해서 값을 가져와 출력해준다.
* <%= pageContext.getAttribute("name") %>
<%= session.getAttribute("name") %>
- 위의 두 코드를 간결하게 적은 코드가 아래의 코드 -
${name}
[ 5. 수치 연산자 ]
${"10" + 1 } <!-- 숫자 11 -->
${"일" + 10} <!-- 에러 발생 -->
${null + 1 } <!-- 1 -->
[ 6. 비교 연산자 ]
${someValue == '2004'}
<!-- someValue.compareTo('2004') == 0 과 같은 의미로 객체가 같은 값을 갖는지를 비교한다. -->
[ 7. 논리 연산자 ], [ 8. empty 연산자 ], [ 9. 비교 선택 연산자 ], [ 10. 문자열 연결 ]
skip!!
[ 11. 컬렉션 ]
- EL 3.0 버전부터 EL 식에서 직접 List, Map, Set 타입의 객체를 생성할 수 있게 되었다.
# EL에서 List 타입 객체를 생성할 때는 [원소1, 원소2, 원소3] 구문을 사용한다.
<c:set var="vals" values="${[1,2,5,10]}" />
${vals[2]} --> 5
<c:set var="mem" value="${ {'name':'홍길동','age':20} }" />
${mem.name}, ${mem.age}
<!-- ${mem.name}는 "홍길동" 출력됨, ${mem.age}는 20 출력됨 -->
# Set 타입의 EL 객체를 생성할 때는 {원소1, 원소2, 원소3} 구문을 사용한다. <!-- 중괄호 { }는 set타입이다. -->
<c:set var="hangul" value="${ {'가','나','다'} }" />
${hangul}
# Map과 List를 혼합해서 생성할 수도 있다. <!-- 리스트 안에 들어있는 원소들이 map 으로 되어 있는 것이다. -->
<c:set var="codes" value="${ [ {'code':'001','label':'1번'}, {'code':'001','label':'1번'} ] }" />
${codes[0].code / ${codes[0].label} <!-- 001/1 출력됨 -->
[ 12. 세미콜론 연산자 ], [ 13. 할당 연산자 ] skip!
3. EL에서 객체의 메서드 호출
// WEB-INF > src > chap11 > Thermometer.java 코드
package chap11;
import java.util.HashMap;
import java.util.Map;
public class Thermometer {
private Map<String, Double> locationCelsiusMap =
new HashMap<String, Double>(); // {"서울" : 27.3}
public void setCelsius(String location, Double value) {
locationCelsiusMap.put(location, value);
}
public Double getCelsius(String location) {
return locationCelsiusMap.get(location);
}
public Double getFahrenheit(String location) {
Double celsius = getCelsius(location);
if (celsius == null) {
return null;
}
return celsius.doubleValue() * 1.8 + 32.0;
}
public String getInfo() {
return "온도계 변환기 1.1";
}
}
<!-- thermometer.jsp 코드 -->
<%@page import="chap11.Thermometer"%>
<%@ page contentType="text/html; charset=utf-8"%>
<%
Thermometer thermometer = new Thermometer();
request.setAttribute("t", thermometer); /* request 객체에 "t" 라는 속성에 thermometer 객체를 넣음 */
%>
<html>
<head>
<title>온도 변환 예제</title>
</head>
<body>
<!-- t 객체 안에 있는 setClesius 메서드를 사용하여 값 지정 -->
${t.setCelsius('서울', 27.3)}
<%-- <% thermometer.setCelsius("서울", 27.3); %> 이 코드를 표현언어로 적으면 위의 코드가 된다. --%>
서울 온도: 섭씨 ${t.getCelsius('서울')}도 / 화씨 ${t.getFahrenheit('서울')}
<br /> 정보: ${t.info}
<!-- info 는 필드를 의미하는 것이 아니라 getInfo() 메서드를 의미한다.!
표현이 info라서 필드라고 오해하지 말것!! -->
<!-- 위의 코드는 원래 이런 코드이다. {requestScope.t.getInfo()} -->
</body>
</html>
'Language > JSP' 카테고리의 다른 글
10장_표준 태그 라이브러리(JSTL) (0) | 2023.01.26 |
---|---|
08장_ 클라이언트와의 대화2 : 세션 (1) | 2023.01.20 |
03장_JSP로 시작하는 웹 프로그래밍 (0) | 2023.01.19 |