JSP

221206 header, mypage, usercontroller, userdao, userserviceimpl, userservice 수정 및 modify 페이지추가

주영재 2022. 12. 6. 14:07

header

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>

	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-idth, initial-scale=1">
   

    <title>Welcome to MyWorld</title>

    <!-- Bootstrap Core CSS -->
    <link href="${pageContext.request.contextPath}/css/bootstrap.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="${pageContext.request.contextPath}/css/business-casual.css" rel="stylesheet">

    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
    <link href="https://fonts.googleapis.com/css?family=Josefin+Slab:100,300,400,600,700,100italic,300italic,400italic,600italic,700italic" rel="stylesheet" type="text/css">
	
	<!-- jQuery -->
    <script src="${pageContext.request.contextPath}/js/jquery.js"></script>

    <!-- Bootstrap Core JavaScript -->
    <script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
    <script>
    $('.carousel').carousel({
        interval: 2000 //changes the speed
    })
    </script>
	<style>
	.abc {
		position: sticky;
		top: 0px;
		width: 100%; 
		z-index: 10;
	}
	</style>
    
    
</head>

<body>
	<%-- header --%>
	<div class="brand">My Web</div>        
    <div class="address-bar">Welcome to MyWorld</div>
    
    <nav class="navbar navbar-default abc" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                
                <a class="navbar-brand" href="/hong">My First Web</a>
            </div>
           
           
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                	
                    <li>
                        <a href="${pageContext.request.contextPath}/index.main">HOME</a>
                    </li>
                    <li>
                        <a href="${pageContext.request.contextPath}/member/member.main">Member</a>
                    </li>
                    <li>
                        <a href="${pageContext.request.contextPath}/board/board_list.board">BOARD</a>
                    </li>
                    
                    <%-- 세션이 없으면 로그인과 회원가입 --%>
                    <c:if test="${sessionScope.user_id==null }">
                    <li>
                        <a href="${pageContext.request.contextPath}/user/user_login.user">LOGIN</a>
                    </li>
                    <li>
                        <a href="${pageContext.request.contextPath}/user/user_join.user" style="color:red">JOIN</a>
                    </li>
                    </c:if>
                    
                    
                    <%-- 세션이 있으면 로그아웃과 마이페이지 --%>
                    <c:if test="${sessionScope.user_id!=null }">
                    <li>
                        <a href="${pageContext.request.contextPath}/user/user_logout.user">LOGOUT</a>
                    </li>
                    <li>
                        <a href="${pageContext.request.contextPath}/user/user_mypage.user" style="color:red">MYPAGE</a>
                    </li>
                    </c:if>
                    
                    <%-- 
                    <c:choose>
                    	<c:when>
                    	로그인,회원가입
                    	</c:when>
                    	<c:otherwise>
                    	로그아웃, 마이페이지 
                    	</c:otherwise>
                    ㅡ<c:/choose>
                    로도 사용 가능
                     --%>
                    
                    
                    
                </ul>
            </div>
            
            
            <!-- /.navbar-collapse -->
        </div>
        <!-- /.container -->
    </nav>
 	<!-- end header -->

로그인이 안되면 왼쪽페이지, 로그인을 하면 오른쪽페이지

a태그에 각각 맞는 경로를 지정

 

 

user_mypage

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp"%>

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

<%@ include file="../include/footer.jsp"%>

 

 

user_modify

<%@page import="com.example.user.model.UserVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>

<section>
	<div align="center">
	<h3>회원정보 수정 연습</h3>
		<form action="updateForm.user" method="post">
			<table>
				<tr>
					<td>아이디</td>
					<td><input type="text" name="id" value="${vo.id }"
						pattern="\w{4,8}" required readonly></td>
				</tr>
				<tr>
					<td>비밀번호</td>
					<td><input type="password" name="pw" placeholder="4~8글자 영문자숫자"
						pattern="\w{4,8}" required="required"></td>
				</tr>
				<tr>
					<td>이름</td>
					<td><input type="text" name="name" pattern="[가-힣]{3,}"
						required="required" value="${vo.name }"></td>
				</tr>
				<tr>
					<td>이메일</td>
					<td><input type="email" name="email" required="required" value="${vo.email }" readonly></td>
				</tr>
				<tr>
					<td>성별</td>
					<td>
						<input type="radio" name="gender" value="f" ${vo.gender eq 'f'?'checked':''}>여자 
						<input type="radio" name="gender" value="m" ${vo.gender eq 'm'?'checked="checked"':''}>남자
					</td>
				</tr>
			</table>
			<input type="submit" value="정보수정">
			<!-- 
					JS로 기능을 붙임 
					onclick="location.href='경로'"
					-->
			<input type="button" value="마이페이지로 가기" onclick="location.href='user_mypage.user'">
		</form>
	</div>
