기존 JSP 스크립트 언어에서 조금 더 발전하여, 표현언어라는 새로운 기능이 추가되었다.
또한, 표현언어에도 개발자가 사용하기 편한 "내장객체"가 정의되어있어서 조금 더 간편하게 데이터를 조작할 수 있다.
표현언어 기본 형식 : ${표현식 또는 값}
표현식을 이용해 파라미터 출력하기
<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<%
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String name = request.getParameter("name");
String email = request.getParameter("email");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >아이디</td>
<td width="7%">비밀번호</td>
<td width="5%" >이름</td>
<td width="11%" >이메일</td>
</tr>
<tr align="center">
<td><%=id%></td>
<td><%=pwd%></td>
<td><%=name%></td>
<td><%=email%></td>
</tr>
<!--
표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
-->
<tr align="center">
<td>${param.id}</td>
<td>${param.pwd}</td>
<td>${param.name}</td>
<td>${param.email}</td>
</tr>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- 표현언어를 사용하기 위해서는 반드시, 페이지 디렉티브에 isELIgnored="false" 을 선언해야 한다.
- JSP스크립트만 이용하면 웹 파라미터를 받아와서 출력해야 하지만, 표현언어를 사용하면 param객체를 통해 자동으로 바인딩 되므로, 바로 출력할 수 있다.
requestScope
내장객체를 통해, 리퀘스트 영역의 데이터를 바로 접근할 수 있다.
memberForm.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입창</title>
<body>
<form method="post" action="forward.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>
- 파라미터들을 forward.jsp 로 전송한다.
forward.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
request.setAttribute("address", "서울시 강남구");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포워딩</title>
</head>
<body>
<jsp:forward page="member2.jsp"></jsp:forward>
</body>
</html>
- forward 에서는 request 객체의 데이터를 추가해서 다시 member2.jsp 로 포워딩한다.
member2.jsp
<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >아이디</td>
<td width="7%">비밀번호</td>
<td width="5%" >이름</td>
<td width="11%" >이메일</td>
<td width="11%" >주소</td>
</tr>
<!--
표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
-->
<tr align="center">
<td>${param.id}</td>
<td>${param.pwd}</td>
<td>${param.name}</td>
<td>${param.email}</td>
<td>${requestScope.address}</td>
</tr>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- 기존파라미터는 표현식을 통해 바인딩해서 출력하였고, 주소부분은 requestScope를 통해 리퀘스트영역에 바인딩 된 addresss 객체에 접근하여 출력하였다.
표현언어에서 객체 접근
표현언어를 통해서도 객체(빈)에 조금 더 수월하게 접근할 수 있다.
<%@page import="java.util.List"%>
<%@ 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="*" /> <!-- setProperty로 파라미터들을 담아옴 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >아이디</td>
<td width="7%">비밀번호</td>
<td width="5%" >이름</td>
<td width="11%" >이메일</td>
</tr>
<tr align="center">
<td><%=m.getId()%></td>
<td><%=m.getPwd() %></td>
<td><%=m.getName() %></td>
<td><%=m.getEmail() %></td>
</tr>
<!--
표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
-->
<tr align="center">
<td>${m.id}</td>
<td>${m.pwd}</td>
<td>${m.name}</td>
<td>${m.email}</td>
</tr>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- jsp:useBean 을 사용하여, 객체 생성 후 setProperty로 데이터를 바인딩한다.
- JSP 스크립트에서는 객체의 getter / setter 메서드를 통해 값을 출력하지만, 표현언어를 사용하면 조금 더 간편하게 데이터를 출력할 수 있다.
컬렉션 객체 접근
동일한 방법으로 표현언어에서 컬렉션 객체에 접근 방법을 알아보자.
ArrayList
member4.jsp
<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="m1" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m1" property="*" /> <!-- setProperty로 파라미터들을 담아옴 -->
<jsp:useBean id="memberList" class="java.util.ArrayList" />
<%
MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
memberList.add(m1);
memberList.add(m2);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >아이디</td>
<td width="7%">비밀번호</td>
<td width="5%" >이름</td>
<td width="11%" >이메일</td>
</tr>
<tr align="center">
<td>${memberList[0].id}</td>
<td>${memberList[0].pwd}</td>
<td>${memberList[0].name}</td>
<td>${memberList[0].email}</td>
</tr>
<!--
표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
-->
<tr align="center">
<td>${memberList[1].id}</td>
<td>${memberList[1].pwd}</td>
<td>${memberList[1].name}</td>
<td>${memberList[1].email}</td>
</tr>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- 컬렉션 프레임워크의 "ArrayList" 는 객체를 배열하는 배열이기 때문에, 인덱스로 접근한다.
- 보통의 사용법과 다르지 않다.
- getter 메서드를 통해 값을 출력하지 않아도 되므로, 편리하다.
HashMap
<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="m1" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m1" property="*" /> <!-- setProperty로 파라미터들을 담아옴 -->
<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);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >아이디</td>
<td width="7%">비밀번호</td>
<td width="5%" >이름</td>
<td width="11%" >이메일</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>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- 별 다를게 없다. Map 은 key, value 이므로 key에 접근해서 값을 출력해온다.
- key 값이 List도 되어있을 경우도 마찬가지이다.
has-a 관계 데이터 가져오기.
has-a 관계란 한 객체안에서 다른 객체를 참조하고 있는 경우를 뜻 한다.
myMemberBean
private Address addr; // 사용자 객체변수
- 객체의 프로퍼티에 Address 객체를 가진다.
Address
package sec01.ex02;
public class Address {
private String city;
private String zipcode;
public Address() {
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
}
member6.jsp
<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ 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="*" /> <!-- setProperty로 파라미터들을 담아옴 -->
<jsp:useBean id="addr" class="sec01.ex02.Address" />
<jsp:setProperty name="addr" property="city" value="서울" /> <!-- setProperty로 파라미터들을 담아옴 -->
<jsp:setProperty name="addr" property="zipcode" value="076054" /> <!-- setProperty로 파라미터들을 담아옴 -->
<%
m.setAddr(addr);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >아이디</td>
<td width="7%">비밀번호</td>
<td width="5%" >이름</td>
<td width="11%" >이메일</td>
<td width="11%" >도시</td>
<td width="11%" >우편번호</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>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- has-a 객체에 접근
스코프 우선순위
내장객체의 변수값이 모두 같은 이름일 때, 데이터 접근에 대한 우선순위를 가진다.
이럴경우 가장 가까운 영역의 데이터를 가져온다.
forward.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
request.setAttribute("address", "서울시 강남구");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포워딩</title>
</head>
<body>
<jsp:forward page="member4.jsp"></jsp:forward>
</body>
</html>
- 리퀘스트 객체의 address 데이터 세팅.
member4.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
request.setCharacterEncoding("UTF-8");
session.setAttribute("address", "서울시 동작구");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<table align="center" width="100%">
<tr align="center" bgcolor="#99ccff">
<td width="7%" >주소</td>
</tr>
<tr align="center">
<td>${address}</td>
</tr>
<tr height="1" bgcolor="#99ccff">
<td colspan="5"></td>
</tr>
</table>
</body>
</html>
- 세션객체의 데이터 address 세팅
내장객체 접근 우선순위는 page → request → session → applicationContext 순이다.
출처: 자바 웹을 다루는 기술
'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글
JSP 액션태그와 Bean (0) | 2020.02.07 |
---|---|
서블릿 스코프, URL패턴, 필터 (0) | 2020.01.30 |
브라우저에서의 사용자정보관리(쿠키, 세션) (0) | 2020.01.16 |
서블릿 리다이렉트 와 바인딩 (0) | 2019.12.26 |
서블릿과 DB 연동 (2) | 2019.12.19 |