자바빈
자바빈 규약을 지켜서 만들어진 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만 있으면 된다)
인텔리제이에서 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 액션태그보다 더 간단하게 프로퍼티를 읽을 수 있어 액션태그는 거의 사용하지 않는다.