1. Expression Language(표현 언어 또는 익스프레션 언어)

- 값을 표현하는데 사용되는 새로운 스크립트 언어로 JSP의 기본문법을 보완하는 역활을 한다.

- JSP 네 가지 기본 객체가 제공하는 영역의 속성 사용

- 집합 객체에 대한 접근 방법 제공

- 수치 연산, 관계 연산, 논리 연산자 제공

- 자바 클래스 메서드 호출 기능 제공

- 표현 언어만의 기본 객체 제공


2. EL 기본 문법

- ${식}

- 식 부분에는 표현 언어가 정의한 문법에 따라 값을 표현하는 식이 온다. (액션태그 또는 커스텀태그의 속성 값, 표현식)

- JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.


- #{식}

- Deferred Expression 이라고 한다.

- JSP 2.1 버전부터 새롭게 지원하는 구문으로 JSF(JavaServer Faces)에서 사용되던 표현 언어 구문이다.

- ${식}은 표현식이 실행되는 시점에 곧바로 값을 계산하고 #{식}은 실제로 값이 실제로 필요한 시점에 값을 계산한다.

- JSP 템플릿 텍스트에서는 사용할 수 없고, 허용되는 태그의 속성에만 위치할 수 있다.


3. EL 기본 객체

- 표현 언어도 11개의 기본 객체를 제공한다.

- 값이 존재하지 않을 경우 null을 출력하지 않고 아무것도 출력하지 않는다.


 기본 객체

 설명

 pageContext

 JSP의 page 기본 객체와 동일하다. 

 pageScope 

 pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 requestScope 

 request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 sessionScope

 session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 applicationScope 

 application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 

 param 

 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체, 타입은 String (request.getParameter(이름)의 결과와 동일)

 paramValues

 요청 파라미터의 <파라미터이름, 값 배열>매핑을 저장한 Map 객체, 타입은 String[] (request.getParameterValues(이름)의 결과와 동일)

 header

 요청 정보의 <헤더이름, 값> 매핑을 저장한 Map 객체 (request.getHeader(이름)의 결과와 동일)

 headerValues

 요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map 객체 (request.getHeaders(이름)의 결과와 동일)

 cookie

 <쿠키 이름, Cookie> 매핑을 저장한 Map 객체 (request.getCookies()로 구한 Cookie 배열로 부터 매핑을 생성) 

 initParam

 초기화 파라미터의<이름, 값> 매핑을 저장한 Map 객체 (application.getInitParameter(이름)의 결과와 동일) 


<!-- elForm.jsp  -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>표현 언어</title>
</head>
<body>
	<form action="elResult.jsp" method="post">
		아이디 : <input type="text" name="id">
		<br>
		<br>
		회원님이 관심있는 스포츠를 선택하세요
		<br>
		축구<input type="checkbox" name="sports" value="축구">
		농구<input type="checkbox" name="sports" value="농구">
		야구<input type="checkbox" name="sports" value="야구">
		골프<input type="checkbox" name="sports" value="골프">
		<br>
		<br>
		<input type="submit" value="확인"><input type="reset" value="취소">
	</form>
</body>
</html>


<!-- web.xml -->

	<context-param>
		<description>테스트 파라미터1</description>
		<param-name>testParamName</param-name>
		<param-value>GZ</param-value>
	</context-param>

	<context-param>
		<description>테스트 파라미터2</description>
		<param-name>testParamAge</param-name>
		<param-value>25</param-value>
	</context-param>


<!-- elResult.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8"); %> <% request.setAttribute("name", "갱짱"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>표현 언어</title> </head> <body> 초기화 파라미터 이름 : ${ initParam.testParamName }<br> 초기화 파라미터 나이 : ${ initParam.testParamAge } <hr> 요청 URI : ${ pageContext.request.requestURI } <hr> request의 name 속성 : ${ requestScope.name } <hr> 아이디 : ${ param.id }<br> 선택한 운동 : ${ paramValues.sports[0] }     ${ paramValues.sports[1] }     ${ paramValues.sports[2] }     ${ paramValues.sports[3] } </body> </html>



