- [JSP] 45. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (4)2024년 07월 09일
- Song hyun
- 작성자
- 2024.07.09.:52
728x90반응형[JSP] 45. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (4)
폴더명 클래스 파일 controller TodoController UserController model UserDAO UserDAOImpl UserDTO utils BasicDBUtil DBUtil views signIn signUp todoDetail todoForm todoList META-INF context.xml 1. [Controller]
(1) TodoController
package com.tenco.controller; 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 java.io.IOException; /** * Servlet implementation class TodoController */ public class TodoController extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public TodoController() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
(2) UserController
package com.tenco.controller; 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 java.io.IOException; import com.tenco.model.UserDAO; import com.tenco.model.UserDAOImpl; import com.tenco.model.UserDTO; // 주소설계 // http://localhost:8080/mvc/user/ @WebServlet("/user/*") public class UserController extends HttpServlet { private static final long serialVersionUID = 1L; private UserDAO userDAO; public UserController() { super(); } @Override public void init() throws ServletException { userDAO=new UserDAOImpl(); } // GET 방식으로 들어올 때, // http://localhost:8080/mvc/user/signUp --> 회원가입 페이지 // http://localhost:8080/mvc/user/signIn --> 로그인 페이지 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getPathInfo(); System.out.println("action : "+action); switch(action) { case "/signIn": request.getRequestDispatcher("/views/signIn.jsp").forward(request, response); break; case "/signUp": request.getRequestDispatcher("/views/signUp.jsp").forward(request, response); break; default: response.sendError(HttpServletResponse.SC_NOT_FOUND); break; } } // 회원 가입 기능 private void signUp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 인증 검사 필요 없는 기능 String username = request.getParameter("username"); String password=request.getParameter("password"); String email=request.getParameter("email"); // 방어적 코드 작성 (username) if(username==null || username.trim().isEmpty()) { request.setAttribute("errorMessage", "사용자 이름을 입력하시오."); request.getRequestDispatcher("/WEB-INF/views/signUp.jsp").forward(request,response); return; } // 방어적 코드 작성 (password) // 방어적 코드 작성 (email) UserDTO userDTO = UserDTO.builder() .username(username) .password(password) .email(email) .build(); int resultRowCount = userDAO.addUser(userDTO); System.out.println("resultRowCount : "+resultRowCount); if(resultRowCount==1) { response.sendRedirect("user/signIn?message=success"); } else { response.sendRedirect("user/signUp?message=error"); } } // 로그인 기능 요청 (자원의 요청 -- GET 방식, 하지만 예외 처리 -> because of 보안) // POST 요청 시 - 로그인 기능 구현, 회원 가입 기능 구현 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getPathInfo(); System.out.println("action : "+action); switch(action) { case "/signIn": // 로그인 페이지로 보내는 동작 처리 break; case "/signUp": // 회원가입 페이지로 보내는 동작 처리 signUp(request,response); break; default: response.sendError(HttpServletResponse.SC_NOT_FOUND); break; } } }
2. [model]
(1) UserDAO
package com.tenco.model; import java.util.List; public interface UserDAO { int addUser(UserDTO userDTO); UserDTO getUserById(int id); UserDTO getUserByUsername(String username); List<UserDTO> getAllUsers(); int updateUser(UserDTO userDTO, int principalId); // 권한 (마이 정보 -> 나만 바꿔야 함!) // 인증 시에는 세션도 체크해야 한다. (세션 ID) // principalId == 세션 ID int deleteUser(int id); // 세션 인증 필요 }
(2) UserDAOImpl
package com.tenco.model; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import com.tenco.utils.DBUtil; public class UserDAOImpl implements UserDAO{ private DataSource dataSource; public UserDAOImpl() { try { InitialContext ctx=new InitialContext(); dataSource=(DataSource)ctx.lookup("java:comp/env/jdbc/MyDB"); } catch (NamingException e) { e.printStackTrace(); } } @Override public int addUser(UserDTO userDTO) { int resultCount = 0; String sql= "INSERT INTO users(username,password,email) VALUES (?,?,?)"; try (Connection conn = dataSource.getConnection()){ // 트랜잭션 시작 conn.setAutoCommit(false); try (PreparedStatement pstmt = conn.prepareStatement(sql)){ pstmt.setString(1, userDTO.getUsername()); pstmt.setString(2, userDTO.getPassword()); pstmt.setString(3, userDTO.getEmail()); resultCount = pstmt.executeUpdate(); // 트랜잭션 커밋 conn.commit(); } catch (Exception e) { conn.rollback(); e.printStackTrace(); } // end of preparedStatement } catch (Exception e) { e.printStackTrace(); } // end of Connection return resultCount; } @Override public UserDTO getUserById(int id) { // TODO Auto-generated method stub return null; } @Override public UserDTO getUserByUsername(String username) { // TODO Auto-generated method stub return null; } @Override public List<UserDTO> getAllUsers() { // TODO Auto-generated method stub return null; } @Override public int updateUser(UserDTO userDTO, int principalId) { // TODO Auto-generated method stub return 0; } @Override public int deleteUser(int id) { // TODO Auto-generated method stub return 0; } }
(3) UserDTO
package com.tenco.model; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; /** * 데이터를 변환, 담는 개념, 메서드를 사용할 수 있다. * 단순히 데이터만 담는 개념 => VO */ @Data @NoArgsConstructor @AllArgsConstructor @Builder @ToString public class UserDTO { private int id; private String username; private String password; private String email; private String createdAt; // 필요하다면 메서드 정의 가능!ㅉ }
3. [util]
(1) BasicDBUtil
package com.tenco.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class BasicDBUtil { private static final String URL="jdbc:mysql://localhost:3306/m_todo?serverTimezone=Asia/Seoul"; private static final String USER="root"; private static final String PASSWORD="asd123"; public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } return DriverManager.getConnection(URL,USER,PASSWORD); } }
(2) DBUtil
package com.tenco.utils; import java.sql.Connection; import java.sql.SQLException; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class DBUtil { private static DataSource dataSource; // 정적 초기화 블록, static block static { try { // InitialContext 객체를 생성하여 JNDI API기술을 통해 // 존재하는 리소스를 찾는 방법! InitialContext ctx = new InitialContext(); dataSource=(DataSource) ctx.lookup("java:comp/env/jdbc/MySQL"); } catch (NamingException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }
4. [Views]
(1) signUp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% String eMessage = (String)request.getAttribute("errorMessage"); out.println(eMessage); %> <h1>여기는 회원가입 JSP 파일입니다.</h1> </body> </html>
(2) todoDetail
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html>
(3) todoForm
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>여기는 todoForm 페이지입니다.</h1> </body> </html>
(4) todoList
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html>
5. [META-INF]
(1) context.xml
<?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource" factory="com.zaxxer.hikari.HikariJNDIFactory" uniqueResourceName="MyDB" minimumIdle="5" maximumPoolSize="10" connectionTimeOut="30000" idleTimeOut="60000" maxLifeTime="1800000" jdbcUrl="jdbc:mysql://localhost:3306/db_todo2?serverTimezon=Asia/Seoul" driverClassName="com.mysql.cj.jdbc.Driver" username="root" password="asd123"/> </Context>
728x90반응형'JSP > Todo 리스트 만들기' 카테고리의 다른 글
[JSP] 47. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (6) (0) 2024.07.10 [JSP] 46. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (5) (0) 2024.07.09 [JSP] 44. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (3) (0) 2024.07.09 [JSP] 43. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (2) (0) 2024.07.09 [JSP] 42. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (1) (0) 2024.07.09 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)