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');
=============================================================
<%@ 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>
<%@ 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>");
}
%>
<%@ 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) 성공시
메인
실패
다시 원래페이지 == 회원가입 페이지
<%@ 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)
<%@ 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가 다름
<%@ 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>
<%@ 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>
================================================================
================================================================
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>");
}
}
<%@ 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>
- 로그인한 회원의 데이터는 main에서 ctrl-> mypage로 그대로 들고가는것이 직관적