재밌고 어려운 IT를 이해해보자~!

JSP 3 본문

코리아IT핀테크과정

JSP 3

언제나즐거운IT 2024. 1. 8. 13:56

저장해놨던 정보를 화면전환과 같이 전달해주고 싶을땐 Forward를 사용하자!

 

JSP파일 하나를 CTRL로 사용하는 MVC 패턴을 배웠다 !

기존에 난장판으로 작성했었는데, 훨씬 낫다.

 

V C
사용자가 입력 -- 파라미터 --> DTO 객체에 setXxx();
유효성 검사 DAO 의 CRUD 를 호출 ----- M
친절한 안내    <-- 결과 --
++++++++++++++++++++++++++++++++++++++++++++++++++


회원 테이블
MID VARCHAR PK
MPW VARCHAR NOT NULL
NAME VARCHAR NOT NULL

회원가입 insertMember
회원목록출력 selectAllMember
로그인 / 로그아웃 login / logout
이름 변경 updateMemberName
회원탈퇴 deleteMember

댓글 테이블
RID INT PK
WRITER VARCHAR FK
CONTENT VARCHAR NOT NULL

댓글 추가 insertReply
댓글목록출력 selectAllReply
댓글1개 선택출력 selectOneReply
내용 변경 updateReplyContent
댓글 삭제 deleteReply
++++++++++++++++++++++++++++++++++++++++++++++++++
회원목록 보여줄 예정 >> 얘 누르면 얘가 쓴 댓글만 출력
댓글목록 보여줄 예정 >> 해당 댓글만 화면에 출력
회원가입 / 로그인 / 로그아웃 / 마이페이지
댓글추가

회원가입 페이지

로그인 페이지

해당 댓글 상세 페이지
내용 변경 / 댓글 삭제 >> 본인일때에만 수행가능

마이페이지
이름 변경 / 회원탈퇴

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

를 작성해볼것이다!

만든파일목록

MODEL---------
MemberDAO.java
MemberDTO.java
ReplyDAO.java
ReplyDTO.java
MEMBER_AND_REPLY.sql

VEIW----------
login.jsp
join.jsp
main.jsp
reply.jsp
mypage.jsp

CTRL-----------
controller.jsp
index.jsp

MODEL에선 평범한 쿼리문이 사용되니 스킵~

login.jsp

<%@ 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="login">
	아이디 <input type="text" name="mid" required> <br>
	비밀번호 <input type="password" name="mpw" required> <br>
	<input type="submit" value="로그인">
</form>

<hr>

<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>

join.jsp

<%@ 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="join">
	아이디 <input type="text" name="mid" required> <br>
	비밀번호 <input type="password" name="mpw" required> <br>
	이름 <input type="text" name="name" required> <br>
	<input type="submit" value="회원가입">
</form>

<hr>

<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>

 

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.dto.*,java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
<style type="text/css">
	.info {
		width: 250px;
	}
</style>
</head>
<body>

<%

	String mid=(String)session.getAttribute("mid");
	if(mid != null){ // 로그인 상태
		
%>
<script>
 document.querySelector('body').style.backgroundColor = 'orange';
	 </script>
		<a href="controller.jsp?action=logout">로그아웃</a> | <a href="controller.jsp?action=mypage">마이페이지</a>

<%
	}
	else{ // 로그아웃 상태
	
	
%>
		<a href="controller.jsp?action=loginPage">로그인</a> | <a href="controller.jsp?action=joinPage">회원가입</a>
<%
	}
%>

<hr>

<ul>
	<%
		ArrayList<ReplyDTO> rdatas=(ArrayList<ReplyDTO>)request.getAttribute("rdatas");
		if(rdatas.size()<=0){
			out.println("출력할 댓글이 없습니다!");
		}
		else{
			for(ReplyDTO data:rdatas){
	%>
			<li><a href="controller.jsp?action=replySelectOne&Rid=<%=data.getRid()%>"><%=data.getRid()%>번 댓글 <%=data.getWriter()%>님이 작성</a></li>
	<%
			}
		}
	%>
</ul>

<hr>

		<form action="controller.jsp?action=replyInsert" method="POST">
			
			<%
				if(mid != null){
			%>	
		<!-- 	오호 hidden으로 value를 보내서 set해줄수도 있구나 ~_~ -->
			<input type="text" name="content" required placeholder="댓글 내용 입력"> <br>
			<input type="hidden" name="writer" value="<%=mid%>" >
				
				
				<input type="submit" value="댓글추가">
			<%		
				}
				else{ // 로그아웃 상태라면
			%>
				<input class="info" type="text" name="content" disabled value="댓글을 작성하시려면 로그인하세요."> <br>
			<%
				}
			%>
		
		</form>

<hr>

