mojo's Blog
JSP 액션 태그 본문
액션 태그
액션 태그란?
JSP에서 객체 생성과 공유, 페이지 이동과 전달, 태그 파일 작성 등에 필요한 기능을 제공하는 일종의 커스텀 태그다.
표준 액션이라고도 불리며 커스텀 태그 기반이지만 별도의 taglib 지시어 사용 없이 jsp 접두어를 사용한다.
다음 표는 주로 사용되는 액션 태그를 보여준다.
액션태그 | 설명 |
jsp:forward | request와 response 객체를 포함해 다른 페이지로 포워드함 |
jsp:include | 다른 페이지의 실행 결과를 포함시킴 |
jsp:useBean | 자바 빈즈 객체를 생성하거나 불러옴 |
jsp:setProperty | 자바 빈즈 객체의 속성(멤버 변수)에 값을 할당함 |
jsp:getProperty | 자바 빈즈 객체의 속성값을 출력함 |
jsp:param | include, forward 액션 사용 시 파라미터 값을 수정하거나 추가함 |
자바 빈이란?
자바의 재활용 가능한 컴포넌트 모델을 말하는 것으로, 웹 개발에만 국한된 개념이 아니며 POJO라고 하는 단순한 구조를 가진다.
POJO(Plain Old Java Object)란 특정 기술이나 프레임 워크에 종속하지 않고 기본 생성자와 멤버 변수에 대한 getter/setter 메서드를 제공하고 직렬화할 수 있는 자바 클래스를 의미한다.
자바 빈 구조는 다음과 같은 특징을 가진다.
- 인자가 없는 생성자(기본 생성자)로 구성된다.
- 파일 혹은 네트워크를 통해 객체를 주고받을 수 있는 직렬화 구조가 가능하다.
- getter, setter 메서드를 통해 멤버 변수(속성)에 접근한다.
다음은 회원 관리를 위한 Member Class를 자바 빈 구조로 만든 것이다.
class Member { // 클래스 선언
private int id;
private String name;
private String email;
...
public void setId(int id) { // setter 메서드 선언
this.id = id;
}
public int getId() { // getter 메서드 선언
return id;
}
...
}
메서드 내에서 추가적으로 필요한 기능을 구현할 수 있으며 이러한 구조는 객체지향에서 캡슐화의 한 형태이다.
스프링 빈이란?
스프링 프레임워크의 경우에도 컨테이너 기반으로 객체의 생성과 소멸 등을 관리하게 되는데 이러한 객체를 스프링 빈이라고 한다.
이러한 객체는 컨테이너를 통해 공유하거나 참조할 수 있다.
useBean 액션이란?
JSP에서 자바 빈 객체를 생성하거나 참조하기 위한 액션이다.
매우 유용하지만 JSP를 단순히 뷰 역할로만 사용한다면 사용할 일이 없다.
기본적인 동작 방식은 다음과 같다.
- useBean을 이용해 만든 객체 범위는 지정하는 속성인 scope에 주어진 id의 객체가 있는지 확인한다.
- 객체가 없다면 새로 객체를 생성하고 해당 scope에 저장한다.
기본 구문과 사용 예는 다음과 같다.
<jsp:useBean id="instanceName" scope="page | request | session | application"
class="packageName.className" type="packageName.className"
beanName="packageName.className" >
</jsp:useBean>
- id : 자바 빈을 특정 scope에 저장하거나 가져올 때 사용하는 이름이며, 현재 페이지에서는 해당 인스턴스를 참조하기 위한 변수명이 된다.
- scope : 해당 클래스 타입의 객체를 저장하거나 가지고 오는 범위로 내장객체의 일부다.
- class : 생성하거나 참조하려는 객체의 클래스명이며 반드시 패키지명까지 명시해야 한다. 추상 클래스나 인터페이스는 사용할 수 없다.
- type : 특정 타입의 클래스를 명시할 때 사용한다. 추상 클래스나 인터페이스, 일반 클래스가 될 수 있으며 class 속성의 클래스에서 상속 혹은 구현이 이루어져야 한다.
- beanName : type과 beanName 사용을 통해 class 속성을 대체할 수 있다.
HTML 폼에서 입력한 값을 자바 객체로 연동할 때 useBean을 주로 활용한다.
useBean 액션을 사용하면 다음 코드와 같이 간단한 처리가 가능하다.
<jsp:useBean id="m" class="com.my.Member" />
<jsp:setProperty name="m" property="*" />
<%
MemberDAO dao = new MemberDAO();
dao.insertDB(m);
%>
- page scope로 새로운 Member 클래스 인스턴스를 생성한 후 m이라는 이름으로 속성에 저장한다.
- setProperty는 HTML <form> 태그의 name 속성값을 해당 객체의 setter 메서드를 이용해 저장한다.
- property 속성에는 멤버 변수명 혹은 *을 사용해 전체 변수를 한 번에 지정할 수 있다.
서블릿으로도 위와 같은 구현을 할 수 있다.
하지만 모든 값을 개발자가 직접 읽어와 객체에 할당해야 하기 때문에 불편하다.
이와 같이 불편한 부분은 Apache Commons BeanUtils 라이브러리로 해결이 가능하다.
서블릿에서 BeanUtils를 사용한 코드는 다음과 같다.
doGet(...) {
Member m = new Member();
BeanUtils.populate(m, request.getParameterMap());
...
dao.insertDB(m);
}
※ include 액션
include 지시어와 마찬가지로 다른 페이지를 포함한다는 점에서 동일하지만 처리 과정에서 차이가 있다.
include 지시어에서는 include된 파일 구조를 모두 포함해 하나의 파일로 컴파일한 다음 처리했다.
반면 include 액션은 include 된 파일을 각각 호출해 처리된 결과만 포함해 보여주는 형식이다.
아래 코드는 include 액션을 사용하여 'main.jsp'에 'header.jsp'를 포함시킨 경우로, 'main.jsp'를 호출하면 'header.jsp'의 실행 결과가 포함되어 출력된다.
// main.jsp
<jsp:include page="header.jsp">
<jsp:param name="title" value="My Homepage" />
</jsp:include>
// header.jsp
<h2> <%= request.getParameter("title") %> </h2>
'main.jsp'에서 'header.jsp'를 include할 때 <jsp:param> 에서 title을 통해 My Homepage라는 값을 전달한다.
그리고 'header.jsp'는 <h2> 부분에서 전달받은 제목을 출력하는 형태가 된다.
※ forward 액션
forward 액션은 클라이언트 요청을 다른 페이지로 전환하는 액션으로 리다렉션(response.sendRedirect())과 기능적으로 유사하다.
클라이언트 요청과 다른 새로운 페이지(혹은 서블릿)로 이동하는 점은 두 방법이 동일하다고 할 수 있지만 내부적으로는 차이가 있다.
리다렉션은 서버가 클라이언트에게 새로운 페이지로 다시 접속하도록 응답을 보내고, 응답을 받은 클라이언트가 다시 새로운 페이지로 접속하는 방식이다.
하지만 forward 액션은 클라이언트가 새롭게 접속하는 것이 아니라 서버에서 내부적으로 새로운 페이지로 이동하고 그 페이지의 내용을 클라이언트에게 응답으로 전달한다.
단순한 페이지 이동이 필요한 경우 리다렉션이 적합하다.
하지만 최초 request를 유지하거나 request의 setAttribute()로 속성값을 저장한 경우에 이를 유지하면서 페이지를 이동하려면 forward 액션을 사용해야 한다.
include 액션과 마찬가지로 파라미터의 추가가 가능하다.
// main.jsp
<jsp:forward page="header.jsp">
<jsp:param name="title" value="My Homepage" />
</jsp:forward>
// result.jsp
<h2> <%= request.getParameter("title") %> </h2>
계산기 구현
calcForm.html 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기-useBean</title>
</head>
<body>
<h2>계산기-useBean</h2>
<hr>
<form method="post" action="calc.jsp">
<input type="text" name="n1" size="10"> <select name="op">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select> <input type="text" name="n2" size="10">
<input type="submit" value="실행">
</form>
</body>
</html>
getter/setter 만들는 방법
1. Source => Generate Getters and Setters 를 클릭한다.
2. 모든 변수명을 클릭 후 Generate 를 클릭한다.
3. 완성이다.
Calculator.java 코드
package ch07;
public class Calculator {
private int n1;
private int n2;
private String op;
public long calc() {
long result = 0;
switch(op) {
case "+" : result = n1 + n2; break;
case "-" : result = n1 - n2; break;
case "*" : result = n1 * n2; break;
case "/" : result = n1 / n2; break;
}
return result;
}
public int getN1() {
return n1;
}
public void setN1(int n1) {
this.n1 = n1;
}
public int getN2() {
return n2;
}
public void setN2(int n2) {
this.n2 = n2;
}
public String getOp() {
return op;
}
public void setOp(String op) {
this.op = op;
}
}
calc.jsp 코드
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<jsp:useBean id="calc" class="ch07.Calculator" />
<jsp:setProperty name="calc" property="*" />
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>계산기-useBean</title>
</head>
<body>
<h2>계산 결과-useBean</h2>
<hr>
결과 : <%= calc.calc() %>
</body>
</html>
'JSP' 카테고리의 다른 글
MVC 패턴의 이해 (0) | 2021.12.31 |
---|---|
JSP - 커스텀 태그, EL, JSTL (0) | 2021.12.30 |
JSP 프로그래밍 (0) | 2021.12.29 |
JSP의 기초 (0) | 2021.12.29 |
서블릿 프로그래밍 (0) | 2021.12.28 |