BackEnd/WEB

EL_국비_DAY56

Leo.K 2022. 5. 19. 13:59

JSP파일은 컴파일 시 서블릿으로 변환된다고 했다. 이때 주석문을 어떤것으로 쓰느냐에 따라서 차이가 있는데 그 차이점을 살펴보자. 

주석문의 차이점 

<!-- HTML 주석입니다. --> : JSP파일에서 HTML주석문을 사용하면 컴파일시 변환될 때, 주석문이라서 실행이 안되지만 주석문은 넘어간다. 

<%-- JSP 주석입니다. --%> : JSP파일에서 JSP 주석문을 사용하면 컴파일시 변환될 때, 위와는 달리 주석문 자체가 변환되어 넘어가지 않는다.

아래의 이미지를 확인하면 HTML주석문은 넘어가고, JSP주석문은 넘어가지 않은 것을 확인할 수 있다.

위의 주석문을 사용할 때 주의해야 하는 이유는 EL 표현식을 사용할 때이다. 

EL표현식은 말그대로 표현식인데 HTML이 아닌 JSP파일에서만 사용할 수 있는 표현식이다. 이때 EL표현식에 대한 주석문을 html로 작성하게 되면 컴파일러가 잘못 인식하여 에러가 발생한다. 

결론적으로 말하면 EL 표현식에 대한 내용은 반드시 JSP 주석을 사용해야 컴파일시 자바 파일로 변환될 때, 주석문이 넘어가질 않기 때문에, 에러가 없이 사용할 수 있다. 이 부분을 모른 상태에서 에러를 마주하면 수정이 굉장히 힘들다.

 

EL(Expression Language) : 표현 언어 
1.형식 : $( 상수 또는 변수 또는 연산자 ), EL표현식 앞에 '\'를 붙여주면, EL표현식이 아니라 그냥 텍스트로 인식한다. 
2.변수 : 각 socpe에 저장된 변수 (pageScope, requestScope, sessionScope, applicationScope)
          param변수 : xxx.jsp?name=홍길동 => $ {param.name}
3.읽기전송

4.연산자
  1)산술연산자 : + - * /(div) %(mod)
  2)관계연산자 : >(gt) >=(ge) <(lt) <=(le) ==(eq) !=(ne)
  3)논리연산자 : &&(and) ||(or) !(not)
  4)기타  : empty

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    
<%
    //자바 코드 작성
    //EL(Expression Language) : 표현 언어 
    //1.형식 : $( 상수 또는 변수 또는 연산자 ), EL표현식 앞에 '\'를 붙여주면, EL표현식이 아니라 그냥 텍스트로 인식한다. 
    //2.변수 : 각 socpe에 저장된 변수 (pageScope, requestScope, sessionScope, applicationScope)
    //           param변수 : xxx.jsp?name=홍길동    =>    $ {param.name}
    //3.읽기전송
    //4.연산자
    //  1)산술연산자 : + - * /(div) %(mod)
    //  2)관계연산자 : >(gt) >=(ge) <(lt) <=(le) ==(eq) !=(ne)
    //  3)논리연산자 : &&(and)    ||(or)    !(not)
    //  4)기타         : empty
    //  5)3항 연산자 : (조건) ? 참값 : 거짓값
 %>
 
 
<!-- Html 주석 -->
<%-- JSP주석 EL표현형식 : $( 변수 ) : 서블릿 전환시 안 넘어간다. --%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<hr>
    산술연산자
<hr>
 
\${ 1 + 2} => ${ 1 + 2}<br>
\${3 - 2} => ${3 - 2}<br>
\${ 3 * 2} => ${ 3 * 2}<br>
\${ 10 / 3} => ${ 10 / 3}<br>
\${ 10 % 3} => ${ 10 % 3}<br>
 
<hr>
    관계연산자 
<hr>
 
\${3>2 } => ${3>2 } or ${3 gt 2 }<br>    <!-- gt : greater than -->
\${3>=2 } => ${3>=2 } or ${3 ge 2 }<br>    <!-- ge : greater equal -->
 
\${3<2 } => ${3<2 } or ${3 lt 2 }<br>    <!-- lt : less than -->
\${3<=2 } => ${3<=2 } or ${3 le 2 }<br>    <!-- le : less equal -->
 
\${3==2 } => ${3==2 } or ${3 eq 2 }<br>    <!-- eq : equal -->
\${3!=2 } => ${3!=2 } <%-- or ${3 ne 2 } --%><br>    <!-- ne : not equal -->
 
<hr>
    논리연산자 
<hr>
 
