jsp JDBC MVC 게시글 day 41

stan·2023년 7월 3일
0

jsp

목록 보기
9/15
JAVA 
		M: JDBC

JSP
		V
		C -> controller.jsp 컨트롤러가 여러장이면 불편 



MVC 모델 1 (회사에서 이런거 쓰고 있으면 빤쓰런 : 어디에서도 이런 방식을 쓰지 않음)
a.jsp -> controller01.jsp -> b.jsp
b.jsp -> controller02.jsp -> c.jsp
		data
		 호랑신랑뎐


MVC 모델 2 (대부분 모델2를 씀. MVC방식이라고 하면 이거임)
a.jsp --->> controller.jsp -> b.jsp
	action 01 웹툰목록 보여줘 ~~~ 
b.jsp --->> controller.jsp -> c.jsp
	action 02 웹툰 1개보여줘 ~ 
		data
		 호랑신랑뎐

=======================================================

writer 작성자는 로그인을 한 사람: fk 외래키라서 : mid -> 반드시 상대 테이블의 PK를 가져와야함 !

회원테이블
회원VO
mid
mpw
name
CREATE TABLE MEMBER(
MID VARCHAR(20) PRIMARY KEY,
MPW VARCHAR(20) NOT NULL,
NAME VARCHAR(20) NOT NULL
);
INSERT INTO MEMBER VALUES('admin','1234','관리자');
게시글테이블
게시글VO
num
title
content
writer << FK 외래키 : mid → 반드시 상대 테이블의 PK를 가져와야함!
mid랑 writer랑 같은 데이터

CREATE TABLE BOARD(
NUM INT PRIMARY KEY AUTO_INCREMENT,
TITLE VARCHAR(30) NOT NULL,
CONTENT VARCHAR(50) NOT NULL,
WRITER VARCHAR(20) NOT NULL ★ → 실무에서는 FK 외래키를 등록안하는경우가 훨씬 많음! (테이블, 설계서에는 잘 그림; 그리고 주석으로 FK써놓음; 근데 등록을 FK로 안함
왜냐하면 FK로 등록하는 순간 제약조건이 너무 많아짐)
e.g. 글 작성자가 회원탈퇴;
→null로 바꿔서 탈퇴한 회원입니다; 이런거 보여주려면 제약조건이 없어야해
);

INSERT INTO BOARD VALUES(1,'제목','테스트','admin');
INSERT INTO BOARD (TITLE,CONTENT,WRITER) VALUES('제목','테스트','admin');

=============================================================

b_main 메인페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.BoardVO,java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인</title>
</head>
<body>
<%
/*
이 페이지는 controller가 없이는 볼 수 없는 페이지 
뷰에서 부터 시작 안함( 자바에서도 그렇게 시작 안함)

로그인 여부에 따라 
session으로 부터 현재 로그인 한 사람의 mid를 받아오도록

input이 submit을 제외하고 총 3가지 

mid
mpw
action이라는 이름으로 login을 넣어둠
	1개의 컨트롤러를 쓸건데 action값이 뭐니? 하는 기능 

*/
%>

<%
	String mid=(String)session.getAttribute("mid");
	// == 아, 세션에 로그인 정보가 "name"이라는 변수명으로 저장되어있구나!

	if(mid==null){ // 로그인안된상태
%>
	<form action="controller.jsp" method="post">
		<input type="hidden" name="action" value="login">
		<input type="text" name="mid">
		<input type="password" name="mpw">
		<input type="submit" value="로그인">
	</form> <!-- form이 블록 요소라서 한칸을 혼자 다 차지(자동 줄바꿈) -->
	
	<a href = "controller.jsp?action=signupPage">회원가입</a>
<%
	}
	else{ //else는 로그인이 되어 있는거임 
		out.println("<a href='controller.jsp?action=mypage1'>"+mid+"님의 마이페이지</a> <a href='controller.jsp?action=logout'>로그아웃</a>");
	}
%>

<hr>

