2022. 3. 19. 21:36ㆍLanguage`/JSP (Java Server Page)
자바빈(JavaBeans)
- 객체를 JSP페이지에서 사용하기 위해서 사용
- 자바빈을 사용하면 JSP에서 객체를 사용해서 데이터를 저장하고 불러올 수 있다
- 규격을 갖추지 않고 사용하면 에러가 발생
- java.io.Serializable 인터페이스를 구현해야 한다
- 인수가 없는 기본 생성자가 있어야 한다
- 반드시 패키지화
- 멤버변수를 "Property"라고 부른다
- 프로퍼티의 접근 지정자는 반드시 private
- 프로퍼티마다 getter/setter가 존재해야 한다
- 읽기 전용의 경우 getter만 있어야 한다
- getter 메소드에는 파라미터가 존재하면 안된다
- setter 메소드에는 파라미터가 1개 이상 존재해야 한다
- 프로퍼티를 제외한 기본 생성자 & 메소드들은 "public"으로 작성해야 한다
- java.io.Serializable 인터페이스는 생략 가능하나 "자바빈즈 규약"에 명시된 내용을 보면 '자바빈즈에 저장된 프로퍼티를 포함한 채로 파일 시스템에 저장되거나 네트워크로 전송될 수 있도록 객체 직렬화를 제공해야 한다'라고 나와있기 때문에 java.io.Serializable을 implement해야 한다
package chap08.member;
public class MemberInfo implements java.io.Serializable{
private String id;
private String password;
private String name;
private String address;
private Date registerDate;
private String email;
public MemberInfo(){
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getRegisterDate() {
return registerDate;
}
public void setRegisterDate(String registerDate) {
this.registerDate = registerDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
<jsp:useBean> 액션 태그
- 자바빈 객체를 생성하는 액션 태그
<jsp:useBean id="[빈 이름]" class="[자바빈 클래스 이름]" scope="[범위]" />
- id : JSP 페이지에서 자비빈 객체에 접근할 때 사용할 이름 지정 (레퍼런스?)
- class : 패캐지 이름을 포함한 자바빈 클래스의 완전 이름 입력
- scope : 자비빈 객체를 저장할 영역 지정 >> 해당 영역에서는 객체가 공유 가능하다
- page / request / session / application 중 하나
- default는 page이다
- 이미 해당 scope에 해당 객체가 존재하면 이미 존재하는 객체를 사용한다
- 영역별로 공유할 데이터를 쉽게 저장할 수 있다
Example)
## makeObject.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:useBean id="info" class="chap08.member.MemberInfo" scope="request"/>
<%
info.setId("gildong");
info.setPassword("1234");
info.setName("홍길동");
info.setAddress("서울");
info.setRegisterDate(new Date());
info.setEmail("gildong@gmail.com");
%>
<jsp:forward page="useObject.jsp"/>
</body>
</html>
>> scope이 "request"니까 "request" 영역 내에 모든 JSP 페이지는 "memberinfo" 객체를 공유한다
## useObject.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:useBean id="info" class="chap08.member.MemberInfo" scope="request"/>
<%
out.print("아이디 : " + info.getId() + "<br>");
out.print("비밀번호 : " + info.getPassword() + "<br>");
out.print("이름 : " + info.getName() + "<br>");
out.print("주소 : " + info.getAddress() + "<br>");
out.print("등록 날짜 : " + info.getRegisterDate() + "<br>");
out.print("이메일 : " + info.getEmail() + "<br>");
%>
</body>
</html>
<jsp:setProperty> & <jsp:getProperty>
<jsp:setProperty name="자비빈이름" property="이름" value="값" />
<jsp:getProperty name="자바빈이름" property="이름" />
- name은 <jsp:useBean>에서 지정한 "id"를 기입하면 된다
- <jsp:setProperty>에서 value대신 param을 사용할 수도 있다
- param을 사용하면 "다른 Property의 값"을 property에 지정한 프로퍼티의 값에 저장한다는 것이다
<jsp:setProperty name="info" property="id" param="memberId" />
<jsp:setProperty name="info" property="id" value="abcde" />
<jsp:useBean id="member" class="chap08.member.memberInfo" />
<jsp:setProperty name="member" property="*" />
여기서 property="*"의 의미는 각 프로퍼티의 값을 같은 이름을 갖는 파라미터의 값으로 설정한다는 의미이다
>> name & email 요청 파라미터가 있다고 가정하면, 위 코드는 name 파라미터의 값을 name 프로퍼티의 값으로, email 파리미터의 값은 email 프로퍼티의 값으로 설정한다는 뜻이다
- 어떤 form을 통해서 user가 회원가입을 하면 해당 form의 각 name별로 각 프로퍼티 값으로 설정?
Example) 회원가입 양식 폼
package chap08.member;
public class MemberInfo implements java.io.Serializable{
private String id;
private String password;
private String name;
private String address;
private String registerDate;
private String email;
public MemberInfo(){
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getRegisterDate() {
return registerDate;
}
public void setRegisterDate(String registerDate) {
this.registerDate = registerDate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
## sign_up.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/chap08/SignUp/process_signUp.jsp" method="post">
<fieldset>
<legend>회원 가입</legend>
아이디 : <input type="text" name="id"/><br><br>
비밀번호 : <input type="password" name="password"/><br><br>
이름 : <input type="text" name="name"/><br><br>
주소 : <input type="text" name="address"/><br><br>
이메일 : <input type="email" name="email"/><br><br>
<input type="submit" value="회원 가입"/>
</fieldset>
</form>
</body>
</html>
## process_signUp.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
request.setCharacterEncoding("UTF-8");
SimpleDateFormat sdt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d = sdt.format(new Date());
%>
<jsp:useBean id="member" class="chap08.member.MemberInfo" />
<jsp:setProperty name="member" property="*" />
<jsp:setProperty name="member" property="registerDate" value="<%=d%>"/>
<html>
<head>
<title>Title</title>
</head>
<body>
## 회원 가입 완료 & 가입 정보 ##<br><br>
아이디 : <%=member.getId()%> <br><br>
비밀번호 : <%=member.getPassword()%><br><br>
이름 : <%=member.getName()%><br><br>
주소 : <%=member.getAddress()%><br><br>
이메일 : <%=member.getEmail()%><br><br>
가입 시간 : <%=member.getRegisterDate()%>
</body>
</html>
property="*"를 통해서 form의 각 name(id, password, name, address, email)의 value를 memberInfo 객체의 각 프로퍼티에 설정을 해주었다
그리고 registerDate의 경우 SimpleDateFormat을 통해서 "yyyy-MM-dd HH:mm:ss" 형식으로 String 값으로 저장을 하였다