\${ true && true } => ${true && true }<br>
\${ true && false } => ${true && false }<br>
 
\${ false || false } => ${false || false }<br>
\${ true || false } => ${true || false }<br>
 
<hr>
    기타 : empty(특정 객체가 비어있는지 확인)
<hr>
 
parameter 메시지 : ${ (empty param.msg) ? '메세지 없음' : param.msg}
</body>
</html>
cs

 

[Scope]

JSP에서 사용하는 내장객체의 이름과 EL에서 사용하는 내장객체의 이름이 다르다는 것은 이전 포스팅에서 설명했다. 가리키는 영역은 같지만 참조하는 이름만 다를 뿐이다. 아래의 예시를 보면서 영역에 대한 이해를 해보자. 

값을 출력할 때, 영역을 생략하면 Tomcat이 자체적으로 참조하는 순서가 있는데, 이는 영역의 크기가 작은 것부터 커지는 순서로 참조를 하다가 값을 발견하면 출력한다.

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
 
 
<%
    //수행영역 : _jspService()
    //각 영역에 데이터를 넣는다.     (key, value)
    //                          key        value
    pageContext.setAttribute("msg""안녕? page영역에 있어?");
    request.setAttribute("msg""Hi~ 나는 request 영역에 있어?");
    session.setAttribute("msg""안녕하십니까 고객님 세션입니다.");
    application.setAttribute("msg""전역데이터야 ....");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 형식 : ${ 영역.객체(변수)명 } --%>
pageScope내의 msg : ${ pageScope.msg }<br>
requestScope내의 msg : ${ requestScope.msg }<br>
sessionScope내의 msg : ${ sessionScope.msg }<br>
applicationScope내의 msg : ${ applicationScope.msg }<br>
 
<!-- 영역이 생략되면 참조되는 순서가 있다. 
     pageScope -> requestScope -> sessionScope -> applicationScope
 -->
나는 어느 영역의 msg일까 ? : ${ msg }<br>
</body>
</html>
cs

 

[Map 데이터 EL로 출력하기]

각 영역에 데이터를 Set하는 방법이 map과 유사하다. 키와 value의 쌍으로 저장하게 된다. map의 참조변수 명을 key로 저장하고, map데이터 전체를 value로 저장한다. 

아래 예시를 보면 알겠지만, 출력을 하는 방법은 영역을 명시하는 경우와 명시 안하는 경우(생략시 참조 순서가 있다고 했다.) Json과 출력방법이 비슷하다. key값을 사용해 dot(.)연산자를 사용하거나, key값을 사용해 bracket연산자를 사용하면 된다.

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
 
<%
    Map map = new HashMap();
    map.put("driver""oracle.jdbc.driver.OracleDriver");
    map.put("url"   , "jdbc:oracle:thin:@localhost:1521:xe");
    map.put("user"  , "scott");
    map.put("pwd"   , "tiger");
    
    //Map을 pageContext넣기 -> 왜? -> EL사용하려고
    //                          key   value
    pageContext.setAttribute("map", map);
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
    EL을 이용한 Map 데이터 출력하기 
<hr>
 
${ pageScope.map }<br>
 
<!-- 일반적으로 자바에서 get(Object key)를 사용하지 않고 그냥 dot(.)방식으로 바로 키를 입력하면 value가 나옴 -->
Driver : ${ pageScope.map.driver }<br>
Url    : ${ map.url }<br>        <!-- 영역을 생략하는 경우 참조하는 순서가 있다고 했다. 있으면 찾고 없으면 더 넓은 영역으로 확장하면서 찾아본다, 참조순서가 있기 때문에 생략해도 된다. -->
User   : ${ map['user'] }<br>    <!-- Json과는 다르지만 dot와 bracket표현 방식 둘 다 사용가능 -->
Pwd       : ${ map["pwd"] }<br>
</body>
</html>
 
cs

 

 

JSTL 사용법

JSTL Library 위치

C:\apache-tomcat-8.5.78\webapps\examples\WEB-INF\lib에 있는 taglibs-standard-impl-1.2.5, taglibs-standard-spec-1.2.5 2개의 파일을 C:\apache-tomcat-8.5.78\lib이 위치로 복사 붙여 넣기 해야 한다.

JSTL라이브러리를 가져왔다면 직접 선언해주어야 한다. 선언에 대한 방식은 소스코드에 주석과 함께 정리하겠다. 주의해야할 점은 JSTL의 라이브러리 연결을 제대로 하지 않고 JSTL을 사용하는 경우 원하는 결과가 동작하지도 않음은 물론 에러가 발생하지 않아서 수정하기가 어려움이 크다. 따라서 JSTL을 사용할 때는 반드시 라이브러리를 우선적으로 연결하자.