<table border="1">
	<tr>
		<th>글 번호</th><th>글 제목</th><th>작성자</th>
	</tr>
	<%
		//전체출력
		//datas를 컨트롤러에서 받아와야함 
		ArrayList<BoardVO> datas=(ArrayList<BoardVO>)request.getAttribute("datas");
		for(BoardVO v:datas){
	%>
	<tr>	<!-- a태그는 버튼(밑줄생기면서 클릭 할 수 있게 해 주는거) -->
		<td><a href="controller.jsp?action=board&num=<%=v.getNum()%>"><%=v.getNum()%></a></td>
		<%-- 게시글은 모두 같은 데이터를 보고 있기 때문에 session이면 안된다
		DB여야만 한다
		--%>
		<td><%=v.getTitle()%></td>
		<td><%=v.getWriter()%></td>
	</tr>
	<%
		}
	%>
</table>
<br>
<%  //게시글작성
	if(mid!=null){ //로그인이 되어 있다면 
		out.println("<a href='controller.jsp?action=insertBoard'>게시글 작성</a>");
	}
%>

</body>
</html>

Ctrl

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList,model.BoardVO" %>
    <% 
    request.setCharacterEncoding("UTF-8");
    %>
<jsp:useBean id="bDAO" class="model.BoardDAO" />
<jsp:useBean id="mDAO" class="model.MemberDAO" />
<jsp:useBean id="mVO" class="model.MemberVO" />
<jsp:setProperty property="*" name="mVO" />
<jsp:useBean id="bVO" class="model.BoardVO" />
<jsp:setProperty property="*" name="bVO" />
<%
	//실무에선 이렇게 쓰지 않음
	//String action="";
	//action = request.getParameter("action");
	
	
	String action = request.getParameter("action");

	System.out.println("로그 : controller.jsp : ");
	System.out.println("action: "+action);
	System.out.println("bVO: "+bVO);
	System.out.println("mVO: "+mVO);
	 
	if(action.equals("main")){ //전체출력
		ArrayList<BoardVO> datas=bDAO.selectAll(null);
		request.setAttribute("datas", datas);
		request.getRequestDispatcher("b_main.jsp").forward(request, response); //forward는 데이터 유지가 됨; jsp action 태그를 자바로 쓴 형태
	}
	else if(action.equals("board")){ //1개 출력
		bVO=bDAO.selectOne(bVO); //여기에 인자 bVO를 제대로 주려면 
		/*
		BoardDAO bDAO = new BoardDAO();  //bDAO.selectOne을 하려면 dao 객체 필요; useBean이 해줌
		
		bVO.setNum(request.getParameter(num)); // 게시글 selectOne 하려면 num이 필요함 : 
											"controller.jsp?action=board&num=<%=v.getNum()//이걸 main에서 받아오고 있어야 함 num		
		*/
		if(bVO!=null){
			request.setAttribute("data", bVO);
			request.getRequestDispatcher("d_board.jsp").forward(request, response);
		}
	}
	else if(action.equals("login")){
		mVO = mDAO.selectOne(mVO); // mVO에 mid, mpw가 setter에 의해 저장된 상태 
		if(mVO==null){
			out.println("<script>alert('로그인 실패...');history.go(-1);</script>");
		}
		else{
			session.setAttribute("mid", mVO.getMid());
			session.setAttribute("name", mVO.getName());
			response.sendRedirect("controller.jsp?action=main");
		}
	}
	else if(action.equals("logout")){//로그아웃
		session.removeAttribute("mid");//mid 빼기
		response.sendRedirect("controller.jsp?action=main"); //메인으로
	}
	
	else if(action.equals("signupPage")){ //회원가입 페이지로 가줘
		response.sendRedirect("e_signup.jsp"); //보낼 데이터 없음 response.sendRedirect를 씀 (포워드안씀)
	}
	
	else if(action.equals("signup")){ //회원가입 진행 해줘
		boolean flag=mDAO.insert(mVO);
		if(flag){
			out.println("<script>alert('회원가입 성공! 로그인후 이용하세요 :D');location.href='controller.jsp?action=main';</script>");//성공
//			response.sendRedirect("controller.jsp?action=main"); //우선실행되서 alert가 안뜸
			//out.println가 실행될 기회가 없음; script의 실행 주체는 자바가아니라 browser라서 script를 쓸 생각이 있으면 response를 쓰면 안됨
		}
		else{
			out.println("<script>alert('회원가입 실패...');history.go(-1);</script>");//실패
		}
		
		/*
		if(!mDAO.insert(mVO)){ //회원가입 실패면
			out.println("<script>alert('회원가입 실패...');history.go(-1);</script>");//실패
		}
		else { //회원가입성공
			out.println("<script>alert('회원가입 성공!');");//성공
			response.sendRedirect("controller.jsp?action=main"); //메인으로
		}
	*/
	}
	else if(action.equals("insertBoard")){ //게시글작성
		response.sendRedirect("c_insertBoard.jsp"); //c 페이지로 이동해서 게시글작성
	}
	else if(action.equals("saveBoard")){//게시글 저장
		boolean flag = bDAO.insert(bVO);//게시글 저장 진행
		if(flag){//성공
			out.println("<script>alert('글작성 성공!');location.href='controller.jsp?action=main';</script>");			
		}
		else {//실패
			out.println("<script>alert('글작성 실패...');history.go(-1);</script>");
		}
	}
	else if(action.equals("updateBoard")){//글 제목,내용 수정
		/*
		if(session.getAttribute("mid")!=null && session.getAttribute("mid").equals(bVO.getWriter())){ //만약 현재 로그인한 mid와 data의 Writer가 같다면
			boolean flag = bDAO.update(bVO);
				if(flag){ //성공
					out.println("<script>alert('글 수정 성공!');location.href='controller.jsp?action=main';</script>");
				}else { //실패
					out.println("<script>alert('글 수정 실패...');history.go(-1);</script>");
				}
		}
		else {//만약 현재 로그인한 회원의 mid와 data의 Writer가 다르면 
			out.println("<script>alert('본인이 작성한 글이 아닙니다');history.go(-1);</script>");
		}
		*/
		boolean flag = bDAO.update(bVO);//게시글 저장 진행
		if(flag){//성공
			out.println("<script>alert('글 수정 성공!');location.href='controller.jsp?action=main';</script>");			
		}
		else {//실패
			out.println("<script>alert('글 수정 실패...');history.go(-1);</script>");
		}
		
	}
	else if(action.equals("deleteBoard")){//게시글 삭제
		boolean flag = bDAO.delete(bVO);
		if(flag){//성공
			out.println("<script>alert('글 삭제 성공!');location.href='controller.jsp?action=main';</script>");			
		}
		else {//실패
			out.println("<script>alert('글 삭제 실패...');history.go(-1);</script>");
		}
	}
	else if(action.equals("mypage")){ //마이페이지로 이동
		response.sendRedirect("f_mypage.jsp");
	}
	else if(action.equals("updateMember")){//회원정보 업데이트 
		boolean flag = mDAO.update(mVO);
		if(flag){//성공
			out.println("<script>alert('회원정보 수정 성공!');location.href='controller.jsp?action=main';</script>");
		}
		else {//실패
			out.println("<script>alert('회원정보 수정 실패...');history.go(-1);</script>");
		}
	}
	else if(action.equals("deleteMember")){//회원정보 삭제
		boolean flag = mDAO.delete(mVO);
		if(flag){//성공
			out.println("<script>alert('회원탈퇴 성공!');location.href='controller.jsp?action=main';</script>");
		}
		else {//실패
			out.println("<script>alert('회원탈퇴 실패...');history.go(-1);</script>");
		}
	}
	else{ //url action에 이상한 값이 들어오면 막아주세요; 
		out.println("<script>alert('action 파라미터의 값을 확인해주세요!');history.go(-1);</script>");
	}