<ul>
	<%
		ArrayList<MemberDTO> mdatas=(ArrayList<MemberDTO>)request.getAttribute("mdatas");
		if(mdatas.size()<=0){
			out.println("출력할 회원이 없습니다!");
		}
		else{
			for(MemberDTO data:mdatas){
	%>
				<li><%=data.getName()%>님</li>
	<%
			}
		}
	%>
</ul>

</body>
</html>

reply.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.dto.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>댓글 상세 페이지</title>
</head>
<body>
<%ReplyDTO rDTO = (ReplyDTO)request.getAttribute("rDTO"); %>
<%
String mid=(String)session.getAttribute("mid");
if((mid != null) && (mid.equals(rDTO.getWriter()))){
	 //로그인상태이고 본인이 작성한 글이 맞으면 출력
%>	
	댓글번호 : <%=rDTO.getRid()%> <br>
	작성자 : <%=rDTO.getWriter()%> <br>
	내용 : <%=rDTO.getContent()%> <br>
<form action="controller.jsp" method="POST">
	<input type="hidden" name="action" value="replyUpdate">
	<input type="hidden" name="rid" value="<%=rDTO.getRid()%>">
	변경할 내용 : <input type="text" name="content" required placeholder="댓글 내용 입력"> <br>
	<input type="submit" value="내용 변경">
</form>
<a href="controller.jsp?action=replyDelete&Rid=<%=rDTO.getRid()%>">댓글 삭제</a>
<hr>

<% 
} else {
%>
	댓글번호 : <%=rDTO.getRid()%> <br>
	작성자 : <%=rDTO.getWriter()%> <br>
	내용 : <%=rDTO.getContent()%> <br>
<% 
	} 
%>
<br>
<a href="controller.jsp?action=main">메인으로 돌아가기</a>
</body>
</html>

mypage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"  import="model.dto.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>마이페이지</title>
</head>
<body>
<%MemberDTO mDTO = (MemberDTO)request.getAttribute("mDTO"); %>
	
 	아이디 : <%=mDTO.getMid()%>  <br>
	이름 : <%=mDTO.getName()%> <br><br>
	 
<form action="controller.jsp" method="POST">
<input type="hidden" name="action" value="updateName">
변경할 이름 : <input type=text name="name"> <br> 
<input type="submit" value="이름 변경">
</form>

<a href="controller.jsp?action=withdraw">회원탈퇴</a>

<hr>

<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

	response.sendRedirect("controller.jsp?action=main");

%>

무주건 인덱스를 통해서 프로그램을 실행시킨다!

controller.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList,model.dto.*" %>
<%
	request.setCharacterEncoding("UTF-8");
	// getParameter() 해서 setXxx() 를 진행할때에 인코딩깨짐
	// 얘 전(10번 라인 전)에 수행해야함!!!!!