추가로 JSTL을 사용할 때 상수를 제외한 모든 값은 반드시 EL표현법을 사용해야 한다. 이로 인해 JSTL을 사용할 때는 EL표현의 주의사항도 몇가지 고려해야 하는데 첫 번째로 출력하여 표현하고자 하는 값은 반드시 서버의 pageContext, request, session, application 네 가지 영역 중 하나의 영역에 데이터를 저장(setAttribute)해야 한다. 이는 출력을 하기 전의 사전 작업으로 이 또한 까먹으면 오류 수정이 어렵다. 

두 번째로 표현에 관한 이야기인데 아래의 소스코드를 보면 알겠지만, EL표현법은 ${ 변수 }형태로 사용을 한다. 이때 가장 주의할 점은 EL표현법 외부에 공백이 들어가면 안된다는 것이다. 이는 JSTL을 사용할 때 많이 하는 실수인데, 필자 또한 여러번 고생했다. 

내가 소유한 현금 : <fmt:formatNumber value="${ money  }" type="currency" />소스코드의 일부분만 가져와서 보자. 

위의 식에서 EL표현식이 사용된 부분은 value=""이다. 여기에서 필자가 언급한 EL표현법의 외부라는 말은 ""안에 있지만 EL표현 바깥쪽이라는 뜻이다. 쉽게 예를 들어보겠다.

value="${money}" : 이런식으로 공백이 없어야 한다. 

value=" ${money}" : 이런식으로 공백이 생기면 에러가 발생하기 때문에 꼭 주의하도록 하자. 참고도 EL표현식 {}내부에는 공백이 있어도 상관이 없다. 

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
 
<!-- JSTL 라이브러리 연결 (연결하지 않으면 에러도 안나고 동작도 안됨.)-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
    
<%
    /*
        JSTL에서의 모든 값은 반드시 EL 표현법을 사용해야 한다.
        JSTL(JSP STANDARD TAG LIBRARY)
        1.core : if                    <c:if>
                 choose                <c:choose>
                 switch                <c:forEach>
        2.format : 숫자                <fmt:formatNumber>
                   날짜             <fmt:formatDate>
        3.function    : 문자열 기능(substring, indexof, length...)    fn:substring()
    */
    
    //숫자 출력
    int money = 1234500000;
        
    
    //문자열 날짜 
    String str_date = "2022-05-19 15:42:30.0";
        
    //날짜 출력
    Date today = new Date();//현재 시스템 날짜를 구한다.
    
    
    //값을 사용하기 위해서 반드시 4개의 영역 중 한 곳에 넣어야만 값을 탐색해서 참조할 수 있다.
    //값이 Integer로 Auto-Boxing되어 들어간다.
    pageContext.setAttribute("money", money);
    pageContext.setAttribute("today", today);
    pageContext.setAttribute("str_date", str_date);
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- JSTL 날짜 출력 pattern 속성으로 내가 원하는 형태로 서식을 지정할 수 있다.-->
<fmt:formatDate pattern="YYYY년MM월dd일 hh:mm:ss" value="${today }"/><br>
 
<!-- JSTL 문자열 잘라내기 -->
<!-- 문자열 날짜는 pattern을 지정할 수 없다. -->
${ str_date }<br> <!-- EL로 단순히 문자열을 출력한 것 -->
${fn:substring(str_date,0,16)}<br><!-- 인덱스를 알아야 슬라이싱 가능, 제로베이스다. -->
 
<%-- <fmt:setLocale value="ko"/> --%>
<!-- JSTL 내에서 사용되는 값은 반드시 EL표현식으로 값을 표현해야 한다. (상수제외) -->
<!-- "EL표현식 외부에는 공백이 있으면 안된다!!" -->
<!-- JSTL이나 EL은 Scope중 어느 한 곳에 반드시!!! setAttribute를 설정해주고 출력해줘야 한다. 그렇지 않으면 순서대로 탐색을 한다고 해도 값을 찾을 수 없음 -->
내가 소유한 현금 : <fmt:formatNumber value="${ money  }" type="currency" />
 
</body>
</html>
cs

'BackEnd > WEB' 카테고리의 다른 글

국비_DAY58  (0) 2022.05.23
JSTL_국비_DAY57  (0) 2022.05.20
JSP_국비_DAY55  (0) 2022.05.18
서블릿_국비_DAY54  (0) 2022.05.17
SERVLET_국비_DAY53  (0) 2022.05.16