본문 바로가기
JSP Servlet

회원관리 MVC2(forward)

by noddu 2021. 2. 8.
728x90
반응형

포워딩은 JSP에서 RequestDispacher클래스와 HttpServletResponse클래스를 이용한다

 

 

 


-DataBase-

create table memiot(
	num number primary key,
	id varchar2(20) not null,
	pass varchar2(20) not null,
	mname varchar2(20) not null,
	mage number(3),
	memail varchar2(50),
mtel varchar2(20)
);

create sequence num_seq;

insert into MEMIOT
values(num_seq.nextval,'admin','admin','관리자',40,'admin@naver.com','010-9999-1000');

select * from memiot;

-Controller-

●MemListController.java

@WebServlet("/memList.do")
public class MemListController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {

	MemberDAO dao=new MemberDAOImpl();
	List<MemberVO> list=dao.memberList();
	//요청의뢰객체를 생성
	//RequestDispatcher rd = 요청을 의뢰할 객체(JSP)
	request.setAttribute("list", list); // 객체바인딩
	RequestDispatcher rd=request.getRequestDispatcher("member/memList.jsp");
	rd.forward(request, response); //-----------------------------▲
		}
	}

포워딩할 RequestDispatcher rd = getRequestDispatcher ( JSP );

                  요청의뢰 ----> JSP한테 (여기서는 member/memList.jsp)

rd.forward(request, response)해야 --------------------------▲이쪽 JSP에넘어감!! (servlet의 req,res와 같아야함!!)

 

객체바인딩 - request에다가 값을넣음 request.setAttribute ("list", list)로 함

                                                                 (Controller와  View가 data를 공존해서 가져갈 수 있게)

  그러면 memList.jsp(View)에서 같은 request에 request.getAttribute해서 값을 뺄수있음

 

●MemInsertFormController.java

@WebServlet("/memInsertForm.do")
public class MemInsertFormController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.sendRedirect("member/memInsertForm.jsp");
	}
}

객체바인딩 필요없이 페이지만 바꾸면되니까 sendRedirect로 InsertForm.jsp로 가게한다

 

 

 

 

 

●MemInsertController.java

@WebServlet("/memInsert.do")
public class MemInsertController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws
 ServletException, IOException {
 		//1. 클라이언트에서 넘어온 폼파라메터를 가져오기:파라메터 수집(VO)
			String cpath=request.getContextPath();// /KDIOT
			
            request.setCharacterEncoding("utf-8"); // euc-kr
			String id=request.getParameter("id");
			String pass=request.getParameter("pass");
			String mname=request.getParameter("mname");
			int mage=Integer.parseInt(request.getParameter("mage")); // "111"->111
			String memail=request.getParameter("memail");
			String mtel=request.getParameter("mtel");
            
			MemberVO vo=new MemberVO(id, pass, mname, mage, memail, mtel);
			MemberDAO dao=new MemberDAOImpl();
			int cnt=dao.memberInsert(vo);
            
			if(cnt>0) {
				//성공(*)->리스트를 보여주는게좋아요 : 응답을 memberList.do에서 받으면돼?
				response.sendRedirect(cpath+"/memList.do");
				//System.out.println("저장성공");
			}else {
				//실패
				throw new ServletException("error");//Tomcat으로 예외를 던지기
			}
		}
	}

insert성공시 response.sendRedirect로 memlist.do페이지로 되게하기

 

 

 

 

 

 

●MemDeleteController.java

@WebServlet("/memDelete.do")
public class MemDeleteController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
 	String cpath=request.getContextPath();
	int num=Integer.parseInt(request.getParameter("num"));
	MemberDAO dao=new MemberDAOImpl();
	int cnt=dao.memberDelete(num);
    
	if(cnt > 0) {
 		response.sendRedirect(cpath+"/memList.do");
 	}else {
		 throw new ServletException("error");
 		}
	}
}

 

 

 

●MemContentController.java

