본문 바로가기
국비학원

[국비지원] KH 정보교육원 86일차

by 도전하는 개발자 2022. 7. 29.

kh day 086

3. <jsp:setProperty /> 액션 태그 이어서 나가자

자바빈(JavaBeans)에 초기화하려는 값이 HTML태그의 입력 파라미터값이라면 다음과 같이 value속성 대신에 param 속성을 사용한다. param 속성값으로 HTML 태그의 name값을 지정하면 자동으로 파라미터값이 프라퍼티에 저장된다. 

<jsp:setProperty name="빈 이름“ property="프라퍼티 이름” param="파라미터명“ />

param 속성
앞서 작업했던 LoginBean 클래스에 HTML의 입력 파라미터값으로 초기화하기 위한 방법은 다음과 같다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>로그인 창</title>
</head>
<body>
    <h1>/loginForm.html</h1>
    <hr>

    <form action="JSP/useBeanParam.jsp" method="post">
        <fieldset>
            <legend>로그인 폼</legend>
            <ul>
                <li>
                    <label for="userid">아이디</label>
                    <input type="text" name="userid">
                </li>

                <li>
                    <label for="passwd">비밀번호</label>
                    <input type="password" name="passwd">
                </li>

                <li>
                    <input type="submit" value="전송">
                </li>
            </ul>
        </fieldset>
    </form>
</body>
</html>

loginForm2.html

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

<jsp:useBean id="myBean" class="org.zerock.myapp.domain.LoginBean" />

<!-- param 속성에 지정한 이름이 바로 전송 파라미터의 이름임 -->
<jsp:setProperty name="myBean" property="userid" param="userid" />
<jsp:setProperty name="myBean" property="passwd" param="passwd" />


<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>useBeanParam</title>
</head>

<body>
    <h1>/JSP/useBeanParam</h1>
    <hr>

    <h1>param 속성을 통한 전송 파라미터 자동수집 실습</h1>

    1. userid: <%= myBean.getUserid() %> <br>
    1. passwd: <%= myBean.getPasswd() %> <br>

    <!--  -->
    <p>다른 방식으로 해보자 (위에 방법이 더 낫다)</p>

    1. userid: <jsp:getProperty name="myBean" property="userid" /><br>
    1. passwd: <jsp:getProperty name="myBean" property="passwd" />
    
</body>
</html>

useBeanParam.jsp


만약에 자바빈(JavaBeans)의 프라퍼티명과 HTML 태그의 입력 파라미터명이 모두 일치한다면 다음과 같이 간단하게 표현이 가능하다. 
<jsp:setProperty name="빈 이름“ property="*” />

다음은 HTML 태그의 파라미터명과 LoginBean의 프라퍼티가 일치하는 경우의 예이다. 



 

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

<!-- page 공유영역에 LoginBean 객체가 있으면 재사용하고 없으면 생성해서 page 공유영역에 바인딩 -->
<jsp:useBean id="myBean" class="org.zerock.myapp.domain.LoginBean" scope="page" />
<!-- 자바빈 객체의 프로퍼티의 이름과 모든 전송파라미터의 이름이 일치하는 경우에만 사용가능 -->
<jsp:setProperty name="myBean" property="*" />

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>useBeanAll</title>
</head>

<body>
    <h1>/JSP/useBeanAll.jsp</h1>    
    <hr>

    <h1>param 속성을 통한 전송파라미터 자동수집 실습2</h1>

    1. userid: <jsp:getProperty name="myBean" property="userid" /> <br>
    2. passwd: <jsp:getProperty name="myBean" property="passwd" />
</body>
</html>

useBeanAll.jsp

---

4. <jsp:getProperty /> 액션 태그
자바빈(JavaBeans)의 프라퍼티를 출력하기 위한 방법이다. 기본적인 문법은 다음과 같다
<jsp:getProperty name="빈 이름“ property="프라퍼티 명” />

이전에 작업했던 LoginBean의 userid 프라퍼티값을 출력하기 위한 예이다.

 

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

<jsp:useBean id="myBean" class="org.zerock.myapp.domain.LoginBean" />
<jsp:setProperty name="myBean" property="userid" value="john" />
<jsp:setProperty name="myBean" property="passwd" value="1234" />

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <title>useBeanGet</title>
</head>