4. EL 데이터 타입

- 불리언(Boolean) 타입 : true, false

- 정수 타입 : 0 ~ 9로 이루어진 정수 값, 음수의 경우'-'가 붙는다.

- 실수 타입 : 0 ~ 9로 이루어져 있고, 소수점('.')을 사용할 수 있고, 3.24e3과 같이 지수형으로 표현 가능하다.

- 문자열 타입 : 따옴표(' 또는 ")로 둘러싼 문자열, 만약 홑따옴표(')를 사용시 표현할 경우 값에 포함된 작은 따옴표는 \'로 입력한다. \기호는 \\로 표시한다.

- 널 타입 : null


5. EL 객체 접근

- ${ <표현1>.<표현2> } 또는 ${ <표현1>[<표현2>] } 형식을 사용한다.

- <표현1>을 <값1>로 변환한다.

- <값1>이 null이면 null을 리턴한다.

- <값1>이 null이 아니면 <표현2>를 <값2>로 변환한다.

- <값2>가 null이면 null을 리턴한다.

- <값1>이 Map, List, 배열인 경우

- <값1>이 Map 이면

- <값1>.containsKey(<값2>)가 false이면 null을 리턴한다.

- 그렇지 않으면 <값1>.get(<값2>)를 리턴한다.

- <값1>이 List나 배열이면

- <값2>가 정수값인지 검사한다.(정수값이 아닐 경우 에러 발생)

- <값1>.get(<값2>) 또는 Array.get(<값1>, <값2>)를 리턴한다.

- 위 코드가 익셉션을 발생하면 에러를 발생한다.

- <값1>이 다른 객체이면

- <값2>를 문자열로 변환한다.

- <값1>이 이름이 <값2>이고 읽기 가능한 프로퍼티를 포함하고 있다면 프로퍼티의 값을 리턴한다.

-  그렇지 않을 경우 에러를 발생한다.


6. EL 객체의 탐색

- ${ EL기본객체영역.이름 } 또는 ${ 이름 }

- PAGE, REQUEST, SESSION, APPLICATION 영역에 저장된 속성에 접근 할 때에는 pageScope, requestScope, sessionScope, applicationScope 기본객체를 사용한다.

- 영역을 나타내는 EL 기본객체를 사용하지 않고 이름만 지정할 경우 EL은 네개의 영역을 차례대로 검색해서 속성이 존재하는지 확인한다.

- 단 영역별로 이름이 같은 객체가 있을 경우 작은 영역이 우선이다. (page < request < session < application)


7. EL 수치 연산자

- '+' : 덧셈

- '-' : 뺄셈

- '*' : 곱셈

- '/' 또는 div : 나눗셈

- '%' 또는 mod : 나머지

- 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환한 후 연산자를 수행한다. (단, 숫자로 변환할 수 있는 객체)

- 객체가 null이면 0으로 처리된다.

- 나눗셈 연산자는 피연산자를 Double 타입으로 변환한 뒤 연산을 수행한다.


8. EL 비교 연산자

- '==' 또는 eq : 같은가

- '!=' 또는 nu : 같지 않은가

- '<' 또는 lt : 작은가

- '>' 또는 gt : 큰가

- '<=' 또는 le : 작거나 같은가

- '>=' 또는 ge : 크거나 같은가


<!-- elOp.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
	pageContext.setAttribute("name", "페이지네임");
	request.setAttribute("name", "리퀘스트네임");
	session.setAttribute("name", "세션네임");
	application.setAttribute("name", "어플리케이션네임");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>표현 언어</title>
