카테고리 없음

오후수업

logloglog 2020. 12. 31. 16:41

SVN : 사용툴

repository..

commit update

 

패키지를 설꼐했다가 패키지 이름을 바꿔버리면..  오류날수도있음

그니까 새로 만들고 커밋하고 복사하고 커밋하고 하는게 나음

 

멤버라는 프로그램을 웹어플리케이션을 컨버젼해볼거임 (서블릿이용해서)

 

어떤 행위를 해달라는것 자체를 커맨드라고함

사용자가 요청이있었을때 실질적으로 처리해주는놈을 커맨드객체라고함

커맨드객체를 이용해서 처리하는 패턴을 커맨드패턴이라고 한다.

커맨드패턴이용하면 사용자요청을 처리하는걸 별도로 커맨드객체라는 인터페이스에 맞춰서 분리가능

새로운 커맨드객체가 생기면 커맨드만 확장해가지고 기능을 추가할수있다

유지보수가 좋아진다.

캡슐화...

사용자 요청을 캡슐화한 객체 >> 커맨드객체

 

자바소스는 건들지않고 설정파일로 매핑해주기위해서 프로퍼티스파일을 뽑아서 설정파일을 관리하려고 한다.

 

핸들러가 컨트롤러 기능도 같이하고있는거임

web 앱 만드려면 url 설계를 해야함.. 기존엔 메인기준실행이었지만 이제 브라우저의 url로 사용자의 요청을 구분하는거임

필요한 url정보를 관리하기위한 properties

추가로 생기면 여기에 더 적어주면 됨

 

 


이게
이값임

 

 

webController는 매핑어떻게해놨음? .do 로만 시작하면 이게 실행됨 근데 이 전에 이미 초기화를 한번 했기때문에 맵안에는 이미 커맨드핸들러객체가 들어가있을테니 그안에서 꺼내쓰기만 하면 됨

 

사용자가 요청하는 url이 왔을떄 유알엘 처리할 놈  (핸들러)랑 매ㅂ핑될 프러퍼티 만들어놓고 프라퍼티 읽어서 유알엘이 키값, 객체가 밸류값으로 해서 맵에다가 하나식 담은거를 한거임 지금까지

 

 

web.controller

package kr.or.ddit.controller;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

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

import kr.or.ddit.member.handler.CommandHandler;

public class WebController extends HttpServlet {
//리스트조회하면 url통해 요청을 할거고 url을 맨처음 받아서 (사용자요청을 받아서) 적당한데로 보내는거를 컨트롤러가 한다
//사용자요청(url)을 처리하는게 컨트롤러
//서블릿은 http서블릿상속받아서 두겟두포스트 .. 이러는게 반복되니까 대표자만들어서 한놈이컨트롤러하게..그래서 이거만든거임
//모든요청은 이 웹컨트롤러가 받아서 처리하게 할거임 중복줄이기위해서
	
//	@Override
//	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		process(req,resp);//메서드를 통일한다
//	}
//	
//
//	@Override
//	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		process(req,resp);//메서드를 통일한다
//
//	}
//
//	/**
//	 * doget이든 dopost든 여기서 처리
//	 * 요청처리메서드
//	 * @param req
//	 * @param resp
//	 */
//	private void process(HttpServletRequest req, HttpServletResponse resp) {
//		
//		String reqURI = req.getRequestURI(); //요청URL가져오기
//		
//		//contetextpath : 프로젝트 구분하는 용도.. 이 패스는 요청시마다 항상있는거임
//		//url을 하나으 ㅣ키값으로 쓰고싶은데 앞에꼐속똑같은게 잇으니까 그냥 제거한 나머지 url만
//		//가지고 판단하고싶은거임. 그부분만 제거할거다
//		
//		//ContextPath 부분을 제거한 URL 가져오기
//		if(reqURI.indexOf(req.getContextPath()) == 0) {
//			reqURI = reqURI.substring(req.getContextPath().length());
//		}
//		
//		if(reqURI.equals("/member/list.do")) {
//			//목록 조회
//		}else if(reqURI.equals("/member/insert.do")) {
//			if(req.getMethod().equals("GET")) {
//				//등록하는 폼 화면으로 이동
//			}else if(req.getMethod().equals("POST")){
//				//등록작업 시작.
//			}
//		}else if(reqURI.equals("/member/update.do")) {
//			if(req.getMethod().equals("GET")) {
//				//수정하는 폼 화면으로 이동
//			}else if(req.getMethod().equals("POST")){
//				//수정작업 시작.
//			}
//		}else if(reqURI.equals("/member/delete.do")) {
//			//삭제작업
//		}
//		
		