%>
<jsp:useBean class="model.dao.ReplyDAO" id="rDAO" />
<jsp:useBean class="model.dto.ReplyDTO" id="rDTO" />
<jsp:useBean class="model.dao.MemberDAO" id="mDAO" />
<jsp:useBean class="model.dto.MemberDTO" id="mDTO" />
<jsp:setProperty name="mDTO" property="*" /><!--  setProperty 형변환 알아서해준데 대박--> 
<jsp:setProperty name="rDTO" property="*" />
<%
	String action=request.getParameter("action");
	if(action.equals("main")){
		ArrayList<ReplyDTO> rdatas=rDAO.selectAll(rDTO);
		request.setAttribute("rdatas", rdatas);
		
		ArrayList<MemberDTO> mdatas=mDAO.selectAll(mDTO);
		request.setAttribute("mdatas", mdatas);
	
		pageContext.forward("main.jsp");
		// 새로운 요청 : GET
		// 기존 요청 정보를 모두 삭제시킴
		// 리다이렉트 방식
		// ↓
		// 기존 요청 정보를 유지하는 요청 방식을 사용해야한다!!!!!
		// 포워드 방식
	}
	else if(action.equals("join")){
		
		boolean flag=mDAO.insert(mDTO);
		if(flag){
			response.sendRedirect("controller.jsp?action=main");
		}
		else{
			out.println("<script>alert('ID 중복 등으로 인해 회원가입에 실패하셨습니다!');history.go(-1);</script>");
		}
	}
	else if(action.equals("joinPage")){
		response.sendRedirect("join.jsp"); // V -> C ->  V
	}
	
	
	else if(action.equals("logout")){
	session.invalidate();
	response.sendRedirect("login.jsp");
		// 로그아웃
	}
	else if(action.equals("mypage")){
		mDTO.setMid((String)session.getAttribute("mid"));
		mDTO.setSearchCondition("userinfo");
		mDTO=mDAO.selectOne(mDTO);
		request.setAttribute("mDTO", mDTO);
	
		pageContext.forward("mypage.jsp");

		// 마이페이지로 이동
	}
	
	
	else if(action.equals("login")){
		mDTO.setSearchCondition("login");
		mDTO=mDAO.selectOne(mDTO);
		if(mDTO!=null){
		 	session.setAttribute("mid",mDTO.getMid());
			session.setAttribute("member",mDTO.getName()); 
			response.sendRedirect("controller.jsp?action=main");
			
		}
		else{
			out.println("<script>alert('로그인실패!');history.go(-1);</script>");
		}
	}
	
	else if(action.equals("loginPage")){
		response.sendRedirect("login.jsp");
		// 로그인 페이지로 이동
	}
	else if(action.equals("updateName")) {
		// 이름 변경
		mDTO.setMid((String)session.getAttribute("mid"));
		System.out.println(mDTO);
		boolean flag=mDAO.update(mDTO);
		if(flag){
			
			//변경된 DTO 다시 보내기~ 안그러면 <%=mDTO.getName() 에러난다...ㅡㅡ!!!
			request.setAttribute("mDTO", mDTO);
			out.println("<script>alert('이름 변경완료:D');</script>");
		}
		else{
			out.println("<script>alert('FAIL');history.go(-1);</script>");
		}
		pageContext.forward("mypage.jsp");
	}
	else if(action.equals("withdraw")){
		// 회원 탈퇴
		mDTO.setMid((String)session.getAttribute("mid"));
		boolean flag=mDAO.delete(mDTO);
		if(flag){
			out.println("<script>alert('탈퇴완료');</script>");
			session.invalidate();
			response.sendRedirect("controller.jsp?action=main");
			
		}
		else{
			out.println("<script>alert('FAIL');history.go(-1);</script>");
		}
	}
	
	else if(action.equals("replySelectOne")){
		rDTO.setRid(Integer.parseInt(request.getParameter("Rid")));
		rDTO=rDAO.selectOne(rDTO);
		request.setAttribute("rDTO", rDTO);
		pageContext.forward("reply.jsp");
		
		// 댓글 상세 페이지로 이동
	}
	else if(action.equals("replyInsert")){
	/* 	String member=request.getParameter("action");
		System.out.println(rDTO); */
		boolean flag=rDAO.insert(rDTO);
		if(flag){
			request.setAttribute("rDTO", rDTO);
			//response.sendRedirect("controller.jsp?action=main");
			pageContext.forward("controller.jsp?action=main");
		}
		else{
			out.println("<script>alert('글 작성 실패!');history.go(-1);</script>");
		}
		// 댓글추가
	}
	else if(action.equals("replyUpdate")){
		rDTO=rDAO.selectOne(rDTO);
		boolean flag=rDAO.update(rDTO);
		if(flag){
			request.setAttribute("rDTO", rDTO);
			pageContext.forward("reply.jsp");
			//response.sendRedirect("controller.jsp?action=main");
		}
		else{
			out.println("<script>alert('글 변경 실패!');history.go(-1);</script>");
		} 
	}
		else if(action.equals("replyDelete")){
			rDTO.setRid(Integer.parseInt(request.getParameter("Rid")));
			boolean flag=rDAO.delete(rDTO);
			if(flag){
				response.sendRedirect("controller.jsp?action=main");
			}
			else{
				out.println("<script>alert('글 삭제 실패!');history.go(-1);</script>");
			}
			
		// 댓글추가
	}
	else{
		// 이상한 요청
		// 에러처리해야함!
	}
%>

페이지 주도권 이란 ? ★
<script> 는 
해당 페이지에 <script> 가 작성되어있을때, 그때 수행됨!
로그인 실패시엔 페이지 이동관련 코드가 없어서
controller.jsp에 남아있음,

로그아웃은
페이지 이동 관련 코드가 있음
main으로 넘어감 .

out을 수행하지만
out 된 페이지는 controller.jsp 페이지이고,
이동된 페이지는, main.jsp 라서
script가 수행되지않아 사용자가 볼수없음. 

따라서 스크립트로 이동시키면된다!
redirect말고 ...
<script>alert('로그인실패');location.href="controller.jsp?action=main"</script>

 

과제를 하면서 알게된 내용

<jsp:setProperty name="mDTO" property="*" /><!--  setProperty 형변환 알아서해준데 대박--> 
<jsp:setProperty name="rDTO" property="*" />
이둘은 형변환을 알아서해서 set해준다고하는데,,,,난 에러가난다. 좀 더 찾아봐야할듯

 

그냥 HTML에 

 <%=rDTO.getRid()%> 로 출력해주는 것이 아닌

다음과 같은 방법으로도 출력이 가능하다.

redonly 및 disable 필수~

'코리아IT핀테크과정' 카테고리의 다른 글

MVC pattern2에서 alert 구현하기  (1) 2024.01.11
JSP, Servlet Mapping  (2) 2024.01.10
JSP practice  (0) 2024.01.06
JSP2  (0) 2024.01.05
JSP  (2) 2024.01.04
Comments