@WebServlet("/memContent.do")
public class MemContentController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
		 String cpath=request.getContextPath();
		int num = Integer.parseInt(request.getParameter("num"));
		MemberDAO dao=new MemberDAOImpl();
		MemberVO vo=dao.memberContent(num);
        
		request.setAttribute("vo", vo);
		RequestDispatcher rd=request.getRequestDispatcher("member/memContent.jsp");
		rd.forward(request, response);
	}
}

회원 한명의 정보를 setAttribute(객체 바인딩)해주고

memContent.jsp로 넘어가게 forward해준다

 

 

●MemUpdateController.java

@WebServlet("/memUpdate.do")
public class MemUpdateController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {

 		String cpath=request.getContextPath();
  		request.setCharacterEncoding("utf-8");
  		int num = Integer.parseInt(request.getParameter("num"));
  		int mage = Integer.parseInt(request.getParameter("mage"));
 		String memail = request.getParameter("memail");
  		String mtel = request.getParameter("mtel");

  		MemberVO vo = new MemberVO();
  		vo.setNum(num);
  		vo.setMemail(memail);
  		vo.setMtel(mtel);
  		vo.setMage(mage);

  		MemberDAO dao=new MemberDAOImpl();
  		int cnt=dao.memberUpdate(vo);

  		if(cnt>0) {
  			response.sendRedirect(cpath+"/memList.do");
  		}else {
  			throw new ServletException("error");
  		}
     }
 }

 

 

 


-Model-

 

●MemberDAO.java(interface)

public interface MemberDAO {
 public List<MemberVO> memberList(); // 회원전체리스트
 public int memberInsert(MemberVO vo); // 회원가입
 public int memberDelete(int num); // 회원삭제
 public MemberVO memberContent(int num); // 회원1명의 정보가져오기
 public int memberUpdate(MemberVO vo); // 회원정보수정
}

 

 

 

●MemberDAOImpl.java

public class MemberDAOImpl implements MemberDAO{
 	private Connection conn;
 	private PreparedStatement ps;
	 private ResultSet rs;
 	//CRUD
   public void getConnect() {
 		String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
 		String user="hr";
		String password="hr";
         
 		try {
        		Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection(url, user, password);
 		} catch (Exception e) {
			e.printStackTrace();
 		}
 }//
 public void dbClose() {
 	try {
 		if(rs!=null) rs.close();
 		if(ps!=null) ps.close();
 		if(conn!=null) conn.close();
 	}catch(Exception e) {
 		e.printStackTrace();
 	}
 }//
	@Override
	public List<MemberVO> memberList() {
		// VO(묶고)->List(담고)
		String SQL="select * from memiot";
		List<MemberVO> list=new ArrayList<MemberVO>();
		getConnect(); // conn=
        
	try {
 		ps=conn.prepareStatement(SQL);
 		rs=ps.executeQuery(); // rs->커서(이동 : next())
        
 		while(rs.next()) {
 			int num=rs.getInt("num");
 			String id=rs.getString("id");
 			String pass=rs.getString("pass");
			String mname=rs.getString("mname");
 			int mage=rs.getInt("mage");
 			String memail=rs.getString("memail");
			 String mtel=rs.getString("mtel");
			 MemberVO vo=new MemberVO(num, id, pass, mname, mage, memail, mtel);
			list.add(vo);
	   }
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		dbClose();
	}
	return list;
}//

public int memberInsert(MemberVO vo) {

	String SQL="insert into memiot values(num_seq.nextval,?,?,?,?,?,?)";
	getConnect(); //conn
	int cnt=-1;// -1(실패, 끝)
	try {
 		ps=conn.prepareStatement(SQL);
 		ps.setString(1, vo.getId());
		 ps.setString(2, vo.getPass());
		 ps.setString(3, vo.getMname());
		 ps.setInt(4, vo.getMage());
 		ps.setString(5, vo.getMemail());
		 ps.setString(6, vo.getMtel());
		 cnt=ps.executeUpdate();//실행
	} catch (Exception e) {
			e.printStackTrace();
            } finally {
				dbClose();
			}
				return cnt;
}//

@Override
public int memberDelete(int num) {
	String SQL="delete from memiot where num = ?";
	getConnect();
	int cnt=-1;
	try {
 	ps=conn.prepareStatement(SQL);
 	ps.setInt(1, num);
 	cnt=ps.executeUpdate();
 	} catch (Exception e) {
		 e.printStackTrace();
 	} finally {
 		dbClose();
 	}
		return cnt;
}//

@Override
public MemberVO memberContent(int num) {
	String SQL = "select * from memiot where num = ?";
	getConnect();
	MemberVO vo=null;
	try {
 	ps=conn.prepareStatement(SQL);
 	ps.setInt(1, num);
 	rs=ps.executeQuery();
    
	if(rs.next()) {
 		num=rs.getInt("num");
 		String id=rs.getString("id");
 		String pass=rs.getString("pass");
		String mname=rs.getString("mname");
 		int mage=rs.getInt("mage");
 		String memail=rs.getString("memail");
 		String mtel=rs.getString("mtel");
 		vo=new MemberVO(num, id, pass, mname, mage, memail, mtel);
	 }
 } catch (Exception e) {
 		e.printStackTrace();
 } finally {
 		dbClose();
 }
return vo;
}//

@Override
public int memberUpdate(MemberVO vo) {
 	//수정
 	int cnt = -1; //실패의 의미로 -1 을 사용
 	String SQL = "UPDATE memiot SET mage=?, memail=?, mtel=? WHERE num=?";
 	getConnect();
    
 try {
		ps = conn.prepareStatement(SQL);
		ps.setInt(1, vo.getMage());
 		ps.setString(2, vo.getMemail());
		ps.setString(3, vo.getMtel());
 		ps.setInt(4, vo.getNum());
		 cnt = ps.executeUpdate(); //실행
 	 } catch(Exception e) {
		 e.printStackTrace();
	 } finally {
		 dbClose();
	 }
	 return cnt;
 	}
}

 

 

 

 