	/**
	 * - 커맨드 패턴...
	 * 사용자 요청에 대한 실제 처리 기능을 커맨드 객체로 처리하기
	 * 
	 * Command : 사용자 요청을 캡슐화한 객체(실제 처리기능을 구현한 객체)
	 * Invoker : 사용자 요청에 대응되는 적당한 커맨드 객체를 찾아 실행해 주는 역할을 하는 객체 (invoke:호출)
	 * 
	 * 장점
	 * 요청을 처리하는 객체(Invoker)로부터 실제 수행 기능을 분리함으로서 새로운 기능을 추가하는데 보다 수월하다.
	 * => 새로운 기능(Command)를 추가할 때 기존 기능을 수정할 필요가 없다.
	 */
		
		//멤버변수부터 만들자
		//매핑 정보 저장
		private Map<String, CommandHandler> cmdHandlerMap = new HashMap<String, CommandHandler>();
		
		@Override
			public void init(ServletConfig config) throws ServletException {
				String configFilePath = config.getInitParameter("handler-config");//어떤 Url이 오면 어떤 커맨드가 동작할지 매핑정보를 handler-config에 담..나?
				Properties handlerProp = new Properties();
				
				//설정파일을 읽어서 대응되는 핸들러 객체를 생성하여 맵에 등록하기
				String configFileRealPath = config.getServletContext().getRealPath(configFilePath);
				
				FileReader fr;
				try {
					fr = new FileReader(configFilePath);
					// 파일 리더를 통해서 해당 프로퍼티스 읽기위해선 실제 경로를 가져와서 파일리더객체형성할거임
					//우리가 사용할 프러퍼티스가 저놈을 파라미터로 요구하기때문에
					handlerProp.load(fr);
				}catch(IOException e) {
					e.printStackTrace();
					throw new ServletException(e);
				}
				
				//하나하나 읽어오는 작업
				for(Object key : handlerProp.keySet()) {
					String reqUrl = (String) key;  // 앞에 유알엘값만 가져옴.. 사용자가 요청한 기능이 곧 유알엘이니까 요청=코맨드로 한거임
					//requrl=command 같은의미
					
					try {
						//클래스타입의 객체를 얻어올수있따. 위에 만든 프라퍼티객체의 겟프라퍼티안에 요청한 유알엘을 키값으로 넣으면 밸류 (클래스이름)가 나옴
						Class<?> klass = Class.forName(handlerProp.getProperty(reqUrl));// 클래스 객체정보를 가져오기위해서
						//왜 클래스객체가져왔냐? 클래스르 알고있으면 리플렉션으로 객체생성가능하니까 뉴 인스턴스로 객체생성하려고!
						CommandHandler handlerInstance = (CommandHandler) klass.newInstance();
						//맵에다가 차곡차곡 담기 유알엘 나중에 파싱하면 get(key값)넣어서 클래스ㄱ 뽑아낼수있으니까
						cmdHandlerMap.put(reqUrl, handlerInstance);						
					}catch(Exception e ) {
						throw new ServletException(e);
					}
					
				}
				Set<Map.Entry<String, CommandHandler>> entrySet = cmdHandlerMap.entrySet();
				for(Entry<String, CommandHandler> entry : entrySet) {
					System.out.println(entry.getKey() + "=>" + entry.getValue());//엔트리는 키밸류 다 가져올수잇따.
				}
		}
		
//	}//process
}//webcontroller

 

 

 

이제 준비는 다 됐고 doget 이랑 dopost 를 할거임

 

사용자는 뭐하고싶은지 url로 표현함

url바탕으로 웹컨트롤러가 맨 앞단에서 사용자요청받아가지고 이건 이 핸들러 이건 이핸들러 로 분배를 해줄거임

package kr.or.ddit.controller;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

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

import kr.or.ddit.member.handler.CommandHandler;

