관리 메뉴

거니의 velog

(12) 표현 언어와 JSTL 3 본문

Java/Java_JSP

(12) 표현 언어와 JSTL 3

Unlimited00 2023. 9. 14. 21:28

3. 표현 언어로 바인딩 속성 출력하기

* request, session, application 내장 객체에 속성을 바인딩한 후 다른 서블릿이나 JSP에 전달할 수 있다. 표현 언어를 사용하면 자바 코드를 사용하지 않고 바인딩된 속성 이름으로 바로 값을 출력할 수 있다.


(1) 내장 객체 속성 값 출력 실습

* 먼저 request, session, application 내장 객체에 바인딩된 속성 값을 표현 언어를 이용해 JSP에 출력해 보자.

1. 첫 번째 JSP인 forward1.jsp를 다음과 같이 작성한다. 브라우저에서 요청 시 request, session, application 내장 객체에 회원 정보를 바인딩한 후 다시 member1.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"); // request 내장 객체에 바인딩한다.
  session.setAttribute("name", "홍길동"); // sesson 내장 객체에 바인딩한다.
  application.setAttribute("email", "hong@test.com"); // application 내장 객체에 바인딩한다.
%>

<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>forward1</title>
    </head>

    <body>
        <jsp:forward page="member1.jsp" /> <!-- member1.jsp로 포워딩한다. -->
    </body>

</html>

2. 두 번째 JSP인 member1.jsp를 다음과 같이 작성한다. 우선 첫 번째 방법으로 getAttribute() 메서드에 속성 이름을 인자로 하여 값을 가져온다. 그리고 두 번째 방법으로 표현 언어에서 자바 코드를 사용하지 않고 바로 속성 이름으로 회원 정보를 가져와 출력한다.

<%@ 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");
   // 각 내장 객체에 바인딩된 속성 값들을 getAttribute() 메서드를 이용해 가져온다.
%>
<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>

3. 다음의 주소로 요청한다. 첫 번째 회원 정보는 getAttribute() 메서드를 이용해 출력하고, 두 번째 회원 정보는 표현 언어에서 속성 이름으로 바로 출력한다.

- http://localhost:8090/pro14/test02/forward1.jsp

* 이번에는 request에 회원 정보를 저장한 MemberBean 객체를 바인딩한 후 다시 출력해 보자.

4. 다음과 같이 forward2.jsp에서 MemberBean 객체를 생성하고 속성에 회원 정보를 설정한다. 그리고 request 내장 객체에 속성 이름 member로 MemberBean 객체를 바인딩한 후 member2.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"); // MemberBean 객체 생성 후 회원 정보를 속성에 설정한다.
  request.setAttribute("member", member); // 속성 이름 member로 MemberBean 객체를 바인딩한다.
%>

<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>forward2</title>
    </head>

    <body>
        <jsp:forward page="member2.jsp" />
    </body>

</html>

5. member2.jsp를 다음과 같이 작성한다. request 내장 객체에 속성 이름 member로 접근한 후 MemberBean 속성 값을 출력한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"    isELIgnored="false"  %>

<html lang="ko">

    <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> 
                <!-- 바인딩 시 속성 이름으로 각각의 MemberBean 속성에 접근하여 회원 정보를 출력한다. -->
            </tr>
        </table>
    </body>

</html>

6. 다음의 주소로 요청하여 실행 결과를 확인한다.

- http://localhost:8090/pro14/test02/forward2.jsp

7. 이번에는 request에 회원 정보를 저장한 ArrayList를 바인딩하고 다시 출력해 보자. forward3.jsp에서 다음과 같이 ArrayList 객체를 생성하고 MemberBean 객체를 저장한다. 그리고 request 내장 객체에 ArrayList 객체를 다시 memberList 속성 이름으로 바인딩 한 후 두 번째 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(); // ArrayList 객체를 생성한다.
   MemberBean m1 = new MemberBean("lee", "1234", "이순신", "lee@test.com");
   MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com"); // MemberBean 객체를 생성한 후 두 명의 회원 정보를 저장한다.
   membersList.add(m1);
   membersList.add(m2); // 두 개의 MemberBean 객체를 ArrayList에 저장한다.
   request.setAttribute("membersList", membersList); // request 내장 객체에 ArrayList를 속성 이름 memberList로 바인딩한다.