</head>
<body>
	<h1>객체</h1>
	name : ${ name }<br>
	pagename : ${ pageScope.name }<br>
	requestName : ${ requestScope.name }<br>
	sessionName : ${ sessionScope.name }<br>
	applicationName : ${ applicationScope.name }<br>
	<hr>
	
	<h1>수치 연산자</h1>
	더하기 : ${ 10 + 10 }<br>
	빼기 : ${ '10' - 10 }<br>
	곱하기 : ${10 * "10" }<br>
	몫 : ${'40' div '6' }<br>
	나머지 : ${40 mod 6 }<br>
	<hr>
	
	<h1>비교 연산자</h1>
	같은가 : ${ 10 eq 10 }<br>
	다른가 : ${ 10 eq 10 }<br>
	작은가 : ${ 10 lt 10 }<br>
	큰가 : ${ 10 gt 10 }<br>
	작거나같은가 : ${ 10 le 10 }<br>
	크거나같은가 : ${ 10 ge 10 }<br>
	<hr>
</body>
</html>

<!-- 
	실행 결과
	
	객체

	name : 페이지네임
	pagename : 페이지네임
	requestName : 리퀘스트네임
	sessionName : 세션네임
	applicationName : 어플리케이션네임
	--------------------------------------------------
	
	수치 연산자
	
	더하기 : 20
	빼기 : 0
	곱하기 : 100
	몫 : 6.666666666666667
	나머지 : 4
	--------------------------------------------------
	
	비교 연산자
	
	같은가 : true
	다른가 : true
	작은가 : false
	큰가 : false
	작거나같은가 : true
	크거나같은가 : true
 -->


9. EL 논리 연산자

- '&&' 또는 and : 그리고

- '||' 또는 or : 이거나

- '!' 또는 not : 부정


10. EL empty 연산자

- empty <값>

- 검사할 객체가 null 인지 검사하기 위해 사용한다.

- <값>이 null이면 true

- <값>이 빈 문자열("")이면 true

- <값>이 길이가 0인 배열이면 true

- <값>이 빈 Map이면 true

- <값>이 빈 Collection이면 true

- 이 외의 경우에는 false


11. EL 비교 선택 연산자

- <수식> ? <값1> : <값2>

- <수식>의 결과값이 ture 이면 <값1>을 리턴하고, false이면 <값2>를 리턴한다.


12. EL 연산자 우선순위

- 우선순위가 높은순으로 먼저 실행되고, 같을 경우 왼쪽에서 오른쪽으로 진행된다.

-    []    .

-    ()

-    -(단일)    not    !    empty

-    *    /    div    %    mod

-    +    -

-    <    >    <=    >=    lt    gt    le    ge

-    ==    !=    eq    ne

-    &&    and

-    ||    or

-    ? :


13. EL 특수문자 처리

- \${식} 또는 \#{식}

- JSP 템플릿 텍스트에서 처리할때 앞에 역슬래시(\)를 위치시킨다.


14. EL 객체의 메서드 호출

- JSP 2.2 버전에 추가된 기능으로 객체의 메서드를 직접 호출할 수 있다.

- 자바빈스타일의 메서드, 리턴타입이 void이거나 파라미터 개수의 관계없이 호출 된다.

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
// ELMethod.java
 
package com.tistory.gangzzang;
 
import java.util.HashMap;
import java.util.Map;
 
public class ELMethod {
     
    private Map memberMap = new HashMap();
     
    public int sumNumber(int num1, int num2) {
        return num1 + num2;
    } // sumNumber : 두 정수를 더한다.
     
    public void setMember(String name, String tel) {
        memberMap.put(name, tel);
    } // setMember : memberMap에 회원 추가한다.
     
    public String getMember(String name) {
        return memberMap.get(name);
    } // getMember : memberMap에서 회원 이름의 연락처를 얻는다.
     
    public String getInfo() {
        return "EL 메서드 호출";
    } // getInfo : 정보 출력
     
} // ELMethod
<!-- elMethod.jsp -->