public class WebController extends HttpServlet {
//리스트조회하면 url통해 요청을 할거고 url을 맨처음 받아서 (사용자요청을 받아서) 적당한데로 보내는거를 컨트롤러가 한다
//사용자요청(url)을 처리하는게 컨트롤러
//서블릿은 http서블릿상속받아서 두겟두포스트 .. 이러는게 반복되니까 대표자만들어서 한놈이컨트롤러하게..그래서 이거만든거임
//모든요청은 이 웹컨트롤러가 받아서 처리하게 할거임 중복줄이기위해서
	
//	@Override
//	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		process(req,resp);//메서드를 통일한다
//	}
//	
//
//	@Override
//	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		process(req,resp);//메서드를 통일한다
//
//	}
//
//	/**
//	 * doget이든 dopost든 여기서 처리
//	 * 요청처리메서드
//	 * @param req
//	 * @param resp
//	 */
//	private void process(HttpServletRequest req, HttpServletResponse resp) {
//		
//		String reqURI = req.getRequestURI(); //요청URL가져오기
//		
//		//contetextpath : 프로젝트 구분하는 용도.. 이 패스는 요청시마다 항상있는거임
//		//url을 하나으 ㅣ키값으로 쓰고싶은데 앞에꼐속똑같은게 잇으니까 그냥 제거한 나머지 url만
//		//가지고 판단하고싶은거임. 그부분만 제거할거다
//		
//		//ContextPath 부분을 제거한 URL 가져오기
//		if(reqURI.indexOf(req.getContextPath()) == 0) {
//			reqURI = reqURI.substring(req.getContextPath().length());
//		}
//		
//		if(reqURI.equals("/member/list.do")) {
//			//목록 조회
//		}else if(reqURI.equals("/member/insert.do")) {
//			if(req.getMethod().equals("GET")) {
//				//등록하는 폼 화면으로 이동
//			}else if(req.getMethod().equals("POST")){
//				//등록작업 시작.
//			}
//		}else if(reqURI.equals("/member/update.do")) {
//			if(req.getMethod().equals("GET")) {
//				//수정하는 폼 화면으로 이동
//			}else if(req.getMethod().equals("POST")){
//				//수정작업 시작.
//			}
//		}else if(reqURI.equals("/member/delete.do")) {
//			//삭제작업
//		}
//		
		
	/**
	 * - 커맨드 패턴...
	 * 사용자 요청에 대한 실제 처리 기능을 커맨드 객체로 처리하기
	 * 
	 * Command : 사용자 요청을 캡슐화한 객체(실제 처리기능을 구현한 객체)
	 * Invoker : 사용자 요청에 대응되는 적당한 커맨드 객체를 찾아 실행해 주는 역할을 하는 객체 (invoke:호출)
	 * 
	 * 장점
	 * 요청을 처리하는 객체(Invoker)로부터 실제 수행 기능을 분리함으로서 새로운 기능을 추가하는데 보다 수월하다.
	 * => 새로운 기능(Command)를 추가할 때 기존 기능을 수정할 필요가 없다.
	 */
		
		//멤버변수부터 만들자
		//매핑 정보 저장
		private Map<String, CommandHandler> cmdHandlerMap = new HashMap<String, CommandHandler>();
		