</section>

<%@include file="../include/footer.jsp" %>

checked="checked"는 checked만 써도 된다.

다른 태그도 가능. required나 readonly, disabled 등등도 그냥 써도 된다.

 

placeholder에 ${ }를 넣으면 값을 받아올 수 없다. value에 넣어야 한다

 

 

UserController

package com.example.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.example.user.model.UserVO;
import com.example.user.service.UserService;
import com.example.user.service.UserServiceImpl;

@WebServlet("*.user")
public class UserController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
  
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	
	}
	
	//get, post 하나로 묶음
	protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//한글처리
		request.setCharacterEncoding("utf-8");
		
		//요청분기
		String uri = request.getRequestURI();
		String path = request.getContextPath();
		String command =uri.substring(path.length());
		
		System.out.println("요청경로:"+command);
		
		//서비스 영역
		UserService service=new UserServiceImpl();
		
		
		
		switch (command) {
		case "/user/user_join.user":
			
			request.getRequestDispatcher("user_join.jsp").forward(request, response);
			
			break;
		case "/user/joinForm.user"://회원가입기능
			
			int result = service.join(request, response);
			
			if(result>=1) {//중복
				//메시지
				request.setAttribute("msg", "중복된 아이디 or email입니다");
				request.getRequestDispatcher("user_join.jsp").forward(request, response);
				
			}else {//가입성공
				//가지고나갈 데이터 없음. redirect
				//response.sendRedirect("user_login.jsp");-그런데 이대로 하면 페이지 주소가 user_login.jsp로 남음. MVC2는 컨트롤러를 타고 가야 함
				response.sendRedirect("user_login.user");//이렇게하면 컨트롤러가 이걸 받아오고, 그래서 세번째 case로 이동하고 튀어나간다.
				//MVC2에서 리타이렉트는 다시 컨트롤러를 태우는 요청
			}
			
			break;
			
		case"/user/user_login.user"://로그인페이지
			
				request.getRequestDispatcher("user_login.jsp").forward(request, response);
			break;
			
		case"/user/loginForm.user"://로그인요청
				UserVO vo = service.login(request, response);
				if(vo==null) {//로그인실패
					request.setAttribute("msg", "아이디 비밀번호를 확인하세요");
					request.getRequestDispatcher("user_login.jsp").forward(request, response);
				}else {//로그인성공
					//마이페이지
					response.sendRedirect("user_mypage.user");
				}
				
			break;
			
		case"/user/user_mypage.user": //마이페이지
				request.getRequestDispatcher("user_mypage.jsp").forward(request, response);
			break;
			
		case"/user/user_logout.user": //로그아웃
			HttpSession session=request.getSession();
			session.invalidate();//세션무효화
			
			//response.sendRedirect("/JSPWeb/index.main");//메인으로
			response.sendRedirect(path+"/index.main");
			
			break;
		case"/user/user_modify.user"://정보수정화면 
			/****회원데이터를 가지고 나오는 작업 ****
			 * service와 dao에 getInfo() 메서드를 선언합니다.
			 * service에서는 세션에서 아이디를 얻습니다
			 * dao에서는 id를 전달받아 회원 데이터를 조회하여 vo에 저장합니다
			 * controller에서는 조회한 vo를 저장하고 화면으로 가지고 나갑니다.
			 * 화면에서는 input태그에 값을 출력해주세요
			 */
			UserVO vo2 = service.getInfo(request, response);
			//1회용으로 쓸거임. 수정하기 전에 보여주기만 할 것.
			request.setAttribute("vo", vo2);
			
			request.getRequestDispatcher("user_modify.jsp").forward(request, response);
			
			
			break;
			
		case"/user/updateForm.user":
			/*
			 ****회원정보를 업데이트 하는 작업****
			 *service와 dao에 update() 메서드를 생성
			 *service에선 필요한 파라미터 값을 받습니다(pw, name, gender) 조건절에 id
			 *dao에서 데이터를 전달받아서 업데이트를 실행
			 *업데이트 이후에는 컨트롤러를 태워서 mypage로 리다이렉트
			 */
			int result2 = service.update(request, response);
			if(result2==1) {//업데이트 성공
				//response.sendRedirect("user_mypage.user");
				
				//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>");
			}else {//업데이트 실패
				//modify화면으로 포워드-데이터를 가지고 나갈 수가 없다. 때문에 컨트롤러를 타는 것
				response.sendRedirect("user_modify.user");
			}
			break;
			
		case "/user/user_delete.user":
			//삭제는 실패가 일어나지 않아서 메서드 반환 타입을 void로 하고 메서드 호출과 페이지이동만 해도 된다.
				int result3 = service.delete(request, response);
				
				if(result3==1) {//삭제성공
					response.sendRedirect(path+"/index.main");//메인화면
				}else {
					response.sendRedirect("user_mypage.user");//마이페이지
				}
			break;
			

		default:
			break;
		}
		
		
	}
	
	

}

