개발자 미니민의 개발스터디

[JSP] 액션 태그 (계산기) / java Bean / setProperty, getProperty

by mini_min

JSP

[JSP] 액션 태그 (계산기) / java Bean / setProperty, getProperty

✔️ 액션 태그

: 액션 태그란? JSP 액션 태그는 클라이언트 혹은 서버에게 어떠한 동작을 행하도록 명령을 내리는 태그이다.

: JSP 페이지에서 페이지의 모듈화와 흐름제어를 위해 include, forward 액션 태그를 제공하고, 자바 빈의 사용을 위해 useBean, setProperty, getProperty 등의 액션 태그를 제공한다.

 

📓 특징

- JSP 액션 태그는 XML 구문 형식으로 작성한다.

- 시작 태그가 있으면 반드시 끝나는 태그가 있어야한다.

- 액션 태그는 접두어 jsp: 가 붙는다.

- XML 규칙에 의해 끝나는 태그를 따로 하지 않고 시작 태그의 마지막 부분을 /> 로 마무리한다.

 

👩‍💻 주요 액션 태그 종류

<jsp:useBean> : 자바 빈 객체를 생성, 사용하기 위한 환경을 정의하는 태그이다.

<jsp:setProperty> : 자바 빈 태그로 생성한 자바 빈 객체의 속성값 설정 (추출은 get)

<jsp:forward> : 현재 페이지에서 다른 페이지로 제어를 이동한다.

<jsp:include> : 현재 페이지에 다른 페이지 실행 결과를 포함한다.

<jsp:param> : 포워드, 인클루드 태그에서 데이터 전달 목적으로 사용한다.

 

👩‍💻 액션 태그 속성

id : JSP 페이지에서 참조할 수 있는 액션 태그를 고유하게 식별한다.

scope : 연관된 객체의 id 의 라이프 사이클을 정의한다. 즉, 인스턴스가 사용 가능하게될 범위를 정의한다.

(page, request, session, application)

 

 

✔️ 자바 빈즈

: 자바 빈 규약에 따라 만들어진 클래스

: 데이터를 표현하는 것을 목적으로 하는 자바 클래스다.

✨ 폼 데이터 처리가 용이하고, 원래는 쿼리 문자열은 파라미터 수 만큼 getParameter() 사용해서 받아야하는데, 자바 빈즈를 사용하면 액션 태그 한 번만 사용해서 모든 질의 문자열으 값을 추출해 저장이 가능하다.

: 컴포넌트 기반 구현이 가능하다.

: JSP 페이지 내에서 필요한 비즈니스 로직을 컴포넌트로 만들어 활용하면 JSP 페이지의 크기는 작아지고, 각 JSP 페이지에서 필요로 하는 기능은 컴포넌트 재활용을 통해 구현되므로 웹 애플리케이션을 효과적으로 구현할 수 있다.

 

👩‍💻 규칙

- 반드시 패키지화 되어 있어야한다.

- 기본 생성자가 있어야한다. <jsp:useBean> 

- 프로퍼티의 접근 제어자가 private 로 선언되어야한다.

- getter, setter 메소드 존재해야한다.

- 위에 메소드 접근자는 public 으로 선언되어야한다.

- 읽기 전용 프로퍼티인 경우 getter 메소드만 작성 가능하다.

- 직렬화는 선택 사항이다.

 

 

✔️ <jsp:useBran>

: 빈 클래스를 찾거나 인스턴스화 하는데 사용된다. Bean 클래스가 이미 생성된 경우 범위에 따라 또 생성하지 않는다. 

 

✔️ <jsp:set(get)Property>

: useBean 으로 생성한 인스턴스의 프로퍼티에 값을 설정하며, setter 메소드로 bean 의 등록 정보 값을 설정 또는 getter 메소드로 bean 등록 정보 값을 반환한다.

 

 

🔒 액션태그 예제 - 계산기

기존 방식대로라면, 객체를 생성하고 파라미터를 넘겨서 메소드를 사용했을 것이지만,

ex01_ok.jsp 로 넘어갔을 때, useBean 액션 태그로 인스턴스화 하여 프로퍼티 값을 설정한다.

<form action="ex01_ok.jsp" method="post">
	<p>
		<input type="text" name="num1" required="required" pattern="\d+">
		<select name="operator">
			<option value="+">더하기</option>
			<option value="-">빼기</option>
			<option value="*">곱하기</option>
			<option value="/">나누기</option>
		</select>
		<input type="text" name="num2" required="required" pattern="\d+">
		<button type="submit"> = </button>
	</p>

</form>

 