		@Override
			public void init(ServletConfig config) throws ServletException {
				String configFilePath = config.getInitParameter("handler-config");//어떤 Url이 오면 어떤 커맨드가 동작할지 매핑정보를 handler-config에 담..나?
				Properties handlerProp = new Properties();
				
				//설정파일을 읽어서 대응되는 핸들러 객체를 생성하여 맵에 등록하기
				String configFileRealPath = config.getServletContext().getRealPath(configFilePath);
				
				FileReader fr;
				try {
					fr = new FileReader(configFilePath);
					// 파일 리더를 통해서 해당 프로퍼티스 읽기위해선 실제 경로를 가져와서 파일리더객체형성할거임
					//우리가 사용할 프러퍼티스가 저놈을 파라미터로 요구하기때문에
					handlerProp.load(fr);
				}catch(IOException e) {
					e.printStackTrace();
					throw new ServletException(e);
				}
				
				//하나하나 읽어오는 작업
				for(Object key : handlerProp.keySet()) {
					String reqUrl = (String) key;  // 앞에 유알엘값만 가져옴.. 사용자가 요청한 기능이 곧 유알엘이니까 요청=코맨드로 한거임
					//requrl=command 같은의미
					
					try {
						//클래스타입의 객체를 얻어올수있따. 위에 만든 프라퍼티객체의 겟프라퍼티안에 요청한 유알엘을 키값으로 넣으면 밸류 (클래스이름)가 나옴
						Class<?> klass = Class.forName(handlerProp.getProperty(reqUrl));// 클래스 객체정보를 가져오기위해서
						//왜 클래스객체가져왔냐? 클래스르 알고있으면 리플렉션으로 객체생성가능하니까 뉴 인스턴스로 객체생성하려고!
						CommandHandler handlerInstance = (CommandHandler) klass.newInstance();
						//맵에다가 차곡차곡 담기 유알엘 나중에 파싱하면 get(key값)넣어서 클래스ㄱ 뽑아낼수있으니까
						cmdHandlerMap.put(reqUrl, handlerInstance);						
					}catch(Exception e ) {
						throw new ServletException(e);
					}
					
				}
				Set<Map.Entry<String, CommandHandler>> entrySet = cmdHandlerMap.entrySet();
				for(Entry<String, CommandHandler> entry : entrySet) {
					System.out.println(entry.getKey() + "=>" + entry.getValue());//엔트리는 키밸류 다 가져올수잇따.
				}
		}
		
		@Override
			protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			process(req,resp); //실제처리하는 기능을 하니까 메서드로 뻈음
		}
		

		@Override
			protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			process(req,resp); //실제처리하는 기능을 하니까 메서드로 뻈음
		
		}
		
		private void process(HttpServletRequest req, HttpServletResponse resp) {
			
			//contetextpath : 프로젝트 구분하는 용도.. 이 패스는 요청시마다 항상있는거임
			//url을 하나으 ㅣ키값으로 쓰고싶은데 앞에꼐속똑같은게 잇으니까 그냥 제거한 나머지 url만
			//가지고 판단하고싶은거임. 그부분만 제거할거다
			String reqURI = req.getRequestURI(); //요청URL가져오기
			//ContextPath 부분을 제거한 URL 가져오기
			if(reqURI.indexOf(req.getContextPath()) == 0) {
				reqURI = reqURI.substring(req.getContextPath().length());
			}
			
			System.out.println("reqURI"+reqURI);
			System.out.println("cmdHandlerMap : " + cmdHandlerMap);//잘 들어있나보기
			
			CommandHandler handler = cmdHandlerMap.get(reqURI);
			
			
			
		}
//	}//process
}//webcontroller

 

이제부터 사용할 핸들러들을 정의할거임

insert 요청이 오면 ...

**war로 묶으면 WEBCONTENT아래의 파일들이 묶임

classese에 우리가 모든 컴파일한게 여기에 들어감

마치 예전에 자바 빈에 다 들어간것처럼

 

웹브라우저 입장에서는 url로 아무리 뭘 해도 web-inf안에는 접근할수없는거임

그래서 클라이언트로부터 뭔가 감추고싶은 데이터들은 web-inf폴더 밑으로 저장을할수있음

 

 

 

저 블록부분 지우고 해보

 

package kr.or.ddit.member.handler;

import java.net.URLEncoder;

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

import kr.or.ddit.member.service.IMemberService;
import kr.or.ddit.member.service.MemberServiceImpl;
import kr.or.ddit.vo.MemberVO;

public class InsertMemberHandler implements CommandHandler{
//insert는 크게 두가지 경우를 생각해야함 입력하는 폼에 정보들을 적을텐데, 그걸 가져와서 dao(ibatis)이용해서 ㅅ쓸텐데
	//처음에 무조건 폼으로 가는경우가있고, 폼에서 누르면 인서트가 일어나느 ㄴ경우가있음 이를 메서드로 구분할거임
//겟방식은 뷰페이지로 포스트방식은 실제 인서트작업(db 에 등록하는 작업)
	//웹컨트롤러가 인보커역할하고있음
	