%>

e_signup 회원 가입

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입페이지</title>
</head>
<body>

	<form action = "controller.jsp" method="post"><!-- url이랑 post랑 같이 안씀; 문법상 post에서 안씀; url은 GET에있음 -->
		<input type ="hidden" name="action" value="signup">
		아이디 <input type = "text" name = "mid" required>
		비밀번호 <input type="password" name="mpw" required> <br>
		이름	   <input type="text" name = "name" required>
		<input type="submit" value="회원가입">
	</form>
	<%
	/*
	a 태그는 별도로 데이터를 보내지않을때 사용함
	10번에서 15번 사이에 action값을 보냈어야 하는것
	*/
	%>
	<br>
	
	<a href="controller.jsp?action=main">메인으로 돌아가기</a> <!-- 회원가입 하기 싫어질수도 -->
</body>
</html>

[controller.jsp]
 1) 회원가입 페이지로 이동시키기
[회원가입 페이지]
 1) mid,mpw,name 회원가입 버튼 누르기
 2) C야, 회원가입 시켜줭!~~
[controller.jsp]
 1) 아 ㅇㅋ 회원가입?
 2) 성공시
	메인
    실패
	다시 원래페이지 == 회원가입 페이지

c_insertBoard 게시글 입력


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 작성 페이지</title>
</head>
<body>
	<form action="controller.jsp" method="post">
		<input type="hidden" name="action" value="saveBoard" >
		글제목<input type="text" name="title" required>
		글내용<input type="text" name="content" required>
		작성자<input type="hidden" name="writer" value="<%=session.getAttribute("mid")%>">
		<input type="submit" value="글작성">
	</form>
	
	<a href="controller.jsp?action=main">메인으로 돌아가기</a> <!-- 글작성 하기 싫어질수도 -->