●MemberVO.java

public class MemberVO {
	private int num;
	private String id;
	private String pass;
	private String mname;
	private int mage;
	private String memail;
	private String mtel;
	public MemberVO(int num, String id, String pass, String mname,
 								int mage, String memail, String mtel) {
		super();
		this.num = num;
		this.id = id;
		this.pass = pass;
		this.mname = mname;
		this.mage = mage;
		this.memail = memail;
		this.mtel = mtel;
	}
    
public MemberVO(String id, String pass, String mname, int mage, String memail, String mtel) {
	super();
	this.id = id;
	this.pass = pass;
	this.mname = mname;
	this.mage = mage;
	this.memail = memail;
	this.mtel = mtel;
}
public MemberVO() { }

public int getNum() {
	return num;
}
public void setNum(int num) {
	this.num = num;
}
public String getId() {
	return id;
}
public void setId(String id) {
	this.id = id;
}
public String getPass() {
	return pass;
}
public void setPass(String pass) {
	this.pass = pass;
}
public String getMname() {
	return mname;
}
public void setMname(String mname) {
	this.mname = mname;
}
public int getMage() {
	return mage;
}
public void setMage(int mage) {
	this.mage = mage;
}
public String getMemail() {
	return memail;
}
public void setMemail(String memail) {
	this.memail = memail;
}
public String getMtel() {
	return mtel;
}
public void setMtel(String mtel) {
	this.mtel = mtel;
}

@Override
public String toString() {
		return "MemberVO [num=" + num + ", id=" + id + ", pass=" + pass + ", mname=" +
 		mname + ", mage=" + mage + ", memail=" + memail + ", mtel=" + mtel + "]";
	}
}

 

 


-View-

 

 

●memList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%@page import="java.util.*" %>
<%@page import="kr.smhrd.model.*" %>
<%
 String cpath=request.getContextPath();
 List<MemberVO> list=(List<MemberVO>)request.getAttribute("list");
