[JSP&Servlet] 자바빈의 정의와 실제 사용을 위한 표준 액션 태그들

Re_Go·2024년 8월 6일
0

JSP&Servlet

목록 보기
15/19
post-thumbnail

1. 자바빈이란?

자바빈(Java Bean) 이란 서버측에서 특정 형식으로 정보를 저장하고자 개발자가 작성한 클래스를 의미하는데요. 대표적으로 DTO와 VO가 있습니다. 그리고 DTO와 VO 둘 다 서버측에서 객체를 생성하기 위해 정의된 클래스라는 공통점이 있지만, 차이점을 살펴보자면 DTO는 주로 데이터 전송을 목적으로 하고, VO는 값 자체를 표현하고자 할 때 사용한다고 하네요. (뭐... 둘 중 아무거나 상관 없다고 스프링 창시자도 말씀은 하셨다면 이걸로 항상 갑론을박이라고 합니다.)

(자료 출처 : https://maenco.tistory.com/entry/Java-DTO%EC%99%80-VO%EC%9D%98-%EC%B0%A8%EC%9D%B4)

2. 자바빈의 필수 구성 요소

이러한 자바 빈도 결국은 클래스라는 점에서 필수 구성 요소는 다음과 같은데요.

  • 반드시 디폴트 패키지를 제외한 특정 패키지에 작성 및 저장해야 한다.
  • 필드 + 생성자 + getter/setter 로 구성되어야 한다.
  • 필드의 프로퍼티는 반드시 private 접근자로 작성한다.
  • 생성자는 jsp:useBean에서 사용을 하기 위해 반드시 디폴트 생성자를 직접 작성해야 한다.
  • getter/setter는 반드시 public 으로 작성한다.

그리고 다음의 규약을 지켜 작성한 자바빈의 예시는 다음과 같습니다. (그냥 단축키 모음에서 우클릭 후 getter와 setter, field를 편하게 생성하면 됩니다.)

package com.practice.test

// 필드 (private)
public class MemberDTO {
	private String id;
	private String pw;
	private String name;
	private int age;
	private String addr;
	private String gender;
	private String[] hobbies;
	private String[] likeFoods;
	private String[] dislikeFoods;

	// 기본 생성자
	public MemberDTO() {}
	// 풀 생성자
	public MemberDTO(String id, String pw, String name, int age, String addr, String gender, String[] hobbies,
			String[] likeFoods, String[] dislikeFoods) {
		super();
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.age = age;
		this.addr = addr;
		this.gender = gender;
		this.hobbies = hobbies;
		this.likeFoods = likeFoods;
		this.dislikeFoods = dislikeFoods;
	}
	// 게터와 세터(public)
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String[] getHobbies() {
		return hobbies;
	}

	public void setHobbies(String[] hobbies) {
		this.hobbies = hobbies;
	}

	public String[] getLikeFoods() {
		return likeFoods;
	}

	public void setLikeFoods(String[] likeFoods) {
		this.likeFoods = likeFoods;
	}

	public String[] getDislikeFoods() {
		return dislikeFoods;
	}

	public void setDislikeFoods(String[] dislikeFoods) {
		this.dislikeFoods = dislikeFoods;
	}
}

3. 표준 액션 태그

앞서 살펴본 자바빈즈(JavaBeans)를 보다 쉽게 사용하기 위해서 JSP에는 표준 액션 태그는 JSP(JavaServer Pages)라는 태그가 존재하는데요. 그래서 JSP 페이지와 같은 웹 애플리케이션의 구성 요소를 다루기 위해 자주 사용되는 자바빈즈를 쉽게 생성, 수정, 읽기 및 관리를 하기 위해 우리는 표준 액션 태그를 사용하게 되는 거죠. 그럼 JSP에서 사용되는 대표적인 액션 태그들을 하나씩 살펴보도록 하겠습니다.

그럼 그 전에 다음과 같은 자바빈과 JSP 페이지가 있다고 하겠습니다.

  1. JSP 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="userInfoSave.jsp">
		<div>이름 <input type="text" name="name"> </div>
		<div>나이 <input type="text" name="age"> </div>
		<div><input type="text" name="height"> </div>
		<div>몸무게 <input type="number" name="weight"> </div>
		<div>성별 <input type="text" name="gender"> </div>
		<div>주소 <input type="text" name="addr"> </div>
		<input type="submit" value="전송">
	</form>
</body>
</html>
  1. 자바빈즈
package com.practice.test;

public class PersonVO {
	private String name;
	private int age;
	private double height;
	private double weight;
	private String gender;
	private String addr;
	
	public PersonVO() {}

	public PersonVO(String name, int age, double height, double weight, String gender, String addr) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
		this.addr = addr;
		this.gender = gender;
	}

	public double getWeight() {
		return weight;
	}

	public void setWeight(double weight) {
		this.weight = weight;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}	
}

<jsp:useBean>

JSP 페이지에서 자바빈즈를 사용하기 위해 필요한 인스턴스를 생성하거나, 이미 생성된 인스턴스를 찾아서 사용할 수 있게 합니다. 설정하는 속성으로는 세 가지가 존재하는데, 첫번째(id)는 JSP 페이지에서 해당 자바빈즈를 식별하기 위한 별명이고, 두번째(class)는 해당 빈즈의 패키지 경로, 세번째(scope) 는 해당 빈즈가 어느 영역까지(pageContext부터 Application까지) 유효한지를 설정할 수 있습니다.

<jsp:useBean id="info" class="com.practice.test.PersonVO" scope="session"/>

<jsp:setProperty>

