본문 바로가기

JSP

[JSP] MVC 패턴 - 로그인, 게시판 만들기

728x90
반응형
1. Model
   1) DB생성   
   2) VO   
   3) DAO
   4) Util
2. View
1)  메인페이지
2)  로그인 페이지
3) 회원가입 페이지
4) 게시글 작성페이지 
5) 게시글 상세페이지 
6) 마이페이지
3. Controller

 

<파일 저장 경로> 

 


 

1. Model

1) DB 생성 

MEMBER.sql - 로그인, 회원가입,마이페이지

CREATE TABLE MEMBER(
	MID VARCHAR(20) PRIMARY KEY,
	MPW VARCHAR(20) NOT NULL,
	MNAME VARCHAR(20) NOT NULL,
	ROLE VARCHAR(20) NOT NULL
);

BOARD.sql - 게시글 

CREATE TABLE BOARD(
	BID INT PRIMARY KEY, 
	TITLE VARCHAR(20) NOT NULL,
	CONTENT VARCHAR(50) NOT NULL,
	WRITER VARCHAR(20) NOT NULL 
);

2) VO   

MemberVO

package model.vo;

public class MemberVO {
	private String mid; // 아이디
	private String mpw; // 비밀번호
	private String mname; // 이름
	private String role; //계정권한
	public String getMid() {
		return mid;
	}
	public void setMid(String mid) {
		this.mid = mid;
	}
	public String getMpw() {
		return mpw;
	}
	public void setMpw(String mpw) {
		this.mpw = mpw;
	}
	public String getMname() {
		return mname;
	}
	public void setMname(String mname) {
		this.mname = mname;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	@Override
	public String toString() {
		return "MemberVO [mid=" + mid + ", mpw=" + mpw + ", mname=" + mname + ", role=" + role + "]";
	}
}

BoardVO

package model.vo;

public class BoardVO {
	private int bid; //pk값
	private String title; //제목
	private String content; //내용
	private String writer; //작성자
	public int getBid() {
		return bid;
	}
	public void setBid(int bid) {
		this.bid = bid;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	@Override
	public String toString() {
		return "BoardVO [bid=" + bid + ", title=" + title + ", content=" + content + ", writer=" + writer + "]";
	}
}

 

  3) DAO

MemberDAO

package model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import model.util.JDBCUtil;
import model.vo.MemberVO;

public class MemberDAO {
	Connection conn;
	PreparedStatement pstmt;
	final String sql_selectOne="SELECT * FROM MEMBER WHERE MID=? AND MPW=?";
		//로그인 로직
	final String sql_insert="INSERT INTO MEMBER VALUES(?,?,?,?)";
	final String sql_update="UPDATE MEMBER SET MPW=?,MNAME=? WHERE MID=?"; //비밀번호, 이름은 바꿀 수 있음
	final String sql_delete="DELETE FROM MEMBER WHERE MID=? AND MPW=?";
	public MemberVO selectOne(MemberVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectOne);
			pstmt.setString(1, vo.getMid());
			pstmt.setString(2, vo.getMpw());
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) {
				MemberVO data=new MemberVO();
				data.setMid(rs.getString("MID"));
				data.setMname(rs.getString("MNAME"));
				data.setMpw(rs.getString("MPW"));
				data.setRole(rs.getString("ROLE"));
				return data;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return null;
	}
	public boolean insert(MemberVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_insert);
			pstmt.setString(1, vo.getMid());
			pstmt.setString(2, vo.getMpw());
			pstmt.setString(3, vo.getMname());
			pstmt.setString(4, vo.getRole());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean update(MemberVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_update);
			pstmt.setString(1, vo.getMpw());
			pstmt.setString(2, vo.getMname());
			pstmt.setString(3, vo.getMid());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean delete(MemberVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_delete);
			pstmt.setString(1, vo.getMid());
			pstmt.setString(2, vo.getMpw());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
}

BoardDAO

package model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import model.util.JDBCUtil;
import model.vo.BoardVO;