	private static final String VIEW_PAGE = "/member/insertForm.jsp";//jsp( 웹페이지)를 webinf밑에다가 널거임
	//web-inf라는 폴더는 web.xml을 담고잇는 폴더임.. 근데 이 안에는 classes도 있음
	//이클립스안에서 개발을 하고 export할떄 WAR(웹어플리케이션을위한묶음파일)export가있음
	//웹어플리케이션은 war로 묶음 (이게 표준임) 나중에 이걸로 묶어서 배포를 하게됨
	@Override
	public boolean isRedirect(HttpServletRequest req) {//
		if(req.getMethod().equals("GET")) {//get이면 리다이렉트가 아님
			return false;
		}else{ 
			return true;
		}
	}

	
	//url로 멤버 인서트.do 왓을때의 작업..
	@Override
	public String process(HttpServletRequest req, HttpServletResponse res) throws Exception {
		if(req.getMethod().equals("GET")) { //GET방식인 경우
			return VIEW_PAGE;//인서트폼화면으로 이동할거임.. 작성하는 화면
		} else if(req.getMethod().equals("POST")) {//post인 경우는 인서트 떄려줘야함
			//인서트작업을 수행해줄거임
			
			//1. 요청 파라미터 정보 가져오기
			String memId = req.getParameter("memId");
			String memName = req.getParameter("memName");
			String memTel = req.getParameter("memTel");
			String memAddr = req.getParameter("memAddr");
			
			//2.서비스 객체가 필요함..서비스 객체 생성하기
			IMemberService memberService = MemberServiceImpl.getInstance();//서비스 날릴라고 가져옴
			
			//3. 회원정보 등록
			MemberVO mv = new MemberVO();
			mv.setMemId(memId);
			mv.setMemName(memName);
			mv.setMemTel(memTel);
			mv.setMemAddr(memAddr);
			
			int cnt = memberService.insertMember(mv);
			
			String msg = "";
			if(cnt > 0) {
				msg = "성공";
			}else {
				msg = "실패";
			}
			//여기까지는 사용자가 정보치고 그 정보가 톰캣으로 넘어와서 디비에 인서트한것뿐임 위에 유알엘은 insert.do에서 가만히있는상태
			//등록하면 목록을 보여준다던지 하니까 이제 목록화면으로 이동할거임
			
			//4. 목록 조회 화면으로 이동
			String redirectUrl = req.getContextPath() + "/member/list.do?msg="+ URLEncoder.encode(msg, "UTF-8");
			//우리 리턴타입은 스트링임
			return "redirect:" + redirectUrl;
			
//			리다이렉트는 웹컨트롤러가할거임
		}
		//이도저도 아니면 리턴 null
		return null;
	}

}

 

아무것도 아닌걸 처리하는 커맨드객체를 만들거임 > 널핸들러

package kr.or.ddit.member.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//url을 가지고 찾아봤는데 특정하게 매핑되는거 없을떄 사용하는 핸들러
public class NullHandler implements CommandHandler{

	@Override
	public boolean isRedirect(HttpServletRequest req) {
		
		return false;
	}

	@Override
	public String process(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		resp.sendError(HttpServletResponse.SC_NOT_FOUND);//얘들이 스태틱함수로 이미 상수를 정해놓음 즉 404를 써도되고 가독성을 위해 상수를 써도됨
		return null;
	}

}

 

package kr.or.ddit.controller;

import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.ddit.member.handler.CommandHandler;
import kr.or.ddit.member.handler.NullHandler;