%> 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Model 1</title>
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
 overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
 font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-baqh{text-align:center;vertical-align:top}
.tg .tg-lqy6{text-align:right;vertical-align:top}
.tg .tg-calz{background-color:#ecf4ff;font-weight:bold;text-align:center;vertical-align:top}
</style>
<script type="text/javascript">

 function insertForm(){
	//alert("OK");
	location.href="<%=cpath%>/memInsertForm.do";
 }
 function deleteFn(num){
 	//alert(num);
 	location.href="<%=cpath%>/memDelete.do?num="+num;
 }
</script>
</head>
<body>

★★회원목록(MVC01~02 버전)★★
<table class="tg" style="undefined;table-layout: fixed; width: 886px">
<colgroup>
	<col style="width: 50px">
	<col style="width: 118px">
	<col style="width: 101px">
	<col style="width: 104px">
	<col style="width: 269px">
	<col style="width: 157px">
	<col style="width: 87px">
</colgroup>

<thead>
 <tr>
 	<th class="tg-calz">번호</th>
 	<th class="tg-calz">아이디</th>
  	<th class="tg-calz">비밀번호</th>
  	<th class="tg-calz">이름</th>
  	<th class="tg-calz">이메일</th>
  	<th class="tg-calz">전화번호</th>
  	<th class="tg-calz">삭제</th>
 </tr>
</thead>

<tbody>
<% for(int i=0;i<list.size();i++){
 MemberVO vo=list.get(i); %>
 <tr>
 	 <td class="tg-baqh"><%=vo.getNum()%></td>
	 <td class="tg-baqh">
	 <a href="<%=cpath%>/memContent.do?num=<%=vo.getNum()%>"><%=vo.getId()%></a></td>
	 <td class="tg-baqh"><%=vo.getPass()%></td>
 	 <td class="tg-baqh"><%=vo.getMname() %></td>
 	 <td class="tg-baqh"><%=vo.getMemail() %></td>
 	 <td class="tg-baqh"><%=vo.getMtel()%></td>
 	 <td class="tg-baqh"><input type="button" onclick="deleteFn(<%=vo.getNum()%>)" value="삭제"/></td>
 </tr>
<% } %>

 <tr>
 	<td class="tg-lqy6" colspan="7"><input type="button" onclick="insertForm()" value="회원가입"/></td>
 </tr>
</tbody>
</table>
</body>
</html>

request.getAttribute해서 값을 빼와야하는데 Object가 아닌 list타입으로 받아야해서 list로 다운캐스팅해야함!!

 

 

 

●memInsertForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%
 String cpath=request.getContextPath();
%> 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
 overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
 font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-baqh{text-align:center;vertical-align:top}
.tg .tg-c3ow{border-color:inherit;text-align:center;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
</head>
<body>
<form action="<%=cpath%>/memInsert.do" method="post">
<table class="tg" style="undefined;table-layout: fixed; width: 522px">

<colgroup>
	<col style="width: 116px">
	<col style="width: 406px">
</colgroup>

<thead>
 <tr>
 	<th class="tg-c3ow">아이디</th>
 	<th class="tg-0pky"><input type='text' name="id"/></th>
 </tr>
</thead>

<tbody>
 <tr>
 	<td class="tg-c3ow">비밀번호</td>
 	<td class="tg-0pky"><input type="password" name="pass"/></td>
 </tr>
 <tr>
 	<td class="tg-c3ow">이름</td>
 	<td class="tg-0pky"><input type='text' name="mname"/></td>
 </tr>
 <tr>
 	<td class="tg-c3ow">나이</td>
 	<td class="tg-0pky"><input type='text' name="mage"/></td>
 </tr>
 <tr>
 	<td class="tg-c3ow">이메일</td>
 	<td class="tg-0pky"><input type='text' name="memail"/></td>
 </tr>
 <tr>
 	<td class="tg-baqh">전화번호</td>
 	<td class="tg-0lax"><input type='text' name="mtel"/></td>
 </tr>
 <tr>
 	<td class="tg-baqh" colspan="2">
 	<input type="submit" value="회원가입"/>
 	<input type="reset" value="취소"/>
 	</td>
 </tr>
</tbody>
</table>
</form>
</body>
</html>

Controller요청이와서 insert할 정보를 memInsert.do로 mapping된 memListController.java 로 보낸다.

 

 

 

●MemContent.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%@ page import="kr.smhrd.model.*"%>
<%
	String cpath=request.getContextPath();
	int num = Integer.parseInt(request.getParameter("num"));
	MemberDAO dao=new MemberDAOImpl();
	MemberVO vo=dao.memberContent(num);
%> 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><%=vo.getMname()%>의 상세보기</title>
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
 overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{border-color:black;border-style:solid;border-width:1px;font-family:Arial, sans-serif;font-size:14px;
 font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-baqh{text-align:center;vertical-align:top}
.tg .tg-fs2w{background-color:#cbcefb;font-weight:bold;text-align:center;vertical-align:top}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
</head>
<body>
★★<%=vo.getMname()%>의 상세보기
<form action="<%=cpath%>/memUpdate.do" method="post">
<input type="hidden" name="num" value="<%=vo.getNum()%>"/>
<table class="tg" style="undefined;table-layout: fixed; width: 552px">

<colgroup>
	<col style="width: 107px">
	<col style="width: 445px">
</colgroup>

<thead>
 <tr>
	 <th class="tg-fs2w">번호</th>
 	 <th class="tg-0lax"><%=vo.getNum()%></th>
 </tr>
</thead>
<tbody>
 <tr>
 	<td class="tg-fs2w">아이디</td>
 	<td class="tg-0lax"><%=vo.getId()%></td>
 </tr>
 <tr>
 	<td class="tg-fs2w">비밀번호</td>
 	<td class="tg-0lax"><%=vo.getPass()%></td>
 </tr>
 <tr>
 	<td class="tg-fs2w">이름</td>
 	<td class="tg-0lax"><%=vo.getMname()%></td>
 </tr>
 <tr>
 	<td class="tg-fs2w">나이</td>
 	<td class="tg-0lax"><input type="text" name="mage" value="<%=vo.getMage()%>"/></td>
 </tr>
 <tr>
 	<td class="tg-fs2w">이메일</td>
 	<td class="tg-0lax"><input type="text" name="memail" value="<%=vo.getMemail()%>"/></td>
 </tr>
 <tr>
 	<td class="tg-fs2w">전화번호</td>
 	<td class="tg-0lax"><input type="text" name="mtel" value="<%=vo.getMtel()%>"/></td>
 </tr>
 <tr>
 	<td class="tg-baqh" colspan="2">
 	   <input type="submit" value="수정하기"/>
 	   <input type="reset" value="취소"/>
	   <input type="button" onclick="location.href='/MVC01/memList.do'" value="리스트"/>
 </td>
 </tr>
</tbody>
</table>
</form>
</body>
</html>

getParameter()메서드의 경우 String타입을 리턴

getAttribute()는 Object 타입을 리턴하기 때문에 주로 빈 객체나 다른 클래스를 받아올때 사용된다.

 

 

request.getParameter("num")은 웹브라우저에서 전송받은 request영역에서 name값이 "num"인것을 찾아 그 값을 읽어오는데

request.getAttribute("num")은 request.setAttribute("num", "123") 과 같이 setAttribute()를 통해 값을 설정해주지 않으면 null값을 리턴받게 된다.

 

 

반응형

'JSP Servlet' 카테고리의 다른 글

비동기식페이지(JQuery,Ajax,JSON)  (0) 2021.02.08
회원관리 MVC2+HandlerMapping+JSTL  (0) 2021.02.08
회원관리 MVC2(forward+FrontController)  (0) 2021.02.08
물품관리 MVC1  (0) 2021.02.08
JSP/Servlet  (0) 2021.02.08