public class BoardDAO {
	Connection conn;
	PreparedStatement pstmt;
	final String sql_selectOne="SELECT * FROM BOARD WHERE BID=?";
	final String sql_selectAll="SELECT * FROM BOARD ORDER BY BID DESC";
	final String sql_insert="INSERT INTO BOARD VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD),?,?,?)";
	final String sql_update="UPDATE BOARD SET TITLE=?,CONTENT=? WHERE BID=?";
	final String sql_delete="DELETE FROM BOARD WHERE BID=?";
	public BoardVO selectOne(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectOne);
			pstmt.setInt(1, vo.getBid());
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) {
				BoardVO data=new BoardVO();
				data.setBid(rs.getInt("BID"));
				data.setContent(rs.getString("CONTENT"));
				data.setTitle(rs.getString("TITLE"));
				data.setWriter(rs.getString("WRITER"));
				return data;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}		
		return null;
	}
	public ArrayList<BoardVO> selectAll(BoardVO vo){
		ArrayList<BoardVO> datas=new ArrayList<BoardVO>();
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectAll);
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()) {
				BoardVO data=new BoardVO();
				data.setBid(rs.getInt("BID"));
				data.setContent(rs.getString("CONTENT"));
				data.setTitle(rs.getString("TITLE"));
				data.setWriter(rs.getString("WRITER"));
				datas.add(data);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}		
		return datas;
	}
	public boolean insert(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_insert);
			pstmt.setString(1, vo.getTitle());
			pstmt.setString(2, vo.getContent());
			pstmt.setString(3, vo.getWriter());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean update(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_update);
			pstmt.setString(1, vo.getTitle());
			pstmt.setString(2, vo.getContent());
			pstmt.setInt(3,vo.getBid());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean delete(BoardVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_delete);
			pstmt.setInt(1,vo.getBid());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
}


   4) Util

package model.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUtil {
	static final String driverName="oracle.jdbc.driver.OracleDriver";
	static final String url="jdbc:oracle:thin:@localhost:1521:xe";
	static final String user="kim";
	static final String passwd="1234";
	public static Connection connect() {
		Connection conn=null;
		try {
			Class.forName(driverName);

			conn=DriverManager.getConnection(url, user, passwd);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	public static void disconnect(PreparedStatement pstmt,Connection conn) {
		try {
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

※ index.jsp

index페이지는 시작페이지, 표기페이지로 DB에 방문할 수 있도록 요청하는 역할! 
첫 실행되자마자 로그인 페이지로 연결될 수 있도록 Controller에 요청한다. 

자바에서 AppStart()메소드와 같은 동작을 하는 개념 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 표지페이지 -->
<!--"controller.jsp로 이동할건데, action이라는 파라미터에는 login값을 넣어주세요 -->
<jsp:forward page="controller.jsp?action=login" />

<%
	// pageContext.forward("controller.jsp?action=main");
%>

2. View 

1)  메인페이지

main.jsp - 로그인 후에 해당 메인페이지가 보임 

번호 클릭 시 board.jsp 게시판 상세 페이지로 이동

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.BoardVO,java.util.ArrayList" %>
<jsp:useBean id="datas" class="java.util.ArrayList" scope="request" />
<jsp:useBean id="member" class="model.vo.MemberVO" scope="session" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인페이지</title>
</head>
<body>
<script type="text/javascript">
	function check(){
		ans=prompt('비밀번호를 입력하세요.');
		if(ans==<%=member.getMpw()%>){
			location.href="controller.jsp?action=mypage";
		}
	}
</script>


<h1><a href="javascript:check()"><%=member.getMname()%></a>님, 반갑습니다! :D</h1>
<table border="2">
	<tr>
		<th>번 호</th><th>제 목</th><th>작성자</th>
	</tr>
<%
	for(BoardVO v:(ArrayList<BoardVO>)datas){
%>
	<tr>
		<th><a href="controller.jsp?action=board&bid=<%=v.getBid()%>"><%=v.getBid()%></a></th>
		<td><%=v.getTitle()%></td>
		<td><%=v.getWriter()%></td>
	</tr>
<%
	}
%>
</table>
<hr>
<a href="form.jsp">새로운 글 작성하기</a>


</body>
</html>

2)  로그인 페이지

login.jsp - 로그인이 완료되면 c 거쳐서 main 페이지로 이동

<%@ 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?action=login" method="post">
	<table border="1">
		<tr>
			<td>아이디</td>
			<td><input type="text" name="mid" required></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="mpw" required></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="로그인">
			</td>
		</tr>
	</table>
</form>
<hr>
<a href="reg.jsp">회원가입하기</a>

</body>
</html>

3) 회원가입 페이지

reg.jsp 

아이디, 비밀번호, 이름은 반드시 입력되어야 하기 때문에 required 속성 추가 

계정권한에 기본 선택값은 MEMBER로 고정 하기위헤 selected 속성 추가 

<%@ 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?action=reg" method="post">
	<table border="1">
		<tr>
			<td>아이디</td>
			<td><input type="text" name="mid" required></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="mpw" required></td>
		</tr>
		<tr>
			<td>이름</td>
			<td><input type="text" name="mname" required></td>
		</tr>
		<tr>
			<td>계정권한</td>
			<td>
				<select name="role">
					<option selected>MEMBER</option>
					<option>ADMIN</option>
				</select>
			</td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="회원가입">
			</td>
		</tr>
	</table>
</form>
<hr>
<a href="login.jsp">돌아가기</a>

</body>
</html>

4) 게시글 작성페이지 

form.jsp 

게시글 작성 시 작성자 부분에 작성자의 id값이 뜨게하기 위해서 

<jsp:useBean id="member" class="model.vo.MemberVO" scope="session" /> 

로그인 시 세션에 저장된 member을 사용하여 .getMid() 해준다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.vo.BoardVO" %>
<jsp:useBean id="member" class="model.vo.MemberVO" scope="session" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>작성페이지</title>
</head>
<body>

<form action="controller.jsp" method="post">
	<input type="hidden" name="action" value="insert">
	<table border="1">
		<tr>
			<td>제목</td>
			<td><input type="text" name="title" required></td>
		</tr>
		<tr>
			<td>내용</td>
			<td><input type="text" name="content" required></td>
		</tr>
		<tr>
			<td>작성자</td>
			<td><input type="text" name="writer" value="<%=member.getMid()%>" required></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="글 작성하기">
			</td>
		</tr>
	</table>
</form>
<hr>
<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>

5) 게시글 상세페이지 