public class WebController extends HttpServlet {
//리스트조회하면 url통해 요청을 할거고 url을 맨처음 받아서 (사용자요청을 받아서) 적당한데로 보내는거를 컨트롤러가 한다
//사용자요청(url)을 처리하는게 컨트롤러
//서블릿은 http서블릿상속받아서 두겟두포스트 .. 이러는게 반복되니까 대표자만들어서 한놈이컨트롤러하게..그래서 이거만든거임
//모든요청은 이 웹컨트롤러가 받아서 처리하게 할거임 중복줄이기위해서
	
//	@Override
//	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		process(req,resp);//메서드를 통일한다
//	}
//	
//
//	@Override
//	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		process(req,resp);//메서드를 통일한다
//
//	}
//
//	/**
//	 * doget이든 dopost든 여기서 처리
//	 * 요청처리메서드
//	 * @param req
//	 * @param resp
//	 */
//	private void process(HttpServletRequest req, HttpServletResponse resp) {
//		
//		String reqURI = req.getRequestURI(); //요청URL가져오기
//		
//		//contetextpath : 프로젝트 구분하는 용도.. 이 패스는 요청시마다 항상있는거임
//		//url을 하나으 ㅣ키값으로 쓰고싶은데 앞에꼐속똑같은게 잇으니까 그냥 제거한 나머지 url만
//		//가지고 판단하고싶은거임. 그부분만 제거할거다
//		
//		//ContextPath 부분을 제거한 URL 가져오기
//		if(reqURI.indexOf(req.getContextPath()) == 0) {
//			reqURI = reqURI.substring(req.getContextPath().length());
//		}
//		
//		if(reqURI.equals("/member/list.do")) {
//			//목록 조회
//		}else if(reqURI.equals("/member/insert.do")) {
//			if(req.getMethod().equals("GET")) {
//				//등록하는 폼 화면으로 이동
//			}else if(req.getMethod().equals("POST")){
//				//등록작업 시작.
//			}
//		}else if(reqURI.equals("/member/update.do")) {
//			if(req.getMethod().equals("GET")) {
//				//수정하는 폼 화면으로 이동
//			}else if(req.getMethod().equals("POST")){
//				//수정작업 시작.
//			}
//		}else if(reqURI.equals("/member/delete.do")) {
//			//삭제작업
//		}
//		
		
	/**
	 * - 커맨드 패턴...
	 * 사용자 요청에 대한 실제 처리 기능을 커맨드 객체로 처리하기
	 * 
	 * Command : 사용자 요청을 캡슐화한 객체(실제 처리기능을 구현한 객체)
	 * Invoker : 사용자 요청에 대응되는 적당한 커맨드 객체를 찾아 실행해 주는 역할을 하는 객체 (invoke:호출)
	 * 
	 * 장점
	 * 요청을 처리하는 객체(Invoker)로부터 실제 수행 기능을 분리함으로서 새로운 기능을 추가하는데 보다 수월하다.
	 * => 새로운 기능(Command)를 추가할 때 기존 기능을 수정할 필요가 없다.
	 */
		
		//멤버변수부터 만들자
		//매핑 정보 저장
		private Map<String, CommandHandler> cmdHandlerMap = new HashMap<String, CommandHandler>();
		
		@Override
			public void init(ServletConfig config) throws ServletException {
				String configFilePath = config.getInitParameter("handler-config");//어떤 Url이 오면 어떤 커맨드가 동작할지 매핑정보를 handler-config에 담..나?
				Properties handlerProp = new Properties();
				
				//설정파일을 읽어서 대응되는 핸들러 객체를 생성하여 맵에 등록하기
				String configFileRealPath = config.getServletContext().getRealPath(configFilePath);
				
				FileReader fr;
				try {
					fr = new FileReader(configFilePath);
					// 파일 리더를 통해서 해당 프로퍼티스 읽기위해선 실제 경로를 가져와서 파일리더객체형성할거임
					//우리가 사용할 프러퍼티스가 저놈을 파라미터로 요구하기때문에
					handlerProp.load(fr);
				}catch(IOException e) {
					e.printStackTrace();
					throw new ServletException(e);
				}
				
				//하나하나 읽어오는 작업
				for(Object key : handlerProp.keySet()) {
					String reqUrl = (String) key;  // 앞에 유알엘값만 가져옴.. 사용자가 요청한 기능이 곧 유알엘이니까 요청=코맨드로 한거임
					//requrl=command 같은의미
					
					try {
						//클래스타입의 객체를 얻어올수있따. 위에 만든 프라퍼티객체의 겟프라퍼티안에 요청한 유알엘을 키값으로 넣으면 밸류 (클래스이름)가 나옴
						Class<?> klass = Class.forName(handlerProp.getProperty(reqUrl));// 클래스 객체정보를 가져오기위해서
						//왜 클래스객체가져왔냐? 클래스르 알고있으면 리플렉션으로 객체생성가능하니까 뉴 인스턴스로 객체생성하려고!
						CommandHandler handlerInstance = (CommandHandler) klass.newInstance();
						//맵에다가 차곡차곡 담기 유알엘 나중에 파싱하면 get(key값)넣어서 클래스ㄱ 뽑아낼수있으니까
						cmdHandlerMap.put(reqUrl, handlerInstance);						
					}catch(Exception e ) {
						throw new ServletException(e);
					}
					
				}
				Set<Map.Entry<String, CommandHandler>> entrySet = cmdHandlerMap.entrySet();
				for(Entry<String, CommandHandler> entry : entrySet) {
					System.out.println(entry.getKey() + "=>" + entry.getValue());//엔트리는 키밸류 다 가져올수잇따.
				}
		}
		
