Beans in JSP

Beans Class

  • JSP Beans는 JSP와 연동하기 위해 만들어진 클래스
  • JSP Beans는 컨테이너에 위치, 프로그램 요소를 모듈화하는 기능

UseBean

package useBeans.useBeansTest;

public class UseBeansExample {
		
		public int x;

		public int cube(int n) {
				return n*n*10;
		}
}
  • 하나의 클래스에 멤버 변수와 메서드 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<jsp:useBean id="beans" class="useBeans.useBeansTest.UseBeansExample"/>

<%
beans.x=5; //5를 멤버 변수 x에 대입
int z=beans.x;

int example=beans.cube(z); //250
%>
  • JSP 파일에서 useBean 태그 사용
  • class 값은 생성하고싶은 클래스 명, id는 해당 클래스를 참조할 참조 변수 명 기입
  • id의 참조 변수를 통해 class의 멤버 변수와 메서드를 자유롭게 호출 가능

Attributes in useBeans Tag

<jsp:useBean id= "instanceName" scope= "page | request | session | application"   
class= "packageName.className" type= "packageName.className"  
beanName="packageName.className | <%= expression >" >  
</jsp:useBean>
  • id : 지정된 범위에서 Beans를 식별하는 데 사용
  • scope : Beans의 사용 가능 범위 지정(default 값은 page)
  • class : 해당 클래스 객체를 생성(argument가 없어야 하며, default constructor가 존재해야 하고, non-abstract 클래스여야 함)
  • type : Beans가 범위에 이미 존재하는 경우 Beans에 데이터 유형을 제공하며, 주로 class나 beanName 속성과 함께 사용(class나 beanName 없이 사용하면 Beans가 인스턴스화되지 않음)
  • beanName : java.beans.Beans.instantiate() 메서드를 사용하여 Beans를 인스턴스화

SetProperty

package useBeans.useBeansTest;

public class UseBeansTest {

		private String nick;
		private String pass;

		public String getNick() {
				return nick;
		}
		public void setNick(String nick) {
				this.nick=nick;
		}
		public String getPass() {
				return pass;
		}
		public void setPass(String pass) {
				this.pass=pass;
		}
}
  • DTO 자바 파일에 nick과 pass라는 멤버 변수를 선언하고, 이에 대한 setter와 getter를 자동 생성
  • 멤버 변수의 접근 제한자는 private으로 지정(setter, getter 메서드를 통해 접근)
  • setter, getter 생성 시 각 set, get 메서드 명은 각 멤버 변수 명을 똑같이 따름(필수)
  • explicit constructor를 생성할 경우 반드시 default constructor를 명시적 선언해야 함
<body>
	<form action="Beans.jsp" method="post">
		<input type="text" name="nick" required="required">
		<input type="password" name="pass" required="required">
		<button type="submit">
	</form>
</body>
  • 현재 파일에서 내에 name 속성 값이 DTO의 멤버 변수와 똑같은 <input>이 존재
  • Beans.jsp라는 파일에 action을 통해 입력한 데이터 전송
<%
String nick=request.getParameter("nick");
String pass=request.getParameter("pass");

UseBeansTest dto=new UseBeansTest();

dto.setNick(nick);
dto.setPass(pass);

UseBeansDao dao=new UseBeansDao();
dao.someMethod(dto);
%>
  • 기존 방식으로 <form>에서 입력한 데이터를 넘겨 받기 위해서는 일일이 getParameter() 메서드에 name 값을 입력하여 이를 변수화한 후, 이를 DTO 멤버 변수에 setting하고, 이를 DAO 메서드에 적용해야 함
  • 이는 넘겨 받아야 할 데이터가 많아지면 매우 불편한 과정
<jsp:useBean id="dto" class="useBeans.useBeansTest.UseBeansTest"/>
<jsp:useBean id="dao" class="useBeans.useBeansTest.UseBeansDao"/>

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

<%
dao.someMethod(dto);
%>
  • useBeans 태그를 사용해 두 클래스를 생성
  • name : setProperty할 클래스 명 혹은 참조 변수 명
  • property : setting할 변수 명
  • setProperty 태그는 property 속성에 지정한 변수를 넘겨 받아 변수화한 후, name 값 클래스(dto)의 멤버 변수에 setter로 변수화한 값 대입
  • 이때 넘겨 받는 값의 name 속성, 이를 받아 생성한 변수, setter로 setting할 클래스의 멤버 변수, setter의 이름이 모두 동일해야 함
  • 다만, multipart 사용 시나, 조건문에 삼항연사자가 들어가는 등 일부 상황에서 위 태그 사용 불가

Session

  • session의 결과 값, 반환 값은 모두 Object
  • 이를 String으로 형 변환하여 사용 가능

Simple Usage

