평범한 연구소

[JSP|Servlet] 액션 태그(action tag)와 자바빈즈(Java Bean) 본문

Pront/Javascript

[JSP|Servlet] 액션 태그(action tag)와 자바빈즈(Java Bean)

soyeonisgood 2022. 10. 2. 15:57

액션 태그 (action tag)

  • JSP 액션 태그는 클라이언트 혹은 서버에게 어떠한 동작을 행하도록 명령을 내리는 태그
  • JSP 페이지에서 페이지의 모듈화와 흐름제어를 위해 include, forward 액션 태그를 제공하고, 자바빈의 사용을 위해 useBean, setProperty, getProperty 등의 액션 태그를 제공한다
  • JSP 액션 태그는 XML 구문 형식으로 작성한다. 시작 태그가 있으면 반드시 끝나는 태그도 있어야 한다.
  • 대소문자를 구분한다.
  • 접두어 jsp: 이 붙는다. <jsp: ~ 로 시작해야 한다.
  • 속성 값만 지정하고 내용이 없을 경우에는, 끝나는 태그를 따로 하지 않고 시작태그 마지막 부분을 / 로 마무리한다.
<jsp:useBean> 자바빈 객체를 생성하고 사용하기 위한 환경을 정의하는 태그
<jsp:setProperty> <jsp:useBean> 태그로 생성한 자바빈 객체의 속성값 설정
<jsp:geProperty> <jsp:useBean> 태그로 생성한 자바빈 객체의 속성값 추출
<jsp:forward> 현재 페이지에서 다른 페이지로 제어 이동
<jsp:element> 임의의 XML 태그나 HTML 태그를 생정
<jsp:attribute> 지정한 이름의 속성 값을 설정하는 태그
<jsp:body> 사용자 정의 태그의 바디 부분을 설정하는 태그. 속성 값 없음.
<jsp:attribute> 에서 속성을 설정하는 경우, 분문 부분은 반드시 <jsp:body>를 사용하여 작성.
<jsp:text> JSP 페이지나 문서 템플릿에 표시할 텍스트

 

 

자바 빈즈 (Java Bean)

  • 자바빈 규약에 따라 만들어진 클래스
  • 데이터를 표현하는 것을 목적으로 하는 자바 클래스
  • 폼 데이터 처리 용이
    • 클라이언트로부터 입력 받아 처리하는 쿼리 문자열은 파라미터 수 만큼 request.getParameter()를 사용하여 받지만, 자바빈즈는 액션태그 한 번만 사용해서 모든 질의 문자열의 값을 추출하여 빈즈 객체에 저장 가능.
  • 자바빈즈 활용 범위 확장 용이
    • 여러 페이지에서 사용해야하는 데이터는 자바빈즈를 이용하여 쉽게 여러 범위(request, session)에서 사용 가능
  • 컴포넌트 기반 구현 기능
    • JSP 페이지 내에서 필요한 비즈니스 로직을 컴포넌트로 만들어 활용하면 JSP 페이지의 크기는 작아지고, 각 JSP페이지에서 필요로 하는 기능은 컴포넌트 재활용을 통해 구현되므로 웹 애플리케이션을 효과적으로 구현 가능

 

자바빈 규약

  • JSP에서 자바 빈즈를 사용할 때 기본 패키지(패키지 없는 경우)에 있으면 인식이 안되므로 반드시 패키지화가 되어있어야 한다.
  • 기본 생성자 존재. <jsp:useBean> 은 기본 생성자를 이용하여 객체를 생성한다.
  • 프로퍼티(멤버변수)의 접근 제어자는 private 로 선언되어야한다.
  • 프로퍼티에 접근 가능한 getter, setter 메소드 존재해야한다.
  • getter, setter 메소드의 접근자는 public 으로 선언되어야한다.
  • 프로퍼티는 읽기 및 쓰기가 가능해야하지만, 읽기 전용 프로퍼티인 경우 getter 메소드만 작성 가능.
  • 프로퍼티가 boolean 인 경우 get 대신 is 메소드 작성 가능
  • 직렬화 되어 있어야 한다. (선택사항)

 

 <jsp:useBean>

  • 빈 클래스를 찾거나 인스턴스화 하는 데 사용한다.
  • Bean 객체가 이미 생성된 경우, Bean 클래스의 범위에 따라 Bean을 생성하지 않는다. 그러나 Bean의 객체가 생성되지 않으면 Bean을 인스턴스화 한다.

Calculator.java

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;
	}
	
	
}

ex01.jsp, ex01_ok.jsp

<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]
<jsp:useBean id="calc" class="ch05.calc.Calculator"/>

<%-- Calculator calc = new Calculator(); 와 유사 --%>

 

User.java

  : getter, setter

ex02.jsp, ex02_ok.jsp

<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]
<jsp:useBean id="vo" class="ch05.user.User"/>
<%-- 빈 생성 --%>

 

 <jsp:setProperty>

  • <jsp:useBean> 등에서 생성한 인스턴스의 프로퍼티에 값을 설정하며, setter 메소드를 사용하여 bean의 등록 정보 값을 설정한다.

ex01_ok.jsp

<jsp:setProperty property="*" name="calc"/>

<%--
	calc.setNum1(Integer.parseInt(request.getParameter("num1")));
	calc.setNum2(Integer.parseInt(request.getParameter("num2")));
	calc.setOperator(request.getParameter("operator"));
	의 역할을 한다.
	
	단, form 태그의 input 요소의 name 속성과 동일한 Calculator 클래스의 필드에 값을 설정

 --%>

ex02_ok.jsp

  • 보통 자바 클래스의 필드 이름과 동일하게 준다.
<%-- 생성된 빈에 속성(파라미터) 값 설정 --%>
<%-- property="*" 는 form input 요소의 name과 User 클래스의 필드이름이 동일한 경우에만 설정 --%>
<jsp:setProperty property="*" name="vo"/>

<%-- form input 요소의 name과 User 클래스의 필드가 다른 경우 --%>
<jsp:setProperty property="num" param="no" name="vo"/>

 

<jsp:forward>

  • 요청(request)을 다른 리소스(jsp, servlet, html 등)으로 전달 하는데에 사용.

 

<jsp:element>, <jsp:attribute>, <jsp:body>, <jsp:text>

<!-- jsp:element 는 XML 또는 HTML 태그를 만든다. -->
<jsp:element name="userName"> 
	<jsp:attribute name="gender">
		여자
	</jsp:attribute>
	<jsp:body>사임당</jsp:body>
</jsp:element>

<!-- jsp:text 는 jsp 페이지에 표시할 텍스트 -->
<p>
	<jsp:text> text 액션 태그 </jsp:text>
</p>

'Pront > Javascript' 카테고리의 다른 글

[JSP|Servlet] JDBC  (0) 2022.10.02
[JSP|Servlet] 에러 페이지  (0) 2022.10.02
[JSP|Servlet] submit 관련 버튼  (0) 2022.10.02
[JSP|Servlet] Request Parameter  (0) 2022.10.02
[JSP] GET, POST 방식의 차이점  (0) 2022.09.27