✿∘˚˳°∘°
75일차 : SpringMVC - 회원, 공지사항 본문
20230315
1. Member : 전체회원조회 / 로그인 / 로그아웃 / 회원가입 / 마이페이지(정보수정) / 회원탈퇴
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Spring MVC CRUD</h1>
<hr>
<c:choose>
<c:when test="${not empty sessionScope.m }">
<h3>[${sessionScope.m.memberName }]님 환영합니다.</h3>
<h3><a href="/logout.do">로그아웃</a></h3>
<form action="/searchMember.do" method="get">
조회할 회원 아이디 입력 :
<input type="text" name="memberId">
<input type="submit" value="조회">
</form>
<h3><a href="/allMember.do">전체회원조회</a></h3>
<h3><a href="/mypage.do">마이페이지</a></h3>
<h3><a href="/deleteMember.do?memberNo=${sessionScope.m.memberNo }">회원탈퇴</a></h3>
<h3><a href="/noticeList.do">공지사항</a></h3>
</c:when>
<c:otherwise>
<form action="/login.do" method="post">
<fieldset>
<legend>로그인</legend>
아이디 : <input type="text" name="memberId"><br>
비밀번호 : <input type="password" name="memberPw"><br>
<input type="submit" value="로그인">
</fieldset>
</form>
<h3><a href="/joinFrm.do">회원가입</a></h3>
</c:otherwise>
</c:choose>
</body>
</html>
VO
Member
package kr.or.member.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {
private int memberNo;
private String memberId;
private String memberPw;
private String memberName;
private String memberPhone;
private String memberEmail;
}
MemberRowMapper
package kr.or.member.model.vo;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
//select를 하고 while 또는 if 에서 해주던 rset.getString 작업을 해줄 것
public class MemberRowMapper implements RowMapper{
@Override
public Object mapRow(ResultSet rset, int rowNum) throws SQLException {
Member m = new Member();
m.setMemberNo(rset.getInt("member_no"));
m.setMemberId(rset.getString("member_id"));
m.setMemberPw(rset.getString("member_pw"));
m.setMemberName(rset.getString("member_name"));
m.setMemberPhone(rset.getString("member_phone"));
m.setMemberEmail(rset.getString("member_email"));
return m;
}
}
1 - 1 ) 회원가입
Controller : joinFrm으로 이동하기 위한 메소드(joinFrm.do)
@RequestMapping(value="/joinFrm.do")
public String joinFrm() {
return "member/joinFrm";
}
joinFrm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/join.do" method="post">
<fieldset>
<legend>회원가입</legend>
아이디 : <input type="text" name="memberId"><br>
비밀번호 : <input type="password" name="memberPw"><br>
이름 : <input type="text" name="memberName"><br>
전화번호 : <input type="text" name="memberPhone" placeholder="010-0000-0000"><br>
이메일 : <input type="text" name="memberEmail"><br>
<input type="submit" value="회원가입">
<input type="reset" value="취소">
</fieldset>
</form>
</body>
</html>
Controller : insert를 진행하기위한 controller(join.do)
@RequestMapping(value="/join.do")
public String join(Member m) {
//String memberId, String memberPw, String memberName, String memberPhone, String memberEmail
//값추출할 name값과 매개변수명을 반드시 맞춰줘야한다.
//lombok에서 기능을 지원해줘서 Member m 으로도 받을 수 있음
//만약 jsp에서 넘겨주지 않은 값이 있으면 기본값을 받는다.(int면 0)
int result = service.insertMember(m);
if(result > 0) {
//메인페이지로 보내주기
//viewresolver를 거치지 않고 페이지를 이동하고 싶은 경우(다른 컨트롤러를 호출할경우)
//(viewresolver는 WEB-INF/view/...jsp를 포함하므로)
return "redirect:/"; //redirect: 를 사용하면 viewresolver를 거치지않음
}else {
return "member/joinFrm";
}
}
Service
public int insertMember(Member m) {
int result = dao.insertMember(m);
return result;
}
Dao
public int insertMember(Member m) {
String query = "insert into member_tbl values(member_seq.nextval, ?, ?, ?, ?, ?)";
Object[] params = {m.getMemberId(), m.getMemberPw(), m.getMemberName(), m.getMemberPhone(), m.getMemberEmail()};
int result = jdbc.update(query, params);
return result;
}
1 - 2 ) 로그인
Controller
@RequestMapping(value="/login.do")
public String login(Member member, HttpSession session) {
//매개변수 두개로 받아도 되고, Member로 받아도된다.(보내준 값만 값이 들어있고 나머지는 기본값(0, null)
Member loginMember = service.selectOneMember(member);
if(loginMember != null) {
session.setAttribute("m", loginMember);
}
return "redirect:/";
}
Service
public Member selectOneMember(Member member) {
/*
Member loginMember = dao.selectOneMember(member);
return loginMember;
*/
return dao.selectOneMember(member);
}
Dao
public Member selectOneMember(Member member) {
String query = "select * from member_tbl where member_id = ? and member_pw = ?";
Object[] params = {member.getMemberId(), member.getMemberPw()};
List list = jdbc.query(query, params, new MemberRowMapper());
if(list.isEmpty()) {
return null;
}else {
Member loginMember = (Member)list.get(0);
return loginMember;
}
}
1 - 3 ) 로그아웃
Controller
@RequestMapping(value="/logout.do")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
1 - 4 ) 회원탈퇴
Controller
@RequestMapping(value="/deleteMember.do")
public String deleteMember(int memberNo) {
int result = service.deleteMember(memberNo);
if(result > 0) {
return "redirect:/logout.do";
}else {
return "redirect:/";
}
}
Service
public int deleteMember(int memberNo) {
return dao.deleteMember(memberNo);
}
Dao
public int deleteMember(int memberNo) {
String query = "delete from member_tbl where member_no = ?";
Object[] params = {memberNo};
int result = jdbc.update(query, params);
return result;
}
1 - 5 ) 전체회원조회
Controller
@RequestMapping(value="/allMember.do")
public String allMember(Model model) {
//매개변수가 없으므로 값추출할게 X 바로 비즈니스로직으로 가면된다.
ArrayList<Member> list = service.selectAllMember();
model.addAttribute("list", list);
return "member/allMember";
}
Service
public ArrayList<Member> selectAllMember() {
ArrayList<Member> list = dao.selectAllMember();
return list;
}
Dao
public ArrayList<Member> selectAllMember() {
String query = "select * from member_tbl";
//위치홀더가 없기 때문에 Object[] params = {} 생략
List list = jdbc.query(query, new MemberRowMapper());
return (ArrayList<Member>)list;
}
화면구현 JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>전체회원조회</h1>
<hr>
<table border="1">
<tr>
<th>회원번호</th>
<th>아이디</th>
<th>비밀번호</th>
<th>이름</th>
<th>전화번호</th>
<th>이메일</th>
</tr>
<c:forEach items="${list}" var="m">
<tr>
<td>${m.memberNo }</td>
<td>${m.memberId }</td>
<td>${m.memberPw }</td>
<td>${m.memberName }</td>
<td>${m.memberPhone }</td>
<td>${m.memberEmail }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
1 - 6 ) 마이페이지+정보수정
Controller
- mypage이동 메소드
@RequestMapping(value="/mypage.do")
public String mypage(){
return "member/mypage";
}
- mypage 화면 JSP(정보수정 폼)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/updateMember.do" method="post">
<fieldset>
<legend>마이페이지</legend>
회원 번호 : <input type="text" name="memberNo" value="${sessionScope.m.memberNo }" readonly><br>
아이디 : <input type="text" name="memberId" value="${sessionScope.m.memberId }" readonly><br>
비밀번호 : <input type="text" name="memberPw" value="${sessionScope.m.memberPw }"><br>
이름 : <input type="text" name="memberName" value="${sessionScope.m.memberName }" readonly><br>
전화번호 : <input type="text" name="memberPhone" value="${sessionScope.m.memberPhone }"><br>
이메일 : <input type="text" name="memberEmail" value="${sessionScope.m.memberEmail }"><br>
<input type="submit" value="정보수정">
</fieldset>
</form>
<a href="/">메인페이지로</a>
</body>
</html>
- 정보수정 Controller
@RequestMapping(value="/updateMember.do")
//Member m : 변경값을 적어준 변수
//Member member : 세션에 저장되어 있는 값을 불러올 변수
//@SessionAttribute(required = false) Member member
// : 세션에서 이름이 m인 객체를 꺼내서 Member타입으로 저장(자료형 맞아야함, 세션에 저장되어있는 정보가 Member)
// : required = false 가 없는 경우, 이름이 m인 객체가 없으면 에러발생
public String upadateMember(Member member, @SessionAttribute(required = false) Member m) {
int result = service.updateMember(member);
if(result > 0) {
//세션에 m이라는 이름으로 로그인 객체를 넣어둔걸 가져옴
//정석방법
//Member member = (Member)session.getAttribute("m");
m.setMemberPw(member.getMemberPw());
m.setMemberPhone(member.getMemberPhone());
m.setMemberEmail(member.getMemberEmail());
return "member/mypage";
}else {
return "redirect:/";
}
}
Service
public int updateMember(Member member) {
return dao.updateMember(member);
}
Dao
public int updateMember(Member member) {
String query = "update member_tbl set member_pw = ?, member_phone = ?, member_email = ? where member_no = ?";
Object[] params = {member.getMemberPw(), member.getMemberPhone(), member.getMemberEmail(), member.getMemberNo()};
int result = jdbc.update(query, params);
return result;
}
2. Notice : 공지사항리스트 / 공지사항 상세 / 공지사항작성 / 수정(작성자만) / 삭제 (작성자만)
- 사전작업 : Controller / Service / Dao / VO
@Controller
//spring한테 객체를 만들라고 지시(context-scan과 함께 이루어져야한다.)
public class NoticeController {
@Autowired //이거없이 선언만 해놓으면 안에는 null이 들어있지만 AutoWired를 사용하면 null(X)
private NoticeService service;
public NoticeController() {
super();
}
}
@Service
public class NoticeService {
@Autowired
private NoticeDao dao;
public NoticeService() {
super();
}
}
@Repository
public class NoticeDao {
@Autowired
private JdbcTemplate jdbc;
public NoticeDao() {
super();
// TODO Auto-generated constructor stub
}
}
package kr.or.notice.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Notice {
private int noticeNo;
private String noticeTitle;
private String noticeWriter;
private String noticeContent;
private String noticeDate;
}
package kr.or.notice.model.vo;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class NoticeRowMapper implements RowMapper{
@Override
public Object mapRow(ResultSet rset, int rowNum) throws SQLException {
Notice n = new Notice();
n.setNoticeContent(rset.getString("notice_content"));
n.setNoticeDate(rset.getString("notice_date"));
n.setNoticeNo(rset.getInt("notice_no"));
n.setNoticeTitle(rset.getString("notice_title"));
n.setNoticeWriter(rset.getString("notice_writer"));
return n;
}
}
2 - 1 ) 공지사항 리스트
Controller
@RequestMapping(value="/noticeList.do")
public String noticeList(Model model) {
ArrayList<Notice> list = service.selectAllNotice();
model.addAttribute("list", list);
return "notice/noticeList";
}
Service
public ArrayList<Notice> selectAllNotice() {
return dao.selectAllNotice();
}
Dao
public ArrayList<Notice> selectAllNotice() {
String query = "select * from notice";
List list = jdbc.query(query, new NoticeRowMapper());
return (ArrayList<Notice>)list;
}
화면구현 JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>공지사항</h1>
<hr>
<c:if test="${not empty sessionScope.m }">
<a href="/noticeFrm.do">글작성</a>
</c:if>
<table border="1">
<tr>
<th style="width:10%">글번호</th>
<th style="width:50%">제목</th>
<th style="width:20%">작성자</th>
<th style="width:20%">작성일</th>
</tr>
<c:forEach items="${list }" var="n">
<tr onclick = "location.href='/noticeView.do?noticeNo=${n.noticeNo}'">
<td>${n.noticeNo }</td>
<td>${n.noticeTitle }</td>
<td>${n.noticeWriter }</td>
<td>${n.noticeDate }</td>
</tr>
</c:forEach>
</table>
<a href="/">메인으로</a>
</body>
</html>
2 - 2 ) 공지사항 상세보기
Controller
@RequestMapping(value="/noticeView.do")
public String noticeView(int noticeNo, Model model) {
Notice n = service.selectOneNotice(noticeNo);
if(n != null) {
model.addAttribute("n", n);
return "notice/noticeView";
}else {
return "notice/noticeList";
}
}
Service
public Notice selectOneNotice(int noticeNo) {
return dao.selectOneNotice(noticeNo);
}
Dao
public Notice selectOneNotice(int noticeNo) {
String query = "select * from notice where notice_no = ?";
Object[] params = {noticeNo};
List list = jdbc.query(query, params, new NoticeRowMapper());
Notice n = (Notice)list.get(0);
return n;
}
화면구현 JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>공지사항 상세</h1>
<hr>
<table border="1">
<tr>
<th colspan="2">제목</th>
<td colspan="2">${n.noticeTitle }</td>
</tr>
<tr>
<th>작성자</th>
<td>${n.noticeWriter }</td>
<th>작성일</th>
<td>${n.noticeDate }</td>
</tr>
<tr style="height:500px; padding: 20px;">
<td colspan="4">${n.noticeContent }</td>
</tr>
</table>
<c:if test="${not empty sessionScope.m && sessionScope.m.memberId.equals(n.noticeWriter)}">
<a href="/updateNoticeFrm.do?noticeNo=${n.noticeNo }">수정</a>
<a href="/deleteNotice.do?noticeNo=${n.noticeNo }">삭제</a>
</c:if>
<a href="/noticeList.do">목록으로</a>
</body>
</html>
2 - 3 ) 공지사항 작성
Controller - 작성폼으로 이동해주는 메소드
@RequestMapping(value="/noticeFrm.do")
public String noticeFrm(){
return "notice/noticeFrm";
}
공지사항 작성폼 JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>공지사항 작성</h1>
<hr>
<form action="/insertNotice.do" method="post">
<fieldset>
<legend>공지사항작성</legend>
<table border="1">
<tr>
<th>제목</th>
<td><input type="text" name="noticeTitle"></td>
</tr>
<tr>
<th>작성자</th>
<td><input type="text" name="noticeWriter" value="${sessionScope.m.memberId }" readonly></td>
</tr>
<tr>
<th colspan="2">내용</th>
</tr>
<tr>
<td colspan="2"><textarea name="noticeContent"></textarea></td>
</tr>
</table>
<input type="submit" value="작성하기">
<input type="reset" value="취소">
</fieldset>
</form>
</body>
</html>
Controller - 공지사항 Insert
@RequestMapping(value="/insertNotice.do")
public String insertNotice(Notice n) {
int result = service.insertNotice(n);
if(result > 0) {
//list를 가려면 controller를 통해가야 값을 넣기때문에 redirect:/noticeList.do로 먼저가야한다
return "redirect:/noticeList.do";
}else {
return "notice/noticeFrm";
}
}
Service
public int insertNotice(Notice n) {
return dao.insertNotice(n);
}
Dao
public int insertNotice(Notice n) {
String query = "insert into notice values(notice_seq.nextval, ?, ?, ?, to_char(sysdate, 'yyyy-mm-dd'))";
Object[] params = {n.getNoticeTitle(), n.getNoticeWriter(), n.getNoticeContent()};
int result = jdbc.update(query, params);
return result;
}
2 - 4 ) 공지사항 수정
Controller - 수정입력폼으로 이동해줄 메소드
@RequestMapping(value="/updateNoticeFrm.do")
public String updateNoticeFrm(int noticeNo, Model model) {
Notice n = service.selectOneNotice(noticeNo);
if(n != null) {
model.addAttribute("n", n);
return "notice/updateNoticeFrm";
}else {
return "redirect:/";
}
}
수정입력폼 JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>공지사항 수정</h1>
<hr>
<form action="/updateNotice.do" method="post">
<fieldset>
<legend>공지사항수정</legend>
<table border="1">
<tr><td><input type="hidden" name="noticeNo" value="${n.noticeNo }"></td></tr>
<tr>
<th>제목</th>
<td><input type="text" name="noticeTitle" value="${n.noticeTitle }"></td>
</tr>
<tr>
<th>작성자</th>
<td><input type="text" name="noticeWriter" value="${n.noticeWriter}" readonly></td>
</tr>
<tr>
<th colspan="2">내용</th>
</tr>
<tr>
<td colspan="2"><textarea name="noticeContent">${n.noticeContent }</textarea></td>
</tr>
</table>
<input type="submit" value="작성하기">
<input type="reset" value="취소">
</fieldset>
</form>
</body>
</html>
Controller - update를 진행할 메소드
@RequestMapping(value="/updateNotice.do")
public String updateNotice(Notice n) {
int result = service.updateNotice(n);
if(result > 0) {
return "redirect:/noticeView.do?noticeNo="+n.getNoticeNo();
}else {
return "redirect:/updateNoticeFrm.do";
}
}
Service
public int updateNotice(Notice n) {
return dao.updateNotice(n);
}
Dao
public int updateNotice(Notice n) {
String query = "update notice set notice_title = ?, notice_content = ? where notice_no = ?";
Object[] params = {n.getNoticeTitle(), n.getNoticeContent(), n.getNoticeNo()};
int result = jdbc.update(query, params);
return result;
}
2 - 5 ) 공지사항 삭제
Controller
@RequestMapping(value="/deleteNotice.do")
public String deleteNotice(int noticeNo) {
int result = service.deleteNotice(noticeNo);
if(result > 0) {
return "redirect:/noticeList.do";
}else {
return "redirect:/noticeView.do?noticeNo="+noticeNo;
}
}
Service
public int deleteNotice(int noticeNo) {
return dao.deleteNotice(noticeNo);
}
Dao
public int deleteNotice(int noticeNo) {
String query = "delete from notice where notice_no = ?";
Object[] params = {noticeNo};
int result = jdbc.update(query, params);
return result;
}
'국비수업 > Spring' 카테고리의 다른 글
79일차 : Dynamic Mybatis (0) | 2023.03.21 |
---|---|
78일차 : Mybatis (0) | 2023.03.21 |
77일차 : SpringMVC - 게시판2 (0) | 2023.03.17 |
76일차 : 정규화, SpringMVC - 게시판 (0) | 2023.03.16 |
74일차 : loC, DI, springMVC (0) | 2023.03.14 |