<body>    
    <h1>getProperty 실습</h1>
    
    <!-- useBean으로 얻어낸 자바빈 객체의 프로퍼티 값을 원하는 위치에 출력 -->
    1. 사용자 아이디: <jsp:getProperty name="myBean" property="userid" /> <br>
    2. 사용자 비밀번호: <jsp:getProperty name="myBean" property="passwd" />

    <!-- 다른 방법으로 해보자 (이게 낫다) -->
    1. userid: <%= myBean.getUserid() %> <br>
    2. passwd: <%= myBean.getPasswd() %>

</body>
</html>

useBeanGet.jsp

---

5. <jsp:include /> 액션 태그
앞서 JSP 스크립팅 요소중에서 include 지시어를 배웠다. 여러 JSP페이지마다 공통되는 부분이 있는 경우에 매 페이지마다 중복처리를 하지 않고 공통되는 부분을 삽입시켜 재사용하는 방법이다. 일반적으로 웹 페이지의 footer영역 및 header영역, side영역등으로 모든 페이지가 공통된 화면을 갖는 구조에 적합하다. 이와 마찬가지로 JSP액션 태그도 공통되는 부분을 삽입시켜 재사용하는 방법으로 기본 문법은 다음과 같다. 

page 속성에는 포함시킬 파일명을 지정하고 flush 속성에는 버퍼의 동작방식을 지정한다. true값인 경우에는 버퍼가 모두 채워지지 않더라고 응답 처리되며 일반적으로 true값으로 설정하여 사용한다. 소량의 데이터인 경우에는 문제 발생이 없지만 대량의 데이터를 응답처리할 때 버퍼에 모두 채워서 처리하면 웹 브라우저의 응답화면이 깨지는 현상이 자주 발생되기 때문에 true값으로 설정하여 바로바로 처리하는 방식을 취한다. 
<jsp:include page="삽입될 페이지“ flush="true" />

include 지시어는 정적인(static) 메커니즘으로 동작된다. 따라서 서블릿으로 변환되기 전에 삽입될 페이지의 모든 내용이 먼저 삽입되고 나중에 삽입된 페이지가 한꺼번에 서블릿 코드로 변환되어 실행된다. 따라서 고정된 데이터를 삽입시키는 경우에 적합하다. 

반면에 include 액션 태그의 동작 메커니즘은 다음과 같다. 동적(dynamic)삽입이기 때문에 main.jsp가 header.jsp 페이지로 요청을 한다. 요청받은 header.jsp가 실행된 결과를 소스코드 내용으로 포함시켜 동작하게 된다. 따라서 main.jsp 페이지와 header.jsp페이지 모두 서블릿으로 변환된다. header.jsp페이지가 동적으로 실행된 결과를 포함하는 형태이기 때문에 고정된 데이터가 아닌 변경 가능한 데이터를 삽입할 때 효과적이다

 

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

<%@ page import="java.util.Calendar"%>

<%
    // 내장객체 request 사용
    request.setCharacterEncoding("utf8");

    String httpMethod = request.getMethod();            // HTTP method 획득
    String nickName = request.getParameter("nickName"); // 전송파라미터 획득

    Calendar cal = Calendar.getInstance();    // 달력객체 얻기

    int hour = cal.get(Calendar.HOUR_OF_DAY); // 달력에서 현재 시간 획득
    int minute = cal.get(Calendar.MINUTE);    // 달력에서 현재 분 획득
    int second = cal.get(Calendar.SECOND);    // 달력에서 현재 초 획득

%>

<h1>/JSP/header.jsp</h1>
<hr>
<h1>현재시간 구해주는 jsp</h1>

<h1>현재 시간은 <%= hour %>시 <%= minute %>분 <%= second %>초 입니다</h1>
<h1>닉네임은 <%= nickName %>입니다 </h1>
<h1>HTTP Method :  <%= httpMethod %>입니다 </h1>

header.jsp

 

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

<!-- 현재 페이지 : main.jsp-->

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>main</title>
</head>

<body>
    <h1>/JSP/main2.jsp</h1>
    <hr>

    <h1>include 지시어 태그 실습</h1>

    현재 시간을 구하는 예제입니다. 다음 줄에 header.jsp를 삽입하겠습니다. <br>

    <!-- 동적인 삽입 수행 -->
    <jsp:include page="/JSP/header.jsp" flush="true">
        <jsp:param name="nickName" value="홍길동" />
    </jsp:include>

    <hr>

    <!-- 정적인 삽입 수행 -->
    <!-- <%@ include file="/JSP/header.jsp" %> -->