<body>
	<%
	session.setAttribute("msg", "happy");
	session.setMaxInactiveInterval(10); //인자값 안주면 기본값 30분
	%>

	<form action="sessionAction.jsp" method="post">
		<h2>가고싶은 여행지</h2>
		<input type="radio" value="베트남 3박4일" name="travel" checked>베트남 3박4일
		<input type="radio" value="태국 4박5일" name="travel">태국 4박5일
		<input type="radio" value="필리핀 6박7일" name="travel">필리핀 6박7일
		<input type="radio" value="대만 2박3일" name="travel">대만 2박3일
		<input type="radio" value="캄보디아 3박4일" name="travel">캄보디아 3박4일
		<input value="여행당첨" type="submit">
	</form>
</body>
  • session.setAttribute() 메서드로 session의 이름과 값 지정 가능
  • setMaxInactiveInterval()은 session의 최대 유지 시간을 지정하는 메서드이며, 인자 값은 유지되는 시간(초 단위)이고, 인자 값이 없으면 기본 값 30분으로 지정
  • 예시에서는 session 유지 시간을 10초로 지정했으므로, happy라는 값을 가진 msg session은 10초 후 null 값이 됨
<%
	//세션이 있는지 확인후 없으면 꽝!!!
	String msg=(String)session.getAttribute("msg");	
	String travel=request.getParameter("travel");
	
	if(msg==null||!msg.equals("happy"))
	{%>
		<h3 style="color:red">시간초과로 꽝입니다</h3>
	<%}
	else
	{%>
		<h3>축!!!<%=travel %>상품에 당첨됨!!!</h3>
	<%}
	%>
  • session 유지 시간을 이용해 조건문을 통해 다른 결과 표현 가능
<%
	//세션을 저장하는 방법
	session.setAttribute("msg", "happy monday");
	session.setMaxInactiveInterval(60); //60초동안 유지시간 지정
	%>
	
	//세션 값 얻기
	세션값:<%=session.getAttribute("msg") %><br>
	세션유지시간:<%=session.getMaxInactiveInterval() %>초<br>
	세션 생성시간:<%=session.getCreationTime() %><br>
	세션 생성시간:<%=new Date(session.getCreationTime()) %>

	//세션 값 삭제
	session.removeAttribute("msg");
	session.invalidate();
  • session 객체의 여러 메서드들
  • getCreationTime() 객체는 session이 생성된 시간을 표현하는 메서드
  • removeAttribute() 객체는 인자 값의 속성을 삭제
  • invalidate() 객체는 session 객체의 모든 속성 삭제

Sign In & Out (로그인, 아웃)

Conspectus

  • 로그인 상태일 때는 로그아웃 폼이, 로그아웃 상태일 때는 로그인 폼이 작동
  • 상태에 따라 로그인 폼과 로그아웃 폼 중 어떤 것을 작동할지는 LogoinMain에서 결정

Sign In Form(Premiere)

<body>
	<div class="loginform">
		<form action="loginAction.jsp" method="post">
			<input type="text" name="id" placeholder="ID" required="required"><br>
			<input type="password" name="pass" placeholder="password" required="required"><br>
			
			<button type="submit">로그인</button><br>
			<input type="checkbox" name="savechk">아이디저장
		</form>
	</div>
</body>
  • ID와 Password 입력을 위한 <input>
  • 입력된 ID를 이후 다시 로그인할 시 재입력할 필요 없이 유지하기 위한 checkbox(savechk) 버튼 생성
  • 입력한 데이터를 back end로 전송

DAO(for Authentification)

public class SignOInMethods {

	//id에 맞는 pass인지 확인
	public boolean authentification(String id,String pass) {
		
		boolean flag=false;
		
		Connection conn=db.getConnection();
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		String sql="select * from idx where id=? and pass=?";
		
		try {
			pstmt=conn.prepareStatement(sql);
			
			pstmt.setString(1, id);
			pstmt.setString(2, pass);
			rs=pstmt.executeQuery();
			
			if(rs.next())
				flag=true;
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			db.dbClose(rs, pstmt, conn);
		}
		
		return flag;
	}
}
  • ID와 Password가 DB에 저장된 것과 일치하면 rs.next()가 1회 이상 true를 반환하므로 반환 값은 true, 일치하지 않으면 rs.next()는 계속 false이므로 반환 값은 false

Sign In Action

<body>
	<%
	String id=request.getParameter("id");
	String pass=request.getParameter("pass");
	String save=request.getParameter("savechk");
	
	//아이디와 비번이 맞는지 확인
	SignOInMethods dao=new SignOInMethods();
	boolean flag=dao.authentification(id, pass);
	
	//맞으면 세션지정후 로그인메인으로 이동
	if(flag)
	{
		//로그인중인지 알수있는 세션저장
		session.setAttribute("loginStatus",	"on");
		//아이디 세션 저장
		session.setAttribute("idSession", id);
		//체크값 세션저장..체크하면 값 on,안하면 null
		session.setAttribute("saveSession", save);
		
		//세션 유지시간
		session.setMaxInactiveInterval(60*60*8); //8시간동안 유지(생략시 30분)
		
		//로그인메인으로 이동
		response.sendRedirect("loginMain.jsp");
	}
	else
	{%>
		<script>
			alert("ID and password is not corresponding");
			history.back();
		</script>
	<%}
	%>
