본문 바로가기
카테고리 없음

24. 08. 29 개발자교육 10주차 User 관리 프로젝트

by 융기융 2024. 8. 30.
반응형

 

selectAllServlet

package edu.kh.jdbc.controller;

 

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

import edu.kh.jdbc.dto.User;

import edu.kh.jdbc.service.UserService;

import edu.kh.jdbc.service.UserServiceImpl;

import jakarta.servlet.ServletException;

import jakarta.servlet.annotation.WebServlet;

import jakarta.servlet.http.HttpServlet;

import jakarta.servlet.http.HttpServletRequest;

import jakarta.servlet.http.HttpServletResponse;

import jakarta.servlet.http.HttpSession;

 

@WebServlet("/selectAll")

public class SelectAllServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 

try {

 

// 요청

 

UserService service = new UserServiceImpl();

 

List<User> userList = new ArrayList<User>();

 

userList = service.selectAll();

 

req.setAttribute("userList", userList);

 

// 경로 지정 / 코드순서는 위에서 아래로

String path = "/WEB-INF/views/selectAll.jsp";

 

req.getRequestDispatcher(path).forward(req, resp);

 

}catch(Exception e) {

e.printStackTrace();

}

}

}

UserService

package edu.kh.jdbc.service;

 

import java.util.List;

 

import edu.kh.jdbc.dto.User;

 

public interface UserService {

 

 

/** 사용자등록

*

* @param user

* @return result 1 || 0

*/

int insertUser(User user) throws Exception;

 

/**

* 아이디 중복여부 확인

* @param userId

* @return result(1:중복, 0:중복X)

* @throws Exception

*/

int idCheck(String userId) throws Exception;

 

/** 로그인

* @param userId

* @param userPw

* @return loginUser

* @throws Exception

*/

User login(String userId, String userPw) throws Exception;

 

/**

* 사용자 목록조회

* @return

* @throws Exception

*/

List<User> selectAll() throws Exception;

}

 

 

UserServiceImpl

 

package edu.kh.jdbc.service;

 

// 지정된 클래스의 static 메서드를 모두 얻어와 사용

import static edu.kh.jdbc.common.JDBCTemplate.*;

 

import java.sql.Connection;

import java.util.ArrayList;

import java.util.List;

 

import edu.kh.jdbc.common.JDBCTemplate;

import edu.kh.jdbc.dao.UserDao;

import edu.kh.jdbc.dao.UserDaoImpl;

import edu.kh.jdbc.dto.User;

 

public class UserServiceImpl implements UserService{

 

// 필드

private UserDao dao = new UserDaoImpl();

 

@Override

public int insertUser(User user) throws Exception {

 

// 1. Connection 생성

// JDBCTemplate.getConnection(); // 위에 써놔서 안써도됨

Connection conn = getConnection();

 

// 2. DAO 메서드 호출 후 결과 반환

int result = dao.insertUser(conn, user);

 

// 3. DML 수행 -> 트랜잭션 처리

if(result > 0) commit(conn);

else rollback(conn);

 

// 4. 사용 완료된 Connection 반환

close(conn);

 

// 5. 결과반환

return result;

}

 

@Override

public int idCheck(String userId) throws Exception {

 

Connection conn = getConnection();

 

int result = dao.idCheck(conn, userId);

 

close(conn);

 

return result;

}

 

@Override

public User login(String userId, String userPw) throws Exception {

 

Connection conn = getConnection();

 

// DAO 메서드 호출 후 결과 반환받기

User loginUser = dao.login(conn, userId, userPw);

 

close(conn);

 

return loginUser;

}

 

 

@Override

public List<User> selectAll() throws Exception {

 

Connection conn = getConnection();

 

List<User> userList = new ArrayList<User>();

// dao에게 DB 전달해서 정보 가져와

userList = dao.selectAll(conn);

 

close(conn);

 

return userList;

}

 

}

UserDao

package edu.kh.jdbc.dao;

 

import java.sql.Connection;

import java.util.List;

 

import edu.kh.jdbc.dto.User;

 

public interface UserDao {

 

/** 사용자 등록

* @param conn

* @param user

* @return

* @throws Exception

*/

int insertUser(Connection conn, User user) throws Exception;

 

/**

* 아이디 중복 여부 확인

* @param conn

* @param userId

* @return

* @throws Exception

*/

int idCheck(Connection conn, String userId) throws Exception;

 

/** 로그인

* @param conn

* @param userId

* @param userPw

* @return loginUser

* @throws Exception

*/

User login(Connection conn, String userId, String userPw) throws Exception;

 

List<User> selectAll(Connection conn) throws Exception;

 

 

 

}

userDaoImpl

package edu.kh.jdbc.dao;

 

import static edu.kh.jdbc.common.JDBCTemplate.*;

 

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

 

import edu.kh.jdbc.common.JDBCTemplate;

import edu.kh.jdbc.dto.User;

 