</body>
</html>
==================
게시글 작성
==================

C(index) -> b main (로그인, 게시글작성) -> ctrl (action==게시글작성 이야?) -> c_insertBoard -> ctrl(action==게시글등록 이야?) -> b main
---------------------------------------------------------------
[b main 페이지]
	로그인
		하면 게시글 작성 버튼 보임
	
	게시글작성 
		버튼 누르면 ctrl로이동
		controller.jsp?action=insertBoard


[ctrl 페이지]
	else 만약 action값이 insertBoard 라면 게시글 작성 하러감
		-> c_insertBoard 페이지로 이동


[c_insertBoard 페이지]
	text 박스에 글 제목, 글 내용 작성 
		하고 submit 버튼으로 등록 action=saveBoard
			submit 버튼 누르면 ctrl로 이동


[ctrl 페이지]
	else 만약 action값이 saveBoard라면
	
	글 저장  (bDAO insert)
		성공하면 : '성공!'후 -> b main
		실패하면 : '실패..'후 -> 원래페이지 ( c_insertBoard)

d_board 게시글 수정 / 삭제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.BoardVO" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 상세 페이지</title>
</head>
<body>
 
<%
	BoardVO data=(BoardVO)request.getAttribute("data");
%>
글 번호: <%=data.getNum()%> <br>
글 제목: <%=data.getTitle()%> <br>
글 내용: <%=data.getContent()%> <br>
작성자: <%=data.getWriter()%> <br>
<%
if(session.getAttribute("mid")!=null && session.getAttribute("mid").equals(data.getWriter())){
%>
	<form action="controller.jsp" method="post">
	<input type="hidden" name="action" value="updateBoard" >
	글 제목 수정: <input type="text" name="title" required>
	<br>
	글 내용 수정: <input type="text" name="content" required>
	<input type="hidden" name = "num" value="<%= data.getNum()%>">
	<input type="hidden" name="writer" value="<%=data.getWriter()%>">
	<br>
	<input type="submit" value="글 수정">
	</form>

	<form action="controller.jsp" method="post" >
	<input type="hidden" name="action" value="deleteBoard">
	<input type="hidden" name="num" value="<%= data.getNum()%>">
	<input type="submit" value="글 삭제">
	</form>

<%
}
%>
	
	<a href="controller.jsp?action=main">메인으로 돌아가기</a> <!-- 글수정 하기 싫어질수도 -->

