표현언어란?
초기에는 HTML 태그를 중심으로 자바를 이용해 화면을 구현했으나 화면에 대한 요구 사항이 복잡해지면서 자바 코드를 대체하는 액션 태그가 등장했다.
JSP 2.0에서는 페이지 안에서 복잡한 자바 코드를 제거하는 쪽으로 발전한다. 디자이너의 화면 작업이 불편했기 때문이다.
그리고 현재 JSP 페이지는 스크립트 요소보다 표현 언어(Expression Language)와 JSTL(JSP Standard Tag Library, JSP 표준 태그 라이브러리)을 사용해서 구현한다
표현 언어는 자바 코드가 들어가는 표현식을 좀 더 편리하게 사용하기 위해 JSP 2.0부터 도입된 데이터 출력 기능이다.
표현식에는 자바 변수나 여러 가지 자바 코드로 된 식을 사용하는데, 표현식의 자바 코드가 복잡해짐에 따라 JSP 2.0부터는 자바 코드로 출력하는 표현식을 대체하기 위해 표현 언어라는 것이 등장했다.
JSP 페이지에서 표현 언어를 사용하려면 페이지 디렉티브 태그의 속성인 isELIgnored을 false로 설정해야 사용할 수 있다.
표현 언어의 특징
- 기존 표현식보다 편리하게 값을 출력
- 변수와 여러 가지 연산자를 포함하는 것이 가능
- JSP의 내장 객체에 저장된 속성 및 자바의 빈 속성도 표현 언어에서 출력이 가능
- 표현 언어 자체 내장 객체도 제공
- JSP 페이지 생성 시 기본 설정은 표현 언어를 사용할 수 없음
- 페이지 디렉티브 태그에서는 반드시 isELIgnored=false로 설정
표현언어의 형식
${표현식 or 값}
1. 표현 언어에 사용되는 자료형과 연산자
표현 언어에서 사용되는 자료형
자료형 | 설명 |
불 | true와 false 값을 가짐 |
정수 | 0~9로 이루어진 값을 가지고 음수인 경우 마이너스(-)가 붙음 |
실수 | 소수점(.)을 사용할 수 있고, 1.4e5와 같이 지수형으로 표현할 수 있음 |
문자열 | 따옴표('hello'나 "hello")와 같이 사용됨 |
널 | null을 가짐 |
표현 언어의 여러 가지 연산자
연산자 종류 | 연산자 | 설명 |
산술 연산자 | + | 덧셈 |
- | 뺄셈 | |
* | 곱셈 | |
/ 또는 div | 나눗셈 | |
% 또는 mod | 나머지 | |
비교 연산자 | == 또는 eq | 두 값이 같은지 비교 |
!= 또는 ne | 두 값이 다른지 비교 | |
< 또는 lt | 값이 다른 값보다 작은지 비교 | |
> 또는 gt | 값이 다른 값보다 큰지 비교 | |
<= 또는 le | 값이 다른 값보다 작거나 같은지 비교 | |
>= 또는 ge | 값이 다른 값보다 크거나 같은지 비교 | |
논리 연산자 | && 또는 and | 논리곱 연산 |
|| 또는 or | 논리합 연산 | |
! 또는 not | 부정 연산 | |
empty 연산자 | empty <값> | <값>이 null이거나 빈 문자열이면 true를 반환 |
조건 연산자 | <수식> ? <값1> : <값2> | <수식>의 결괏값이 true이면 <값1>을 반환, false이면 <값2>를 반환 |
1) JSP에서 표현 언어 사용 실습
elTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
isELIgnored="false"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>표현 언어에서 사용되는 데이터들</title>
</head>
<body>
<h1>표현 언어로 여러 가지 데이터 출력하기</h1>
<h1>
\${100}: ${100}<br>
\${"안녕하세요"}: ${"안녕하세요"}<br>
\${10+1}: ${10+1}<br>
\${"10"+1}: ${"10"+1}<br>
</h1>
</body>
</html>
문자열과 숫자를 더하면 자동으로 숫자로 변환해 합을 구하고, null과 숫자를 더하면 null을 0으로 인식하는 것을 확인할 수 있다. 문자열끼리는 더할 수 없고, 문자열과 숫자는 더할 수 없다.
${"안녕"+11} // 문자열과 숫자는 더할수 없다
${"hello"+"world"} // 문자열끼리는 더할 수 없다
2) 표현 언어의 산술 연산자
elTest2.jsp
<body>
<h2>여러 가지 산술 연산자</h2>
<h1>
\${10+10} : ${10+10}<br>
\${20-10} : ${20-10}<br>
\${10*10} : ${10*10}<br>
\${100/9} : ${100/9}<br>
\${100 div 9} : ${100 div 9}<br>
\${100 % 9} : ${100 % 9}<br>
\${100 mod 9} : ${100 mod 9}<br>
</h1>
</body>
나누기 연산을 하려면 div를 사용하고, 나머지 연산을 하려면 mod를 사용한다. 표현 언어에서 나누기 연산 시 나누어지지 않으면 소수점 이하까지 표시한다.
3) 표현 언어의 비교 연산자
표현 언어의 비교 연산자
- 값이 같은지 비교할 때는 == 또는 eq 연산자를 사용
- 값이 같지 않은지 비교할 때는 != 또는 ne 연산자를 사용
- 대소 비교 시 >와 < 연산자 그리고 gt와 lt도 각각 연산자로 사용이 가능
- 대소 및 동등 비교를 동시에 할 때는 >=와 <= 연산자 그리고 ge와 le도 각각 연산자로 사용이 가능
elTest3.jsp
<body>
<h2>여러 가지 비교 연산자</h2>
<h3>
\${10==10} : ${10==10} <br>
\${10 eq 10} : ${10 eq 10} <br><br>
\${"hello" == "hello"} : ${"hello" == "hello"} <br>
\${"hello" eq "hello"} : ${"hello" eq "hello"} <br><br>
\${20!=10} : ${20!=10}<br>
\${20 ne 10} : ${20 ne 10}<br><br>
<%-- 문자열이 서로 다른지 비교할 때는 !=나 ne 연산자를 사용 --%>
\${"hello" != "apple"} : ${"hello" != "apple"} <br>
\${"hello" ne "apple"} : ${"hello" ne "apple"} <br><br>
\${10 < 10} : ${10 < 10} <br>
\${10 lt 10} : ${10 lt 10} <br><br>
\${100 > 10} : ${100 > 10} <br>
\${100 gt 10} : ${100 gt 10} <br><br>
\${100 <= 10} : ${100 <= 10} <br>
\${100 le 10} : ${100 le 10} <br><br>
\${100 >= 10} : ${100 >= 10} <br>
\${100 ge 10} : ${100 ge 10} <br><br>
</h3>
</body>
4) 표현 언어의 논리 연산자
표현 언어의 논리 연산자
- && 연산자나 and 연산자는 논리곱 연산
- || 연산자나 or 연산자는 논리합 연산
- ! 연산자나 not 연산자는 반대의 결과를 출력
elTest4.jsp
<body>
<h2>여러 가지 논리 연산자</h2>
<h2>
\${(10==10) && (20==20)} : ${(10==10) && (20==20)} <br>
\${(10==10) and (20!=20)} : ${(10==10) and (20!=20)} <br><br>
\${(10==10) || (20!=30)} : ${(10==10) || (20!=30)} <br>
\${(10!=10) or (20!=20)} : ${(10!=10) or (20!=20)} <br><br>
\${!(20==10)} : ${!(20==10)}<br>
\${not (20==10)} : ${not (20==10)} <br><br>
\${!(20!=10)} : ${!(20!=10)} <br>
\${not(20!=10)} : ${not(20!=10)} <br><br>
</h2>
</body>
5) 표현 언어의 empty 연산자
empty 연산자는 자바 빈의 속성이 값으로 설정되었는지 또는 List, Map 같은 저장 객체에 값(객체)이 존재하는지를 판단하는 연산자이다.
elTest5.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
isELIgnored="false"
import="java.util.*"
pageEncoding="UTF-8"%>
<jsp:useBean id="m1" class="sec01.ex01.MemberBean" scope="page" />
<%-- 유즈빈(useBean)을 생성 --%>
<jsp:setProperty name="m1" property="name" value="이순신" />
<%-- 빈의 name 속성에 값을 설정 --%>
<jsp:useBean id="m2" class="java.util.ArrayList" scope="page" />
<%-- ArrayList 객체를 빈으로 생성 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>표현언어의 여러 가지 연산자들</title>
</head>
<body>
empty 연산자
<h2>
\${empty m1 } : ${empty m1 }<br>
<%-- m1의 name 속성에 값이 설정되어 있으므로 false를 반환 --%>
\${not empty m1 } : ${not empty m1 }<br><br>
<%-- true를 반환 --%>
\${empty m2 } : ${empty m2 }<br>
<%-- ArrayList 객체인 m2는 비어 있으므로 true를 반환 --%>
\${not empty m2 } : ${not empty m2 }<br><br>
<%-- false를 반환 --%>
\${empty "hello"} : ${empty "hello"}<br>
<%-- 문자열에 대해 false를 반환 --%>
\${empty null} : ${empty null}<br>
<%-- null은 true를 반환 --%>
\${empty ""} : ${empty ""} <br>
<%-- 빈 문자열은 true를 반환 --%>
</h2>
</body>
</html>
<useBean> 액션 태그로 생성한 빈 m1은 생성 후 name 속성에 값을 설정했기 때문에 empty 연산자를 적용하면 false를 반환한다.
<useBean> 액션 태그로 생성한 빈 m2는 생성 후 아무 값도 저장하지 않았기 때문에 empty 연산자를 적용하면 true를 반환한다.
2. 표현 언어 내장 객체(내장변수)
JSP는 기본적으로 내장 객체들을 제공하지만 이 객체들은 표현식에서만 사용할 수 있으므로 표현 언어에서는 따로 내장 객체들을 제공한다. 표현 언어에서 제공하는 내장 객체들은 ${ } 안에서만 사용이 가능하다.
1) 표현 언어에서 제공하는 여러 가지 내장 객체 종류
구분 | 내장 객체 | 설명 |
스코프 | pageScope | JSP의 page와 같은 기능을 하고 page 영역에 바인딩된 객체를 참조함 |
requestScope | JSP의 request와 같은 기능을 하고 request에 바인딩된 객체를 참조함 | |
sessionScope | JSP의 session과 같은 기능을 하고 session에 바인딩된 객체를 참조함 | |
applicationScope | JSP의 application과 같은 기능을 하고 application에 바인딩된 객체를 참조함 | |
요청 매개변수 | param | request.getParameter( ) 메서드를 호출한것과 같으면 한 개의 값을 전달하는 요청 매개변수를 처리함 |
paramValues | request.getParameterValues( ) 메서드를 호출한 것과 같으며 여러 개의 값을 전달하는 요청 매개변수를 처리함 | |
헤더값 | header | request.getHeader( ) 메서드를 호출한 것과 같으며 요청 헤더 이름의 정보를 단일 값으로 반환함 |
headerValues | request.getHeader( ) 메서드를 호출한 것과 같으며 요청 헤더 이름의 정보를 배열로 반환함 | |
쿠키 값 | Cookies | 쿠키 이름의 값을 반환 |
JSP 내용 | pageContext | pageContext 객체를 참조할 때 사용 |
초기 매개변수 | initParam | 컨텍스트의 초기화 매개변수 이름의 값을 반환 |
2) param 내장 객체 사용 실습
회원 가입창에서 회원 정보를 입력하고 JSP로 전송하면 getParameter( ) 메서드를 이용하지 않고 param 내장 객체를 이용해 전송된 회원 정보를 출력하는 예제를 실습해본다.
memberForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입창</title>
<body>
<form method="post" action="member1.jsp">
<h1 style="text-align:center">회원 가입창</h1>
<table align="center">
<tr>
<td width="200"><p align="right">아이디</td>
<td width="400"><input type="text" name="id"></td>
</tr>
<tr>
<td width="200"><p align="right">비밀번호</td>
<td width="400"><input type="password" name="pwd"></td>
</tr>
<tr>
<td width="200"><p align="right">이름</td>
<td width="400"><p><input type="text" name="name"></td>
</tr>
<tr>
<td width="200"><p align="right">이메일</td>
<td width="400"><p><input type="text" name="email"></td>
</tr>
<tr>
<td width="200"><p> </p></td>
<td width="400">
<input type="submit" value="가입하기">
<input type="reset" value="다시입력">
</td>
</tr>
</table>
</form>
</body>
</html>
member1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false" %>
<!-- 포현식으로 출력하기 위해 getParameter()메서드를 이요해 회원 정보를 가져온다 -->
<%
request.setCharacterEncoding("UTF-8");
String id=request.getParameter("id");
String pwd=request.getParameter("pwd");
String name= request.getParameter("name");
String email= request.getParameter("email");
%>
<html>
<head>
<meta charset=”UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1" align="center" >
<tr align="center" bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
</tr>
<tr align=center>
<!-- getparmeter()로 가져온 회원 정보를 표현식으로 출력 -->
<td><%=id %> </td>
<td><%=pwd%> </td>
<td><%=name %> </td>
<td><%=email %> </td>
</tr>
<tr align=center>
<!-- param 객체를 이용해 getParameter()메서드를 이용하지 않고 바로 회원 정보를 출력 -->
<td>${param.id } </td>
<td>${param.pwd } </td>
<td>${param.name } </td>
<td>${param.email }</td>
</tr>
</table>
</body>
</html>
결과를 확인하면 회원 정보가 두번 출력된걸 볼 수 있다.
첫 번째 방법은 전송된 회원 정보를 getParameter( ) 메서드를 이용해 출력하고, 두 번째 방법은 param 내장 객체를 이용해 전송된 매개변수 이름으로 바로 회원 정보를 출력한 결과이다.
따라서 param 내장 객체를 이용하면 굳이 전송된 매개변수를 getParameter( ) 메서드를 이용하지 않고 바로 매개변수 이름으로 접근해서 값을 얻을 수 있다.
3) requestScope 사용 실습
회원 가입창에서 회원 정보를 입력하고 JSP로 전송하면 getParameter( ) 메서드를 이용하지 않고 param 내장 객체를 이용해 전송된 회원 정보를 출력하는 예제를 실습해본다.
forward.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 회원가입창의 request에 대해 다시 주소 정보를 바인딩 -->
<%
request.setCharacterEncoding("utf-8");
request.setAttribute("address","서울시 강남구");
%>
<html>
<head>
<meta charset=”UTF-8">
<title>forward</title>
</head>
<body>
<jsp:forward page="member2.jsp"></jsp:forward>
</body>
</html>
회원 가입창의 request 객체에 setAttribute( ) 메서드를 이용해 address를 바인딩한 후 다시 member2.jsp로 포워딩한다.
member2.jsp
<body>
<table border="1" align="center">
<tr align="center" bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
<td width="20%" ><b>주소</b></td>
</tr>
<tr align=center>
<td>${param.id } </td>
<td>${param.pwd} </td>
<td>${param.name } </td>
<td>${param.email }</td>
<td>${requestScope.address}</td>
<!--requestScope를 이용해 바인딩된 주소 정보를 출력 -->
</tr>
</table>
</body>
requestScope를 이용해 바인딩된 address에 접근해서 주소를 출력한다.
requestScope를 이용하면 request 객체에 바인딩된 데이터에 접근이 가능하다.
마찬가지로 session이나 application 객체에 바인딩된 데이터는 sessionScope나 applicationScope로 접근할 수 있다.
4) pageContext 객체 사용 실습
javax.servlet.jsp.PageContext 클래스를 상속해 웹 컨테이너가 JSP 실행 시 자동으로 생성해서 제공하는 내장 객체이다.
<a> 태그를 이용해 다른 서블릿이나 JSP를 요청하는 방법
1. 컨텍스트 이름(pro14)을 직접 입력하는 방법
<a href="/pro14/test01/memberForm.jsp"> 회원 가입하기</a>
2. getContextPath( ) 메서드를 이용해 컨텍스트 이름을 가져오는 방법
<a href="<%=request.getContextPath() %>/test01/memberForm.jsp">회원 가입하기</a>
그런데 첫 번째 방법은 컨텍스트 이름(pro14)이 바뀌면 일일이 찾아서 수정해야 한다는 단점이 존재한다.
두 번째 방법은 자바 코드가 사용되므로 화면 작업이 복잡해진다는 단점이 존재한다.
그러나 pageContext 객체의 속성인 request의 contextPath 속성을 이용하면 쉽게 컨텍스트 이름을 가져올 수 있다.
login.jsp
<body>
<form action="result.jsp">
아이디 : <input type="text" size=20 /><br>
비밀번호: <input type="password" size=20 /><br>
<input type="submit" value="로그인" /> <input type="reset" value="다시입력" />
</form>
<br><br>
<a href="${pageContext.request.contextPath}/test01/memberForm.jsp">회원가입하기</a>
</body>
자바 코드를 사용하지 않고 pageContext의 속성인 request 하위의 contextPath 속성으로 컨텍스트 이름을 가져온다.
회원가입을 클릭하면 회원가입 창으로 이동한다.
5) 빈 사용 실습
빈의 속성에 접근할 때는 다음과 같은 형식을 사용
${빈이름.속성이름}
빈에 회원 정보를 저장한 후 표현 언어를 이용해 빈의 회원 정보를 출력하는 예제
member3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="m" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m" property="*" />
<meta charset=”UTF-8">
<html>
<head>
<title>회원 정보 출력창</title>
</head>
<body>
<table align=center border="1" >
<tr align="center" bgcolor="#99ccff">
<td width=20%><b>아이디</b></td>
<td width="20%" ><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%" ><b>이메일</b></td>
</tr>
</tr>
<tr align="center">
<td><%=m.getId() %> </td>
<td><%=m.getPwd() %></td>
<td><%=m.getName() %></td>
<td><%=m.getEmail() %></td>
</tr>
<tr align="center">
<td>${m.id } </td>
<td>${m.pwd} </td>
<td>${m.name }</td>
<td>${m.email }</td>
</tr>
</table>
</body>
</html>
이처럼 표현언어에는 자바코드를 사용하지 않고 바로 빈 id로 속성에 접근해 값을 출력할 수 있다.
6) Collection 객체 사용 실습
Collection 객체에 접근할 때는 다음과 같은 형식을 사용한다.
${Collection객체이름[index].속성이름}
ArrayList에 회원 정보 빈을 저장한 후 다시 출력해보자
회원 가입창에서 전송된 회원 정보를 빈 m1에 저장한 후 다시 ArrayList에 저장한다.
그리고 자바 코드로 두번째 MemberBean객체를 생성한 후 회원 정보를 설정하여 ArrayList에 저장한다. 그리고 인덱스로 각 속성에 순차적으로 접근해서 ArrayList의 값을 출력한다.
member4.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.*, sec01.ex01.*" pageEncoding="UTF-8"
isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="m1" class="sec01.ex01.MemberBean"/>
<jsp:setProperty name="m1" property="*" />
<jsp:useBean id="membersList" class="java.util.ArrayList" />
<%
MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
membersList.add(m1);
membersList.add(m2);
%>
<html>
<head>
<meta charset=UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border=1 align="center" >
<tr align="center" bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
</tr>
<tr align="center">
<td>${membersList[0].id}</td>
<td>${membersList[0].pwd}</td>
<td>${membersList[0].name}</td>
<td>${membersList[0].email}</td>
</tr>
<tr align="center">
<td>${membersList[1].id}</td>
<td>${membersList[1].pwd}</td>
<td>${membersList[1].name}</td>
<td>${membersList[1].email}</td>
</tr>
</table>
</body>
</html>
ArrayList에 저장된 회원 정보를 확인할 수 있다.
7) HashMap 사용 실습
HashMap에 저장된 객체에 접근할 때는 다음과 같은 형식을 사용한다.
${HashMap객체이름.키이름}
HashMap에 객체를 저장한 후 다시 출력해보자
회원 가입창에서 전송된 회원 정보를 첫번째 빈 m1속성에 설정한다.
<useBean>태그를 이용해 HashMap객체인 membersMap을 생성하고 membersMap에 회원 정보를 key/value로 저장한다.
memberMap에 ArrayList를 저장한 다음 membersMap에 key로 접근하여 value를 출력한다.
member5.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.*, sec01.ex01.*"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="m1" class="sec01.ex01.MemberBean"/>
<jsp:setProperty name="m1" property="*" />
<jsp:useBean id="membersList" class="java.util.ArrayList" />
<jsp:useBean id="membersMap" class="java.util.HashMap" />
<%
membersMap.put("id", "park2");
membersMap.put("pwd", "4321");
membersMap.put("name","박지성");
membersMap.put("email","park2@test.com");
MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
membersList.add(m1);
membersList.add(m2);
membersMap.put("membersList", membersList);
%>
<html>
<head>
<meta charset=”UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border=1 align="center" >
<tr align=center bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
</tr>
<tr align=center>
<td>${membersMap.id}</td>
<td>${membersMap.pwd}</td>
<td>${membersMap.name}</td>
<td>${membersMap.email }</td>
</tr>
<tr align=center>
<td>${membersMap.membersList[0].id}</td>
<td>${membersMap.membersList[0].pwd}</td>
<td>${membersMap.membersList[0].name}</td>
<td>${membersMap.membersList[0].email}</td>
</tr>
<tr align=center>
<td>${membersMap.membersList[1].id}</td>
<td>${membersMap.membersList[1].pwd}</td>
<td>${membersMap.membersList[1].name}</td>
<td>${membersMap.membersList[1].email}</td>
</tr>
</table>
</body>
8) has-a 관계 빈 사용 실습
객체가 다른 객체를 속성으로 가지는 경우를 has-a 관계라고 한다.
사용형식은 다음과 같이 '속성 이름'과 .(마침표) 연산자로 자식 속성에 접근하면 된다
${부모빈이름.자식속성이름.속성이름}
MemberBean.java
public class MemberBean {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
//주소 정보를 저장하는 address클래스타입 속성을 선언
private Address addr;
public MemberBean() {
}
//속성에 대한 getter/setter
Address.java
public class Address {
private String city;
private String zipcode;
public Address() {
}
//속성에 대한 getter/setter
member6.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="m" class="sec01.ex02.MemberBean" />
<jsp:setProperty name="m" property="*" />
<jsp:useBean id="addr" class="sec01.ex02.Address"/>
<jsp:setProperty name="addr" property="city" value="서울"/>
<jsp:setProperty name="addr" property="zipcode" value="07654"/>
<%
m.setAddr(addr);
%>
<html>
<head>
<meta charset=”UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border=1 align="center" >
<tr align="center" bgcolor="#99ccff" >
<td width="7%"><b>아이디</b></td>
<td width="7%"><b>비밀번호</b></td>
<td width="5%" ><b>이름</b></td>
<td width="5%"><b>이메일</b></td>
<td width="5%" ><b>도시</b></td>
<td width="5%" ><b>우편번호</b></td>
</tr>
<tr align="center">
<td>${m.id } </td>
<td>${m.pwd } </td>
<td>${m.name } </td>
<td>${m.email}</td>
<td><%=m.getAddr().getCity() %></td>
<td><%=m.getAddr().getZipcode() %></td>
</tr>
<tr align="center">
<td>${m.id } </td>
<td>${m.pwd } </td>
<td>${m.name} </td>
<td>${m.email}</td>
<td>${m.addr.city}</td>
<td>${m.addr.zipcode}</td>
</tr>
</table>
</body>
</html>
3. 표현 언어로 바인딩 속성 출력하기
request, session, application 내장 객체에 속성을 바인딩 한 후 다른 서블릿이나 JSP에 전달 할수 있다.
표현언어를 사용하면 자바 코드를 사용하지 않고 바인딩된 속성 이름으로 바로 값을 출력할 수 있다.
1) 내장 객체 속성 값 출력 실습
forward1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
request.setAttribute("id","hong");
request.setAttribute("pwd", "1234");
session.setAttribute("name", "홍길동");
application.setAttribute("email", "hong@test.com");
%>
<html>
<head>
<meta charset=”UTF-8">
<title>forward1</title>
</head>
<body>
<jsp:forward page="member1.jsp" />
</html>
브라우저에서 요청 시 request, session, application 내장 객체에 회원 정보를 바인딩한 후 다시 member1.jsp로 포워딩한다
member1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
String id= (String)request.getAttribute("id");
String pwd= (String)request.getAttribute("pwd");
String name= (String)session.getAttribute("name");
String email= (String)application.getAttribute("email");
%>
<html>
<head>
<meta charset=”UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1" align="center" >
<tr align="center" bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
</tr>
<tr align="center">
<td><%=id %> </td>
<td><%=pwd%> </td>
<td><%=name %> </td>
<td><%=email %> </td>
</tr>
<tr align="center">
<td>${id} </td>
<td>${pwd} </td>
<td>${name} </td>
<td>${email}</td>
</tr>
</table>
</body>
</html>
우선 첫번째 방법으로 getAttribute()메서드에 속성 이름을 인자로 하여 값을 가져온다. 그리고 두번째 방법으로 표현 언어에서 자바코드를 사용하지 않고 바로 속성 이름으로 회원 정보를 가져와 출력한다.
첫번재 회원 정보는 getAttribute()메서드를 이용해 출력하고, 두번째 회원 정보는 표현 언어에서 속성이름으로 바로 출력한다
이번에는 request에 회원 정보를 저장한 MemberBean 객체를 바인딩한 후 다시 출력해 보자
forward2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="sec01.ex01.*" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
MemberBean member = new MemberBean("lee", "1234", "이순신", "lee@test.com");
request.setAttribute("member", member);
%>
<html>
<head>
<meta charset=”UTF-8">
<title>forward2</title>
</head>
<body>
<jsp:forward page="member2.jsp" />
</html>
MemberBean 객체를 생성하고 속성에 회원 정보를 설정한다. 그리고request 내장 객체에 속성 이름을 member로 MemberBean 객체를 바인딩한 후 member2.jsp로 포워딩한다.
member2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<html>
<head>
<meta charset=”UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1" align="center" >
<tr align="center" bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
</tr>
<tr align="center">
<td>${member.id} </td>
<td>${member.pwd} </td>
<td>${member.name} </td>
<td>${member.email}</td>
</tr>
</table>
</body>
</html>
request내장 객체에 속성 이름 member로 접근한 후 MemberBean속성 값을 출력한다.
이번에는 request에 회원 정보를 저장한 ArrayList를 바인딩하고 다시 출력해보자.
forward3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.*, sec01.ex01.*" pageEncoding="UTF-8"
isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
List membersList = new ArrayList();
MemberBean m1 = new MemberBean("lee", "1234", "이순신", "lee@test.com");
MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
membersList.add(m1);
membersList.add(m2);
request.setAttribute("membersList", membersList);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forward3</title>
</head>
<body>
<jsp:forward page="member3.jsp" />
</body>
</html>
ArrayList객체를 생성하고 MemberBean 객체를 저장한다.
그리고 request 내장 객체에 ArrayList객체를 다시 membersList 속성 이름으로 바인딩 한 후 두번째 JSP로 포워딩한다.
member3.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<html>
<head>
<meta charset=UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border=1 align="center" >
<tr align="center" bgcolor="#99ccff">
<td width="20%"><b>아이디</b></td>
<td width="20%"><b>비밀번호</b></td>
<td width="20%" ><b>이름</b></td>
<td width="20%"><b>이메일</b></td>
</tr>
<tr align="center">
<td>${membersList[0].id}</td>
<td>${membersList[0].pwd}</td>
<td>${membersList[0].name}</td>
<td>${membersList[0].email}</td>
</tr>
<tr align="center">
<td>${membersList[1].id}</td>
<td>${membersList[1].pwd}</td>
<td>${membersList[1].name}</td>
<td>${membersList[1].email}</td>
</tr>
</table>
</body>
</html>
바인딩시 속성 이름 membersList로 바로 ArrayList객체에 접근한다.
그런다음 저장 순서인 데인덱스를 이용해 각각의 MemberBean에 접근한 후 속성 이름으로 회원 정보를 출력한다.
2) 스코프 우선순의
request, session, application 내장 객체에서는 데이터를 바인딩해서 다른 JSP로 전달한다.
그런데 각 내장 객체에 바인딩하는 속성 이름이 같은 경우 JSP에서는 각 내장 객체에 지정된 출력 우선순위에 따라 순서대로 속성에 접근한다.
forward4.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
request.setAttribute("id","hong");
request.setAttribute("pwd", "1234");
session.setAttribute("name", "홍길동");
application.setAttribute("email", "hong@test.com");
request.setAttribute("address","서울시 강남구");
%>
<html>
<head>
<meta charset=”UTF-8">
<title>forward2</title>
</head>
<body>
<jsp:forward page="member4.jsp" />
</html>
member4.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false"%>
<%
session.setAttribute("address","수원시 팔달구");
%>
<html>
<head>
<meta charset=”UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1" align="center" >
<tr align="center" bgcolor="#99ccff">
<td width="7%"><b>아이디</b></td>
<td width="7%"><b>비밀번호</b></td>
<td width="5%" ><b>이름</b></td>
<td width="5%"><b>이메일</b></td>
<td width="5%" ><b>주소</b></td>
<tr>
<tr align="center">
<td>${id } </td>
<td>${pwd } </td>
<td>${name } </td>
<td>${email }</td>
<td>${address }</td>
</tr>
</table>
</html>
이번에는 forward4.jsp request에 바인딩 하는 부분을 주석해서 다시 실행해보자
표현 언어에서는 동일한 속성 이름에 접근할 경우 page 객체의 속성 우선순위가 가장 높다.
표현언어에서 같은 속성에 대한 우선순위는 다음과 같다
page > request > session > application
참고 : ⌜자바 웹을 다루는 기술⌟ 책을 공부하며 요약・정리한 내용입니다.
'💻 Web_Back end > JSP' 카테고리의 다른 글
[JSTL] 다국어 태그 라이브러리 사용하기 (1) | 2023.05.05 |
---|---|
[JSTL] JSP 표준 태그 라이브러리 (0) | 2023.05.03 |
자바 코드를 없애는 액션태그 (0) | 2023.05.01 |
JSP welcome 파일 지정하기 (0) | 2023.04.30 |
JSP 페이지 예외 처리하기 (0) | 2023.04.29 |