</body>
</html>

main2.jsp


* 동적 삽입 (<jsp:include ... ) vs 정적 삽입 (<%@ include ... )
동적 삽입은 실행(runtime)시 자식을 컴파일해 불러온다.
정적 삽입은 부모에 자식의 코드를 불러온 후에 통째로 컴파일 한다.
실전에서는 동적삽입을 주로 사용한다.

---

6. <jsp:forward /> 액션 태그
앞서 서블릿에서 학습했던 요청 포워딩 방법중에서 RequestDispatcher 클래스를 이용한 포워드 방식과 동일하게 JSP페이지에서 사용할 수 있는 방법이다. 따라서 클라이언트로부터의 요청과 내부적인 포워드를 통한 요청이 동일한 HttpServletRequest 객체로 처리된다. 기본적인 문법은 다음과 같다.
<jsp:forward page="요청 페이지“ />

요청시 다음과 같이 파라미터값을 설정할 수도 있다. 
<jsp:forward page="삽입될 페이지“ >
 <jsp:param name="파라미터 명“ value="값” />
 <jsp:param name="파라미터 명“ value="값” />
</jsp:forward>

include 액션과 마찬가지로 요청받은 페이지에서 request.getParameter(name) 메소드를 사용하여 요청 파라미터값을 얻는다.

 

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>current.jsp</title>
</head>

<body>
    <h1>/JSP/current.jsp</h1>
    <hr>

    <jsp:forward page="/JSP/forward.jsp">
        <jsp:param name="nickName" value="한글" />
    </jsp:forward>
</body>
</html>

current.jsp

 

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>forward.jsp</title>
</head>

<body>
    <h1>/JSP/forward.jsp</h1>
    <hr>

    <h1>/JSP/forward.jsp에서 포워드 된 화면</h1>

    <%
        String httpMethod = request.getMethod();    // HTTP Method

        // 1. 직접 사용자가 입력하여 전송된 파라미터 획득
        String data = request.getParameter("data");

        // 2. current.jsp에서 준 전송 파리미터 획득
        String nickName = request.getParameter("nickName");
    %>

    <h1>포워드 되었으며 넘어온 파라미터 값은 <%= nickName %> 입니다.</h1>
    <h1>직접 입력시킨 파라미터 값은 <%= data %> 입니다.</h1>
    <h1>HTTP method: <%= httpMethod %></h1>
</body>
</html>

forward.jsp

------

9장 JSP 고급

* EL 언어의 문법 : {EL변수}

* EL 변수는 뭔가요?
 1) 4개의 공유영역에 바인딩되어있는 공유속성명 (***)
 2) EL의 내장객체
 3) JSTL의 문법상 만들어지는 EL변수 (나중에 배우자)


* 만일 특정 공유영역에 바인딩 되어있는 공유속성이 아래 녀석들이라면
  어떻게 ${ } 문법으로 위 객체들을 출력할 수 있을까?
 1) 자바빈즈 객체  -> ${ 공유속성.프로퍼티명 } or ${ 공유속성명.getter메소드 }
 2) Map 객체
 3) 배열 객체
 4) List 컬렉션
 5) 사용자 정의 객체


***EL (Expression Language)

1. EL 개요
EL은 데이터를 출력하기 위한 언어로서 문법이 직관적으로 사용하기 쉽게 구성이 되어있다. 일반적으로 JSP에서는 변수를 출력할 때 변수선언과 초기화가 반드시 필요하지만 EL은 그러한 과정 없이 바로 사용이 가능하고 null값 처리가 쉽다. 따라서 다양한 형태로 저장된 데이터를 효율적으로 처리할 수 있는 장점이 있다. 다양한 형태란 것은 Map형식, List 형식, 배열 형식, 자바빈(JavaBeans)등과 같은 형태를 의미한다.

---

2. EL 내장 객체
EL은 저장된 데이터를 참조하기 위한 내장 객체를 제공한다



---

3. EL 연산자
일반적인 프로그램 언어처럼 연산자도 제공된다. 다음은 EL표기법에서 사용 가능한 연산자 목록이다



---

4. EL 기본문법
EL의 기본 문법은 다음과 같이 $을 이용한 중괄호로 표현된다. 
${ 표현식 }

표현식은 내장객체 또는 scope 영역에 저장된 속성, 배열, List 및 Map 형식을 지정할 수 있다.