</body>
</html>
		
==================
게시글 수정
==================

C(index) -> b main (게시글 번호 선택) -> ctrl (게시글번호) -> d_board (게시글 수정)-> ctrl(성공,실패,본인게시글확인) -> b main

---------------------------------------------------------------	

[ctrl]
	선택된 게시글번호 num 받아서 상세페이지로 이동

[d_게시글상세페이지]
		
	선택한 num 게시글 상세페이지에서 
		
	title - 새로운 제목 입력
	content - 새로운 내용 입력
	히든 writer - 현재 로그인한 회원의 mid를 session으로 받아옴
	
	수정 버튼 클릭 - ctrl로 title, content, writer모두 form을 통해 넘겨줌 

[ctrl]
	if(만약 mid가 현재 로그인 한 사람과 같다면)
		bDAO로 update() 실행
			true 성공
			false 실패

	else 그게 아니라면
		mid가 다름
	

mypageFirst 비번확인

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>비번검사 마이페이지</title>
</head>
<body>



<form action="controller.jsp" method="post">
	<input type="hidden" name="action" value="mypage">
	<input type="hidden" name="mid" value="<%=session.getAttribute("mid")%>">
	비밀번호를 확인하겠습니다. <br>
	비밀번호를 입력해주세요. <br>
	<input type="password" name="mpw">
	<input type="submit" value="비밀번호 확인">
</form>


</body>
</html>

f_mypage

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.MemberVO"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>마이페이지</title>
</head>
<body>
<%
	MemberVO data = (MemberVO)request.getAttribute("data");
%>
	<form action = "controller.jsp" method="post">
		<input type ="hidden" name="action" value="updateMember">
		아이디 <input type = "text" name = "mid" readonly value='<%=data.getMid()%>'> <br>
		비밀번호 변경 <input type="password" name="mpw" value='<%=data.getMpw()%>'> <br>
		이름 변경   <input type="text" name = "name" value='<%=data.getName()%>'>
		<input type="submit" value="회원정보변경">
	</form>

	<form action = "controller.jsp" method="post">
		<input type="hidden" name="action" value="deleteMember">
		<input type="hidden" name="mid" value='<%=data.getMid()%>'>
		<input type="submit" value="회원탈퇴">	
	</form>

	<a href="controller.jsp?action=main">메인으로 돌아가기</a> <!-- 수정 / 삭제가 하기 싫어질수도 -->

</body>
</html>

================================================================

sendRedirect && forward

================================================================

ctrl

	else if(action.equals("mypage")){ //마이페이지로 이동
		response.sendRedirect("f_mypage.jsp");
	}
	else if(action.equals("updateMember")){//회원정보 업데이트 
		boolean flag = mDAO.update(mVO);
		if(flag){//성공
			out.println("<script>alert('회원정보 수정 성공!');location.href='controller.jsp?action=main';</script>");
		}
		else {//실패
			out.println("<script>alert('회원정보 수정 실패...');history.go(-1);</script>");
		}
	}

f_mypage

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>마이페이지</title>
</head>
<body>

   <form action="controller.jsp" method="post">
      <input type="hidden" name="action" value="updateMember">
      아이디<input type="text" name="mid" value = "<%=session.getAttribute("mid")%>" readonly required>
      비밀번호<input type="password" name="mpw" required>
      이름<input type="text" name="name" required>
      <input type="submit" value="회원정보 변경">
   </form>  
   
<%
out.println("<a href='controller.jsp?action=deleteMember&mid="+session.getAttribute("mid")+"'>회원 탈퇴</a>");
%>

</body>
</html>

- session을 쓰면 session에서 'mid'속성값을 다시 가져옴

- 로그인한 회원의 데이터는 main에서 ctrl-> mypage로 그대로 들고가는것이 직관적

- session을 쓰면 데이터가 더 무거워짐

profile
이진 입니다

0개의 댓글