jsp 자바빈과 useBean태그

2021. 10. 15. 17:30jsp

자바빈

자바빈 규약을 지켜서 만들어진 java class를 자바빈이라고 합니다.

자바빈을 사용하는 이유는 디자인(프론트엔드)와 로직(백엔드)를 분리하기 위해서이다.

 

자바빈 규약은 다음과 같다.

  • 패키지에 속해야한다. defualt package에 있는 클래스는 자바빈이 될 수 없다
  • 기본 생성자를 가지고 있어야 한다.
  • 멤버 변수는 private
  • getter/setter가 존재하며 public
  • 직렬화(선택사항)

 

 

이클립스에서 lib 추가하기

로그인예제로 사용할 자바빈 UserVO 클래스를 만들어보자. 

UserVO의 toString() 오버라이딩에 사용할 라이브러리를 다운받도록하자.

브라우저 검색창에 maven repository를 검색한 후

maven repostiroy 홈페이지에서  lang3를 검색해

Apache commons lang 중에서 아무거나 선택해 .jar파일을 다운받도록하자( 난 3.11)

다운받은 .jar파일을 풀지말고 그대로 WEB-INF/lib폴더에 복사하면 된다.   

(다른 lib가 이미 있는건 신경쓰지마라. 나중에 받는다. 우선은 lang3만 있으면 된다)

lnag3가 추가 됬다. 

 

 

 

 

 

인텔리제이에서 lib 추가하기

인텔리제이에서는 다음과 같이 설정해줘야 된다.

 

 

 

 

 

 

 

 

 

com.study.login.vo 패키지의 

UserVO.jsp

package com.study.login.vo;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class UserVO {
	private String userId;
	private String userName;
	private String userPass;
	private String userRole;
	
	// toString() 구현
	  @Override 
	  public String toString() {
		  return ToStringBuilder.reflectionToString(this,
				  ToStringStyle.MULTI_LINE_STYLE); 
		}
	// 생성자
	public UserVO() {
		
	}
	
	// 생성자
	public UserVO(String userId, String userName, String userPass, String userRole) {
	this.userId = userId;
	this.userName = userName;
	this.userPass = userPass;
	this.userRole = userRole;
	}

	
	// 맴버필드의 get/set 메서드 생성

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPass() {
		return userPass;
	}

	public void setUserPass(String userPass) {
		this.userPass = userPass;
	}

	public String getUserRole() {
		return userRole;
	}

	public void setUserRole(String userRole) {
		this.userRole = userRole;
	}
	
	
	
}

 

UserVO를 잘보면 자바빈 규약을 지켰기 때문에 자바빈이라는 걸 알 수 있다.

toString이 UserVO객체를 출력하면 주소값이 아닌 필드이름과 값이 나오도록 하였다.

 

 

 

 

<jsp:usebean:>태그

실습을 위해 00form.jsp+00useBean.jsp를 만들어보자.

 

00form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
	request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<form action="00useBean.jsp" method="post">
userId <input type="text" name="userId" value=""> <br>
userName <input type="text" name="userName" value=""> <br> 
userPass <input type="text" name="userPass" value=""> <br>
userRole <input type="text" name="userRole" value=""> <br>
<!-- UserVO  에 따라 input 만들기  -->
	
	<input type="submit" value="제출">
</form>

</body>
</html>

이 때 주의해야 할 건 input의 name 값이

userVO의 속성이름이랑 동일해야한다는 것이다.

(정확히는 getter랑 짝을 이루지만 보통 userId속성의 이름이

getUserId()가 되니까  신경쓰지말고 속성이름이랑 똑같이 하면 된다.)

 

 

 

00useBean.jsp

jsp:useBean 사용전에 먼저 자바로 해보자.

<%@page import="com.study.member.vo.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
	request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>

<jsp:useBean id="user" class="com.study.login.vo.UserVO" scope="request"></jsp:useBean>         <!-- 영역잘지정해주자 -->


<jsp:getProperty property="userId" name="user"/>
<jsp:getProperty property="userPass" name="user"/>
<jsp:getProperty property="userName" name="user"/>
<jsp:getProperty property="userRole" name="user"/>  


<jsp:setProperty property="userId" name="user" value="<%=request.getParameter("userId") %>"/>
<jsp:setProperty property="userPass" name="user" value="<%=request.getParameter("userPass") %>"/>
<jsp:setProperty property="userName" name="user" value="<%=request.getParameter("userName") %>"/>
<jsp:setProperty property="userRole" name="user" value="<%=request.getParameter("userRole") %>"/>


<br>
<jsp:getProperty property="userId" name="user"/>
<jsp:getProperty property="userPass" name="user"/>
<jsp:getProperty property="userName" name="user"/>
<jsp:getProperty property="userRole" name="user"/> 


</body>
</html>

 

 

 

실행결과

 

 

 

 

 

코드를 하나하나 살펴보자.

<jsp:useBean>

<jsp:useBean id="user" class="com.study.login.vo.UserVO" scope="request"></jsp:useBean>

jsp:useBean태그의 각각의 속성은 다음과 같다.

  • id : jsp페이지에서 자바빈 객체의 이름
  • class : 자바빈 클래스의 이름(패키지명 포함)
  • scope: 자바빈 객체를 저장 할 영역 

위 코드는 UserVO클래스 객체인 user를 생성해서 request에 저장한다는 의미이다. 

이 때  <jsp:useBean>태그는 지정한 영역에 이미 id 값이 저장되어있으면,

객체를 새로 생성하지 않고 기존 객체를 그대로 사용한다.

기존 객체가 없으면 새로 생성해서 저장한다. 

즉 다음의 코드와 같다.

UserVO user=(UserVO)request.getAttribute("user");
	if(user ==null){
		user=new userVO();
		request.setAttribute("user",user);
	}

 

 

 

<jsp:getProperty>

<jsp:getProperty property="userId" name="user"/>

user 객체의 userId속성을 출력해준다.

처음엔 null 이고 값이 세팅된 이후엔 값이 출력된다.

 

 

<jsp:setProperty>

 <jsp:setProperty property="userId" name="user" value="<%=request.getParameter("userId") %>

user 객체의 userId속성을  value값으로 세팅해줍니다.

 

 

 

현재는 <jsp:setProperty>를 이용해 값 프로퍼티(속성)을 하나하나 세팅해줬지만

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

*를 이용해 파라미터로 넘어온 모든 값들을 user에 한번에 세팅해줄도 수 있다. 

 

 

하지만.......

MVC프레임워크를 도입하거나 나중에 배울 EL(Expression Language)를 사용하면

jsp 액션태그보다 더 간단하게 프로퍼티를 읽을 수 있어 액션태그는 거의 사용하지 않는다.