board.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean id="data" class="model.vo.BoardVO" scope="request" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>상세페이지</title>
</head>
<body>
<script type="text/javascript">
	function del(){
		ans=confirm('정말 삭제할까요?');
		if(ans==true){
			document.bForm.action.value="delete";
			document.bForm.submit();
		}
		else{
			return;
		}
	}
</script>

<form name="bForm" action="controller.jsp" method="post">
	<input type="hidden" name="action" value="update">
	<input type="hidden" name="bid" value="<%=data.getBid()%>">
	<table border="1">
		<tr>
			<td>제목</td>
			<td><input type="text" name="title" value="<%=data.getTitle()%>" required></td>
		</tr>
		<tr>
			<td>내용</td>
			<td><input type="text" name="content" value="<%=data.getContent()%>" required></td>
		</tr>
		<tr>
			<td>작성자</td>
			<td><input type="text" name="writer" value="<%=data.getWriter()%>" required readonly></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="변경하기">&nbsp;
				<input type="button" value="삭제하기" onClick="del()">
			</td>
		</tr>
	</table>
</form>
<hr>
<a href="controller.jsp?action=main">메인으로 돌아가기</a>

</body>
</html>

6) 마이페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:useBean id="data" class="model.vo.MemberVO" scope="request" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>마이페이지</title>
</head>
<body>

<script type="text/javascript">
	function out(){
		ans=confirm('정말 탈퇴하시나요??');
		if(ans==true){
			document.aForm.action.value="mdelete"
			document.aForm.submit();
		}
	}

</script>

<form name="aForm" action="controller.jsp" method="post">
	<input type="hidden" name="action" value="mupdate">
	<table border="1">
		<tr>
			<td>아이디</td>
			<td><input type="text" name="mid" value="<%=data.getMid()%>" readonly></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="mpw" value="<%=data.getMpw()%>" required></td>
		</tr>
		<tr>
			<td>이름</td>
			<td><input type="text" name="mname" value="<%=data.getMname()%>" required></td>
		</tr>
		<tr>
			<td>계정권한</td>
			<td><%=data.getRole()%></td>
		</tr>
		<tr>
			<td colspan="2" align="right">
				<input type="submit" value="회원정보변경">
				&nbsp;<input type="button" value="탈퇴하기" onClick="out()">
			</td>
		</tr>
	</table>
</form>
<hr>
<a href="controller.jsp?action=main">메인으로 돌아가기</a> <br>

</body>
</html>

3. Controller

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="error/error.jsp" import="java.util.ArrayList,model.vo.*" %>
<%
	request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="mDAO" class="model.dao.MemberDAO" />