		@Override
			protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			process(req,resp); //실제처리하는 기능을 하니까 메서드로 뻈음
		}
		

		@Override
			protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			process(req,resp); //실제처리하는 기능을 하니까 메서드로 뻈음
		
		}
		
		private void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
			
			//contetextpath : 프로젝트 구분하는 용도.. 이 패스는 요청시마다 항상있는거임
			//url을 하나으 ㅣ키값으로 쓰고싶은데 앞에꼐속똑같은게 잇으니까 그냥 제거한 나머지 url만
			//가지고 판단하고싶은거임. 그부분만 제거할거다
			String reqURI = req.getRequestURI(); //요청URL가져오기
			//ContextPath 부분을 제거한 URL 가져오기
			if(reqURI.indexOf(req.getContextPath()) == 0) {
				reqURI = reqURI.substring(req.getContextPath().length());
			}
			
			System.out.println("reqURI"+reqURI);
			System.out.println("cmdHandlerMap : " + cmdHandlerMap);//잘 들어있나보기
			
			CommandHandler handler = cmdHandlerMap.get(reqURI);
			
			if(handler == null) {
				handler = new NullHandler();
			}
			//여기까지 왓따면 핸들러가 널인경우는 없음 
			//뷰를 담을 객체선언
			String viewPage = ""; // 뷰화면정보
			try{
				viewPage = handler.process(req, resp);
			}catch(Exception e) {
				e.printStackTrace();
				throw new ServletException(e);
			}
			
			System.out.println("viewPage : " + viewPage);
			
			//VIEW 화면처리
			if(viewPage != null) {//뷰페이지가 존재하면
				//우리가 아까 리다이렉트속성을 넣었으므로 리다이렉트를 시켜줘야할 뷰인지 포워드를 시켜줘야할지 
				if(handler.isRedirect(req)) {
					resp.sendRedirect(viewPage);//viewpage로 리다이렉트 시켜주면 됨
				}else {//redirect 가 아님. 포워딩시켜야함
					RequestDispatcher dispatcher = req.getRequestDispatcher(viewPage);
					dispatcher.forward(req, resp);//jsp도 거의 서블릿...이므로 걔도 req,resp객체가 필요하므로 포워딩할떄 같이 던져주고있는것
				}
				
			}
			
			
		}
//	}//process
}//webcontroller

 


이제 인서트하는 화면만들러

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>신규회원 등록</title>
</head>
<body>
	<form action="insert.do" method="post">
		<table>
			<tr>
				<td>I D :</td>
				<td><input type="text" name="memId" value=""></td>
			</tr>
			<tr>
				<td>이름 :</td>
				<td><input type="text" name="memName" value=""></td>
			</tr>
			<tr>
				<td>전화번호 :</td>
				<td><input type="text" name="memTel" value=""></td>
			</tr>
			<tr>
				<td>주소 :</td>
				<td><textarea name="memAddr"></textarea></td>
			</tr>
		</table>
			<input type="submit" value="회원등록">
	</form>
</body>
</html>

오류수정
이부분을 잘못봐서 오류가났엇다

 

 

 

 

인코딩문제> 필터옮기자 만들어놓은거

servlet테스트에서 카피해서

 

web.xml도 필터부분만

 

 

 

 

 


 

 

package kr.or.ddit.member.handler;

import java.util.List;

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

import kr.or.ddit.member.service.IMemberService;
import kr.or.ddit.member.service.MemberServiceImpl;
import kr.or.ddit.vo.MemberVO;

public class ListMemberHandler implements CommandHandler{

	private static final String VIEW_PAGE = "/member/list.jsp";
	
	@Override
	public boolean isRedirect(HttpServletRequest req) {
		return false;//리다이렉트 ㅎ할필요없음 
	}