<%@page import="com.tistory.gangzzang.ELMethod"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	ELMethod elMethod = new ELMethod();
	request.setAttribute("el", elMethod);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL 메서드</title>
</head>
<body>
	${ el.getInfo() }
	<br><br>
	회원 추가 : ${ el.setMember('Gz', '01012345678') }
	<br><br>
	회원 연락처 : ${ el.getMember('Gz')  }
	<br><br>
	두 정수의 합 : ${ el.sumNumber(5, 10) }
</body>
</html>

<!-- 
	실행결과
	
	EL 메서드 호출 

	회원 추가 : 

	회원 연락처 : 01012345678 

	두 정수의 합 : 15
 -->



15. EL 클래스 정적 메서드 호출

- JSP 2.2 버전 이하에서는 위처럼 호출이 불가능하다.

- JSP 2.0 버전 이상부터 지원되는 정적(static) 메서드 호출 방법이 있다.


15-1. 클래스에 static 메서드 작성

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
// ELStaticMethod.java
 
package com.tistory.gangzzang;
 
import java.util.HashMap;
import java.util.Map;
 
public class ELStaticMethod {
     
    private static Map memberMap = new HashMap();
     
    public static int sumNumber(int num1, int num2) {
        return num1 + num2;
    } // sumNumber : 두 정수를 더한다.
     
    public static void setMember(String name, String tel) {
        memberMap.put(name, tel);
    } // setMember : memberMap에 회원 추가한다.
     
    public static String getMember(String name) {
        return memberMap.get(name);
    } // getMember : memberMap에서 회원 이름의 연락처를 얻는다.
     
    public static String getInfo() {
        return "EL 메서드 호출";
    } // getInfo : 정보 출력
     
} // ELMethod


15-2. EL 메서드를 정의한 TLD 파일 작성

- TLD(Tag Library Descriptor) : 태그 라이브러리에 대한 설정 정보를 담고 있다.

- TLD 파일은 WEB-INF\tlds 디렉터리에 위치시킨다.


<?xml version="1.0" encoding="UTF-8"?>
<!-- WEB-INF\tlds\el-functions.tld -->

<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>functions</short-name> <function> <name>elSum</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> java.lang.Integer sumNumber(java.lang.Integer, java.lang.Integer)</function-signature> </function> <function> <name>elSet</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> void setMember(java.lang.String, java.lang.String)</function-signature> </function> <function> <name>elGet</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> java.lang.String getMember(java.lang.String)</function-signature> </function> <function> <name>elInfo</name> <function-class>com.tistory.gangzzang.ELStaticMethod</function-class> <function-signature> java.lang.String getInfo()</function-signature> </function> </taglib>



15-3. web.xml 파일에 TLD 파일 지정

<?xml version="1.0" encoding="UTF-8"?>

<!-- web.xml -->

<web-app 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID"
	version="2.5">
	
	<jsp-config>
		<taglib>
			<taglib-uri>/WEB-INF/tlds/el-functions.tld</taglib-uri>
			<taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location>
		</taglib>
	</jsp-config>
	
</web-app>


15-4. JSP 코드에서 TLD 파일에 정의한 함수 실행

- taglib 디렉티브는 web.xml 파일에서 설정한 태그 라이브러리를 JSP 페이지에서 사용한다는 것을 명시한다.

- taglib에 prefix 속성은 태그 라이브러리를 구분할 때 사용할 접두어를 나타낸다.

- EL 에서 태그 라이브러리에 정의된 메서드를 사용하려면 ${태그라이브러리접두어:메서드() } 코드를 사용한다.

- 단, 실제 사용할 클래스의 메서드이름이 아닌 TLD 파일의 <name> 태그에서 지정한 이름을 사용한다.


<!-- elStaticMethod.jsp -->

<%@page import="com.tistory.gangzzang.ELMethod"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="el" uri="/WEB-INF/tlds/el-functions.tld"%>
<%
	ELMethod elMethod = new ELMethod();
	request.setAttribute("el", elMethod);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL static 메서드</title>
