JSP, JSTL3

정재호·2024년 8월 26일

https://bongra.tistory.com/360
[JAVA] 자바(JAVA) : XML데이터에서 원하는 태그(Tag)의 데이터값을 추출하는 방법

dao - (모델) 에 접근후 DB 에 접근

MVC패턴 쓰는 이유

  • 유지보수가 좋다.

웹에서만의 단점
컨트롤러들이 문제 - Servlet
쓰는이유 : Java파일을 서버에서 실행시키기위해서
단점 : 특정 클래스 상속

  • http 상속
  • http 기능이 많아서 생각보다 무겁다
    서버비용이 비싼데
    Servlet이 많을수록(기능이 많을수록) 비싸고 무거워진다.
    용량을 줄일 수 있을까?

하나로 합치자

Servlet 가운데 하는 컨트롤러
앞에서 받아들인다
Front Controller



url이 있어야 찾아갈 수 있습니다.

클래스와 연결해주는 주소를 달아주는거
요청시 FrontController라고 합니다.

  • URL Mapping

뭘 눌러서 FrontController로 온건지 알 수 없습니다.
규칙을 만듭니다. @WebServlet(".do")
전체를 오게하겠다. @WebServlet("*.do")

ex) 로그인 0826
ex) logout.do
하면 FrontController로 옵니다.

     <form action="login.do"method="post">

이걸로 하고있음

package com.front;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("프론트 컨트롤러 실행");
	
	}

}


contextpath

  • join.do 만 남기게끔 만듭니다.

특정 문자기준 잘라내기
substring() 몇번째를 잘라낼껀지

JoinController 꺼를 가져와서 FrontController에다가 넣습니다.

if(url.equals("/join.do")){

request.setCharacterEncoding("EUC-KR");
			
			String id = request.getParameter("id");
			String pw = request.getParameter("pw");
			String nick = request.getParameter("nick");
			
//			System.out.println(id + "/" + pw + "/" + nick);
			
			WMemberVO vo = new WMemberVO(id, pw, nick);
			
			WMemberDAO dao = new WMemberDAO();
			
			int cnt = dao.join(vo);
			
			if(cnt > 0) {
				System.err.println("회원가입 성공!");
			}else {
				System.err.println("회원가입 실패.");
			}
			
			response.sendRedirect("main.jsp");

}

package com.front;

import java.io.IOException;
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 com.model.WMemberDAO;
import com.model.WMemberVO;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("프론트 컨트롤러 실행");
	
		// 1.client가 요청한 전체 url 가져오기
		// requestURL 변수명에 담아줌
		String requestURL = request.getRequestURI();
		
		//System.out.println(requestURL);
		
		// 2.Context Path 가져오기
		String contextPath = request.getContextPath();
		
		//System.out.println(contextPath);
		
		// 3.요청 url만 가져오기
		String url = requestURL.substring(contextPath.length());
		
		System.out.println(url);
		
		if(url.equals("/join.do")) {
			
			request.setCharacterEncoding("EUC-KR");
			
			String id = request.getParameter("id");
			String pw = request.getParameter("pw");
			String nick = request.getParameter("nick");
			
//			System.out.println(id + "/" + pw + "/" + nick);
			
			WMemberVO vo = new WMemberVO(id, pw, nick);
			
			WMemberDAO dao = new WMemberDAO();
			
			int cnt = dao.join(vo);
			
			if(cnt > 0) {
				System.err.println("회원가입 성공!");
			}else {
				System.err.println("회원가입 실패.");
			}
			
			response.sendRedirect("main.jsp");
		}
		
		
		
	}

}

loginController, logout~, list~
도 옮겨줍니다.

FrontController
객체지향..?

  • Servlet인 이유 web에서 사용중이니까
  • FONRTCONTROLLER 하나에서 다 처리하니까 유지보수가 어렵다
  • SOLID 이니까 다시 요청시 쪼개줌

단순한 CLASS로 쪼갭니다.

Command Pattern

  • 종업원같은 사람 각각의 임무를 클래스한테 명령을 내립니다.

MVC 로그인, 로그아웃 시 > 컨트롤러 감