public class UserDaoImpl implements UserDao{

 

// 필드

 

// JDBC 객체 참조변수 + Properties 참조변수 선언!

private Statement stmt;

private PreparedStatement pstmt;

private ResultSet rs;

 

private Properties prop;

// -> K,V가 모두 String인 Map, 파일 입출력이 쉬움

 

// 기본 생성자 -- 생성될 때 실행되는 메서드

public UserDaoImpl() {

 

// 객체생성시

// 외부에 존재하는 sql.xml 파일을 읽어와

// prop에 저장

 

try {

String filePath =

JDBCTemplate.class

.getResource("/edu/kh/jdbc/sql/sql.xml").getPath();

 

// 지정된 경로의 XML 파일내용을 읽어와

// Properties 객체에 K:V 세팅

prop = new Properties();

prop.loadFromXML(new FileInputStream(filePath));

 

}catch(Exception e) {

e.printStackTrace();

}

 

}

 

@Override

public int insertUser(Connection conn, User user) throws Exception {

 

// 1. 결과 저장용 변수 선언

int result = 0;

 

try {

// 2. SQL 작성

// -> properties를 이용해 외부 sql.xml 파일에서

// 읽어온 sql 이용

String sql = prop.getProperty("insertUser");

 

// 3. PreparedStatement (플레이스홀더 3개라 써야함) 생성

pstmt = conn.prepareStatement(sql);

 

// 4. ? 에 알맞은 값 세팅

pstmt.setString(1, user.getUserId());

pstmt.setString(2, user.getUserPw());

pstmt.setString(3, user.getUserName());

 

// 5. SQL(INSERT) 수행(executeUpdate()) 후

// 결과(삽입된 행의 개수, int) 반환

result = pstmt.executeUpdate();

 

}finally {

// 6. 사용한 JDBC 객체 자원 반환(close)

close(pstmt);

 

}

 

 

return result;

}

 

@Override

public int idCheck(Connection conn, String userId) throws Exception {

 

// 결과 저장할 변수 선언

int result = 0;

 

try {

String sql = prop.getProperty("idCheck");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setString(1, userId);

 

rs = pstmt.executeQuery();

 

if(rs.next()) { // 결과가 1행밖에 없어서 if 사용

result = rs.getInt(1); // 조회결과 1번 컬럼 값 얻어옴

}

 

}finally {

close(rs);

close(pstmt);

 

}

 

 

return result;

}

 

@Override

public User login(Connection conn, String userId, String userPw) throws Exception {

 

// 결과 저장용 변수선언

User loginUser = null;

 

try {

 

String sql = prop.getProperty("login");

 

pstmt = conn.prepareStatement(sql);

 

pstmt.setString(1, userId);

pstmt.setString(2, userPw);

 

rs = pstmt.executeQuery();

 

if(rs.next()) {

int useNo = rs.getInt("USER_NO");

String id = rs.getString("USER_ID");

String pw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String enrollDate = rs.getString("ENROLL_DATE");

 

loginUser =

new User(useNo, userId, userPw, userName, enrollDate);

}

 

}finally {

close(rs);

close(pstmt);

}

 

 

return loginUser;

}

 

@Override

public List<User> selectAll(Connection conn) throws Exception {

 

// 결과 저장용 변수 선언 // ArrayList 객체를 만든 이유

// SQL얻어올 예정

List<User> userList = new ArrayList<User>();

 

try {

 

String sql = prop.getProperty("selectAll");

 

// 강사님이 한 코드

// stmt = conn.createStatement();

// rs = stmt.executeQuery(sql);

 

 

pstmt = conn.prepareStatement(sql);

rs = pstmt.executeQuery();

 

while(rs.next()) {

int userNo = rs.getInt("USER_NO");

String userId = rs.getString("USER_ID");

String userPw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String userEnrollDate = rs.getString("ENROLL_DATE");

 

User user = new User(userNo, userId, userPw, userName, userEnrollDate);

 

userList.add(user);

}

}finally {

close(rs);

close(pstmt);

}

 

return userList;

}

 

@Override

public List<User> search(Connection conn, String searchId) throws Exception {

 

// ArrayList 객체를 미리 생성하는 이유

// == 조회된 결과를 추가(add)해서 묶어 반환하기 위해

List<User> userList = new ArrayList<User>();

 

try {

 

String sql = prop.getProperty("search");

 

// 강사님이 한 코드

// stmt = conn.createStatement();

// rs = stmt.executeQuery(sql);

 

 

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, searchId); // '%검색어%'

 

rs = pstmt.executeQuery();

 

while(rs.next()) {

int userNo = rs.getInt("USER_NO");

String userId = rs.getString("USER_ID");

String userPw = rs.getString("USER_PW");

String userName = rs.getString("USER_NAME");

String userEnrollDate = rs.getString("ENROLL_DATE");

 

User user = new User(userNo, userId, userPw, userName, userEnrollDate);

 

userList.add(user);

}

}finally {

close(rs);

close(pstmt);

}

 

return userList;

}

 

 

}

 

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <%-- 조회되는 사용자의 ID --%>
  <title>user 30 사용자 상세조회</title>
