jsp

MVC2 패턴 예시 마이 페이지 & 정보 수정

0304호 2022. 12. 6.

User_mypage 

마이페이지에 로그아웃 정보수정 회원탈퇴 기능 추가

<section>
	<div align="center">
		${sessionScope.user_id }
		<b> (${sessionScope.user_name })</b>님 환영합니다
		<div>
			<a href="user_logout.user">[로그아웃]</a><br>
			<a href="user_modify.user">[정보수정]</a><br>
			<a href="user_delete.user">[회원탈퇴]</a>
		</div>
	</div>
</section>

로그아웃 클릭시

user_logout.user 로 이동하는걸 Controller에서 *.user 확장자를 인식해서 case로 보낸다.

현재Session을 불러와서 삭제하고 sendRedirect를 통해 메인페이지로 이동

case "/user/user_logout.user":	//로그아웃
			
	session = request.getSession();
	session.invalidate();								//세션 무효화
			
	response.sendRedirect(path + "/index.main");		//메인으로 이동
	break;

정보수정 클릭시

회원데이터를 가지고 정보수정화면에 진입을 한다

case "/user/user_modify.user":	//정보수정화면 진입
	/*
	* 회원데이터를 가지고 나오는 작업
	* service와 dao에 getInfo() 메서드를 선언
	* service에서는 세션에서 아이디를 얻는다
	 * dao에서는 id를 전달받아 회원데이터를 조회하여 vo에서 저장
	* controller에서는 조회한 vo를 저장하고 화면으로 가져나감
	* 화면에서는input태그에 값을 출력한다
	*/
	vo = service.getInfo(request, response);
	//회원데이터를 가지고 나오는 작업
	request.setAttribute("vo", vo);
	request.getRequestDispatcher("user_modify.jsp").forward(request, response);
			
	break;

 

UserServiceImpl 서비스에 requestresponse를 들고 진입한다


회원정보를 불러오기위해 로그인할때 생성한 Session "user_id"를 불러오고

UserDAO에 불러온 Session의 "user_id"를 들고 들어간다

@Override
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response) {
		HttpSession session = request.getSession();
		String id =(String) session.getAttribute("user_id");
		UserDAO dao = UserDAO.getInstance();
		UserVO vo = dao.getInfo(id);
		
		return vo;
	}

UserDAO에서는 가져온 session id를 토대로 sql문을 작성후

데이터베이스에서 가져온 데이터를 vo에 담아서 vo를 리턴한다.

public UserVO getInfo(String id) {
		UserVO vo = null;
		String sql="Select * from users where id = ?";
		try {
			conn=DriverManager.getConnection(URL, UID, UPW);
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			rs=pstmt.executeQuery();
			if(rs.next()) {
				String id2 = rs.getString("id");
				String pw2 = rs.getString("pw");
				String name2 = rs.getString("name");
				String email2 = rs.getString("email");
				String gender2 = rs.getString("gender");
				vo = new UserVO(id2, pw2, name2, email2, gender2);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtill.close(conn, pstmt, rs);
		}
		return vo;
	}

UserDAO에서 가져온 voUserServiceImplvo 에 담기며 그걸 다시 Controller리턴시킨다.

컨트롤러에서는 가져온 vorequest.setAttribute("vo", vo);를 사용해서 request에 담고

foward형식으로 user_modify페이지에 보낸다.


다시 user_modify.user 로 이동하는걸 Controller에서 *.user 확장자를 인식해서 case로 보낸다.

case "/user/updateForm.user":	//정보 수정
	/*
	 * 회원정보를 업데이트하는 작업
	 * service 와 dao에 update()메서드 생성
	 * service의 필요한 파라미터 값을 받음(pw name gender) 조건절 id
	 * dao에서는 데이터를 전달받아 update를 실행
	 * 업데이트 이후에는 컨트롤러를 통해 mypage로 리다이렉트
	 */
	result=service.update(request, response);

	if(result==0) {		//실패
		request.setAttribute("msg", "양식에 맞춰 작성해주세요");
		request.getRequestDispatcher("user_modify.user").forward(request, response);
				
	}else {
		//out 객체를 이용해서 화면에 스크립트를 작성해서 보냄
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<script>");
		out.println("alert('정보가 수정되었습니다');");
		out.println("location.href='user_mypage.user'");
		out.println("</script>");
	}
	break;

받아온 requestresponseUserServiceImplupdate()메서드로 전송한다


UserServiceImpl update()메서드에선 입력받은 form에서 Parameter들을 가져온뒤 vo에 저장한다.

저장한 VO를 UserDAOupdate()메서드의 매개변수로 전송한다.

@Override
	public int update(HttpServletRequest request, HttpServletResponse response) {
		HttpSession session=request.getSession();		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String gender = request.getParameter("gender");
        
		UserDAO dao = UserDAO.getInstance();
		UserVO vo = new UserVO(id,pw,name,null,gender);
		int result = dao.update(vo);
		if(result==1) {
			session=request.getSession();
			session.setAttribute("user_name", name);
		}
		return result;	//0이면 실패 1이면 성공
	}

받아온 voUserDAO update()메서드sql문에 적용을 시킨다.

public int update(UserVO vo) {
		int result = 0;
		String sql = "update users set pw=?, name=?, gender=? where id=?";
		try {
			conn=DriverManager.getConnection(URL, UID, UPW);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getPw());
			pstmt.setString(2, vo.getName());
			pstmt.setString(3, vo.getGender());
			pstmt.setString(4, vo.getId());
			result= pstmt.executeUpdate();		//0이면 실패 1이면 성공
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtill.close(conn, pstmt, rs);
		}
		return result;
	}

pstmt.executeUpdate는 반환값이 int형이기 때문에 result라는 정수형 변수에 담아서 리턴해준다.


UserDAO 에서 반환하는 값은 UserServiceImplUpdate()메서드로 들어가고

if(result==1) {
	session=request.getSession();
	session.setAttribute("user_name", name);
}

반환값이 1이라면 update구문이 성공적으로 돌았다는 뜻이다.

성공적으로 작동했다면 session을 불러오고, session에 저장되어있는 user_name을 변경된 user_name으로바꿔준다.

 

다시 UserServiceImpl의 Update()메서드에서 반환하는 값은 UserController의 updateForm.user케이스로 돌아간다.

if(result==0) {		//실패
		request.setAttribute("msg", "양식에 맞춰 작성해주세요");
		request.getRequestDispatcher("user_modify.user").forward(request, response);
				
	}else {
		//out 객체를 이용해서 화면에 스크립트를 작성해서 보냄
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<script>");
		out.println("alert('정보가 수정되었습니다');");
		out.println("location.href='user_mypage.user'");
		out.println("</script>");
	}

실패한다면 양식에 맞춰 작성해달라는 알림창과 함께 user_modify.user로 보내진다.

성공한다면 out객체를 이용해서 만든 정보가 수정되었다는 알림창과 함께  user_mypage로 보내진다.

댓글