사용자가 입력한 값의 속성(name) 중 특정 속성을 특정 자바빈즈 객체의 속성(필드의 값)으로 지정할 때 사용하는 액션 태그로, 이때 자바빈즈에 정의되어 있는 필드의 각 멤버 이름과 사용자가 요청할 때의 파라미터들의 name 속성의 이름은 꼭 일치해야 하며, 개수 또한 일치해야 합니다.

  1. JSP 페이지에서 사용자가 요청할 값들
<form action="userInfoSave.jsp" method="post">
    <div>이름 <input type="text" name="name"> </div>
    <div>나이 <input type="text" name="age"> </div>
    <div><input type="text" name="height"> </div>
    <div>몸무게 <input type="number" name="weight"> </div>
    <div>성별 <input type="text" name="gender"> </div>
    <div>주소 <input type="text" name="addr"> </div>
    <input type="submit" value="전송">
</form>
  1. 자바빈즈에 설정 된 멤버 필드들
private String name;
private int age;
private double height;
private double weight;
private String gender;
private String addr;

이러한 setProperty 액션 태그의 첫번째 속성은 전달할 값을 의미하며(왠만해선 *를 넣어주자), 두번째 속성은 지정된 자바빈즈의 별명, 즉 useBean에 설정된 해당 자바빈즈의 별명(id)를 넣어주면 됩니다.

// property에  파라미터를 자바빈즈의 특정 멤버에 명시적으로 넣고자 할 경우 다음과 같이 작성
// 단 이럴 경우 나머지 사용자가 전달한 값들은 무시됨.
<jsp:setProperty property="name" name="info"/>
<jsp:setProperty property="age" name="info"/>

// 그래서 보통은 사용자의 입력 값들(name)과 자바빈즈의 멤버 필드의 이름을 꼭 일치시킨 뒤
// 다음과 같이 아스터리스크를 붙여 한꺼번에 자동으로 입력되게 하는 편임.
<jsp:setProperty property="*" name="info"/>

<jsp:getProperty>

특정 별명으로 지정된 자바빈즈 객체의 특정 속성 값을 읽어와서 JSP 페이지에 출력합니다.

<h1>
    이름 : <jsp:getProperty name="info" property="name"/>
    나이 : <jsp:getProperty name="info" property="age"/>
    키 : <jsp:getProperty name="info" property="height"/>
    몸무게 : <jsp:getProperty name="info" property="weight"/>
    성별 : <jsp:getProperty name="info" property="gender"/>
    주소 : <jsp:getProperty name="info" property="addr"/>
</h1>

<jsp:include>

현재 페이지에서 다른 페이지를 포함하면서 포함 된 페이지에 파라미터를 전달할 수 있는 액션 태그입니다. 주로 <jsp:param>과 자주 쓰이며 해당 include로 지정되어 파라미터를 전달 받은 페이지 에서는 해당 파라미터를 활용하여 사용하거나 출력할 수 있습니다.

특히 이 액션 태그는 include 지시어와 동일하다는 특징과, 데이터를 전달할 수 있고 없고의 차이점 또한 존재합니다.

  1. JSP 페이지 1
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>페이지 1 입니다.</h1>

    <br>
  
	<!-- Ex01_include1.jsp 페이지에 Ex01_include2.jsp 페이지를 포함 -->

	<!-- 1. include 지시어 -->
	<%@ include file="page2.jsp" %>
	
	<!-- 2. include 액션 태그 -->
	<jsp:include page="page2.jsp">
		<jsp:param name="name" value="Re_Go"/>
		<jsp:param name="age" value="30"/>
		<jsp:param name="addr" value="서울"/>
	</jsp:include>

</body>
</html>
  1. JSP 페이지 2
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	<%-- params 액션 태그에 의해 전달 받은 파라미터들을 활용 가능 --%>
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String age = request.getParameter("age");
	String addr = request.getParameter("addr");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>include2.jsp 페이지</h1>
	<div>
		이름 : <%=name %>
		나이 : <%=age %>
		주소 : <%=addr %>
	</div>
</body>
</html>

<jsp:forward>

JSP 페이지에서 다른 JSP 페이지 또는 서블릿으로 요청을 포워딩하는 데 사용됩니다. 요청을 포워딩하면, 현재 페이지의 처리가 종료되고 요청이 다른 페이지로 전달됩니다. 사용법은 include 태그와 동일하며,

단일 태그로 사용할 경우 기존에 요청 받은 정보들을 타겟 페이지로 전달하고 종료하지만, 이중 태그로 사용하여 param 태그와 같이 사용할 경우 기존의 요청 정보 + 새로운 파라미터 값을 추가하여 타겟 페이지에 전달할 수 있습니다.

JSP 페이지 1

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>페이지 1 입니다.</h1>
	<br>
	<jsp:forward page="page2.jsp">
		<jsp:param name="name" value="김씨"/>
		<jsp:param name="age" value="20"/>
		<jsp:param name="addr" value="서울"/>
	</jsp:forward>
</body>
</html>

JSP 페이지2

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String age = request.getParameter("age");
	String addr = request.getParameter("addr");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>페이지 2 입니다.</h1>
	<div>
		이름 : <%=name %>
		나이 : <%=age %>
		주소 : <%=addr %>
	</div>
</body>
</html>

<jsp:param>

include나 forward 액션 태그에 속성과 값으로써 문자열 형식으로 전달하는 액션 태그로, 타겟 페이지에 추가적인 정보를 제공하고자 할 때 사용됩니다. (include 및 forward 액션 태그 설명 참조)

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글