</body>
  • DAO의 authentification() 메서드로 본인 인증 시 일치하면 로그인 상태로 간주하여 이후 사용할 session 생성

    1) 로그인 상태가 지속되는 동안 유지되어, 로그인 상태를 판별하는 loginStatus session

    2) session이 삭제될 때까지 지속되어, 어디서나 ID 값을 호출할 수 있는 idSession

    3) 마찬가지로 어디서나 ‘아이디 저장’ 버튼 클릭 여부를 어디서나 호출할 수 있는 saveSession

  • 본인 인증 시 불일치하면 로그아웃 상태 유지

Sign In & Out Main

<body>
	<%
	String loginStatus=(String)session.getAttribute("loginStatus");
	
	if(loginStatus==null||loginStatus.equals("")) //logout상태
	{%>
		<jsp:include page="loginForm.jsp"/> <!-- 주소는 현재 파일이지만 include된 파일을 불러온다 -->
	<%} else { //login상태 %>
		<jsp:include page="logoutForm.jsp"/>
	<%}
	%>
</body>
  • loginStatus session으로 로그인 상태인지 아웃 상태인지를 판별하여 각 상태에 맞는 파일로 이동
  • 이때 include를 사용하여 이후의 모든 주소는 현재의 loginMain.jsp로 유지

DAO(for Get Corresponding Name)

public class SignOInMethods {

	DBConnect db=new DBConnect();
	
	//아이디 통해서 이름 얻기
	public String getName(String id) {
		
		String name="";
		
		Connection conn=db.getConnection();
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		
		String sql="select * from idx where id=?";
		
		try {
			pstmt=conn.prepareStatement(sql);
			
			pstmt.setString(1, id);
			rs=pstmt.executeQuery();
			
			if(rs.next())
				name=rs.getString("name");
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			db.dbClose(rs, pstmt, conn);
		}
		
		return name;
	}
}
  • ID를 통해 이에 해당하는 이름을 얻기 위한 메서드(선택 사항)

Sign Out Form

<body>
	<%
	//세션으로부터 idSession
	String id=(String)session.getAttribute("idSession");
	
	//아이디에 해당하는 이름을 dao로부터 얻는다
	SignOInMethods dao=new SignOInMethods();
	String name=dao.getName(id);
	%>
	<br>
	<b><%=name %></b> is staying signed in now
	<input type="button" value="logout" onclick="location.href='logoutAction.jsp'">
</body>
  • 로그인 상태이므로 로그아웃 폼이 작동
  • session에 저장해 놓은 ID(idSession) 값을 호출 가능

Sign Out Action

<body>
	<%
	//로그인에 대한 세션값 삭제
	session.removeAttribute("loginStatus");
	
	//메인
	response.sendRedirect("loginMain.jsp")
	%>
</body>
  • 로그인 상태가 끝나므로, 로그인 상태 동안 지속되는 loginStatus session 속성을 삭제
  • 로그인 혹은 아웃 폼 중 어느 것을 작동할지 결정할 때는 언제나 Sign In & Out Main(loginMain)으로 데이터 전송
  • loginMain에서는 loginStatus 값이 null이므로 로그인 폼 작동(주소는 여전히 loginMain.jsp)

Sign In Form(After Seconde)

<body>
	<%
	//세션으로부터 아이디 세이브체크값 얻기
	String myid=(String)session.getAttribute("idSession");
	String saveid=(String)session.getAttribute("saveSession");
	
	boolean save=true;
	
	if(saveid==null)
	{
		myid=""; //아이디저장을 체크하지 않을경우 아이디 없앤다
		save=false; //체크하지 않을경우 false,그이외에는 초기값이 true니까 true
	}
	%>
	<div class="loginform">
		<form action="loginAction.jsp" method="post">
			<input type="text" name="id" placeholder="ID" required="required"	value="<%=myid %>"><br>
			<input type="password" name="pass" placeholder="password" required="required"><br>
			
			<button type="submit">로그인</button><br>
			<input type="checkbox" name="savechk" <%=save?"checked":"" %>>아이디저장
		</form>
	</div>
</body>
  • 처음 로그인 폼 작동 시에는 모든 입력 툴이 공백 상태
  • 하지만 재차 로그인 폼 작동 시, 첫 작동 때 설정해둔 데이터가 유지되어 남아있어야 함(아이디 저장 및 아이디 값)
  • 아직 삭제하지 않은 idSession, saveSession을 호출
  • saveSession의 값이 존재하지 않을 경우(’아이디 저장’ 버튼을 클릭하지 않은 경우), ‘아이디 저장’ 버튼에 checked 속성 제거하며, ID 입력 툴의 value 값을 공백으로 부여
  • 반면, savaSession 값이 존재할 경우 ID 입력 툴에 기존에 입력한 ID 데이터(session 값)를 value 값으로 지정하며, ‘아이디 저장’ 버튼에 checked 속성 부여
profile
초보개발자

1개의 댓글

comment-user-thumbnail
2023년 9월 8일

유용한 정보 감사합니다.

답글 달기