FrontController join 기능을 다시 잘라냅니다.

일반커맨드인 join controller .class 에 시키고
다시 받아서 안내를 해줍니다.
<요리 식당과 동일합니다.>

  • 리턴타입이 중요합니다.

  • url이 문자열이니 String으로 다시 알려줍니다.

  • throws Exception
    쓰는 사람이 알아서 해결하겠지 기능을 쓴다면 거기서 예외처리

  • try catch
    폭탄이 터질꺼 같아 내가 직접 해체

public String execute() throws Exception{
		request.setCharacterEncoding("EUC-KR");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String nick = request.getParameter("nick");
		
//		System.out.println(id + "/" + pw + "/" + nick);
		
		WMemberVO vo = new WMemberVO(id, pw, nick);
		
		WMemberDAO dao = new WMemberDAO();
		
		int cnt = dao.join(vo);
		
		if(cnt > 0) {
			System.err.println("회원가입 성공!");
		}else {
			System.err.println("회원가입 실패.");
		}
		
		response.sendRedirect("main.jsp");
	}

request, response 객체가 필요하고 받아오면 됩니다.

빨간줄은 return 없어서 그래요

		response.sendRedirect("main.jsp");

요리사가 만들어서 손님한테 주는 느낌이라서
return "main.jsp"; 바꿔줌

throws ServletException, IOException
부분수정

package com.controller;

import java.io.IOException;

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

import com.model.WMemberDAO;
import com.model.WMemberVO;

public class JoinController {

	public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		
		request.setCharacterEncoding("EUC-KR");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String nick = request.getParameter("nick");
		
//		System.out.println(id + "/" + pw + "/" + nick);
		
		WMemberVO vo = new WMemberVO(id, pw, nick);
		
		WMemberDAO dao = new WMemberDAO();
		
		int cnt = dao.join(vo);
		
		if(cnt > 0) {
			System.err.println("회원가입 성공!");
		}else {
			System.err.println("회원가입 실패.");
		}
		
		return "main.jsp";
	}
	
	
}

모두 써야되서 > public
문자열 > String
request , response >

  • 로그인 컨트롤러에 넣기
    public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

  • 프론트 컨트롤러에서 가져오기
    가져옵니다.

  • 로그인 컨트롤러에 가져온거 넣기

else if(url.equals("/login.do")) {
			LoginController command = new LoginController();
			String moveURL = command. execute (request, response) ;
			response.sendRedirect(moveURL);
			

여기서 response.sendRedirect(moveURL); 사용

			LogoutController command = new LogoutController();
			String moveURL = command.execute(request, response);
			response.sendRedirect(moveURL);

쓸 객체 생성 > command
어떻게 실행? command.execute
다시 url 주소 주기 > sendRedirect

package com.front;

import java.io.IOException;
import java.util.ArrayList;

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.controller.JoinController;
import com.controller.ListController;
import com.controller.LoginController;
import com.controller.LogoutController;
import com.model.WMemberDAO;
import com.model.WMemberVO;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("프론트 컨트롤러 실행");
	
		// 1.client가 요청한 전체 url 가져오기
		// requestURL 변수명에 담아줌
		String requestURL = request.getRequestURI();
		
		//System.out.println(requestURL);
		
		// 2.Context Path 가져오기 / 필요부분만 잘라내기
		String contextPath = request.getContextPath();
		
		//System.out.println(contextPath);
		
		// 3.요청 url만 가져오기
		String url = requestURL.substring(contextPath.length());
		
		System.out.println(url);
		
	
		if(url.equals("/join.do")) {
			
			JoinController command = new JoinController();
			String moveURL = command. execute(request, response);
			response.sendRedirect(moveURL);
			
		}else if(url.equals("/login.do")) {
			LoginController command = new LoginController();
			String moveURL = command. execute (request, response) ;
			response.sendRedirect(moveURL);
			
		}else if(url.equals("/logout.do")) {
			LogoutController command = new LogoutController();
			String moveURL = command.execute(request, response);
			response.sendRedirect(moveURL);
			
		}else if(url.equals("/list.do")) {
			ListController command = new ListController();
			String moveURL = command.execute(request, response);
			response.sendRedirect(moveURL);
		}
		
		
		
	
	}

}