</head>
<body>
   <%-- 조회되는 사용자의 ID --%>
  <h1>user30 사용자 상세 조회</h1>

  <hr>
  <table border="1">
    <tr>
      <th>사용자 번호</th>
      <td>30</td>
    </tr>

    <tr>
      <th>아이디</th>
      <td>user30</td>
    </tr>

    <tr>
      <th>비밀번호</th>
      <td>pass30</td>
    </tr>

    <tr>
      <th>이름</th>
      <td>유저삼십</td>
    </tr>

    <tr>
      <th>등록일</th>
      <td>2024년 8월 30일</td>
    </tr>
  </table>

    <div>
    <button id="updateBtn">수정</button>
    <button id="deleteBtn">삭제</button>
    <button id="goToList">목록으로 돌아가기</button>
  </div>

  <script src="/resources/js/selectUser.js"></script>
</body>
</html>

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>사용자 목록조회</title>
  <link rel="stylesheet" href="/resources/css/selectAll.css">
</head>
<body>
  <h1>사용자 목록조회</h1>

  <%-- empty가 true인 경우 :
      "" (빈칸), 빈 배열, 빈 리스트, null --%>
 <c:if test="${not empty param.searchId}" >
    <h3>"${param.searchId}"검색 결과</h3>
 </c:if>

  <form action="/search">
    ID검색 : <input
              type="text"
              name="searchId"
              placeholder="포함되는아이디검색"
              value="${param.searchId}">
    <button>검색</button>
  </form>

  <hr>

<%-- ${userList} --%>

<table border="1" class="table">
  <thead>
    <tr>
      <th>회원번호</th>
      <th>아이디</th>
      <%-- <th>비밀번호</th> --%>
      <th>이름</th>
      <%-- <th>등록일</th> --%>
    </tr>
  </thead>

  <tbody>
    <%-- 조회 결과가 없을경우 --%>
    <c:if test="${empty userList}" >
      <tr>
        <th colspan="5">조회결과가 없습니다</th>
      </tr>
    </c:if>

    <%-- 조회 결과가 있을경우 --%>
    <c:if test="${not empty userList}">
      <c:forEach items="${userList}" var="user">
      <tr>
        <td>${user.userNo}</td>

        <td>
        <a href="/selectUser?userNo=${user.userNo}">${user.userId}</a>
        </td>

        <%-- <td>${user.userPw}</td> --%>
        <td>${user.userName}</td>
        <%-- <td>${user.enrollDate}</td> --%>
      </tr>
      </c:forEach>
    </c:if>
  </tbody>
</table>


</body>
</html>

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>User 관리 프로젝트</title>
 
</head>

<body>

  <%-- 로그인이 안되있는경우선이여</h1>
    <ul>
      <li>userNo     : ${loginUser.userNo}</li>
      <li>userId     : ${loginUser.user
    == session scope에 "loginUser"가 없는경우 --%>
  <c:if test="${empty sessionScope.loginUser}">
    <h1>Login</h1>
    <form action="/login" method="post">
      <div>
        ID : <input type="text" name="userId">
      </div>
      <div>
        PW : <input type="password" name="userPw">
      <div>
        <button>로그인</button>
        <a href="/signUp">사용자 등록</a>
      </div>
      </div>
    </form>
  </c:if>

  <%-- 로그인 상태인경우 --%>
  <c:if test="${not empty sessionScope.loginUser}" >
   
    <h1>${loginUser.userName} 환영하오 낯선이여</li>
      <li>userName   : ${loginUser.userName}</li>
      <li>enrollDate : ${loginUser.enrollDate}</li>
    </ul>

    <button id="logout">Logout</button>

    <hr>

    <h3>메뉴</h3>
    <ul>
     <%--
       - 클릭 시 /selectAll GET방식 요청
       - 모든 사용자 회원번호, id, pw, name, enrollDate 조회
       - 조회 결과를 request scope에 세팅하여
         /WEB-INF/views/selectAll.jsp로 forward
     
       - <table> 태그를 이용해서 모든 정보 출력
        컬럼명 : 회원번호 | 아이디 | 비밀번호 | 이름 | 등록일
        hint. JSTL 중 <c:forEach> 사용
      --%>
      <li><a href="/selectAll">사용자 목록조회</a></li>
    </ul>

  </c:if>


<%-- session에 message가 존재하는 경우 --%>
<c:if test="${!empty sessionScope.message}" >
  <script>
    alert("${sessionScope.message}");
  </script>

  <%-- session에 존재하는 message 제거 --%>
  <c:remove var="message" scope="session" />
</c:if>

  <script src="/resources/js/main.js"></script>
</body>
</html>

 

 

반응형