</head>
<body>
	${ el:elInfo() }
	<br><br>
	회원 추가 : ${ el:elSet('Gz', '01012345678') }
	<br><br>
	회원 연락처 : ${ el:elGet('Gz')  }
	<br><br>
	두 정수의 합 : ${ el:elSum(5, 10) }
</body>
</html>

<!-- 
	실행결과
	
	EL 메서드 호출 

	회원 추가 : 

	회원 연락처 : 01012345678 

	두 정수의 합 : 15
 -->



16. EL 사용 및 활용

- <jsp:foword> <jsp:include>에 속성으로 전달한 값 활용

<%
	request.setAttribute("boardInfo", boardInfo);
%>
<jsp:include page="<%= includedPage %>" flush="false" />

<!-- 포함되는 JSP에서 스크립트릿과 표현식을 사용하는 경우 -->
<%
	BoardInfo boardInfo = (BoardInfo) request.getAttribute("boardInfo");
%>
이름 : <%= boardInfo.getName() %>

<!-- 포함되는 JSP에서 EL 사용하는 경우 -->
이름 : ${boardInfo.name}


- 액션 태그나 커스텀 태그의 속성값으로 사용

<jsp:include page="/layout/top.jsp" flush="false" />

<!-- 표현식을 사용하는 경우 -->
<jsp:include page='<%="/layout/" + layout.getModuleName() + ".jsp" %>' flush="true" />

<!-- EL 사용하는 경우 -->
<jsp:include page="/layout/${ layout.moduleName }.jsp" flush="true" />



17. EL 비활성화

- web.xml 파일에 비활성화 옵션 설정