	@Override
	public String process(HttpServletRequest req, HttpServletResponse res) throws Exception {
		//1. 서비스 생성하기
		IMemberService memberService = MemberServiceImpl.getInstance();
		
		//2. 회원정보 조회
		List<MemberVO> memList = memberService.getMemberAll();
		
		req.setAttribute("memList", memList);
		
		return VIEW_PAGE;
	}

}

ㄹmember폴터안에 list.jsp 만들고, 

 

리퀘스트객체나 세션객체 기본으로 제공해준다

 

<%@page import="kr.or.ddit.vo.MemberVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	List<MemberVO> memList=(List<MemberVO>)request.getAttribute("memList");
	String msg = request.getParameter("msg") == null? "" : request.getParameter("msg");
	
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원 목록</title>
</head>
<body>
	<table border="1">
		<tr>
			<td colspan="4"><a href="insert.do">[회원등록]</a></td>
		</tr>
		<tr>
			<td>ID</td>
			<td>이름</td>
			<td>전화번호</td>
			<td>주소</td>
		</tr>
		<%
			int memSize = memList.size();
		if(memSize > 0){
			for(int i = 0 ; i<memSize; i++){
		%>	
		<tr>
			<td><%=memList.get(i).getMemId() %></td>
			<td><a href="select.do?memId=<%=memList.get(i).getMemId()%>"><%=memList.get(i).getMemName()%></a></td>
			<td><%=memList.get(i).getMemTel() %></td>
			<td><%=memList.get(i).getMemAddr() %></td>
		</tr>
		<% 		
			}
		}else{//회원정보가 존재하지 않으면..
		%>
			<tr>
				<td colspan="4">회원정보가 없습니다.</td>
			</tr>
		<% 	
		}
		%>
	</table>
	
	<%if(msg.equals("성공")){ %>
		<script>
			alert('정상적으로 처리되었습니다.')
		</script>
	<% }%>
</body>
</html>

동적으로 바뀌도록 프로그래밍 해준거임

 

이제 확인해보자

 

 

 


 

SELECT

 

package kr.or.ddit.member.handler;

import java.util.List;

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

import kr.or.ddit.member.service.IMemberService;
import kr.or.ddit.member.service.MemberServiceImpl;
import kr.or.ddit.vo.MemberVO;

public class SelectMemberHandler implements CommandHandler{
	
	private static final String VIEW_PAGE = "/member/select.jsp";
	
	@Override
	public boolean isRedirect(HttpServletRequest req) {
		return false;
	}

	@Override
	public String process(HttpServletRequest req, HttpServletResponse res) throws Exception {
		
		//사용자가 뭔가 select한다는건..  목록에서 a태그 클릭했을ㅇ때 memId가 넘어옴
		String memId = req.getParameter("memId");
		
		// 1. 회원정보 조회
		MemberVO mv = new MemberVO();
		mv.setMemId(memId);
		
		IMemberService memberService = MemberServiceImpl.getInstance();
		//search기능 이용해보자
		List<MemberVO> memList = memberService.getSearchMember(mv);
		
		req.setAttribute("memVO", memList.get(0));
		
		return VIEW_PAGE;
	}

}

 

select.jsp

 

<%@page import="kr.or.ddit.vo.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    MemberVO memVO = (MemberVO) request.getAttribute("memVO");
    
    String memAddr = memVO.getMemAddr().replaceAll(System.lineSeparator(), "<br>");
    %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원정보</title>
</head>
<body>
	<table border="1">
		<tr>
			<td>I D:</td>
			<td><%=memVO.getMemId() %></td>
		</tr>
		<tr>
			<td>이름 :</td>
			<td><%=memVO.getMemName() %></td>
		</tr>
		<tr>
			<td>전화번호:</td>
			<td><%=memVO.getMemTel() %></td>
		</tr>
		<tr>
			<td>주소:</td>
			<td><%=memVO.getMemAddr() %></td>
		</tr>
		<tr>
			<td colspan="2">
				<a href="list.do">[목록]</a>
				<a href="update.do?memId=<%=memVO.getMemId()%>">[회원정보 수정]</a>
				<a href="delete.do?memId=<%=memVO.getMemId()%>">[회원정보 삭제]</a>
			</td>
		</tr>
	</table>
</body>
</html>