JSP에서 EL(Expression Language)이 값을 출력하지 못할 경우


JSP에서 EL을 사용하여 값을 출력하고자 할때 다음 코드에서 str1의 값 "Hello world~~~"이 정상적으로 출력이 될까?


<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<jsp:useBean id="member" class="com.joe.test.MemberInfo" scope="page"/>

<jsp:setProperty name="member" property="id" value="abcde" />

<jsp:setProperty name="member" property="pwd" value="kog" />

<jsp:setProperty name="member" property="name" value="고길동" />    

<!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=EUC-KR">

<title>EL 사용시 주의 사항</title>

</head>

<body>

<%

String str1 = "Hello world~~~";

%>

아이디 : <jsp:getProperty name="member" property="id"/><br/>

비밀번호 : <jsp:getProperty name="member" property="pwd"/><br/>

이름 : <jsp:getProperty name="member" property="name"/><br/>

<hr/>

아이디 : ${member.id }<br/>

비밀번호 : ${member.pwd }<br/>

이름 : ${member.name }<br/>

<hr/>

str1 : ${str1 }<br/>

</body>

</html>


정답은 출력되지 않는다이다.  출력 결과는 다음과 같다.


아이디 : abcde

비밀번호 : kog

이름 : 고길동

아이디 : abcde

비밀번호 : kog

이름 : 고길동

str1 : 


str1에는 아무것도 출력되지 않는다. 이유가 뭘까? 저 값이 출력되게 할려면 어떻게 해야 할까?

관건은 EL에서 사용할수 있는 변수의 범위(scope)와 관련된 문제이다. 즉 EL 태그가 값을 참조할수 있는 가용 영역(범위, scope)의 문제 때문이다.

EL 태그가 값을 가져올수 있는 영역은 pageContext 영역에 있는 변수의 값, request 영역에 있는 값, session 영역에 있는 값, application 영역에 있는 값이다.

따라서 위의 코드를 다음과 같이 수정하면 Hello world~~~라는 문자열이 정상적으로 출력이 된다.


<%

String str1 = "Hello world~~~";

    

                //다음 4개 중 어느 하나를 추가하면 str1의 값을 EL에서 정상적으로 출력가능하다.

pageContext.setAttribute("str1", str1);

//request.setAttribute("str1", str1);

//session.setAttribute("str1", str1);

//application.setAttribute("str1", str1);

%>


이때 str1의 값을 현재 페이지에서만 사용하면 되는 상황이라면 pageContext, request 영역에 str1의 값을 저장하면 될 것이다(pageContext.setAttribute() 혹은 request.setAttribute() 사용).

만일 좀 더 넓은 범위에서 사용이 필요하다면 session 영역에 저장하면 될 것이다. 

혹은 웹 애플리케이션 전 영역에서 서버 가동 동안 계속 사용이 필요하다면 application 영역에 값을 저장하면 될 것이다(application.setAttribute() 사용).


혹은 JSTL을 사용하여 


<%

     String str1 = "Hello world~~~";

%>

대신에 다음과 같이 JSTL 태그를 사용하면 pageContext, request, session.... 등 사용 없이 EL에서 정상적으로 값을 참조가능 하다.


<%

    <c:set var="str1" value="Hellow world~~~" />

%>


같은 개념으로 다음 코드는 어떻게 될까?


<%

    String myId = (String)request.getAttribute("id");

    String mAtt = (String)request.getAttribute("ctrlAttr");

%>


(1) 컨트롤럴에서 넘어온 값(myId) : ${myId}<br/>

(2) 컨트롤럴에서 넘어온 값(id) : ${id}<br/>

(3) 컨트롤럴에서 넘어온 값(mAtt) : ${mAtt}<br/>

(4) 컨트롤럴에서 넘어온 값(ctrlAttr) : ${ctrlAttr}<br/>


결과는 (1)(3)은 아무 값도 출력되지 않는다.

반면에 (2)(4)은 정상적으로 값이 출력이 된다.

이 경우는 request 영역에 이미 값이 저장되어 있으므로 저장된 값을 가져오기 위한 key 값인 id, ctrlAttr을 막바로 사용하면된다. 


만일 다음과 같이 parameter 형태로 넘어올 경우 EL에서 값을 참조하는 방법은 다음과 같다.


<jsp:forward page="toPage.jsp">

<jsp:param name="mUrl" value="www.naver.com"/>

<jsp:param name="mUser" value="고길동"/>

</jsp:forward>


이 경우 toPage.jsp에서 다음과 같이 파라미터로 넘어오는 값을 받을 수 있다.


<body>

<%

String tUrl = request.getParameter("mUrl");

String tUser = request.getParameter("mUser");

%>


<h1>여기는 toPage.jsp입니다.</h1>

<ul>

<li>url : <%=tUrl %></li>  <!-- 정상적으로 값이 출력된다 -->

<li>user : <%=tUser %></li>

</ul>

<hr/>

<ul>

<li>*url => ${mUrl }</li> <!-- 이런식으로는 값을 참조할 수 없다. -->

<li>*user => ${mUser }</li>

</ul>


<hr/>

<ol>

<li>URL : ${param.mUrl }</li>  <!-- 정상적으로 값이 출력된다 -->

<li>USER : ${param.mUser }</li>

</ol>

</body>



+ Recent posts