12장. JSP에서 자바빈 활용 제12장
1. 자바빈 (JavaBean) 자바빈(JavaBean) 자바빈 활용의 장점 자바빈 구성 요소 또는, JSP와 데이터베이스의 중간에서 데이터 관리의 매개체 역할을 한다. 자바빈 활용의 장점 데이터를 객체 단위로 한데 묶어서 관리하는 데에 많은 편리성이 있다. 메소드로 데이터를 접근: Information Hiding 클래스로부터 객체를 만들고 각 객체별 메소드로 저장된 데이터들을 관리 자바빈 구성 요소 생성자 데이터를 저장하는 프로퍼티(property) 프로퍼티 (데이터) 값을 읽어 올 때 사용되는 멤버 메소드 getter 메소드 프로퍼티(데이터) 값을 저장할 때 사용되는 멤버 메소드 setter 메소드 제12장
1. 자바빈 (JavaBean) 자바빈의 일반적인 구현 형태 제12장 public class JavaBeanClassName implements java.io.Serializable { /* 자체 데이터를 저장하는 프로퍼티 */ // byte stream으로 하드디스크에 저장하고, private String id; // 네트워크로 전송 가능한 객체(Serializable) private String name; /* JavaBeanClassName의 기본 생성자 */ public JavaBeanClassName() { } /* 프로퍼티의 값을 읽어 오는 멤버메소드: getter */ public String getId() { return id; public String getName() { return name; /* 프로퍼티의 값을 변경하는 멤버메소드: setter */ public void setId(String id) { this.id = id; public void setName(String name) { this.name = name; 제12장
1. 자바빈 (JavaBean) 자바빈 규약 (반드시 모든 사항을 지켜야 하는 것은 아니다) 클래스는 java.io.Serializable을 구현(implement)해야 한다. 2) 클래스 내부에 기본 생성자가 정의되어야 한다. 3) 클래스는 public, 프로퍼티는 private, 메소드는 public 접근 제어자를 붙인다. 4) 프로퍼티에 접근할 수 있는 getter 메소드와 setter 메소드가 정의되어야 하며 메소드의 이름은 다음과 같은 규칙을 따라야 한다. - 프로퍼티와 메소드의 이름은 소문자로 시작한다. - 메소드의 이름은 get 또는 set으로 시작한다. - get 이나 set 뒤에 따라오는 단어는 프로퍼티명과 일치해야 하며 대문자로 시작해야 한다. 5) 프로퍼티 타입이 boolean일 경우 getter 메소드의 이름은 get 대신에 is로서 시작한다. 제12장
1. 자바빈 (JavaBean) 자바빈 코딩 방법 getter와 setter 메소드 설정 예를 들어, 프로퍼티의 이름이 width이고 타입이 int라고 할 때 다소 규약에서 벗어난 코딩 방법도 허용된다. 위 코드에서 자바빈 객체를 활용하는 외부에서 간주하게 되는 프로퍼티 이름은 myWidth가 아니라 width가 된다. (메소드에서 정의된 이름) 규약에 있는 각 사항들은 추천사항이며 꼭 지켜야하는 엄격한 룰은 아니다. public void setWidth(int width); public int getWidth(); private int myWidth = 0; public void setWidth(int width) { myWidth = width; } public int getWidth() { return myWidth; 제12장
1. 자바빈 (JavaBean) 자바빈 코딩 방법 읽기 전용 프로퍼티와 프로퍼티의 실체 fahrenheit 프로퍼티는 그 실체가 class에서 명시적으로 정의되어 있지 않다. getFahrenheit() 메소드를 제공함으로써 fahrenheit 프로퍼티를 제공함. 즉, 프로퍼티는 private으로 지정된 변수에 의해 만들어지는 것이 아니라 외부에서 접근이 가능하도록 public으로 지정된 메소드에 의하여 정의됨 public class Temperature { private double celsius; public double getCelsius() { return celsius; } public void setCelsius(double celsius) { this.celsius = celsius; // fahrenheit 프로퍼티는 읽기 전용 프로퍼티 public double getFahrenheit() { return celsius*9.0/5.0+32.0; 제12장
1. 자바빈 (JavaBean) 자바빈 코딩 방법 boolean 타입의 프로퍼티 private boolean good; public boolean isGood() { return end; } public void setGood(boolean good) { this.good = good; 제12장
1. 자바빈 (JavaBean) 자바빈 코딩 방법 배열 데이터를 저장하는 프로퍼티 배열 전체가 아닌 배열의 각 원소를 접근할 수 있는 메소드 들도 추가로 제공 가능 -> 메소드 오버로딩 (Overloading) 메소드 이름이 같지만 (getGrade, setGrade) 파라미터 형태가 틀리게 중복하여 메소드를 정의하는 것 private int[] grade; public int[] getGrade() { return grade; } public void setGrade(int[] grade) { this.grade = grade; public int getGrade(int index) { return grade[index]; } public void setGrade(int index, int value) { grade[index] = value; 제12장
각 프로퍼티 별로 getter/setter 2. 자바빈의 활용 자바빈 생성하기 예제로서 사용할 자바빈 클래스는 이름이 Member이며 다음 표와 같은 데이터들을 저장하는 프로퍼티들을 갖는다. 프로퍼티 이름 값 타입 읽기/쓰기 여부 id String 읽기/쓰기 각 프로퍼티 별로 getter/setter 메소드 존재 name password email registerDate java.util.Date 제12장
2. 자바빈의 활용 자바빈 생성하기 [예제 12.1] jspbook\WEB-INF\java_sources\Member.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package thinkonweb.bean; import java.util.Date; import java.io.Serializable; public class Member implements Serializable{ // 하드디스크에 저장, 네트워크로 전송 가능 private String id; (serializable) private String name; private String password; private String email; private Date registerDate; public String getId() { //getter methods return id; } public String getName() { return name; public String getPassword() { return password; public String getEmail() { return email; 제12장
2. 자바빈의 활용 자바빈 생성하기 [예제 12.1] jspbook\WEB-INF\java_sources\Member.java 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 public Date getRegisterDate() { return registerDate; } public void setId(String id) { //setter methods this.id = id; public void setName(String name) { this.name = name; public void setPassword(String password) { this.password = password; public void setEmail(String email) { this.email = email; public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 서버가 가진 데이터를 출력 회원 정보 데이터들을 자바빈 객체에 담아서 그 객체로부터 값을 꺼내와 보여주는 일반적인 JSP 코드 데이터들을 객체의 멤버 메소드들을 통하여 접근: 일관성 제공 (by information hiding) 그러나 위와 같이 자바빈 객체에 데이터를 할당하는 작업 및 데이터를 얻어오는 작업을 일일이 Java 코딩으로 해결하는 것이 다소 귀찮을 수 있다. 코딩 대신 태그: 데이터 할당과 접근을 위한 액션 태그들을 별도로 제공 <% Member member = new Member(); member.setName(request.getParameter("name")); member.setId(request.getParameter("id")); .... %> 이름 - <%= member.getName() %>, 아이디 - <%= member.getId()%> 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 1. <jsp:useBean> 액션 태그 자바빈 관련 액션 태그 <jsp:useBean> <jsp:setProperty> <jsp:getProperty> 1. <jsp:useBean> 액션 태그 JSP 페이지에서 사용할 자바빈 객체를 생성해 주는 역할을 한다. 용법 id - 새롭게 생성하는 자바빈 객체의 이름을 명시한다. (소문자) class - 패키지 이름을 포함한 자바빈 클래스의 완전한 이름을 명시한다. scope - 자바빈 객체가 속성으로서 저장될 영역(Scope)을 지정한다. request, session, application, page 중 하나를 값으로 갖는다. 기본 값은 page이다. (chap 8: JSP 기본 객체 참조) <jsp:useBean id="[자바빈 이름]“ class="[자바빈 클래스 이름]” scope="[범위]“/> 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 <jsp:useBean> 액션 태그 코딩 예 Member 클래스의 자바빈 객체를 생성하여 변수 member에 할당하고 request 기본객체의 속성으로서 위 객체를 저장함 주의할 점 id 속성에서 지정한 이름에 대한 객체가 해당 영역에 이미 저장이 되어 있다면 객체를 새로 생성하지 않고 이미 저장되어 있는 기존 객체를 그대로 사용한다 i.e., useBean (not createBean) 위의 코드가 내부적으로 변환되는 모습 <jsp:useBean id="member" class="thinkonweb.bean.Member" scope="request"/> thinkonweb.bean.Member member = (thinkonweb.bean.Member) request.getAttribute("member"); if ( member == null ) { // 없으면 새로 객체를 새로 생성 member = new thinkonweb.bean.Member(); request.setAttribute("member", member); } 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 <jsp:useBean> 액션 태그 사용 예제 <jsp:useBean>을 사용하여 Member 객체를 생성한 후 <jsp:forward>를 사용하여 다른 페이지로 흐름을 이동 시킴. (forward되어도 처음 URL은 그대로) -> Member.java가 컴파일되어서 Member.class가 지정된 위치에 있어야 함 [예제 12.2-1] jspbook\ch12\makeBean.jsp 01 02 03 04 05 06 07 08 09 10 11 <%@ page contentType="text/html;charset=utf-8" %> <%@ page import="java.util.Date" %> <jsp:useBean id="member" class="thinkonweb.bean.Member" scope="request" /> <% member.setId("200910231"); member.setName("홍길동"); member.setPassword("112233"); member.setEmail("hong@aaa.bbb.com"); member.setRegisterDate(new Date()); %> <jsp:forward page="useBean.jsp" /> 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 <jsp:useBean> 액션 태그 사용 예제(계속) [예제 12.2-2] jspbook\ch12\useBean.jsp 01 02 03 04 05 06 07 08 09 10 11 12 <%@ page contentType="text/html;charset=utf-8" %> <jsp:useBean id="member" class="thinkonweb.bean.Member" scope="request" /> <html> <head><title>자바빈 객체 사용</title></head> <body> <%= member.getName() %> (<%= member.getId() %>) 회원님 안녕하세요.<br/> 당신의 이메일은 <%= member.getEmail() %>입니다. <br/> 당신의 가입 날짜는 <%= member.getRegisterDate() %>입니다. </body> </html> 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 <jsp:useBean> 액션 태그 사용 예제(계속) makeBean.jsp 실행 없이 useBean.jsp를 곧바로 실행한 모습 request 기본 객체에 member 객체가 없으므로 새롭게 생성하였으나, 각 프로퍼티 값을 설정하여 주는 setter 메소드들을 수행하지 않았기 때문에 null 값들이 출력 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 <jsp:useBean> 액션 태그에서 class 속성 대신 type 속성 사용 지정한 영역에 이미 id에 지정한 이름의 객체가 존재한다고 가정하는 것 만약 존재하지 않을 경우 새로 thinkonweb.bean.Member 객체를 생성하지 않고 에러를 발생시킨다. 위의 코드가 내부적으로 수행되는 모습 <jsp:useBean id="member" type="thinkonweb.bean.Member" scope="request"/> thinkonweb.bean.Member member = (thinkonweb.bean.Member)request.getAttribute("member"); if ( member == null ) { // HTTP 응답 코드 500 에러를 발생! } 제12장
2. 자바빈의 활용 자바빈 생성 및 사용을 위한 액션 태그 <jsp:useBean> 액션 태그에서 class 속성 대신 type 속성 사용 예제 [예제 12.3] jspbook\ch12\useBean2.jsp 01 02 03 04 05 06 07 08 09 10 11 12 <%@ page contentType="text/html;charset=utf-8" %> <jsp:useBean id="member" type="thinkonweb.bean.Member" scope="request" /> <html> <head><title>자바빈 객체 사용</title></head> <body> <%= member.getName() %> (<%= member.getId() %>) 회원님 안녕하세요.<br/> 당신의 이메일은 <%= member.getEmail() %>입니다. <br/> 당신의 가입 날짜는 <%= member.getRegisterDate() %>입니다. </body> </html> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 2. <jsp:setProperty> 액션 태그 이미 생성되어 있는 자바빈 객체의 프로퍼티 값을 지정한다. 용법 name - 프로퍼티의 값을 지정할 자바빈 객체 이름. <jsp:useBean> 액션 태그의 id 속성에서 지정한 값과 동일한 값이 지정된다. property - 값을 지정할 프로퍼티 이름 value - 프로퍼티 값. 표현식 사용이 가능하다. 사용 예 <jsp:setProperty name="[자바빈 이름]" property="[프로퍼티 이름]" value="[값]" /> <jsp:useBean id="member" class="thinkonweb.bean.Member" scope="request" /> <jsp:setProperty name="member" property="id" value="101010“ /> <jsp:setProperty name="member" property="name" value="홍길동“ /> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:setProperty> 액션 태그의 value 속성 대신 param 속성 사용 request 기본 객체가 간직하고 있는 파라미터 값을 자바빈 객체의 프로퍼티 값으로 지정할 때 사용 (e.g., Form 사용시 ‘id’ 값) <jsp:setProperty> 액션 태그의 param 속성 사용 예제 <jsp:setProperty name="member" property="id" param="id“ /> [예제 12.4-1] jspbook\ch12\simpleForm.jsp 01 02 03 04 05 06 07 08 09 10 11 12 <%@ page contentType="text/html;charset=utf-8" %> <html> <head><title>간단한 폼</title></head> <body> <form action="parameterBean.jsp" method="get"> 아이디: <input type="text" name="id“ ><br/> 이름: <input type="text" name="name“><br/> <input type="submit" value="전송"> </form> </body> </html> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:setProperty> 액션 태그의 param 속성 사용 예제 [예제 12.4-2] jspbook\ch12\parameterBean.jsp 01 02 03 04 05 06 07 08 09 10 11 12 <%@ page contentType="text/html;charset=utf-8" %> <% request.setCharacterEncoding("utf-8"); %> <jsp:useBean id="member" class="thinkonweb.bean.Member" /> <jsp:setProperty name="member" property="id" param="id" /> <jsp:setProperty name="member" property="name" param="name" /> 자바빈 처리 완료<br/> 아이디 : <%= member.getId() %><br/> 이름 : <%= member.getName() %> </body> </html> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:setProperty> 액션 태그의 param 속성 사용 예제 [Note] 문자열 외의 타입을 지닌 프로퍼티 처리 만약 자바빈 프로퍼티 타입이 문자열이 아닌 int라고 가정해 보자. 이 경우 파라미터로 입력된 값이 "10"이라는 문자열이라면 이것은 int 타입으로 자동으로 변환되어 정수인 10이 저장된다. 즉, <jsp:setProperty> 액션 태그는 프로퍼티 타입에 따라서 알맞게 그 값을 처리하는 기능을 지닌다. double 또는 float도 마찬가지이다. 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 만약 사용자 입력 폼에서 입력받는 파라미터 데이터가 많고 이에 관한 자바빈 객체 프로퍼티도 같은 이름으로 모두 설정되어 있을 때 코딩 방법 <jsp:setProperty> 액션 태그의 property 속성 값으로 “*”을 사용한 축약된 코딩 방법 유의할 점 각각의 파라미터 이름이 자바빈 객체의 프로퍼티 이름과 대소문자까지 정확하게 같아야 한다. <jsp:useBean id="member" class="thinkonweb.bean.Member" scope="request" /> <jsp:setProperty name="member" property="id" param="id"/> <jsp:setProperty name="member" property="password" param="password"/> <jsp:setProperty name="member" property="name" param="name"/> <jsp:setProperty name="member" property="email" param="email"/> <jsp:useBean id="member" class="thinkonweb.bean.Member" scope="request"/> <jsp:setProperty name="member" property="*"/> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 3. <jsp:getProperty> 액션 태그 자바빈 객체의 프로퍼티 값을 가지고 올 때 사용 용법 name - <jsp:useBean> 액션 태그의 id 속성에서 지정한 값과 동일한 값이 지정된다. property - 값을 가져올 프로퍼티 이름 사용 예 위의 코드는 수행된 후 가져온 값을 바로 출력한다. <jsp:getProperty name="[자바빈 이름]" property="[프로퍼티 이름]"/> <jsp:getProperty name="member" property="name"/> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:getProperty> 액션 태그 사용 예제 [예제 12.5-1] jspbook\ch12\registerForm.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 <%@ page contentType="text/html;charset=utf-8" %> <html> <head><title>회원가입 입력 폼</title></head> <body> <form action="<%= request.getContextPath() %>/ch12/register.jsp" method="post"> <table border="1" cellpadding="0" cellspacing="0"> <tr> <td>아이디</td> <td><input type="text" name="id" size="15"></td> <td>비밀번호</td> <td><input type="password" name="password" size="10"></td> </tr> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:getProperty> 액션 태그 사용 예제 (계속) [예제 12.5-1] jspbook\ch12\registerForm.jsp 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <tr> <td>이름</td> <td colspan="3"><input type="text" name="name" size="15"></td> </tr> <td>이메일</td> <td colspan="3"><input type="text" name="email" size="30"></td> <td colspan="4" align="center"> <input type="submit" value="회원가입"> </td> </table> </form> </body> </html> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:getProperty> 액션 태그 사용 예제 (계속) [예제 12.5-2] jspbook\ch12\register.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 <%@ page contentType="text/html;charset=utf-8" %> <%@ page import="java.util.Date" %> <% request.setCharacterEncoding("utf-8"); %> <jsp:useBean id="member" class="thinkonweb.bean.Member" /> <jsp:setProperty name="member" property="*" /> <jsp:setProperty name="member" property="registerDate" value="<%= new Date() %>" /> <html> <head><title>가입 처리</title></head> <body> 회원 가입 처리 완료 <br/> <table width="400" border="1" cellpadding="0" cellspacing="0"> <tr> <td>아이디</td> <td><jsp:getProperty name="member" property="id" /></td> </tr> 제12장
2. 자바빈의 활용 자바빈 프로퍼티 접근을 위한 액션 태그 <jsp:getProperty> 액션 태그 사용 예제 (계속) [예제 12.5-2] jspbook\ch12\register.jsp 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <tr> <td>이름</td> <td><jsp:getProperty name="member" property="name" /></td> </tr> <td>이메일</td> <td><jsp:getProperty name="member" property="email" /></td> <td>가입일시</td> <td><jsp:getProperty name="member" property="registerDate" /></td> </table> </body> </html> 제12장
3. 객체 직렬화와 자바빈 저장 객체 직렬화(Serialization) 객체 직렬화의 이용 소프트웨어 객체를 byte 단위로 I/O 스트림(stream)을 통하여 읽고 쓸 수 있도록 만드는 과정 (java.io.* package) 데이터베이스의 사용 없이 메모리에 있는 객체를 하드디스크에 저장하거나 네트워크로 전송하기 위한 기법 객체의 영속성(persistence): 객체가 자신의 상태를 기록함으로써 다음 기회나 다른 환경에서 재생될 수 있는 능력을 제공 객체 직렬화의 이용 회원 관리 프로그램에서 회원에 대한 정보를 메모리에 있는 자바빈 객체에 담아낸 후 그 정보를 디스크의 데이터베이스에 저장할 필요가 있다. 그러나 데이터베이스를 사용하지 않아도 객체 자체를 직렬화하면 회원 정보를 디스크에 영구적으로 저장/전송 가능하다. 제1장
3. 객체 직렬화와 자바빈 저장 객체 직렬화(Serialization)와 관련된 클래스와 메소드 객체의 입출력 스트림을 지원하는 java.io 패키지에 있는 클래스 직렬화: 객체를 순차적인 바이트로 표현한 데이터 위 클래스로부터 생성자 메소드를 통하여 객체를 디스크에 읽고 쓸 수 있는 스트림 객체를 만들면 그 객체에게 다음의 두 메소드를 호출하여 원하는 일을 할 수 있다. public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants // 객체 Object obj를 write public final void writeObject(Object obj)throws IOException // 객체 Object를 read public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException 제12장
3. 객체 직렬화와 자바빈 저장 객체 직렬화(Serialization)를 사용한 객체 저장 코드 try { // Point 객체 (http://download.oracle.com/javase/6/docs/api/index.html 참조) Point p = new Point(1, 2); // file을 만든다. FileOutputStream fos = new FileOutputStream("point.ser"); // Point 객체를 file에 byte stream으로 저장한다. ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(p); oos.close(); } catch(Exception e) { System.out.println(e); } 제12장
3. 객체 직렬화와 자바빈 저장 객체 직렬화(Serialization)를 사용한 객체 읽기 코드 try { FileInputStream fis = new FileInputStream("point.ser"); ObjectInputStream ois = new ObjectInputStream(fis); Object o = ois.readObject(); Point p = (Point) o; ois.close(); } catch(Exceptin e) { System.out.println(e); } 제12장
3. 객체 직렬화와 자바빈 저장 객체 직렬화(Serialization)를 사용하기 위한 자바빈 객체 구성 자바빈 구현시에 반드시 java.io.Serializable 이라는 인터페이스를 구현 java.io.Serializable 인터페이스를 구현하는 클래스가 반드시 구현해야 할 메소드는 무엇? "아무것도 없다" java.io.Serializable 인터페이스는 일종의 스펙(specification)와 같은 역할을 하는 것으로서 이것을 구현하는 클래스는 직렬화 기능을 활용할 수 있다. package thinkonweb.bean; import java.util.Date; import java.io.Serializable; public class Member implements Serializable { private String id; private String name; private String password; … } 제12장
3. 객체 직렬화와 자바빈 저장 회원 가입과 회원 정보 저장 기능 구현 [예제 12.6-1] jspbook\ch12\registerForm2.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 <%@ page contentType="text/html;charset=utf-8" %> <html> <head><title>회원가입 입력 폼</title></head> <body> <form action="<%= request.getContextPath() %>/ch12/register2.jsp" method="post"> <table border="1" cellpadding="0" cellspacing="0"> <tr> <td>아이디</td> <td><input type="text" name="id" size="15"></td> <td>비밀번호</td> <td><input type="password" name="password" size="10"></td> </tr> 제12장
3. 객체 직렬화와 자바빈 저장 회원 가입과 회원 정보 저장 기능 구현 [예제 12.6-1] jspbook\ch12\registerForm2.jsp 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 <tr> <td>이름</td> <td colspan="3"><input type="text" name="name" size="15"></td> </tr> <td>이메일</td> <td colspan="3"><input type="text" name="email" size="30"></td> <td colspan="4" align="center"> <input type="submit" value="회원가입"> </td> </table> </form> </body> </html> 제12장
3. 객체 직렬화와 자바빈 저장 회원 가입과 회원 정보 저장 기능 구현 자바빈 객체를 저장할 폴더: ch12 폴더 밑의 member 폴더 생성함. 각 회원별로 자신의 Id 값을 “member_” 뒤에 붙여서 자바빈 객체가 저장되는 파일명을 지정한다. 따라서 각 회원별 정보는 그 회원의 Id 값이 붙여진 파일에 저장된다. 제12장
3. 객체 직렬화와 자바빈 저장 회원 가입과 회원 정보 저장 기능 구현 [예제 12.6-2] jspbook\ch12\register2.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 <%@ page contentType="text/html;charset=utf-8" %> <%@ page import="java.util.Date" %> <%@ page import="java.io.*" %> <% request.setCharacterEncoding("utf-8"); %> <jsp:useBean id="member" class="thinkonweb.bean.Member" /> <jsp:setProperty name="member" property="*" /> <jsp:setProperty name="member" property="registerDate" value="<%= new Date() %>" /> member.setPassword(request.getParameter("password")); String realPath = application.getRealPath("/ch12/member/member_ "+member.getId ()); FileOutputStream fos = new FileOutputStream(realPath); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(member); oos.close(); <html> <head><title>가입 처리</title></head> <body> 회원 가입 처리 완료 <br/> 제12장
3. 객체 직렬화와 자바빈 저장 회원 가입과 회원 정보 저장 기능 구현 [예제 12.6-2] jspbook\ch12\register2.jsp 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <table width="400" border="1" cellpadding="0" cellspacing="0"> <tr> <td>아이디</td> <td><jsp:getProperty name="member" property="id" /></td> </tr> <td>이름</td> <td><jsp:getProperty name="member" property="name" /></td> <td>이메일</td> <td><jsp:getProperty name="member" property="email" /></td> <td>가입일시</td> <td><jsp:getProperty name="member" property="registerDate" /></td> </table> <a href="loginMember.jsp">로그인</a> </body> </html> 제12장
3. 객체 직렬화와 자바빈 저장 회원 가입과 회원 정보 저장 기능 구현 회원 가입시 마다 member 폴더에 저장된 객체 모습 제12장
3. 객체 직렬화와 자바빈 저장 로그인 기능 구현 로그인 처리를 할 때 직렬화되어 파일로 저장된 객체를 읽어와서 로그인시 입력한 정보와 비교한다. [예제 12.6-3] jspbook\ch12\loginMember.jsp 01 02 03 04 05 06 07 08 09 <%@ page contentType="text/html;charset=utf-8" %> <html> <head><title>로그인</title></head> <body> <form action="loginMemebrProcess.jsp" method="post"> ID : <input type="text" name="id"><br/> Password : <input type="password" name="pw"><br/> <input type="submit" value="전송"> </body> </html> 제12장
3. 객체 직렬화와 자바빈 저장 로그인 기능 구현 [예제 12.6-4] jspbook\ch12\loginMemberProcess.jsp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 - 15 16 17 18 19 20 21 <%@ page contentType="text/html;charset=utf-8" %> <%@ page import="thinkonweb.bean.Member" %> <%@ page import="java.io.*" %> <% String storedID = null; String storedPW = null; String id = request.getParameter("id"); String pw = request.getParameter("pw"); try { String realPath = application.getRealPath("/ch12/member/member_"+ id); FileInputStream fis = new FileInputStream(realPath); if (fis != null) { ObjectInputStream ois = new ObjectInputStream(fis); thinkonweb.bean.Member storedMember = (thinkonweb.bean.Member)ois.readObject(); storedID = storedMember.getId(); storedPW = storedMember.getPassword(); ois.close(); } if (id.equals(storedID) && pw.equals(storedPW)) { // 아이디와 패스워드 모두 일치 session.setAttribute("SUCCESS_LOGIN", id); // p.266 session 기본객체 %> 제12장
3. 객체 직렬화와 자바빈 저장 로그인 기능 구현 [예제 12.6-4] jspbook\ch12\loginMemberProcess.jsp 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <html> <head><title>로그인 처리</title></head> <body> 로그인에 성공했습니다. <br/> </body> </html> <% } else if (id.equals(storedID)) { // 패스워드 불일치 %> <script> alert("패스워드가 다릅니다."); history.go(-1); // 바로 전 page로 backward </script> } else { //아이디 불일치 (아이디가 다른 경우 패스워드는 일치 유무 검사 하지 않음) alert("일치하는 ID의 회원정보가 없습니다."); history.go(-1); 제12장
3. 객체 직렬화와 자바빈 저장 로그인 기능 구현 [예제 12.6-4] jspbook\ch12\loginMemberProcess.jsp 42 43 44 45 46 47 48 49 50 <% } } catch (Exception e) { %> <script> alert("일치하는 ID의 회원정보가 없습니다."); history.go(-1); </script> <% } %> 제12장