%>
<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>forward3</title>
    </head>

    <body>
        <jsp:forward page="member3.jsp" />
    </body>

</html>

8. member3.jsp를 다음과 같이 작성한다. 바인딩 시 속성 이름 membersList로 바로 ArrayList 객체에 접근한다. 그런 다음 저장 순서인 인덱스를 이용해 각각의 MemberBean에 접근한 후 속성 이름으로 회원 정보를 출력한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"   isELIgnored="false"  %>
<%
  request.setCharacterEncoding("UTF-8");
%>

<html lang="ko">

    <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>
            <!-- 표현 언어에서 속성 이름으로 ArrayList에 접근한 후 인덱스를 이용해 첫 번째 회원 정보를 출력한다. -->
            <tr align="center">
                <td>${membersList[0].id}</td>
                <td>${membersList[0].pwd}</td>
                <td>${membersList[0].name}</td>
                <td>${membersList[0].email}</td>
            </tr>
            <!-- 표현 언어에서 속성 이름으로 ArrayList에 접근한 후 인덱스를 이용해 두 번째 회원 정보를 출력한다. -->
            <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>

9. 다음의 주소로 요청한다. 복잡한 자바 코드를 사용하지 않고 바로 속성 이름과 인덱스만으로 회원 정보가 출력된 결과를 확인할 수 있다.

- http://localhost:8090/pro14/test02/forward3.jsp


(2) 스코프 우선순위

* request, session, application 내장 객체에서는 데이터를 바인딩해서 다른 JSP로 전달한다. 그런데 각 내장 객체에 바인딩하는 속성 이름이 같은 경우 JSP에서는 각 내장 객체에 지정된 출력 우선순위에 따라 순서대로 속성에 접근한다. 이번에는 각 내장 객체에 같은 속성 이름으로 바인딩할 때의 출력 우선순위를 알아보자.

1. forward4.jsp를 다음과 같이 작성한다. request에 address를 바인딩한 후 다시 member4.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","서울시 강남구"); // request에 address 속성 이름으로 바인딩한다.
%>

<html>

    <head>
        <meta charset="UTF-8">
        <title>forward2</title>
    </head>

    <body>
        <jsp:forward page="member4.jsp" />
    </body>

</html>

2. member4.jsp를 다음과 같이 작성한다. session에 다시 동일한 속성 이름 address로 바인딩한다. 만약 표현 언어로 address 값을 출력하면 session보다 request가 우선순위가 높으므로 request의 address 값이 출력된다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false"%>
<%
  session.setAttribute("address","수원시 팔달구"); // session에 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> <!-- request에서 바인딩된 address 값이 출력된다. -->
        </tr>
    </table>
</body>

</html>

3. 다음의 주소로 요청한다. 주소를 보면 request에 바인딩된 값이 출력된 것을 알 수 있다.

- http://localhost:8090/pro14/test02/forward4.jsp

4. 이번에는 forward4.jsp에 request에 바인딩하는 부분을 주석 처리한다.

5. 다시 회원 가입 창에서 가입하기를 클릭하면 다음과 같이 session에서 바인딩한 주소가 출력된다.

6. 표현 언어에서는 동일한 속성 이름에 접근할 경우 page 객체의 속성이 우선순위가 가장 높다. 표현 언어에서 같은 속성에 대한 우선순위는 다음과 같다.

page > request > session > application

'Java > Java_JSP' 카테고리의 다른 글

(14) 표현 언어와 JSTL 5  (0) 2023.09.15
(13) 표현 언어와 JSTL 4  (0) 2023.09.15
(11) 표현 언어와 JSTL 2  (0) 2023.09.14
(10) 표현 언어와 JSTL 1  (0) 2023.09.13
(9) 자바 코드를 없애는 액션 태그 3  (0) 2023.09.13