6월 22일 내용정리
오늘은 Servlet/JSP을 사용하여 회원가입 기능구현 연습해봄
1.회원가입폼
<!-- 멤버폼 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입 창</title>
<script type="text/javascript">
function fn_sendMember() {
var frmMember= document.frmMember; //폼에 받은 모든걸 객체 frmMember에 담아줌
var id=frmMember.id.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
var pwd=frmMember.pwd.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
var name=frmMember.name.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
var email=frmMember.email.value; //frmMember 객체를 이용하여 각요소 불러내어 변수에 담기
//유효성 체크
if(id.lenght==0 || id==""){ //요소가 길이가 0이거나 빈값일때
alert("아이디는 필수입니다.");
}else if(pwd.lenght==0||pwd==""){ //요소가 길이가 0이거나 빈값일때
alert("비밀번호는 필수 입니다.");
}else if(name.length==0||name==""){ //요소가 길이가 0이거나 빈값일때
alert("이름은 필수 입니다.");
}else if(email.length==0||email==""){ //요소가 길이가 0이거나 빈값일때
alert("이메일은 필수 입니다.");
}else{
frmMember.method="Post"; //위에 모든 조건이 충족되었다면 post로 보내죠
frmMember.action="member3"; // member3 서블릿으로
frmMember.submit(); //frmMember객체를 보내줌
}
}
</script>
</head>
<body>
<form name="frmMember">
<table>
<th>회원 가입창</th>
<tr>
<td>아이디</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="text" name="pwd"></td>
</tr>
<tr>
<td>이름</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="text" name="email"></td>
</tr>
</table>
<!-- 버튼을 누름과 동시에 fn_sendMember() 자바스크립트 함수 호출 -->
<input type="button" value="가입하기" onclick="fn_sendMember()">
<input type="reset" value="다시입력">
<!-- 숨겨진 기능?? 무언가를 체크할때 쓰임 -->
<input type="hidden" name="command" value="addMember" />
</form>
</body>
</html>
2.멤버 서블릿(기능 구현)
package study_0621;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/member3")
public class MemberServlet01 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request,response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
MemberDAO dao= new MemberDAO(); //데이터베이스 관련 객체 생성
PrintWriter out =response.getWriter();
String command=request.getParameter("command"); //command 의 value를 변수에 담아죠
if(command !=null && command.equals("addMember")) //command가 null이 아니면서 value의 내용이 addMember와 같다면
{
String _id=request.getParameter("id"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
String _pwd=request.getParameter("pwd"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
String _name=request.getParameter("name"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
String _email=request.getParameter("email"); //request객체에 담긴 요소를 꺼내서 변수에 담아죠
MemberVO vo = new MemberVO(); //자바빈 객체 생성,은닉성
vo.setId(_id); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
vo.setPwd(_pwd); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
vo.setName(_name); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
vo.setEmail(_email); //자바빈의 set메서드를 사용하여 request객체에 담긴 요소로 설정해죠
dao.addMember(vo); //데이터베이스에 addMember메서드 호출하고 매개변수로 자바빈 객체를 넘겨죠
}else if(command !=null && command.equals("delMember")) //command가 null이 아니면서 value의 내용이 delMember와 같다면
{
String id=request.getParameter("id"); //request객체에서 id를 얻어와서 변수에 담아죠
dao.delMember(id); //데이터베이스의 delMember메서드 호출하고 id를 매개변수로 넘겨죠
}
List<MemberVO> list=dao.listMember(); //데이터베이스의 listMember메서드를 호출해서 List자료구조에에 담아죠, MemberVO객체타입만
out.print("<html><body><table><tr>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td>삭제</td></tr>");
for(int i=0;i<list.size();i++) {
MemberVO memberVO=(MemberVO)list.get(i); //형변환, list의 i번째해당하는 객체를 변수에 담아죠
String id=memberVO.getId(); //memberVO의 객체의 요소를 꺼내죠
String pwd=memberVO.getPwd(); //memberVO의 객체의 요소를 꺼내죠
String name=memberVO.getName(); //memberVO의 객체의 요소를 꺼내죠
String email=memberVO.getEmail(); //memberVO의 객체의 요소를 꺼내죠
String joinDate=memberVO.getJoinDate(); //memberVO의 객체의 요소를 꺼내죠
//그것을 출력해죠
out.print("<tr><td>"+id+"</td><td>"+pwd+"</td><td>"+
name+"</td><td>"+email+"</td><td>"+joinDate+"</td><td>"+
//삭제를 누르면 member3에 해당하는 서블릿으로 이동해죠, 아래값 command=delMember&id=id 을 가지고
"<a href='/Webstudy/member3?command=delMember&id="+id+"'>삭제</a></td></tr>");
}
out.print("</table></body></html>");
//새회원 등록하기를 누르면 Webstudy/memberForm.jsp 로 이동해죠
out.print("<a href='/Webstudy/memberForm.jsp'>새회원 등록하기</a>");
}
}
3.값을 전달하는 데 사용되는 VO(Value Object)클래스
package study_0621;
//값을 전달하는 데 사용되는 VO(Value Object)클래스 입니다.
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private String joinDate;
public MemberVO(){
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getJoinDate() {
return joinDate;
}
public void setJoinDate(String joinDate) {
this.joinDate = joinDate;
}
}
4.데이터베이스 연결클래스
package study_0621;
public class MemberDAO {
private Connection conn;
private PreparedStatement pstmt;
private DataSource dataFactory; //ConnectionPool 객체 생성
MemberDAO(){
try {
Context ctx = new InitialContext(); //JNDI에 접근하기위해 시작객체 InitialContext() 생성
Context envContext=(Context)ctx.lookup("java:/comp/env"); //lookup으로 JNDI의 기본경로(java:/comp/env) 넣어주기
dataFactory=(DataSource)envContext.lookup("jdbc/myoracle"); //톰캣 context.xml에 설정한 name값인 jdbc/myoracle을 이용하여
//톰캣이 미리 연결한 DataSource를 받아온다.
}catch(Exception e) {
e.printStackTrace();
}
}
public List<MemberVO> listMember(){ //MemberVO객체만 받는 자료구조 List의 메서드임
List<MemberVO> list = new ArrayList<>(); // 자료구조 객체 생성
try {
conn=dataFactory.getConnection(); //ConnectionPool 객체의 getConnection()로 연결
String query="select * from t_member"; //sql문
System.out.println("prepareStatememt:"+query);
pstmt=conn.prepareStatement(query); //명령문을 담아줌
ResultSet rs =pstmt.executeQuery(); //결과값을 받을 객체를 생성
while(rs.next()) { //커서의 개념이 있음 next()는 그다음껄 꺼내줌
String id=rs.getString("id"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
String pwd=rs.getString("pwd"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
String name=rs.getString("name"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
String email=rs.getString("email"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
String joinDate=rs.getString("joinDate"); //데이터베이스에서 결과값을 받아서 변수에 넣어줌
MemberVO vo =new MemberVO(); //자바빈 객체 생성
vo.setId(id); //자바빈 객체 설정
vo.setPwd(pwd); //자바빈 객체 설정
vo.setName(name); //자바빈 객체 설정
vo.setEmail(email); //자바빈 객체 설정
vo.setJoinDate(joinDate); //자바빈 객체 설정
list.add(vo); //위에 set으로 설정했던거 다 list에 담아주기
}
rs.close();
pstmt.close();
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
return list; //list 객체를 반환
}
public void addMember(MemberVO memberVO) {
try {
conn=dataFactory.getConnection(); //ConnectionPool 객체연결
String id=memberVO.getId(); //자바빈에서 요소 불러와서 변수에 담아주기
String pwd=memberVO.getPwd(); //자바빈에서 요소 불러와서 변수에 담아주기
String name=memberVO.getName(); //자바빈에서 요소 불러와서 변수에 담아주기
String email=memberVO.getEmail(); //자바빈에서 요소 불러와서 변수에 담아주기
String query="insert into t_member"; //쿼리문
query+="(id,pwd,Name,email)"; //쿼리문
query+="values(?,?,?,?)"; //쿼리문
System.out.println("PreparedStatement:"+query);
pstmt=conn.prepareStatement(query); //쿼리문 날리기 위한 객체생성
pstmt.setString(1, id); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
pstmt.setString(2, pwd); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
pstmt.setString(3, name); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
pstmt.setString(4, email); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
pstmt.executeUpdate(); //실행하기
pstmt.close(); //자원회수
}catch(Exception e) {
e.printStackTrace();
}
}
public void delMember(String id) {
try {
conn=dataFactory.getConnection(); //ConnectionPool 객체연결
String query ="delete from t_member where id=?"; //쿼리문
System.out.println("PreparedStatement:"+query);
pstmt=conn.prepareStatement(query); //쿼리문 날리기 위한 객체생성
pstmt.setString(1, id); //쿼리문 날리는 객체와 함께 보내줘야 하는 값
pstmt.executeUpdate(); //쿼리문 실행하기
pstmt.close(); //자원회수
} catch (SQLException e) {
e.printStackTrace();
}
}
}