자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 20. 액션 태그(Action Tag) - <jsp:forward>, <jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>

개발학생 2023. 12. 7. 23:23
반응형

1. <jsp:forward>

1) 특징

  • 현재 페이지에 들어온 요청을 다음 페이지로 보내는 액션 태그
    → 이 액션 태그를 만나기까지의 모든 출력을 제거하고, 포워드할 페이지로 요청을 전달
    → 포워드와 같음: 버퍼를 사용하지 않도록 설정했다면 사용 불가
  • 다음 페이지로 요청을 전달하는 것이 목적이므로, 이동된 페이지와 request 영역을 공유함
  • URL이 변경되지 않음

 

2) 시작 페이지(포워드하는 페이지)

  • WebContent 폴더 → ActionTag 폴더에서 ForwardMain.jsp 파일 생성
// WebContent/ActionTag/ForwardMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
//1.(아래 코드 2줄)
pageContext.setAttribute("pAttr", "김유신"); 
request.setAttribute("rAttr", "계백"); 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>액션 태그 - forward</title>
</head>
<body>
    <h2>액션 태그를 이용한 포워딩</h2>    //2.
    <jsp:forward page="/ActionTag/ForwardSub.jsp" />    //3. 
</body>
</html>
  1. page 영역과 request 영역에 속성 저장
  2. 출력되지 않는 문구 (jsp:forward를 만나면 그 전의 모든 출력은 제거됨)
  3. ForwardSub.jsp 파일로 포워드함

 

3) 포워드되는 페이지

  • WebContent 폴더 → ActionTag 폴더에서 ForwardSub.jsp 파일 생성
// WebContent/ActionTag/ForwardSub.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>액션 태그 - forward</title>
</head>
<body>
    <h2>포워드 결과</h2>
    <ul>
        <li>
            page 영역 : <%= pageContext.getAttribute("pAttr") %>    //1.
        </li>
        <li>
            request 영역 : <%= request.getAttribute("rAttr") %>    //2.
        </li>
    </ul>
</body>
</html>
  1. page 영역에 저장한 속성값 출력 시도
  2. request 영역에 저장할 속성값 출력 시도

 

4) ForwardMain.jsp를 [Run As] → [Run On Server]로 실행한 결과

  • page 영역에 저장한 속성값 출력 시도 → 실패
  • request 영역에 저장할 속성값 출력 시도 → 성공(”계백”이 출력됨)
  • 실행 결과의 주소표시줄에는 ‘ForwardMain.jsp’가 표시되지만, 화면에는 ForwardSub.jsp의 내용이 출력됨

 

2. <jsp:useBean>

  • 자바빈즈(JavaBeans)를 생성하거나 설정할 때 사용 [자바빈즈: 자바빈즈 개발 규약 참고]

1) 자바빈즈 생성

  • <jsp:useBean>으로 자바빈즈를 생성할 때는 기본 생성자를 호출함 (해당 클래스에 기본 생성자가 없다면 에러 발생
  • ⇒ 기본 생성자는 자바빈즈 규약에서 필수로 정해두었으므로, 규약대로만 만들었다면 문제 없음
  • <jsp:useBean>액션 태그 의 사용방법
    • id: 자바빈즈 객체의 이름 지정 (같은 id로 이미 생성된 객체가 있다면 해당 객체를 사용하고, 아직 없다면 새로 생성)
    • class: 사용하려는 자바빈즈 객체의 실제 패키지명과 클래스명 저장 (자바에서 다른 패키지의 클래스를 사용하기 위해 import를 하는 것과 같음)
    • scope: 자바빈즈가 저장될 내장 객체 영역 지정 (생략 시 기본 값인 page 영역이 저정됨/액션 태그로 생성한 자바빈즈는 4가지 영역 중 한 곳에 저장됨)
<jsp:useBean id="자바빈즈 이름" class="사용할 패키지와 클래스명" scope="저장될 영역" />

2) 멤버 변수 값 설정/추출

(1) <jsp:getProperty>로 멤버 변수 값 설정

<jsp:setProperty name="자바빈즈 이름" property="속성명(멤버 변수)"
 value="설정할 값" />
name <jsp:useBean> 의 id 속성에 지정한 자바빈즈의 이름을 지정함 → 인스턴스 변수를 지정하는 것과 동일
property  자바빈즈의 멤버 변수명 지정
→ 이름을 명시하지 않고 property=”*”라고 쓰면, form의 하위 요소와 일치하는 자바빈즈의 모든 속성에 사용자가 전송한 값이 설정됨 (이때는 value 속성 생략 가능) 
value 멤버 변수에 설정할 값을 지정함

 

(2) <jsp:getProperty>로 자바빈즈(멤버 변수)의 값 추출

  • 각 속성의 의미는<jsp:getProperty>와 같음
<jsp:getProperty name="자바빈즈 이름" property="속성명(멤버 변수)" />

(3) 멤버 변수 값 설정/추출 예제

  • WebContent 폴더 → ActionTag 폴더에서 UseBeanMain.jsp 파일 생성