정보수정으로 넘어갈 때 정보들은 1회용으로 보여주기만 할 것.

request를 사용하고 vo객체에 다 담아서 forward로 보낸다

 

UserDAO

package com.example.user.model;

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

import com.example.util.JDBCUtil;

public class UserDAO {
	
	//여러 사용자들이 사용. 10명이 들어오면 10개가 생성되고 10개가 사라지고 함.
	//어차피 다 똑같이 생김. 여러개 만들면 서버가 힘듦. singleton형식으로 생성

	//UserDAO는 불필요하게 여러개 만들어질 필요가 없기 때문에
	//한개의 객체만 만들어 지도록 Singleton형식으로 설계합니다.
	
	//1. 나자신의 객체를 생성해서 1개로 제한합니다.
	private static UserDAO instance = new UserDAO();
	
	//2. 직접 객체를 생성 할 수 없도록 생성자에 private
	private UserDAO() {
		//드라이버 클래스 로드
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버클래스 로드에러");
		}
	}
	
	//3. 외부에서 객체생성을 요구할 때 getter메서드를 통해 1번의 객체를 반환
	public static UserDAO getInstance() {
		return instance;
	}
	
	//4. 필요한 데이터베이스 변수 선언
	public String URL = "jdbc:oracle:thin:@localhost:1521:xe";
	public String UID = "jsp";
	public String UPW = "jsp";
	
	//원래 지역변수로 만들어야 함. 지금은 편의성을 위해
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	//5.메서드
	public int idCheck(String id, String email) {
		int result=0;
		
		String sql="select count(*) as total from users where id =? or email = ?";
		try {
			//1. conn객체
			conn=DriverManager.getConnection(URL, UID, UPW);
			
			//2.pstmt
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, email);
			
			//3. select문은 executeQuery로 실행
			rs=pstmt.executeQuery();
			
			if(rs.next()) {
				result=rs.getInt("total");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		
		return result;
	}
	
	//회원가입
	public void join(UserVO vo) {
		String sql = "insert into users values(?,?,?,?,?)";
		try {
			conn=DriverManager.getConnection(URL, UID, UPW);
			
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, vo.getId());
			pstmt.setString(2, vo.getPw());
			pstmt.setString(3, vo.getName());
			pstmt.setString(4, vo.getEmail());
			pstmt.setString(5, vo.getGender());
			
			pstmt.executeUpdate();//실행(성공시 1, 실패시 0반환. 성공시에 또 받아서 어디에 넣어야 하면 저장해야 하지만 여기선 그냥 실행만)
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		
	}
	
	//로그인
	public UserVO login(String id, String pw) {
		
		UserVO vo = null;
		String sql = "select * from users where id=? and pw=?";
		
		try {
			conn=DriverManager.getConnection(URL, UID, UPW);
			
			pstmt=conn.prepareStatement(sql);
			
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			
			rs=pstmt.executeQuery();
			
			if(rs.next()) {//로그인 성공 후 ->데이터가 1행 조회되어서 나오면 vo에 회원정보 저장
				String id2  = rs.getString("id");
				String name = rs.getString("name");
				String email = rs.getString("email");
				String gender = rs.getString("gender");
				
				vo=new UserVO(id2, null, name, email, gender);//비밀번호는 가지고 나오지 않는다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		
		return 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()) {//로그인 성공 후 ->데이터가 1행 조회되어서 나오면 vo에 회원정보 저장
				String id2  = rs.getString("id");
				String name2 = rs.getString("name");
				String email2 = rs.getString("email");
				String gender2 = rs.getString("gender");
				
				vo=new UserVO(id2, null, name2, email2, gender2);//비밀번호는 가지고 나오지 않는다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		
		return vo;
	}
	
	//업데이트하기
	public int update(String id, String pw, String name, String gender) {
		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, pw);
			pstmt.setString(2, name);
			pstmt.setString(3, gender);
			pstmt.setString(4, id);
			
			result = pstmt.executeUpdate();//실행(성공시 1, 실패시 0반환.)
			System.out.println(result);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		return result;
	}

	//회원탈퇴 기능
	public int delete(String id) {
		int result=0;
		
		String sql = "delete from users where id=?";
		try {
			
			conn=DriverManager.getConnection(URL, UID, UPW);
			
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			result=pstmt.executeUpdate();//delete도 update와 똑같이 executeUpdate로 실행, 성공하면 1반환, 실패하면 0반환
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(conn, pstmt, rs);
		}
		return result;
	}
	
	
}

 

 

UserService

package com.example.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.user.model.UserVO;

public interface UserService {
	
	public int join(HttpServletRequest request, HttpServletResponse response);//추상메서드 
	public UserVO login(HttpServletRequest request, HttpServletResponse response);//추상메서드 
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response);//추상메서드
	public int update(HttpServletRequest request, HttpServletResponse response);//추상메서드
	public int delete(HttpServletRequest request, HttpServletResponse response);//추상메서드
	
}

 

