어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨
23.05.11 / MVC 패턴 - 회원가입 , 서블릿(Servlet) 본문
[1. 회원가입 화면 - forward]
URI : /Min/m_insert_form.ksmart_m View : m_insert_form.jsp
패키지명 : kr.or.ksmart.controller 클래스명 : MController 메서드 : void doGet / void doPost
패키지명 : kr.or.ksmart.forward 클래스명 : MActionForward
Index.jsp
/WEB-INF/web.xml
[2. 회원가입 처리 - forward / redirect 둘 다 아님]
URI : /Min/m_insert_pro.ksmart_m View : m_pro.jsp
패키지명 : kr.or.ksmart.Inter 인터페이스 : MActionInterFace
패키지명 : kr.or.ksmart.action 클래스명 : MInsertAction 상속 받은 인터페이스 : MActionInterFace
패키지명 : kr.or.ksmart.dto 클래스명 : Member
패키지명 : kr.or.ksmart.dao 클래스명 : Mdao
/META-INF/context.xml
[3. 회원가입 목록 - forward / redirect 둘 중 선택]
URI : /Mlist/m_list.ksmart_m View : m_list.jsp
패키지명 : kr.or.ksmart.action 클래스명 : MListAction 상속 받은 인터페이스 : MActionInterFace
[화원가입 화면]
1. index.jsp 생성 - 여기까지 생성 후 실행하면 404에러 발생 ( 경로 문제 )
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<%
response.sendRedirect(request.getContextPath()+"/Min/m_insert_form.ksmart_m");
//response.sendRedirect(request.getContextPath()+"/Min/m_insert_pro.ksmart_m");
//response.sendRedirect(request.getContextPath()+"/Mlist/m_list.ksmart_m");
%>
2. MController 클래스 Sevlet으로 생성
public class MController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MController() {
super();
}
//어딘가에 있을 호출부 : 객체참조변수명.doGet(request,response);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-1 doGet Mcontroller.java");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-2 doPost Mcontroller.java");
}
}
부모 클래스 : HttpServlet
자식 클래스 : MController
메서드 : doGet / doPost
자바 자체에서 만들어놓은 Servlet이라는 클래스의 메서드를 MController 클래스에서 상속 받아 오버라이딩하는 것
[ HttpServletRequest ]
http프로토콜의 request정보를 서블릿에게 전달하기 위해 HttpServletRequest 객체 생성
헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드
바디의 스트림을 읽어 들이는 메서드
[ HttpServletResponse ]
WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있는 상태
해당 클라이언트에게 응답을 보내기 위해 HttpServleResponse 객체 생성
서블릿에게 전달하고 content type, 응답 코드, 응답 메시지 등을 전송
3. /WEB-INF/web.xml - 여기까지 생성 후 실행하면 뷰포트에는 아무것도 안 뜨지만 콘솔에 1-1 doGet Mcontroller.java 출력
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MController</display-name>
<servlet>
<servlet-name>MController</servlet-name>
<servlet-class>
kr.or.ksmart.controller.MController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MController</servlet-name>
<url-pattern>*.ksmart_m</url-pattern>
</servlet-mapping>
4. MController 클래스에 doPro 메서드 선언
package kr.or.ksmart.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MController() {
super();
}
//doGet 또는 doPost 메서드 내부 처리과정에서 호출하면 실행되는 메서드를 선언한다.
protected void doPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("2 doPro Mcontroller.java");
System.out.println(request + "request doPro Mcontroller.java");
System.out.println(response + "response doPro Mcontroller.java");
// /mysqlv8_MVC_MG_tomcat9_jstl/Min/m_insert_form.ksmart_m
String RequestURI=request.getRequestURI();
// /mysqlv8_MVC_MG_tomcat9_jstl
String contextPath=request.getContextPath();
// /Min/m_insert_form.ksmart_m
// substring의 뜻 - RequestURI에서 contextPath의 길이 다음부터 command에 담는다.
String command=RequestURI.substring(contextPath.length());
System.out.println(RequestURI + "<-- RequestURI MController.java");
System.out.println(contextPath + "<-- contextPath MController.java");
System.out.println(contextPath.length() + "<-- contextPath.length() MController.java");
System.out.println(command + "<-- command MController.java");
System.out.println("----------MController.java----------------");
System.out.println();
}
//사용자가 Get방식을 사용하면 doGet 메서드를 호출하고 doGet 메서드 내에서 doPro 메서드를 호출한다.
//어디선가 호출 : 객체참조변수명.doGet(request,response);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-1 doGet Mcontroller.java");
doPro(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-2 doPost Mcontroller.java");
request.setCharacterEncoding("euc-kr"); // post 방식 한글 처리
doPro(request,response);
}
}
인터페이스 : javax.servlet.http.HttpServletRequest
구현 클래스 : org.apache.catalina.connector 패키지내의 RequestFacade 클래스
구현 객체 : org.apache.catalina.connector.RequestFacade@79000909
인터페이스 : javax.servlet.http.HttpServletResponse
구현 클래스 : org.apache.catalina.connector 패키지내의 ResponseFacade 클래스
구현 객체 : org.apache.catalina.connector.ResponseFacade@80392cb
5. MActionForward 클래스 생성 ( 목적 : 포워드 / 리다이렉트 선택과 경로 셋팅)
package kr.or.ksmart.forward;
public class MActionForward {
private boolean isRedirect=false; //isRedirect가 false면 포워드,true면 리다이렉트
private String path=null;
public boolean isRedirect() { // 값이 ture 또는 false 인 경우 generate 했을 때 get이 아니고 is가 붙음
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String toString() { // 오른쪽 마우스 - source - generate toString
return "MActionForward [isRedirect=" + isRedirect + ", path=" + path + "]";
}
// String 클래스에 선언된 toString 메서드를 오버라이딩한 것 -
// 원래 return super.toStirng(); 였던 것을
// return "MActionForward [isRedirect=" + isRedirect + ", path=" + path + "]"; 형태로 오버라이딩
// String 클래스의 toString은 자신이 가진 값을 그대로 리턴
// File 클래스의 toString은 자신이 가진 해당 경로값을 리턴
}
6. MController 클래스에 doPro 메서드에 경로셋팅 / 포워드, 리다이렉트 처리 구현
( URI : /Min/m_insert_form.ksmart_m 일 때 - MActionForward 클래스 객체참조변수와 주소)
// 경로 셋팅
MActionForward forward = null;
if(command.equals("/Min/m_insert_form.ksmart_m")) {
System.out.println("3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
forward = new MActionForward();
forward.setPath("/minsert/m_insert_form.jsp"); //어떤 경로 셋팅?
System.out.println(forward + "forward 3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
//forward.setRedirect(false); 현재 기본 값 false인 상태 -> 포워드
//경로는 셋팅된 상태 -> 하지만 포워드 경로에 해당 파일 없음 (404 에러 발생)
//minsert 폴더와 m_insert_form.jsp 파일 아직 안만들었음.
// 5번 MActionForward 클래스의 객체참조변수 forward에 주소 할당
// System.out.println(forward); 하면
// 5번 MActionForward 클래스에 재정의된 toString 메서드는 자동 호출 됨
// MActionForward [isRedirect=false, path=/minsert/m_insert_form.jsp] 출력됨
}
// 포워드 or 리다이렉트 처리
if(forward != null){
if(forward.isRedirect()){
response.sendRedirect(forward.getPath());
}else{
RequestDispatcher dispatcher=
request.getRequestDispatcher(forward.getPath());
System.out.println(forward.getPath() + "<--- forward.getPath()[jsp 이동경로] MController.java");
System.out.println();
dispatcher.forward(request, response);
}
}
}
==========================================================================================
package kr.or.ksmart.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.forward.MActionForward;
public class MController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MController() {
super();
}
//doGet 또는 doPost 메서드 내부 처리과정에서 호출하면 실행되는 메서드를 선언한다.
protected void doPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("2 doPro Mcontroller.java");
System.out.println(request + "request doPro Mcontroller.java");
System.out.println(response + "response doPro Mcontroller.java");
// /mysqlv8_MVC_MG_tomcat9_jstl/Min/m_insert_form.ksmart_m
String RequestURI=request.getRequestURI();
// /mysqlv8_MVC_MG_tomcat9_jstl
String contextPath=request.getContextPath();
// /Min/m_insert_form.ksmart_m
String command=RequestURI.substring(contextPath.length());
System.out.println(RequestURI + "<-- RequestURI MController.java");
System.out.println(contextPath + "<-- contextPath MController.java");
System.out.println(contextPath.length() + "<-- contextPath.length() MController.java");
System.out.println(command + "<-- command MController.java");
System.out.println("----------MController.java----------------");
System.out.println();
// 경로 셋팅
MActionForward forward = null;
if(command.equals("/Min/m_insert_form.ksmart_m")) {
System.out.println("3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
forward = new MActionForward();
forward.setPath("/minsert/m_insert_form.jsp"); //어떤 경로 셋팅?
System.out.println(forward + "forward 3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
//forward.setRedirect(false); 현재 기본 값 false인 상태 -> 포워드
//경로는 셋팅된 상태 -> 하지만 포워드 경로에 해당 파일 없음 (404 에러 발생)
//minsert 폴더와 m_insert_form.jsp 파일 아직 안만들었음.
// 5번 MActionForward 클래스의 객체참조변수 forward에 주소 할당
// System.out.println(forward); 하면
// 5번 MActionForward 클래스에 재정의된 toString 메서드는 자동 호출 됨
// MActionForward [isRedirect=false, path=/minsert/m_insert_form.jsp] 출력됨
}
// 포워드 or 리다이렉트 처리
if(forward != null){
if(forward.isRedirect()){
response.sendRedirect(forward.getPath());
}else{
RequestDispatcher dispatcher=
request.getRequestDispatcher(forward.getPath());
System.out.println(forward.getPath() + "<--- forward.getPath()[jsp 이동경로] MController.java");
System.out.println();
dispatcher.forward(request, response);
}
}
}
//사용자가 Get방식을 사용하면 doGet 메서드를 호출하고 doGet 메서드 내에서 doPro 메서드를 호출한다.
//어디선가 호출 : 객체참조변수명.doGet(request,response);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-1 doGet Mcontroller.java");
doPro(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-2 doPost Mcontroller.java");
request.setCharacterEncoding("euc-kr"); // post 방식 한글 처리
doPro(request,response);
}
}
7. minsert 폴더에 m_insert_form.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
/minsert/m_insert_form.jsp
<form action="<%= request.getContextPath() %>/Min/m_insert_pro.ksmart_m" method="post">
<table border="1">
<tr>
<td>아이디</td>
<td><input type="text" name="m_id" size="20"></td>
<tr>
<tr>
<td>암호</td>
<td><input type="text" name="m_pw" size="20"></td>
<tr>
<tr>
<td>권한</td>
<td><input type="text" name="m_level" size="20"></td>
<tr>
<tr>
<td>이름</td>
<td><input type="text" name="m_name" size="20"></td>
<tr>
<tr>
<td>이메일</td>
<td><input type="text" name="m_email" size="20"></td>
<tr>
<tr>
<td colspan="4"><input type="submit" value="회원가입버튼"></td>
</tr>
</table>
</form>
</body>
8. 회원가입 화면 view에 출력 됨
[화원가입 처리]
9. MActionInterFace 인터페이스 생성해서 추상메서드 선언
package kr.or.ksmart.Inter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.forward.MActionForward;
public interface MActionInterFace {
//execute 추상 메서드 선언
public MActionForward execute(HttpServletRequest request,HttpServletResponse response) throws Exception;
}
10. MActionInterFace 인터페이스를 상속받을 MInsertAction 클래스 생성해서 execute 메서드 오버라이딩
package kr.or.ksmart.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.forward.MActionForward;
public class MInsertAction implements MActionInterFace {
@Override
public MActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("4-1 execute MinsertAction.java");
//execute 추상 메서드에서 어떤 처리를 해야 할까?
//1단계 : 입력자료를 받아 콘솔창에 출력한다 - 필요함
//2단계 : DTO 셋팅 - 필요함
//3단계 : DAO 메서드 호출 후 리턴이 있으면 리턴 받는다. - 필요함
//4단계 : request or session 영역에 셋팅 - 불 필요함
//6단계 : MActionForward 객체 주소값 리턴 - 필요
return null;
}
}
11. MController 클래스에 doPro 메서드에 경로셋팅
( URI : /Min/m_insert_pro.ksmart_m 일 때 - MinsertAction 클래스 객체참조변수와 주소)
* 인터페이스 data type으로 선언된 action 객체참조변수에는 인터페이스 구현 객체의 주소 값을 할당
(인터페이스 MActionInterFace의 객체 참조변수 action 선언은 딱 하나만 하고, 주소 값 할당만 계속 재할당한다. - 다형성)
else if(command.equals("/Min/m_insert_pro.ksmart_m")) {
System.out.println("3-2 조건문 /Min/m_insert_pro.ksmart_m");
action = new MInsertAction();
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
==========================================================================================
package kr.or.ksmart.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.action.MInsertAction;
import kr.or.ksmart.action.MInsertProAction;
import kr.or.ksmart.forward.MActionForward;
public class MController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MController() {
super();
}
//doGet 또는 doPost 메서드 내부 처리과정에서 호출하면 실행되는 메서드를 선언한다.
protected void doPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("2 doPro Mcontroller.java");
System.out.println(request + "request doPro Mcontroller.java");
System.out.println(response + "response doPro Mcontroller.java");
// /mysqlv8_MVC_MG_tomcat9_jstl/Min/m_insert_form.ksmart_m
String RequestURI=request.getRequestURI();
// /mysqlv8_MVC_MG_tomcat9_jstl
String contextPath=request.getContextPath();
// /Min/m_insert_form.ksmart_m
String command=RequestURI.substring(contextPath.length());
System.out.println(RequestURI + "<-- RequestURI MController.java");
System.out.println(contextPath + "<-- contextPath MController.java");
System.out.println(contextPath.length() + "<-- contextPath.length() MController.java");
System.out.println(command + "<-- command MController.java");
System.out.println("----------MController.java----------------");
System.out.println();
//경로 셋팅
MActionForward forward = null;
MActionInterFace action = null;
if(command.equals("/Min/m_insert_form.ksmart_m")) {
System.out.println("3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
forward = new MActionForward();
forward.setPath("/minsert/m_insert_form.jsp"); //어떤 경로 셋팅?
System.out.println(forward + "forward 3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
}else if(command.equals("/Min/m_insert_pro.ksmart_m")) {
System.out.println("3-2 조건문 /Min/m_insert_pro.ksmart_m");
action = new MInsertAction();
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
//포워드 or 리다이렉트
if(forward != null){
if(forward.isRedirect()){
response.sendRedirect(forward.getPath());
}else{
RequestDispatcher dispatcher=
request.getRequestDispatcher(forward.getPath());
System.out.println(forward.getPath() + "<--- forward.getPath()[jsp 이동경로] MController.java");
System.out.println();
dispatcher.forward(request, response);
}
}
}
//사용자가 Get방식을 사용하면 doGet 메서드를 호출하고 doGet 메서드 내에서 doPro 메서드를 호출한다.
//어디선가 호출 : 객체참조변수명.doGet(request,response);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-1 doGet Mcontroller.java");
doPro(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-2 doPost Mcontroller.java");
request.setCharacterEncoding("euc-kr"); // post 방식 한글 처리
doPro(request,response);
}
}
12. Member 클래스로 DTO 생성
package kr.or.ksmart.dto;
public class Member {
private String m_id;
private String m_pw;
private String m_level;
private String m_name;
private String m_email;
public String getM_id() {
return m_id;
}
public void setM_id(String m_id) {
this.m_id = m_id;
}
public String getM_pw() {
return m_pw;
}
public void setM_pw(String m_pw) {
this.m_pw = m_pw;
}
public String getM_level() {
return m_level;
}
public void setM_level(String m_level) {
this.m_level = m_level;
}
public String getM_name() {
return m_name;
}
public void setM_name(String m_name) {
this.m_name = m_name;
}
public String getM_email() {
return m_email;
}
public void setM_email(String m_email) {
this.m_email = m_email;
}
@Override
public String toString() {
return "Member [m_id=" + m_id + ", m_pw=" + m_pw + ", m_level=" + m_level + ", m_name=" + m_name + ", m_email="
+ m_email + "]";
}
}
13. MInsertAction 클래스 execute 메서드 오버라이딩
(사용자가 입력한 데이터 받기 / 받은 데이터 DTO에 셋팅하기 - 아직 데이터베이스 연결 전)
//1단계 : 입력자료를 받아 콘솔창에 출력한다 - 필요함
String m_id = request.getParameter("m_id");
String m_pw = request.getParameter("m_pw");
String m_level = request.getParameter("m_level");
String m_name = request.getParameter("m_name");
String m_email = request.getParameter("m_email");
System.out.println(m_id + "<- m_id execute MInsertProAction.java");
System.out.println(m_pw + "<- m_pw execute MInsertProAction.java");
System.out.println(m_level + "<- m_level execute MInsertProAction.java");
System.out.println(m_name + "<- m_name execute MInsertProAction.java");
System.out.println(m_email + "<- m_email execute MInsertProAction.java");
//2단계 : DTO 셋팅 - 필요함
Member m = new Member();
m.setM_id(m_id);
m.setM_pw(m_pw);
m.setM_level(m_level);
m.setM_name(m_name);
m.setM_email(m_email);
System.out.println(m + "<- m execute MInsertProAction.java");
===============================================================================================
package kr.or.ksmart.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.dto.Member;
import kr.or.ksmart.forward.MActionForward;
public class MInsertAction implements MActionInterFace {
@Override
public MActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("4-1 execute MinsertAction.java");
//execute 추상 메서드에서 어떤 처리를 해야 할까?
//1단계 : 입력자료를 받아 콘솔창에 출력한다 - 필요함
String m_id = request.getParameter("m_id");
String m_pw = request.getParameter("m_pw");
String m_level = request.getParameter("m_level");
String m_name = request.getParameter("m_name");
String m_email = request.getParameter("m_email");
System.out.println(m_id + "<- m_id execute MInsertProAction.java");
System.out.println(m_pw + "<- m_pw execute MInsertProAction.java");
System.out.println(m_level + "<- m_level execute MInsertProAction.java");
System.out.println(m_name + "<- m_name execute MInsertProAction.java");
System.out.println(m_email + "<- m_email execute MInsertProAction.java");
//2단계 : DTO 셋팅 - 필요함
Member m = new Member();
m.setM_id(m_id);
m.setM_pw(m_pw);
m.setM_level(m_level);
m.setM_name(m_name);
m.setM_email(m_email);
System.out.println(m + "<- m execute MInsertProAction.java");
//3단계 : DAO 메서드 호출 후 리턴이 있으면 리턴 받는다. - 필요함
//4단계 : request or session 영역에 셋팅 - 불 필요함
//5단계 : MActionForward 객체에 포워드 또는 리다이렉트 설정 및 경로 셋팅 - 필요함
//6단계 : MActionForward 객체 주소값 리턴 - 필요
return null;
}
}
14. META-INF 폴더에 context.xml 파일 생성 (JDBC 드라이버 로딩 / DB 연결 정보를 셋팅)
<Context>
<Resource
name="jdbc/MySQLDB"
auth="Container"
type="javax.sql.DataSource"
username="dev47id"
password="dev47pw"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
url="jdbc:mysql://localhost:3306/dev47db"
maxActive="500"
/>
</Context>
15. Mdao 클래스 생성 (Constructios from superclass 체크해서 생성자 메서드 선언 추가)
package kr.or.ksmart.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import kr.or.ksmart.dto.Member;
public class Mdao {
DataSource ds;
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
List<Member> lm = null;
Member m;
public Mdao() {
try{
Context init = new InitialContext();
System.out.println(init + "<-- init Mdao() ");
ds = (DataSource) init.lookup("java:comp/env/jdbc/MySQLDB");
System.out.println(ds + "<-- ds Mdao() ");
}catch(Exception ex){
System.out.println("DB 연결 실패 : " + ex);
return;
}
}
}
15. MInsertAction 클래스 execute 메서드 오버라이딩
(DAO 메서드 호출 후 리턴 받기 - 데이터베이스 연결)
//3단계 : DAO 메서드 호출 후 리턴이 있으면 리턴 받는다. - 필요함
Mdao mdao = new Mdao();
mdao.mInsert(m);
==========================================================================================
package kr.or.ksmart.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.dao.Mdao;
import kr.or.ksmart.dto.Member;
import kr.or.ksmart.forward.MActionForward;
public class MInsertAction implements MActionInterFace {
@Override
public MActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("4-1 execute MinsertAction.java");
//execute 추상 메서드에서 어떤 처리를 해야 할까?
//1단계 : 입력자료를 받아 콘솔창에 출력한다 - 필요함
String m_id = request.getParameter("m_id");
String m_pw = request.getParameter("m_pw");
String m_level = request.getParameter("m_level");
String m_name = request.getParameter("m_name");
String m_email = request.getParameter("m_email");
System.out.println(m_id + "<- m_id execute MInsertProAction.java");
System.out.println(m_pw + "<- m_pw execute MInsertProAction.java");
System.out.println(m_level + "<- m_level execute MInsertProAction.java");
System.out.println(m_name + "<- m_name execute MInsertProAction.java");
System.out.println(m_email + "<- m_email execute MInsertProAction.java");
//2단계 : DTO 셋팅 - 필요함
Member m = new Member();
m.setM_id(m_id);
m.setM_pw(m_pw);
m.setM_level(m_level);
m.setM_name(m_name);
m.setM_email(m_email);
System.out.println(m + "<- m execute MInsertProAction.java");
//3단계 : DAO 메서드 호출 후 리턴이 있으면 리턴 받는다. - 필요함
Mdao mdao = new Mdao();
mdao.mInsert(m);
//4단계 : request or session 영역에 셋팅 - 불 필요함
//5단계 : MActionForward 객체에 포워드 또는 리다이렉트 설정 및 경로 셋팅 - 필요함
//6단계 : MActionForward 객체 주소값 리턴 - 필요
return null;
}
}
16. Mdao 클래스 mInsert 메서드 선언 (입력 처리 메서드)
public void mInsert(Member m) throws ClassNotFoundException, SQLException {
System.out.println("5-1 mInsert Mdao.java");
conn=ds.getConnection();
System.out.println(conn + "<- conn mInsert Mdao.java");
pstmt = conn.prepareStatement(
"INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
System.out.println(pstmt + "<-- pstmt 1");
System.out.println(m + "<-- m");
pstmt.setString(1, m.getM_id());
pstmt.setString(2, m.getM_pw());
pstmt.setString(3, m.getM_level());
pstmt.setString(4, m.getM_name());
pstmt.setString(5, m.getM_email());
System.out.println(pstmt + "<-- pstmt 2");
int result = pstmt.executeUpdate();
System.out.println(result + "<-- result");
pstmt.close();
conn.close();
}
==========================================================================================
package kr.or.ksmart.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import kr.or.ksmart.dto.Member;
public class Mdao {
DataSource ds;
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
List<Member> lm = null;
Member m;
public Mdao() {
try{
Context init = new InitialContext();
System.out.println(init + "<-- init Mdao() ");
ds = (DataSource) init.lookup("java:comp/env/jdbc/MySQLDB");
System.out.println(ds + "<-- ds Mdao() ");
}catch(Exception ex){
System.out.println("DB 연결 실패 : " + ex);
return;
}
}
public void mInsert(Member m) throws ClassNotFoundException, SQLException {
System.out.println("5-1 mInsert Mdao.java");
conn=ds.getConnection();
System.out.println(conn + "<- conn mInsert Mdao.java");
pstmt = conn.prepareStatement(
"INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
System.out.println(pstmt + "<-- pstmt 1");
System.out.println(m + "<-- m");
pstmt.setString(1, m.getM_id());
pstmt.setString(2, m.getM_pw());
pstmt.setString(3, m.getM_level());
pstmt.setString(4, m.getM_name());
pstmt.setString(5, m.getM_email());
System.out.println(pstmt + "<-- pstmt 2");
int result = pstmt.executeUpdate();
System.out.println(result + "<-- result");
pstmt.close();
conn.close();
}
}
[화원가입 목록]
17. MInsertAction 클래스 execute 메서드 오버라이딩 (경로 셋팅 및 리턴값 수정)
//5단계 : MActionForward 객체에 포워드 또는 리다이렉트 설정 및 경로 셋팅 - 필요함
MActionForward mf = new MActionForward();
mf.setRedirect(true);
mf.setPath(request.getContextPath()+"/Mlist/m_list.ksmart_m");
//6단계 : MActionForward 객체 주소값 리턴 - 필요
return mf;
==========================================================================================
package kr.or.ksmart.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.dao.Mdao;
import kr.or.ksmart.dto.Member;
import kr.or.ksmart.forward.MActionForward;
public class MInsertAction implements MActionInterFace {
@Override
public MActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("4-1 execute MinsertAction.java");
//execute 추상 메서드에서 어떤 처리를 해야 할까?
//1단계 : 입력자료를 받아 콘솔창에 출력한다 - 필요함
String m_id = request.getParameter("m_id");
String m_pw = request.getParameter("m_pw");
String m_level = request.getParameter("m_level");
String m_name = request.getParameter("m_name");
String m_email = request.getParameter("m_email");
System.out.println(m_id + "<- m_id execute MInsertProAction.java");
System.out.println(m_pw + "<- m_pw execute MInsertProAction.java");
System.out.println(m_level + "<- m_level execute MInsertProAction.java");
System.out.println(m_name + "<- m_name execute MInsertProAction.java");
System.out.println(m_email + "<- m_email execute MInsertProAction.java");
//2단계 : DTO 셋팅 - 필요함
Member m = new Member();
m.setM_id(m_id);
m.setM_pw(m_pw);
m.setM_level(m_level);
m.setM_name(m_name);
m.setM_email(m_email);
System.out.println(m + "<- m execute MInsertProAction.java");
//3단계 : DAO 메서드 호출 후 리턴이 있으면 리턴 받는다. - 필요함
Mdao mdao = new Mdao();
mdao.mInsert(m);
//4단계 : request or session 영역에 셋팅 - 불 필요함
//5단계 : MActionForward 객체에 포워드 또는 리다이렉트 설정 및 경로 셋팅 - 필요함
MActionForward mf = new MActionForward();
mf.setRedirect(true);
mf.setPath(request.getContextPath()+"/Mlist/m_list.ksmart_m");
//6단계 : MActionForward 객체 주소값 리턴 - 필요
return mf;
}
}
18. MController 클래스 doPro 메서드 추가
}else if(command.equals("/Mlist/m_list.ksmart_m")) {
System.out.println("3-3 조건문 /Mlist/m_list.ksmart_m");
}
=========================================================================================
package kr.or.ksmart.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.action.MInsertAction;
import kr.or.ksmart.forward.MActionForward;
public class MController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MController() {
super();
}
//doGet 또는 doPost 메서드 내부 처리과정에서 호출하면 실행되는 메서드를 선언한다.
protected void doPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("2 doPro Mcontroller.java");
System.out.println(request + "request doPro Mcontroller.java");
System.out.println(response + "response doPro Mcontroller.java");
// /mysqlv8_MVC_MG_tomcat9_jstl/Min/m_insert_form.ksmart_m
String RequestURI=request.getRequestURI();
// /mysqlv8_MVC_MG_tomcat9_jstl
String contextPath=request.getContextPath();
// /Min/m_insert_form.ksmart_m
String command=RequestURI.substring(contextPath.length());
System.out.println(RequestURI + "<-- RequestURI MController.java");
System.out.println(contextPath + "<-- contextPath MController.java");
System.out.println(contextPath.length() + "<-- contextPath.length() MController.java");
System.out.println(command + "<-- command MController.java");
System.out.println("----------MController.java----------------");
System.out.println();
MActionForward forward = null;
MActionInterFace action = null;
if(command.equals("/Min/m_insert_form.ksmart_m")) {
System.out.println("3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
forward = new MActionForward();
forward.setPath("/minsert/m_insert_form.jsp"); //어떤 경로 셋팅?
System.out.println(forward + "forward 3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
//forward.setRedirect(false); 현재 기본 값 false인 상태 -> 포워드
//경로는 셋팅된 상태 -> 하지만 포워드 경로에 해당 파일 없음 (404 에러 발생)
//minsert 폴더와 m_insert_form.jsp 파일 아직 안만들었음.
}else if(command.equals("/Min/m_insert_pro.ksmart_m")) {
System.out.println("3-2 조건문 /Min/m_insert_pro.ksmart_m");
action = new MInsertAction();
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}else if(command.equals("/Mlist/m_list.ksmart_m")) {
System.out.println("3-3 조건문 /Mlist/m_list.ksmart_m");
}
//포워드 or 리다이렉트
if(forward != null){
if(forward.isRedirect()){
response.sendRedirect(forward.getPath());
}else{
RequestDispatcher dispatcher=
request.getRequestDispatcher(forward.getPath());
System.out.println(forward.getPath() + "<--- forward.getPath()[jsp 이동경로] MController.java");
System.out.println();
dispatcher.forward(request, response);
}
}
}
//사용자가 Get방식을 사용하면 doGet 메서드를 호출하고 doGet 메서드 내에서 doPro 메서드를 호출한다.
//어디선가 호출 : 객체참조변수명.doGet(request,response);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-1 doGet Mcontroller.java");
doPro(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-2 doPost Mcontroller.java");
request.setCharacterEncoding("euc-kr"); //post방식 한글 처리
doPro(request,response);
}
}
19. MActionInterFace 인터페이스를 상속받을 MListAction 클래스 생성
20. MController 클래스 doPro 메서드 추가
else if(command.equals("/Mlist/m_list.ksmart_m")) {
System.out.println("3-3 조건문 /Mlist/m_list.ksmart_m");
action = new MListAction();
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
============================================================================================
package kr.or.ksmart.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.action.MInsertAction;
import kr.or.ksmart.action.MListAction;
import kr.or.ksmart.forward.MActionForward;
public class MController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MController() {
super();
}
//doGet 또는 doPost 메서드 내부 처리과정에서 호출하면 실행되는 메서드를 선언한다.
protected void doPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("2 doPro Mcontroller.java");
System.out.println(request + "request doPro Mcontroller.java");
System.out.println(response + "response doPro Mcontroller.java");
// /mysqlv8_MVC_MG_tomcat9_jstl/Min/m_insert_form.ksmart_m
String RequestURI=request.getRequestURI();
// /mysqlv8_MVC_MG_tomcat9_jstl
String contextPath=request.getContextPath();
// /Min/m_insert_form.ksmart_m
String command=RequestURI.substring(contextPath.length());
System.out.println(RequestURI + "<-- RequestURI MController.java");
System.out.println(contextPath + "<-- contextPath MController.java");
System.out.println(contextPath.length() + "<-- contextPath.length() MController.java");
System.out.println(command + "<-- command MController.java");
System.out.println("----------MController.java----------------");
System.out.println();
MActionForward forward = null;
MActionInterFace action = null;
if(command.equals("/Min/m_insert_form.ksmart_m")) {
System.out.println("3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
forward = new MActionForward();
forward.setPath("/minsert/m_insert_form.jsp"); //어떤 경로 셋팅?
System.out.println(forward + "forward 3-1 /Min/m_insert_form.ksmart_m 조건문 실행");
//forward.setRedirect(false); 현재 기본 값 false인 상태 -> 포워드
//경로는 셋팅된 상태 -> 하지만 포워드 경로에 해당 파일 없음 (404 에러 발생)
//minsert 폴더와 m_insert_form.jsp 파일 아직 안만들었음.
}else if(command.equals("/Min/m_insert_pro.ksmart_m")) {
System.out.println("3-2 조건문 /Min/m_insert_pro.ksmart_m");
action = new MInsertAction();
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}else if(command.equals("/Mlist/m_list.ksmart_m")) {
System.out.println("3-3 조건문 /Mlist/m_list.ksmart_m");
action = new MListAction();
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
//포워드 or 리다이렉트
if(forward != null){
if(forward.isRedirect()){
response.sendRedirect(forward.getPath());
}else{
RequestDispatcher dispatcher=
request.getRequestDispatcher(forward.getPath());
System.out.println(forward.getPath() + "<--- forward.getPath()[jsp 이동경로] MController.java");
System.out.println();
dispatcher.forward(request, response);
}
}
}
//사용자가 Get방식을 사용하면 doGet 메서드를 호출하고 doGet 메서드 내에서 doPro 메서드를 호출한다.
//어디선가 호출 : 객체참조변수명.doGet(request,response);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-1 doGet Mcontroller.java");
doPro(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("1-2 doPost Mcontroller.java");
request.setCharacterEncoding("euc-kr"); //post방식 한글 처리
doPro(request,response);
}
}
20. Mdao 클래스 mAllSelect 메서드 선언 (전체 회원 조회 메서드)
//2 전체 회원 조회 메서드 선언
public List<Member> mAllSelect() throws ClassNotFoundException, SQLException{
System.out.println("5-2 mAllSelect Mdao.java");
conn=ds.getConnection();
System.out.println(conn + "<- conn mAllSelect Mdao.java");
pstmt = conn.prepareStatement("select * from tb_member");
System.out.println(pstmt + "<-- pstmt");
rs = pstmt.executeQuery();
lm = new ArrayList<Member>();
while(rs.next()){
//System.out.println("while문 실행");
m = new Member();
m.setM_id(rs.getString("m_id"));
m.setM_pw(rs.getString("m_pw"));
m.setM_level(rs.getString("m_level"));
m.setM_name(rs.getString("m_name"));
m.setM_email(rs.getString("m_email"));
lm.add(m);
System.out.println(lm + "<- lm mAllSelect Mdao.java");
}
pstmt.close();
rs.close();
conn.close();
return lm;
}
======================================================================================
package kr.or.ksmart.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import kr.or.ksmart.dto.Member;
public class Mdao {
DataSource ds;
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
List<Member> lm = null;
Member m;
public Mdao() {
try{
Context init = new InitialContext();
System.out.println(init + "<-- init Mdao() ");
ds = (DataSource) init.lookup("java:comp/env/jdbc/MySQLDB");
System.out.println(ds + "<-- ds Mdao() ");
}catch(Exception ex){
System.out.println("DB 연결 실패 : " + ex);
return;
}
}
//2 전체 회원 조회 메서드 선언
public List<Member> mAllSelect() throws ClassNotFoundException, SQLException{
System.out.println("5-2 mAllSelect Mdao.java");
conn=ds.getConnection();
System.out.println(conn + "<- conn mAllSelect Mdao.java");
pstmt = conn.prepareStatement("select * from tb_member");
System.out.println(pstmt + "<-- pstmt");
rs = pstmt.executeQuery();
lm = new ArrayList<Member>();
while(rs.next()){
//System.out.println("while문 실행");
m = new Member();
m.setM_id(rs.getString("m_id"));
m.setM_pw(rs.getString("m_pw"));
m.setM_level(rs.getString("m_level"));
m.setM_name(rs.getString("m_name"));
m.setM_email(rs.getString("m_email"));
lm.add(m);
System.out.println(lm + "<- lm mAllSelect Mdao.java");
}
pstmt.close();
rs.close();
conn.close();
return lm;
}
//1 입력처리 메서드 선언
public void mInsert(Member m) throws ClassNotFoundException, SQLException {
System.out.println("5-1 mInsert Mdao.java");
conn=ds.getConnection();
System.out.println(conn + "<- conn mInsert Mdao.java");
pstmt = conn.prepareStatement(
"INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
System.out.println(pstmt + "<-- pstmt 1");
System.out.println(m + "<-- m");
pstmt.setString(1, m.getM_id());
pstmt.setString(2, m.getM_pw());
pstmt.setString(3, m.getM_level());
pstmt.setString(4, m.getM_name());
pstmt.setString(5, m.getM_email());
System.out.println(pstmt + "<-- pstmt 2");
int result = pstmt.executeUpdate();
System.out.println(result + "<-- result");
pstmt.close();
conn.close();
}
}
21. MListAction 클래스 execute메서드 오버라이딩 - 여기까지하면 404에로 (경로 아직 없어서 -mlist/m_list.jsp)
package kr.or.ksmart.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.or.ksmart.Inter.MActionInterFace;
import kr.or.ksmart.dao.Mdao;
import kr.or.ksmart.dto.Member;
import kr.or.ksmart.forward.MActionForward;
public class MListAction implements MActionInterFace {
@Override
public MActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("4-2 execute MListProAction.java");
//1단계 : 입력자료를 받아 콘솔창에 출력한다 - 불필요함
//2단계 : DTO 셋팅 - 불 필요함
//3단계 : DAO 메서드 호출 후 리턴이 있으면 리턴 받는다. - 필요함
//mAllSelect 메서드 호출 후 리턴받아 리턴 값을 콘솔창에 출력 하세요
Mdao mdao = new Mdao();
List<Member> lm = mdao.mAllSelect();
System.out.println(lm + "<- lm execute MListProAction.java");
//4단계 : request or session 영역에 셋팅 - 필요함
request.setAttribute("lm", lm);
//5단계 : MActionForward 객체에 포워드 또는 리다이렉트 설정 및 경로 셋팅 - 필요함
MActionForward mf = new MActionForward();
mf.setRedirect(false);
mf.setPath("/mlist/m_list.jsp");
//6단계 : MActionForward 객체 주소값 리턴 - 필요함
return mf;
}
}
22. mlist/m_list.jsp 생성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<!--jstl을 사용하려면 필요함-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
포워드 경로 /mlist/m_list.jsp <br><br>
<a href="${pageContext.request.contextPath}/Min/m_insert_form.ksmart_m">회원가입</a><br><br>
회원 리스트 <br>
<table width="100%" border="1">
<tr>
<td>아이디</td><td>비번</td><td>권한</td><td>이름</td><td>이메일</td><td>수정</td><td>삭제</td>
</tr>
<!-- <c:forEach></c:forEach> : List, 배열 요소를 순서대로 반복해서 처리할 수 있는 jstl 태그 -->
<c:forEach items="${lm}" var="lm" varStatus="status">
<tr>
<td>${lm.m_id}</td>
<td>${lm.m_pw}</td>
<td>${lm.m_level}</td>
<td>${lm.m_name}</td>
<td>${lm.m_email}</td>
<td>
<a href="<%= request.getContextPath() %>/Mup/m_update_form.ksmart_m?send_id=${lm.m_id}">수정버튼</a>
<!-- 수정버튼 클릭시 경로 확장자 ksmart_m으로 변경 후 작업 시작 -->
</td>
<td>
<a href="<%= request.getContextPath() %>/Mdel/m_delete_pro.ksmart_m?send_id=${lm.m_id}">삭제버튼</a>
<!-- 삭제버튼 클릭시 경로 확장자 ksmart_m으로 변경 후 작업 시작 -->
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
'Back - end > JAVA' 카테고리의 다른 글
[ Java ] Arrays 클래스 (0) | 2023.09.03 |
---|---|
[ Java / 백준15552 ] BufferedReader & BufferedWriter (1) | 2023.08.31 |
23.05.10 / MVC 패턴 (0) | 2023.05.10 |
23.03.28 / jsp - session 내장 객체 이용한 로그인 후 권한 관리 (0) | 2023.03.28 |
23.03.27 / jsp - include 이용한 레이아웃 나누기 (0) | 2023.03.27 |