// WebContent/ActionTag/UseBeanMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>액션 태그 - UseBean</title>
</head>
<body>
    <h2>useBean 액션 태그</h2>
    <h3>자바빈즈 생성하기</h3>
    <jsp:useBean id="person" class="common.Person" scope="request" />    //1.

    <h3>setProperty 액션 태그로 자바빈즈 속성 지정하기</h3>
		//2.(아래 코드 2줄)
    <jsp:setProperty name="person" property="name" value="임꺽정" /> 
    <jsp:setProperty name="person" property="age" value="41" /> 

    <h3>getProperty 액션 태그로 자바빈즈 속성 읽기</h3>
    <ul>
				//3.(아래 코드 2줄)
        <li>이름 : <jsp:getProperty name="person" property="name" /></li> 
        <li>나이 : <jsp:getProperty name="person" property="age" /></li> 
    </ul>
</body>
</html>

1. common 패키지의 Person 클래스로 person이라는 자바빈즈를 생성해 request 영역에 저장함

//1.을 자바코드로
Peson person = (Person)request.getAttribute("person");    //request 영역에서 가져옴
if (person == null) {    //없으면 새로 생성해 저장
		person = new Person();
		request.setAttribute("person", person);
}		

 

2. person 자바빈즈의 name과 age 멤버 변수에 값 설정 (setter 메소드 이용)

3. 자바빈즈에서 멤버 변수의 값 출력 (getter 메소드를 이용해 값 추출)

 

  • UseBeanMain.jsp을 [Run] → [Run On Server]로 실행한 결과
    → Person 클래스를 기반으로 자바빈즈를 생성하고 설정된 값이 출력됨

 

3) 와일드카드로 폼값 한 번에 설정하기

*와일드카드 사용 시 폼값과 자바빈즈 멤버 변수 매핑

 

(1) 폼값을 전송하는 페이지 생성

  • WebContent 폴더 → ActionTag 폴더에서 UseBeanForm.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>액션 태그 - UseBean</title></head>
<body>
    <h2>액션 태그로 폼값 한 번에 받기</h2> 
    <form method="post" action="UseBeanAction.jsp">    //1.
				//2.(아래 2줄)
        이름 : <input type="text" name="name" /> <br /> 
        나이 : <input type="text" name="age" /> <br /> 
        <input type="submit" value="폼값 전송" />    //3.
    </form>
</body>
</html>
  1. 폼값을 전송하는 방식을 post로 설정
  2. 이름과 나이 입력 (input 태그의 name 값이 Person 클래스의 멤버 변수 이름과 같아야 함)
  3. 폼값을 전송

 

(2) 폼값을 받는 페이지

  • WebContent 폴더 → ActionTag 폴더에서 UseBeanAction.jsp 파일 생성
// WebContent/ActionTag/UseBeanAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>액션 태그 - UseBean</title></head>
<body>
    <h3>액션 태그로 폼값 한 번에 받기</h3>
    <jsp:useBean id="person" class="common.Person" />    //1.  
    <jsp:setProperty property="*" name="person" />    //2.  
    <ul>
				//3.(아래 2줄)
        <li>이름 : <jsp:getProperty name="person" property="name" /></li>  
        <li>나이 : <jsp:getProperty name="person" property="age" /></li> 
    </ul>
</body>
</html>
  1. Person클래스로 자바빈즈 생성 - scope 속성을 설정하지 않았으므로, 가장 좁은 page 영역에 저장됨
  2. <jsp:setProperty>로 폼값을 자바빈즈에 설정함→ 폼값은 항상 input 태그의 name 속성에 지정한 이름을 통해 전송되므로, name 속성에 지정한 이름과 Person 클래스의 멤버 변수 이름을 같게 하면 폼값을 한 번에 저장!
    → property 속성에 멤버 변수 이름 대신 와일드카드 [*] 사용해서, 전송된 폼값이 자바빈즈에 한 번에 저장됨
  3. 2.에서 설정한 값이 제대로 들어 있는지 확인

 

(3) 한글 인코딩 문제 방지

  • WebContent 폴더 → WEB-INF 폴더에서 web.xml 파일 수정 (’필터’ 추가)
// WebContent/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=...생략...>
  
  ...생략...

	<filter>    //1.
			<filter-name>SetCharEncoding</filter-name>    //2.
			<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>    //3.
			
			<init-param>
					<param-name>encoding</param-name>    //4.
					<param-value>utf-8</param-value>    //5.
			</init-param>
	</filter>
	<filter-mapping>    //6.
			<filter-name>SetCharEncoding</filter-name>    //7.
			<url-pattern>/*</url-pattern>    //8.
	</filter-mapping>
</web-app>
  1. <filter> 태그: 필터의 이름, 사용할 클래스, 4., 5. 클래스에 전달할 매개변수 설정
  2. 필터의 이름 - SetCharEncoding
  3. 사용할 클래스
  4. 인코딩 방식(이름)
  5. 인코딩 값: utf-8
  6. <filter-mapping> 태그로 요청 URL과 필터를 매핑
  7. 8.로 인해, 해당 웹 애플리케이션으로 들어오는 모든 요청에 SetCharEncoding이라는 이름의 필터 적용
  8. URL 패턴을 /*로 지정
    → 모든 요청의 encoding을 utf-8로 변경

(4) 동작 확인

  • UseBeanForm.jsp 파일 [Run] → [Run On Server]로 실행 후, 이름과 나이 입력란에 각각 “안창호”와 “60”을 입력하고 [폼값 전송 버튼 클릭]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형