- ex01_ok.jsp 파일

useBean 에서 Calculator 클래스를 찾아서 인스턴스화 한 것이다.

useBean 에서 id는 같은 변수라고 본다. 동일한 변수명이 있으면 안된다.

useBean은 같지는 않지만 Calculator calc = new Calculator(); 와 유사하다.

 

Calculator  객체를 생성하고, 가지고 있는 파라미터들을 객체에 넣어준 것과 동일한 과정이 있다고 보면 된다.

calc.setNum1(Integer.parseInt(request.getParameter("num1")));
calc.setNum2(Integer.parseInt(request.getParameter("num2")));
calc.setOperator(request.getParameter("operator"));
의 역할을 한다.

 

자바 빈즈 객체를 이용할 때는 jsp:useBean의 id랑 setProperty 에서 name 이랑 내용이 일치/동일해야한다.

<jsp:useBean id="calc" class="ch05.calc.Calculator"/>
<jsp:setProperty property="*" name="calc"/>

<h3> 결과 : jsp 액션 태그 </h3>
<p>
	<%=calc.toString() %>
</p>

 

- Calculator 클래스

1) public class 로 선언되어있다.

2) getter 와 setter 메소드가 있다.

3) toString() 재정의가 되어 있다.

package ch05.calc;

public class Calculator {
	private int num1; 
	private int num2;
	private String operator;
	
	public int getNum1() {
		return num1;
	}
	public void setNum1(int num1) {
		this.num1 = num1;
	}
	public int getNum2() {
		return num2;
	}
	public void setNum2(int num2) {
		this.num2 = num2;
	}
	public String getOperator() {
		return operator;
	}
	public void setOperator(String operator) {
		this.operator = operator;
	}
	
	@Override
	public String toString() {
		String s = "";
		
		if(operator==null) return s;
		
		try {
			switch(operator) {
			case "+" : s = String.format("%d + %d = %d", num1, num2, num1+num2); break;
			case "-" : s = String.format("%d - %d = %d", num1, num2, num1-num2); break;
			case "*" : s = String.format("%d * %d = %d", num1, num2, num1*num2); break;
			case "/" : s = String.format("%d / %d = %d", num1, num2, num1/num2); break;
			
			}
		} catch (ArithmeticException e) {
			s = "연산 불가 ";
		} catch (Exception e) {
			s = "연산 오류 ";
		}
		
		return s;
	}
	
	
}

 

🔒 액션태그 - useBean 예제

이번에도 useBean 에서 빈 클래스를 인스턴스화해준다.

<h3> jsp:useBean </h3>

<form action="ex02_ok.jsp" method="post">
	<p> 번호 : <input type="text" name="no"> </p>
	<p> 이름 : <input type="text" name="name"> </p>
	<p> 나이 : <input type="text" name="age"> </p>
	<p> 과목 : <input type="text" name="subject"> </p>
	<p>
		<button>확인</button>
	</p>

</form>

 

- ex02_ok.jsp

form input 요소의 name 과 User 클래스의 필드 이름이 동일한 경우

<!-- 빈 생성 -->
<jsp:useBean id="vo" class="ch05.user.User"/>

<!-- 생성된 빈에 속성(파마리터) 값 설정 -->
<!-- property="*" 는 form input 요소의 name 과 User 클래스의 필드 이름이 동일한 경우 설정 -->
<!--  name 인 vo 는 변수와 똑같이 자바에서 호출 가능하다. vo.get()~ 이런식으로 -->
<jsp:setProperty property="*" name="vo"/>

<!-- form input 요소의 name(no) 과 User 클래스의 필드(num)가 다른 경우 -->
<!-- 프로퍼티와 파라미터 이름 매칭 시켜줘야한다. -->
<jsp:setProperty property="num" param="no" name="vo"/>

빈 객체를 생성하고 class 는 ch05.user.User 이다.

1) jsp:setProperty 에서 property="*" 는 form input 요소의 name 과 User 클래스의 필드 이름이 동일한 경우 설정

(getter , setter 를 생성한 클래스의 필드명과 파라미터들의 이름이 동일한 경우 "*")

2) jsp:setProperty 에서 설정한 name 속성은 변수와 똑같이 자바에서 호출 가능하다.

 

 

form input 요소의 name 과 User 클래스의 필드 이름이 다른 경우

프로퍼티와 파라미터 이름을 매칭 시켜줘야한다.

프로퍼티 이름이 num 인 것을 no 라는 파라미터와 매칭 시킨다는 의미이다.

<jsp:setProperty property="num" param="no" name="vo"/>

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기