<!-- EL ${식} 비활성화 -->
<jsp-config>	
	<jsp-property-group>
		<url-pattern>/디렉터리명/*</url-pattern>
		<el-ignored>true</el-ignored>
	</jsp-property-group>
</jsp-config>

<!-- EL #{식} 비활성화 -->
<jsp-config>
	<jsp-property-group>
		<url-pattern>/디렉터리명/*</url-pattern>
		<deferred-syntax-allowed-as-literal>true</deferred-syntax-allowed-as-literal>
	</jsp-property-group>
</jsp-config>


- JSP 페이지내에서 page 디렉티브에서 비활성화 설정

- web.xml 파일 여부와 상관없이 page 디렉티브를 이용해서 활성화 또는 비활성화가 가능하다.

- isELIgnored : true일 경우 EL ${식}을 일반 문자열로 처리한다.

- deferredSyntaxAllowedAsLiteral : true일 경우 EL #{식}을 일반 문자열로 처리한다.

<!-- EL ${식} 비활성화 -->
<%@ page isELIgnored="true" %>

<!-- EL #{식} 비활성화 -->
<%@ page deferredSyntaxAllowedAsLiteral="true" %>


- web.xml 파일 버전에 따른 EL 자동 비활성화

- 서블릿 2.3 버전의 web.xml : EL 미지원

- 서블릿 2.4 버전의 web.xml : #{식} 미지원

- 서블릿 2.5 / 서블릿 3.0 버전의 web.xml : ${식}, #{식} 지원


- 비활성화 처리 여부

 web.xml <el-ignored>

 page isELIgnored 

 EL 처리여부 

 설정하지 않음

 설정하지 않음 

 web.xml 파일이 서블릿 2.3 또는 그 이전버전이라면 EL 처리하지 않는다.

 false

 설정하지 않음 

 EL 처리한다.

 true 

 설정하지 않음 

 EL 처리하지 않는다. 

 상관없음 

 false 

 EL 처리한다.

 상관없음

 true 

 EL 처리하지 않는다. 



 저작자 : http://gangzzang.tistory.com/112

'프로그래밍 > Servlet & JSP' 카테고리의 다른 글

jsp:include 와 <%@ include%> 차이  (1) 2012.09.13

I. <jsp:include>

1. 설명

-. 서버측 include가 아닌 클라이언트측의 include라 생각하면 간단하다

즉 출력 결과만(html코드)을 include 한다

-. include 되는 페이지와 변수를 같이 사용할 수 없다

2. 속성

① page

-. 포함시키고자 하는 문서의 위치를 명시한다

-. 상대경로뿐만 아니라 절대경로도 가능하다

-. 서블릿 컨테이너에 따라 HTML 페이지는 안될 수도 있다

-. get 방식으로 파라미터를 전달 할수 없다

-. 동적으로 페이지 할당이 가능하다

        즉 <jsp:include page="<%=variable%>" flush="true"/> 가 가능하다

② flush

    -. true : 문서의 출력 결과를 항상 버퍼내에서 갱신 하라는 의미이다

3. 예제

a.jsp

...

<jsp:include page="b.jsp" flush="true"/>

...


a.jsp 결과에 b.jsp 가 실행된 결과가 include 된다

즉 따로따로 실행 된 후 그 결과(html)만을 가지고 include 한다


II. <%@ include %>

1. 설명

-. 서버측 include 라고 생각하면 된다

즉 소스 실행전에 include가 된다고 보자

-. 소스 실행전 포함됨으로 변수를 같이 사용할 수 있다

-. 동적으로 페이지 할당을 할 수가 없다

2. 속성

① file

    -. 포함될 페이지를 명시한다

3. 예제

a.jsp

...

<%@ include file="b.jsp" %>

...

b.jsp 코드자체가 a.jsp에 포함된 후 실행된다.

jsp:include

<jsp:include page="/xxx.jsp" />

1. 요청시간에 처리

2. 별도의 파일로 요청 처리 흐름을 이동

3. 화면 레이아웃의 일부분을 모듈화 할 때 주로 사용된다.

@include

디렉티브

1. JSP파일을 자바 소스로 변환할 때 처리

2. 현재 파일에 삽입시킴

연결된 파일을 포함해서 같이 컴파일 한다.

include 지시어는 다른 JSP의 소스 코드를 해당 JSP에 그대로 포함시킨다

반면에 액션 태그의 <jsp:include> 태그는 다른 JSP의 소스 코드가 아니라,

다른 JSP의 실행 결과값을 해당 JSP 페이지에 포함시킨다.

또한, include는 주로 조각난 코드를 삽입을 하고자 할때 사용되고,

<jsp:include> 액션 태그는 페이지를 모듈화할때 사용된다.

즉 템플릿 페이지를 작성할때 사용된다.

<!--
정적인 페이지 할 때 사용한다.>
-->
<%@ include file="/include/top.jsp" %>
<hr></hr>
index.jsp입니다.<br></br><br></br>
<hr></hr>
<%@ include file="/include/bottom.jsp" %>

=============================================================================

<%--
동적인 페이지 할 때 사용한다.

--%>

<jsp:include page="top.jsp">
<jsp:param value="ok" name="flag"/>
</jsp:include>
<hr></hr>
main.jsp....
<hr></hr>
<jsp:include page="bottom.jsp"></jsp:include>

name - 이동할 페이지에 전달될 파라미터의 이름 ( 표현식 사용 불가 )

value - 이동할 페이지에 전달될 파라미터의 값( 표현식 사용 가능 )

받는곳에서 request.getParameter("flag");로 받는다.

=============================================================================


JSP내의 Java Code를 Designer나 HTML Coder가 보기쉽고(?), 수정하기 쉽게(?) Java Code를 HTML Tag과 같은 Tag 형태로 사용할 수 있도록 한 JSP Custom Tag.

그중에 가장 많이 쓰이는 Tag인 <jsp:include /> 하지만 이 <jsp:include /> Tag의 단점은 원격지의 JSP 페이지를 include 할 수 없는데 있다.

이처럼 <jsp:include /> Tag로 할 수 없는 것을 <c:import /> Tag는 가능하게 해준다.

그럼.. 어떻게 사용하는가?

우선... 아래의 URL에서 Taglib를 다운 받는다.

http://people.apache.org/builds/jakarta-taglibs/nightly/projects/standard/

에서 JSP 버전에 맞는 Taglib 를 다운 받는다.
다운 받은 파일을 압축을 풀면... 4개의 (doc, javadoc, lib, tld) 디렉토리와, LICENSE, NOTICE, README 파일 그리고 2개의 WAR 파일이 있다.

우리가 필요한건... 다름아닌... lib 폴더 아래의 jstl.jar , standard.jar 이다.

이 두개의 jar 파일을 적용하고자 하는 JSP의 Container (WAS)의 /WEB-INF/lib/에 복사한다.

그리고는... JSP페이지에

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>을 추가하고,
<c:import />를 Tag를 사용하면 된다.

예)
<%
String url = http://xxx.xxx.xxx.xxx/naver/test.jsp;
%>
<c:import url="<%= url %>" charEncoding="EUC-KR">
<c:param name="query" value="민원" />
<c:param name="method" value="get" />
</c:import>

위와 같이 사용하면 원격지의 WEB 페이지를 include와 유사하게 사용할 수 있다.


----------------------------------------------------------------------------------------------------
위와 같은 환경에서 작업을 해야만 하는 이유가 있다.

WWW <---> [Firewall] <---> WEB <---> [Firewall] <---> WAS

와 같은 환경에서 WAS 서버에서는 외부망(인터넷망)으로 접속이 불가능하며, 오직 WAS와 WEB서버간의 특정 PORT를 열어서 둘간의 통신만 가능하는 경우가 있다.

그런데... 외부망 접속이 되지 않는 WAS에서 인터넷 상에 존재하는 데이터를 읽어와서 가공한 후
그 데이터를 JSP에 나타내야 하는 경우가 발생했다.

처음 시도는 RMI였다. RMI는 WAS와 WEB서버간 RMI Registry를 통해 원격 객체를 등록한 후 WAS에서 WEB의 JAVA Code를 로컬에 있는 객체처럼 사용할 수 있기 때문이었다.

하지만... RMI Code는 완성되었는데... WAS와 WEB서버간 열수있는 PORT가 최소 2개있어야 하는데... PORT를 추가로 OPEN할 수 없는 상황이었다. 즉, RMI로 프로그램을 작성했지만...
환경적 문제로 인하여 RMI를 사용할 수 없게된거다. ToT

그러다가... 생각해낸 방법이 Http 통신이다.
WAS와 WEB서버간 RMI를 위한 PORT를 OPEN한 상태였기 때문에... WEB서버에 추가적으로 Tomcat을 설치하고, 그 Tomcat의 서비스 포트를 RMI 등록용 PORT로 맞춰서 WAS에서 처리해야 할 Java 및 JSP 코드를 WEB서버에 Tomcat을 설치하고 Tomcat을 통해 처리한 후 WAS에 있는 JSP에서 include 할 계획이었다.

앗! 그러나... <jsp:include /> 이 Tag는 원격지 파일 include가 안되는 거다. 또한번 좌절...
하지만... 결국 해결책을 찾았다. 바로 <c:import /> Tag였다.

이 번 일을 통해서.. 중요한 2가지를 배울 수 있었다.
하나는 RMI와 관련된 내용이고, 또 하나는 여기에 서술한 <c:import /> Tag

갈증을 해소하기 위해서 삽질 중이라면... 중간에 포기하지마라...
삽질이 결국 갈증을 해소해준다. 


[출처] http://blog.naver.com/rookieangel?Redirect=Log&logNo=140110137373

'프로그래밍 > Servlet & JSP' 카테고리의 다른 글

el 표현 언어 사용 법  (0) 2014.07.28

+ Recent posts