UserServiceImpl

package com.example.user.service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.example.user.model.UserDAO;
import com.example.user.model.UserVO;

public class UserServiceImpl implements UserService{
	//컨트롤러의 역할을 분담
	
	//가입처리
	public int join(HttpServletRequest request, HttpServletResponse response) {
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		String gender = request.getParameter("gender");
		
		//아이디 or email 중복 검사 -> 가입
		UserDAO dao=UserDAO.getInstance();
		int result=dao.idCheck(id, email);
		
		if(result>=1) {//중복
			return 1;//중복의 의미반환
		}else {//중복x->가입
			UserVO vo = new UserVO(id, pw, name, email, gender);
			dao.join(vo);
			return 0;//성공의 의미반환
		}
		
		
		
	}
	
	//로그인
	public UserVO login(HttpServletRequest request, HttpServletResponse response) {
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		UserDAO dao = UserDAO.getInstance();
		UserVO vo = dao.login(id, pw);
		
		if(vo!=null){
		HttpSession session = request.getSession();//자바에서 현재 세션 사용
		//세션에 아이디, 이름을 저장
		session.setAttribute("user_id", vo.getId());
		session.setAttribute("user_name", vo.getName());
		}
		return vo;
	}

	//값 받아오기
	public UserVO getInfo(HttpServletRequest request, HttpServletResponse response) {
		//세션에서 user_id값을 얻음
		HttpSession session = request.getSession();
		String id = (String)session.getAttribute("user_id");//컨트롤러 로그인메서드에 있는 setAttribute의 키값
		
		UserDAO dao = UserDAO.getInstance();//DAO는 특별하게 생성한다. new UserDAO()가 아님
		UserVO vo = dao.getInfo(id);
		
		return vo;
		
	}

	//업데이트
	public int update(HttpServletRequest request, HttpServletResponse response) {
		String id=request.getParameter("id");
		String pw=request.getParameter("pw");
		String name=request.getParameter("name");
		String gender=request.getParameter("gender");
		
		//DAO객체 생성
		UserDAO dao=UserDAO.getInstance();
		int result = dao.update(id, pw, name, gender);
		
		//업데이트 성공시 세션 변경
		if(result==1) {//세션을 바꾸는건 서비스에서!
			HttpSession session = request.getSession();
			session.setAttribute("user_name", name);
		}
		
		return result;
	}
	
	
	

	//회원탈퇴
	public int delete(HttpServletRequest request, HttpServletResponse response) {
		int result = 0;
		
		//id가 필요
		HttpSession session = request.getSession();
		String id = (String)session.getAttribute("user_id");
		
		UserDAO dao3=UserDAO.getInstance();
		result = dao3.delete(id);
		
		if(result==1) {
			session.invalidate();
		}
		
		return result;
	}
	

}