<jsp:useBean id="bDAO" class="model.dao.BoardDAO" />
<jsp:useBean id="bVO" class="model.vo.BoardVO" />
<jsp:setProperty property="*" name="bVO" />
<jsp:useBean id="mVO" class="model.vo.MemberVO" />
<jsp:setProperty property="*" name="mVO" />
<%
	// 어떤 요청을 받았는지 파악
	//  -> 해당 요청을 수행

	String action=request.getParameter("action");
	System.out.println("로그: "+action);
	
	if(action.equals("login")){ //로그인
		//login.jsp에서 전달된 mid, mpw로 selectOne진행
		MemberVO member=mDAO.selectOne(mVO);
		if(member!=null){ //member에 값이 존재한다면			
			session.setAttribute("member", member);//session에 값을 저장하기 위해서 setAttribute사용 
												// 이름이 "member"인 속성의 값을 member로 지정 
			response.sendRedirect("controller.jsp?action=main");//로그인이 완료되면 main으로 이동
		}
		else{
			response.sendRedirect("login.jsp");//로그인실패 시 다시 로그인페이지로
		}
	}
	else if(action.equals("reg")){ //회원가입
		if(mDAO.insert(mVO)){//회원가입에 성공했다면
			response.sendRedirect("login.jsp");//로그인페이지로 이동
		}
		else{
			throw new Exception("reg 오류");
		}
	}
	else if(action.equals("mypage")){ //마이페이지
		//세션에 저장된 값을 얻기 위해서 session객체의 getAttribute 사용
		MemberVO member=(MemberVO)session.getAttribute("member");
		if(member!=null){
			request.setAttribute("data", member);//이름이"data"인 속성의 값을 member로 지정
			pageContext.forward("mypage.jsp");//data가지고 mypage로 이동
		}
		else{
			throw new Exception("mypage 오류");
		}
	}
	else if(action.equals("mupdate")){ //마이페이지 변경
		if(mDAO.update(mVO)){
			session.invalidate(); // 세션 정보 전체 제거하기
			 /// session.removeAttribute("member");
			response.sendRedirect("login.jsp");
		}
		else{
			throw new Exception("mupdate 오류");
		}
	}
	else if(action.equals("mdelete")){ //마이페이지 삭제
		MemberVO member=(MemberVO)session.getAttribute("member");
		if(member!=null && mDAO.delete(member)){
			session.invalidate(); // 세션 정보 전체 제거하기
			response.sendRedirect("login.jsp");
		}
		else{
			throw new Exception("mdelete 오류");
		}
	}
	else if(action.equals("main")){ //메인페이지
		ArrayList<BoardVO> datas=bDAO.selectAll(bVO);
		request.setAttribute("datas", datas);
		pageContext.forward("main.jsp"); // forward 액션
	}
	else if(action.equals("board")){ //게시판
		BoardVO data=bDAO.selectOne(bVO);
		if(data==null){
			response.sendRedirect("controller.jsp?action=main");
		}
		request.setAttribute("data", data);//이름이"data"인 속성의 값을 data로 지정
		pageContext.forward("board.jsp");
	}
	else if(action.equals("insert")){ //게시판 글작성
		if(bDAO.insert(bVO)){
			response.sendRedirect("controller.jsp?action=main");
		}
		else{
			throw new Exception("insert 오류");
		}
	}
	else if(action.equals("update")){ //게시판 글변경
		if(bDAO.update(bVO)){
			response.sendRedirect("controller.jsp?action=main");
		}
		else{
			throw new Exception("update 오류");
		}
	}
	else if(action.equals("delete")){ //게시판 글삭제
		if(bDAO.delete(bVO)){
			response.sendRedirect("controller.jsp?action=main");
		}
		else{
			throw new Exception("delete 오류");
		}
	}
	else{
		out.println("<script>alert('action 파라미터 값이 올바르지 않습니다...');location.href='controller.jsp?action=main'</script>");	
	}
%>

속성 처리 메소드

 메소드 리턴타입  설명 
 setAttribute(String name, Object value)  void  이름이 name인 속성의 값을 value로 지정합니다.
 getAttribute(String name)  Object  이름이 name인 속성읠 값을 구합니다. 지정한 이름의 속성이 존재하지 않을 경우 null을 리턴합니다.
 removeAttribute(String name)  void 이름이 name인 속성을 삭제 합니다. 
 getAttributeNames()  java.util
 Enumeration
 속성의 이름 목록을 구합니다.

속성의 쓰임새

 기본객체 영역  쓰임새 
 pageContext  PAGE  (한번의 요청을 처리하는) 하나의 JSP페이지 내에서 공유될 값을 저장합니다. 주로 커스텀 태그에서 새로운 변수를 추가할때 사용됩니다.
 request  REQUEST  한번의 요청을 처리하는데 사용되는 모든 JSP페이지에서 공유될 값을 저장합니다. 주로 하나의 요청을 처리하는데 사용되는 JSP페이지 사이에서 정보를 전달하기 위해 사용됩니다.
 session  SESSION  한 사용자와 관련된 정보를 JSP들이 공유하기 위해서 사용됩니다. 사용자의 로그인 정보와 같은 것들을 저장합니다.
 application  APPLICATION  모든 사용자와 관련해서 공유할 정보를 저장합니다. 임시 디렉터리 경로와 같은 웹 어플리케이션의 설정 정보를 주로 저장합니다. 

 

728x90
반응형

'JSP' 카테고리의 다른 글

[JSP] 커스텀태그 사용법  (0) 2022.08.14
[JSP] 표현언어 EL (Expression Language)  (0) 2022.08.14
[JSP] forward / redirect 특정페이지 이동방법  (0) 2022.08.08
[JSP] 자바빈즈  (0) 2022.08.03
[JSP] application을 이용한 SNS 예제  (0) 2022.08.02