package com.front;

import java.io.IOException;
import java.util.ArrayList;

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.controller.JoinController;
import com.controller.ListController;
import com.controller.LoginController;
import com.controller.LogoutController;
import com.model.WMemberDAO;
import com.model.WMemberVO;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("프론트 컨트롤러 실행");
	
		// 1.client가 요청한 전체 url 가져오기
		// requestURL 변수명에 담아줌
		String requestURL = request.getRequestURI();
		
		//System.out.println(requestURL);
		
		// 2.Context Path 가져오기 / 필요부분만 잘라내기
		String contextPath = request.getContextPath();
		
		//System.out.println(contextPath);
		
		// 3.요청 url만 가져오기
		String url = requestURL.substring(contextPath.length());
		
		System.out.println(url);
		
		String moveURL = null;

		if(url.equals("/join.do")) {
			JoinController command = new JoinController();
			moveURL = command.execute(request, response);
		}else if(url.equals("/login.do")) {
			LoginController command = new LoginController();
			moveURL = command. execute(request, response);
		}else if(url.equals("/logout.do")) {
			LogoutController command = new LogoutController();
			moveURL = command. execute(request, response);
		}else if(url.equals("/list.do")) {
			ListController command = new ListController();
			moveURL = command. execute(request, response);

			response. sendRedirect(moveURL);
		}
		
		
	
	}

}

추상메서드

  • 추상클래스
  • 인터페이스

자바에서 상속은 1개
인터페이스는 상속 여러개 (틀을 지정)

public String execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

추상적 정의되어있지 않고 ;로 되어있음
로그인 컨트롤러에는 로그인이 들어가있음
각각 클래스마다 다르게 되어있습니다.

강제적으로 틀을 만들기 위함입니다.
excute로 구현가능하게 만듭니다.


  • 통일화, 확장성 > 개발방식 통일(스타일), 분업화, 유지보수, 부모로 Command

List, LogoutController , login~, join
implements Command 붙여넣기
excute에서 쓸 수 있게했음

인터페이스와 추상클래스는 객체 못만듬 (생성 x)
Command comand = null; 객체 변수 선언은 가능(공간)

new 객체생성이 command로 들어감
데이터타입이 Command 그러나
사진에 new 뒤에꺼는 다 자식 > 부모타입으로 올라감

  • 형변환 업캐스팅

커맨드를 구현한 자식클래스는 부모타입으로 변환된다하더라도
호출하는순간 자식의 메서드가 구현된다.

묶으면 if문에서 할 필요없이 밖에서 처리가능하다.

package com.front;

import java.io.IOException;
import java.util.ArrayList;

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.controller.JoinController;
import com.controller.ListController;
import com.controller.LoginController;
import com.controller.LogoutController;
import com.controller.UpdateController;
import com.model.WMemberDAO;
import com.model.WMemberVO;

@WebServlet("*.do")
public class FrontController extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		System.out.println("프론트 컨트롤러 실행");
	
		// 1.client가 요청한 전체 url 가져오기
		// requestURL 변수명에 담아줌
		String requestURL = request.getRequestURI();
		
		//System.out.println(requestURL);
		
		// 2.Context Path 가져오기 / 필요부분만 잘라내기
		String contextPath = request.getContextPath();
		
		//System.out.println(contextPath);
		
		// 3.요청 url만 가져오기
		String url = requestURL.substring(contextPath.length());
		
		System.out.println(url);
		
		String moveURL = null;
		
		Command command = null;

		if(url.equals("/join.do")) {
				command = new JoinController();
			}else if(url.equals("/login.do")) {
				command = new LoginController();
			}else if(url.equals("/logout.do")) {
				command = new LogoutController();
			}else if(url.equals("/list.do")) {
				command = new ListController();
			}else if(url.equals("/update.do")) {
				command = new UpdateController();

			moveURL = command.execute(request, response) ;
			response.sendRedirect(moveURL);

			}
		
		
	
	}

}
profile
성장하는 하루가 되자

0개의 댓글