<회원추가>
* member_detail 에 정보넣는 건 안 되는 거 확인. -> 어떻게 해결 ?
** 근데 굳이 add.jsp와 ddUser.jsp를 나누지말고 폼 태그에서 받은 값들을 바로바로 세팅해서 넘겨줄 수 없나 ? 흐음..
<add.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="db.Member" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
table {
width: 100%;
}
th, td {
border: solid 1px;
}
</style>
</head>
<body>
<%
Member member = new Member();
%>
<h1>회원 추가</h1>
<form method="get" action="addUser.jsp">
<table>
<colgroup>
<col style="width: 20%;" />
<col style="width: 80%;" />
</colgroup>
<tbody>
<tr>
<th>회원구분</th>
<td><input type="text" name="memberType"></td>
</tr>
<tr>
<th>아이디</th>
<td><input type="text" name="userId"></td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="text" name="password"></td>
</tr>
<tr>
<th>이름</th>
<td><input type="text" name="name"></td>
</tr>
<tr>
<th>핸드폰 번호</th>
<td><input type="text" name="mobileNo"></td>
</tr>
<tr>
<th>마케팅 수신여부</th>
<td>
<input type="checkbox" name="marketingYn" value="1">수신
<input type="checkbox" name="marketingYn" value="0">미수신
</td>
</tr>
</tbody>
</table>
<input type="submit" value="회원가입"/>
</form>
</body>
</html>
form 태그 이용해서 사용자로부터 값을 받아올 수 있게 함.
method = "get" // 주소창에 표시됨.
action ="addUser.jsp" // submit 버튼을 눌렀을 때 입력된 정보가 날아갈 페이지
마케팅 수신여부는 체크박스를 만들어서 각 value 값을 다르게 줌. 수신은 1 미수신은 0
입력받은 값들을 memer setXxx() 메소드로 세팅 -> add.jsp
세팅한 member의 값을 memerService의 register()로 넘겨줌. ->addUser.jsp
<addUser.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="db.Member" %>
<%@ page import="db.MemberService" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Member member = new Member();
MemberService memberService = new MemberService();
member.setMemberType(request.getParameter("memberType"));
member.setUserId(request.getParameter("userId"));
member.setPassword(request.getParameter("password"));
member.setName(request.getParameter("name"));
member.setMobileNo(request.getParameter("mobileNo"));
if (request.getParameter("marketingYn").equals("0")) {
member.setMarketingYn(false);
} else {
member.setMarketingYn(true);
}
java.util.Date date = new java.util.Date();
long currentM = date.getTime();
member.setRegisterDate(new java.sql.Date(currentM));
memberService.register(member);
%>
<a href="list.jsp">메인으로 돌아가기</a>
</body>
</html>
add.jsp에서 넘어온 member 객체의 값들을 request.paremeter로 받아서 memberService의 register(Member member)로 넘겨줌.
** 근데 굳이 add.jsp와 ddUser.jsp를 나누지말고 폼 태그에서 받은 값들을 바로바로 세팅해서 넘겨줄 수 없나 ? 흐음..
? 가입일자는 사용자 입력이 아닌 자동입력이 되어야 함.
Date 클래스 이용.
Date date = Calender.getInstance().getTime();
으로 받아왔는데 addUser.jsp 에서 오류가 났음.
입력은 java.util.Date인데 DB에 setRegisterDate 할 때는 java.sql.Date여야해서 오류가 난다 !
이부분
preparedStatement.setDate(9, (java.sql.Date)member.getRegisterDate());
이렇게 java.sql.Date로 형변환을 해주니까
addUser에 Date 코드 쪽에 The type Date is ambiguous 오류
보통 java.util.Date와 java.sql.Date 둘 중 뭘 사용해야할 지 몰라서 발생하는 오류라고 함.
해결방법
1. import로 어떤 클래스 사용할 것인지 명시
2. 선언시 java.util.Date date 명시
둘다 걸릴게 없는데 안 됐음. 그렇다고 Member 속성을 LocalDate로 바꾸자니 일이 커질 것 같음.
* 변환을 해줘보자 !
<addUser.jsp>
java.util.Date date = new java.util.Date();
long currentM = date.getTime();
member.setRegisterDate(new java.sql.Date(currentM));
<MemberService.java>
insert() 메소드에
preparedStatement.setDate(9,( java.sql.Date)member.getRegisterDate());
이 부분을 바꿔줬다.
이건 해결 !
그런데 나는 member 테이블과 memberDetail 테이블 두 개가 있고
이것들은 서로 member_id, user_id 가 동일한 같은 회원임. 근데 속성이 다름.
이 정보를 한 번에 저장하고 싶어서
tring sql = "insert into member(member_type, user_id, password, name)" +
" values (?, ?, ?, ?) ;"
+ " insert into member_detail(member_type, user_id, mobile_no, marketing_yn, register_date)"
+ " values(?,?,?,?,?);";
이렇게 쿼리를 두 개 썼더니 오류가 났다. 데이터 저장이 안 됨.
엥 근데 생각보다 너무 가볍게 해결..
String sql = "insert into member(member_type, user_id, password, name)" +
" values (?, ?, ?, ?) ;";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, member.getMemberType());
preparedStatement.setString(2, member.getUserId());
preparedStatement.setString(3, member.getPassword());
preparedStatement.setString(4, member.getMemberType());
sql = " insert into member_detail(member_type, user_id, mobile_no, marketing_yn, register_date)"
+ " values(?,?,?,?,?);";
preparedStatement.setString(5, member.getUserId());
preparedStatement.setString(6, member.getMobileNo());
preparedStatement.setBoolean(7,member.isMarketingYn());
preparedStatement.setString(8, member.getName());
preparedStatement.setDate(9,( java.sql.Date)member.getRegisterDate());
int affected = preparedStatement.executeUpdate();//쿼리를 실행하면 내용이 컬렉션형태로 반환 되기 때문에 그냥 execute가 아닌 executeQuery로 해야함.
그냥 쿼리문을 두 개 만들어줬다.
이게 맞는진 모르겠지만 일단 내 힘으로 해결했다는 것에 의의를 두며 .. 점점 발전시켜 나가야징
ㄴㄴ 이거 안 된다.
<회원삭제>
*여기서 메인으로 이동버튼 없이 삭제버튼 눌러서 삭제가 완료되면 다시 list.jsp로 오고 싶은데 리다이렉션이었나 ..? 다음에 구현해봐야겠다.
회원 상세에 들어갔을 때 삭제하도록 짜보자.
<detail.jsp> 삭제버튼 추가
<div>
<a href="delete.jsp?memberType=<%=member.getMemberType() %>&userId=<%=member.getUserId() %>">삭제</a>
</div>
1. 삭제를 누르면 member_type과 user_id를 가지고 delete.jsp로 넘어가야함
<a>태그의 href 속성에 기재.
<a href="delete.jsp?memberType=<%=member.getMemberType() %>&userId=<%=member.getUserId() %>">
이 jsp 에서 넘겨주는 이름과 받는 곳에서 request.getParemeter()안의 인자값만 동일하면 어떤 값을 써도 상관없음
2. detail.jsp에서 삭제 버튼을 통해 넘어온 memberType과 userId를 이용해서 MemberService의 delete()를 호출.
<delete.jsp>
<%
MemberService memberService = new MemberService();
memberService.delete(request.getParameter("memberType"), request.getParameter("userId"));
%>
getParameter안에 인자값으로 받을 이름은 넘겨준 이름과 동일해야
3. memberService의 delete() 메소드 만들기. 이때의 인자는 그냥 String type 두 개로 받자.
/**
* 회원 탈퇴 함수
*/
public void delete(String memberType, String userIdValue) {
//1. 드라이버 연결
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url = "jdbc:mariadb://우분투 탄력 ip 주소:3306/testdb1";
String userId = "testuser1";
String password = "";
//2. connection 객체 생성
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = DriverManager.getConnection(url,userId, password);
String sql = "delete from member "
+ " where member_type=? and user_id=?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, memberType);
preparedStatement.setString(2, userIdValue);
sql = "delete from member_detail "
+ " where member_type=? and user_id=?";
preparedStatement.setString(3, memberType);
preparedStatement.setString(4, userIdValue);
int affected = preparedStatement.executeUpdate();
if (affected > 0) {
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
if (connection != null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
잘 되는 것을 확인하였다 !
*여기서 메인으로 이동버튼 없이 삭제버튼 눌러서 삭제가 완료되면 다시 list.jsp로 오고 싶은데 리다이렉션이었나 ..? 다음에 구현해봐야겠다.
<회원 수정>
역시 회원 상세페이지에서 수정 진행.
* member_detail에는 정보 추가가 안 되기 때문에 member테이블의 속성 값만 변경할 수 있음.
1. 회원 정보 수정을 진행할 버튼 detail.jsp에 생성
<div>
<a href="update.jsp?"memberType=<%=member.getMemberType() %>&userId=<%=member.getUserId() %>">정보수정</a>
</div>
2. 넘어온 정보를 받아 memeberService의 update() 메소드를 호출해줄 update.jsp 생성
* 음 근데 얘는 생각해보니까 넘어온 정보를 가지고 회원을 찾아줄 findBy어쩌구 하는 메소드가 또 필요하겠는 걸...
직접 만들어보니 매번 기능마다 jsp 파일을 만들어 메소드를 호출해주는 것이 불필요하게 느껴진다.
한 번에 요청을 받아 메소드를 호출하는 파일이 있으면 좋을 것 같은데
예전에 단기 특강 때 이걸 servlet으로 받아서 처리했었던가 ?? .. 기억이 잘 안 난다.
차차 익혀나가야지
'공부 > 웹 개발' 카테고리의 다른 글
웹 개발 교육 7일차 - 파일 업로드/다운로드 (0) | 2023.03.03 |
---|---|
웹 개발 교육 6일차 - Filter , Listener , JDBC (0) | 2023.02.27 |
웹 개발 교육 5일차 - 서블릿 (0) | 2023.02.26 |
웹 개발 교육 4일차 - 자료구조 , JSP 실습 (0) | 2023.02.25 |
웹 개발 교육 3일차 - 예외처리, 게시판 만들기 (0) | 2023.02.24 |