카테고리 없음

0223 오전

logloglog 2021. 2. 23. 12:50

싱글톤패턴으로 만든거 없애야댐

코드의 디자인패턴의 싱글톤패턴을 날려야하고

인스턴스를 이제 여기서기서 생성하지 않고 initlistener 에서 인스턴스

 

싱글톤은 현상자체 (인스턴스하나만만들어서쓰는)이고

그걸 하기위한 코드디자인패턴이 우리원래쓰던 싱글톤 디자인패턴임

그 디자인패턴을 없앨거임

 

static 다 없애고 getInstance도 삭제

 

외부에서 인스턴스못만들도록 하기위함이었기떄문에 모든 싱글톤패턴자체를 쓰면안됨

우리가 new instance 를 하면 안됨

 

서비스임플에 new 어쩌구. getInstance 다 지우고 싱글턴패턴도 지우기

 

*타입에 근거해서 변수명을 만드는게 낫다.

 

name : setmethod 이름이랑 같아야하고

ref-value는 안에들어갈 인스턴스인데 그게 저 id랑 같은거고 결국 그 id인거임

 

invoke는 set메서드 호출한거임 결과물에서 invoke어쩌구부터가 조립한거임

결국 인스턴스조립은 리스너가 한거고 우리는 주문서만 쓴거임 얘랑얘랑 조립해달라구

 

 

맵꺼내는 어플리케이션ㅅ컨텍스트도 이제 setmethod만 넣으먼 알아서만들어지게?만들거임?

 

 

classes안에 application contexct.xml 이 들어감. 이프로젝트가 배포되었을때의 실제물리적경로를 was가 알고잇음 was가 root임. 
이걸 서블릿컨텍스트가 알고있음. 이 물리적경로는 어디에배포되느냐에 따라 다를수있기떄문에. 여기까지를 classpath라고 기호화시킨거임

 

was까지는 getrealpath로 땡기고 web-inf/classese까지를 classpath라고 기호화시킨;거임

그다움부터는 내가만든 패키지경로랑똑같음 /를 파일 seperator로 바꾸면 됨

 

 

 

 

이렇게 하면 application context를 읽을수있게됨

 

이제부터 그 xml을 xml리더를 이용해서 읽는다.

그냥 파일리더로 읽는건 그냥 text를 읽는거니까 소용없음

xml을 읽어주는 DocumentBuilderFactory 이용

 

text지만 태그형태로 인지해서 트리를 쫙 만듬 (parse()) document안에

뭐안에 뭐가있고 이런걸 알게됨

이제꺼내쓰면됨

 Element root = document.getDocumentElement();//최상위요소 (root element) 뽑기
         NodeList beans = root.getElementsByTagName("bean"); // <beans> <bean id="identify" class="class Type"

root는 beans!

beans안의 bean을 읽어옴

 

그 빈들에 대해서 인스턴스만들어서 넣어야하니까 맵 준비

맵을 만들어놓으면 실제로 사용하는건 핸들러

 

빈 콘테이너 안에 인스턴스들을 만들어서 조립해놓고

그걸 생성하고(이건 톰캣이 진행할떄 만들어야하니까 initlistener로 만듦)  어딘가에선 그걸 사용할거임(액셔너.(=핸들러))

액셔너? 요청이왔을때 실제로 실행하는놈이 이놈이기때문.. 스프링에선 핸들러랑 액셔너가 별개이기때문에 일부러 액셔너라고 한것

 

암튼 빈콘테이너안의 인스턴스들을 구체화시켜야함. > MAp으로 만들자. 맵을 왜씀? 이름을 주니까 꺼내쓰기 쉬움

앞에는 이름. 알맹이는 인스턴스 .. 타입은 뭐가올지모르니까 <String ,object> 

여기서 문제가 생김.오브젝트의 타입이 뭔지 모르니까 . 안다고해도 각각 일일히 다 캐스팅 못함..

이게 객체지향의 치명적인 핸디캡임

 

그래서 만들어낸게 리플렉션

이게뭐임? 인스턴스에게 너 누구냐 하고 물어보는거임

리플렉션으로 만든 연산자가 instanceOf임!! 이게 너 누구냐 하는 메서드임

인스턴스가 오는데 이게 무슨타입인지 모를때 너 memvo냐 memberdao냐 묻는게 instanceOf인거임 이게 리플렉션임

리플렉션에서 가장 핵심인놈 invoke()

타입은 모르지만 이거안에 이거 실행해~ 필요한파라미터는 줄테니까 ~ 하는넘임

 

해당인스턴스에다가 매서드인스턴스때려버리면 그 인스턴스가 가지고있는 매서드 다 끄집어내서 그 매서드에 관한 정보를 다 알수잇음 (파라미터나 리턴타입등) 

매서드를 끄집어내서 실행하는게 invoke

method와 invoke로 셋메서드를 건들수있게되는거

 

셋메서드에 대한 힌트를 어플리케이션컨텍스트의 name이 주는거임

 

암튼 이 맵을 쓸건데

초기화시 initListner도 쓰고 액셔너도 쓰는데 그 맵을 감싸고있는 클래스가 application context임

그 어플리케이션컨택스트 그 맵을 어떻게 조직해야하는지 적어놓은게 어플리케이션컨텍스트.xml인거임

그걸 읽어서 initialize시키는게 initlistener임

 

xml이 주문서고 그걸 읽어서 initializing(초기화)시키는게 리스너

그걸 조립하는과정에 setmethod의 호출이불가피하게되기때문에

메서드를 다 꺼내보게됨(너 이런 셋메서드있어?잇으면 뭐넣어줌) 그떄필요한게 리플렉션임(무슨타입인지모르니까)

 

package com.jquery.handler;

import java.util.HashMap;
import java.util.Map;

public class ApplicationContext {
//나중에 액셔너가, 핸들러가 써야하는데 맵을 리스너에 만들어버리면 핸들러에서 꺼내쓰기가 껄끄러워지기떄문에
/*//	맵을 여기서 꺼내만들수있게
//	리스너는 셐팅하는거고
//	이걸써야하는데 (맵ㄴ을) 암튼.. 밖에만든거임
*/
	private static Map<String, Object> applicationContext = new HashMap<String, Object>();

	private ApplicationContext() {}

	public static Map<String, Object> getApplicationContext() {
		return applicationContext;
	}
}

xml읽었고 구조읽었고

그거에대한 맵 가져왓고

읽으면서 이제 맵에 넣으면 됨

 

일단 조립하려고 하더래도 그 인스턴스가 있어야함

조립보다먼저

일단 하는건 bean들을 읽으면서 인스턴스들을 다 만들어냄

즉 안의 프로퍼티는 무시하고 빈태그만 읽으면서 인스턴스를 쫙 읽고 그담에!조립하는거임

 

for (int i = 0; i < beans.getLength(); i++) {/

빈만 뒤져가면서

 

Node bean = beans.item(i);

 bean : 빈태그 말하는거임

 

 

public class InitListener implements ServletContextListener {//[웹 어플리케이션이 시작되거나 종료될 때 호출할 메서드를 정의한 인터페이스]를 구현한 클래스 (InitListener). 서블릿컨텍스트리스너를 구현하면, 컨텍스트리스너가 된다. 얘는
   //두 메서드를 구현해야하는데, contextInitialized(어플리케이션이 시작될떄 호출)와  contextDestroyed(어플리케이션이 종료될떄 호출) 이다.

   //서블릿ㅌ콘텍스트가 서블릿컨텍스트이벤트객체로부터 두 메서드로 전달되어진다.
   public void contextInitialized(ServletContextEvent ctxEvent)  { //**(알고있기)이벤트는 항상 이벤트의 발생된 element 를 항상 같이 가져옴.모니터를 클릭하면클릭이벤트뿐만 아니라 해당객체(모니터)도 같이있음
      //서블릿컨텍스트이벤트안에 서블릿컨텍스트가 있다는거임
	   ServletContext ctx = ctxEvent.getServletContext();//컨텍스트를 얻어온다.

      String beanConfigXml = ctx.getInitParameter("contextConfigLocation");//web.xml파일에 등록한 초기화 파라미터값 조회(web.xml에 contextparam의 paramname이 이거임), config란 자바클래스파일을 설정파일로이용하겠다는뜻
      beanConfigXml = ctx.getRealPath("/") //webapp 까지를 의미 배포폴더까지가지고오는거임 
            + beanConfigXml.replace("classpath:", "/WEB-INF/classes/").replace("/", File.separator);//replace(a,b):a라는문자열이있을경우b로치환
      // " / " 는 OS에 맞는 구분자 주기위해서 넣어둔거임 그럼 경로가 나올테니까 그때 파일을 읽어냄
      ///WEB-INF/classes/ 여기가 클래스배포폴더임
      

      if (beanConfigXml == null)
         return;

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// documentbuilderfactory:문서를읽기위한공장
      try {
         DocumentBuilder documentBuilder = factory.newDocumentBuilder();//xml문서를 document로파싱
         Document document = documentBuilder.parse(beanConfigXml);//아까뽑은..paramvalue는 application context.xml이엇음
         Element root = document.getDocumentElement();//최상위요소 (root element) 뽑기
         NodeList beans = root.getElementsByTagName("bean"); // <beans> <bean id="identify" class="class Type"
                                                // ></bean> </beans>

         Map<String, Object> applicationContext = ApplicationContext.getApplicationContext(); // application context  // handler pakage에 있는 map만 따로빼놓은 ..거기에 get어쩌구는 applicationconetext 라는맵리턴함
                                                                           // map

         for (int i = 0; i < beans.getLength(); i++) {//bean의 갯수만큼반복

            // System.out.println(beans.item(i).getNodeName());

            Node bean = beans.item(i);//빈 하나씩꺼내서 bean
            if (bean.getNodeType() == Node.ELEMENT_NODE) {//getNodeType가 node의 타입을 분별.. element노드,text노드등이있는데 그중 그중에 element타입만.text제외한 <>태그같은거만 엘리먼트노드임
               Element ele = (Element) bean; //bean을 요소타입으로 형변환
               String id = ele.getAttribute("id");//bean의 아이디뽑기
               String classType = ele.getAttribute("class");//class 의 경로뽑기// 인스턴스의 대상이됨

               // map instance put
               Class<?> cls = Class.forName(classType);//class.forname에 경로를 넣으면 class 오브젝트를 리턴함 //타입은 모르지만 클래스가 만들어짐
               Object targetObj = cls.newInstance();//인스턴스만듦

               //맵에넣어야할키값과 인스턴스가 만들어졌으므로 넣자.
               applicationContext.put(id, targetObj);//이름이랑 클래스객체담음

 

여기까지가 인스턴스 만든거임

여기까지의 결과 인스턴스를 생성하고있는 로그이다.

 

이제 조립해야하니까 또 다시 ,bean돌리면서 프로퍼티가 있는지없는지 확인

 

네임이랑 레퍼런스밸류가지고오기

네임은 셋메서드레퍼런스는 주입해야할 인스턴스고 이건 맵에있는거임 (셋메서드는 잠깐놔두고)

이게 맵에 들어가있는 키값임

 

 for (Method method : methods) {//여기서 온갖 메서드 다 가져오고
                        // 의존성 여부 확인
                        if (method.getName().equals(setMethodName)) {//뽑은 메서드중에 setXXXX형태가있으면

일단 그런 셋메서드가 있는지 확인해봐야함

method 다 꺼내오고 그중에 name으로 준 셋메서드가 잇는지는 확인해야함

 

그 메서드 이름이 setMEthodNAme (셋붙이고 첫글자대문자로 바꾼..)과 같은지 보는거임

있으면!

 

  method.invoke(applicationContext.get(eleBean.getAttribute("id")),applicationContext.get(ref));//맵에서 bean의id를 키값으로 뽑고,맵에서 레퍼런스밸류를키값으로뽑기

셋메서드 뽑아서 알아서해라(invoke) 넣어야함 (셋메서드 호출)

invoke(인스턴스,메서드안에들어갈파라미터)

 

이떄 조립이된다.

 

 

[invoke]com.jquery.service.MemberServiceImpl@549b85b0:com.jquery.mybatis.OracleIBatisSqlSessionFactory@7dd9880a
[invoke]com.jquery.service.BoardServiceImpl@6c442fba:com.jquery.dao.BoardDAOImpl@5dec73e0
[invoke]com.jquery.service.BoardServiceImpl@6c442fba:com.jquery.dao.ReplyDAOImpl@31a576a0
[invoke]com.jquery.service.BoardServiceImpl@6c442fba:com.jquery.dao.AttachDAOImpl@16b9e04

주입하고있는거임. 실제로 주입되고있는 로그임..  맵안의 인스턴스꺼내와서 그냥주소값찍힌거임

 

 

ex)

 

여기이름을 이상하게주면
여기가 null 이뜸 왜? 그런 bean이 없으니까

 

 

 


이제 컨트롤단을 뒤집을거임

어떻게? 액션에서 사용하고잇는 각가의 서비스들을 의존을 덜하게 (결합도가 낮게) 만들어야함

 

url을 정의하고 거기에대해서 핸들러를 만듦

우리는 아주편협하게 url을 키로, 핸들러를 인스턴스로 매칭시켜서 맵에넣고있음

 

그 맵을 서블릿에서 쓰고잇음

 

왜?

 

사용자는 리퀘스트를 보내는데, 이떄 유알엘이 옴

그 유알엘을 서블릿이 꺼낼수있고 그 유알엘을 키로 맵에서 핸들러를 꺼내고있는거임

 

근데 사실은 이 맵을 서블릿에서 하고잇는데, (웹컨트롤러에있음) 사실여기둬서는 안되는거임

 

서블릿에 url을 이니셜라이징하는 코드가들어가잇기떄문에 웹컨트롤러들 들어내면 그것도 사라지고

결국 핸들러도 쓸수없기때무넹

 

맵이 거기에있어서 결합도가 높아진거임

 

서블렛을 바꾸고싶을떄 바꿀우싱어야하는데 그거떄문에 바꿀수가없음

 

핸들러를 쓸수잇도록 만든게 맵인데 왜 서블렛에 넣어놨으며

핸들러에 서비스가 박혀있기떄문에 서비스를 바꾸고싶을떄도 곤란.

결합도가 높다. 바꾸려면 싹다바꿔야하는거임

 

그래서 url/hander와 서블렛 사이의 연결을 끊고싶은거임

핸들러와 유알엘 연결하는 맵퍼를 따로뺄거임 독립적으로 만들거임

그럼 서블렛은 유알엘로 맵퍼에 요청만 하면 맵퍼가 줄거임

 

그럼 역시나 각종 핸들러가 들어갈꺼기쨰문에 어떤 핸들러가 올지 모르니까 맵은 <String, Object>가 됨

그럼 또 리플렉션해서 써야됨.

 

매퍼가 독립이 되고 거기서 사용하는 서비스로직도 따로 분리가되어있음 (appl;ication context xml) 로

리스너가 만드는 서비스가 어플리케이션콘텍스트를 거쳐 핸들러까지 제대로 가야 의미가있는거임

핸들러에 셋메서드 이름을 어플리케이션컨텍스트xml에있는 key이름으로 정해야함

맵의 key이름은 xml의 프로퍼티임 결국

이게 다 합이 맞아야함


핸들러맵퍼를 만들려고하는데

 

웹컨트롤러를 지운다.

이제 아무것도 안됨

web.xml도 이부분 지운다

 

 

h 대문자임

핸들러프로퍼티에있는 유알엘과 핸들러맵핑해주고 의존주입시키는것 어디의? 서비스의

package kr.or.ddit.controller;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;

import com.jquery.handler.ApplicationContext;
import com.jquery.handler.CommandHandler;

public class HandlerMapper {

	//핸들러를 유알엘과 매칭시켜서 보관할 맵이 필요함
	private Map<String, CommandHandler> commandMap = new HashMap<String, CommandHandler>();
//	commandHAndler 서블렛마다 실행하는 메서드가 다르면 못땡기니까 각각의 핸들러가 실행하는 매서드를 통일하기위해
//	커맨드핸들러를 임플받은거엿음 .인터페이스의 기능중 하나가 획일화인거임
	//기능은 다르더라고 형태는 똑같이 만드는거임
	
	//이제 프로퍼티를 읽어야함
	//어디서?핸들러매퍼가 만들어질때 >> 생성자를 이용
	public HandlerMapper() throws ClassNotFoundException, InstantiationException,IllegalAccessException, Exception {
	
		//**생성자는 상속이되지않고 리턴타입이 없다. throws는 가능함
		
		//프로퍼티읽을거니까 경로를 줘야함
		String path = "com/jsp/properties/handler";
		
		//이번에는 리소스번들이용, 상대주소쓸거임. 상대주소만 주면 얘가 찾아옴
		ResourceBundle rbHome = ResourceBundle.getBundle(path);//handler.properties 읽어옴
		
		//읽었으니까 키를 꺼내서 하나씩 interator로 가져옴
		//왜 이런과정이 필요할까? 리소스번들은 내부에 이터레이터 자체가 없고 그냥 get value임 (키값이용해서꺼낼수밖에없음)
		//근데 우리는 뭐가있는지, 키값이 뭔지 모르니까 겟벨류할수없음
		//일단 키셋을 꺼낼수는 잇으니까 키를 몽창뽑아서 셋으로 받아서 (이게 유알엘 -> actionSEthome)
		//이걸 하나씩 뽑을거임 set안에 interator잇으니까
		
		Set<String> actionSetHome = rbHome.keySet();
		
		Iterator<String> it = actionSetHome.iterator();
		
		//이제 와일문으로
		//겟벨류하면 핸들러의 타입이 나올테니까 그걸로 인스턴스 만들어서 맵에넣을거임
		
		while(it.hasNext()) {
		
			//핸들러이름가져오기
			String command = it.next();
			String actionClassName = rbHome.getString(command);
			System.out.println(actionClassName);
			
			try {
				Class<?> actionClass = Class.forName(actionClassName);
				//인스턴스를 만들자
				CommandHandler commandAction = (CommandHandler)actionClass.newInstance();
				
				//핸들러가들어가잇긴한데 서비스와 결합이 안되어있음
				//어디에있는 서비스? 어플리케이션컨텍스트에잇는 서비스
//				commandMap.put(command, commandAction); 그래서 지금 안넣고 의존주입 사이에 해줘야함
				
				//의존성 확인 및 조합
				Method[] methods = actionClass.getMethods();			
				
				for (Method method : methods) { 
					if (method.getName().contains("set")) {
						String paramType=method.getParameterTypes()[0].getName();
						paramType=paramType.substring(paramType.lastIndexOf(".")+1);
						
						paramType=(paramType.charAt(0) + "").toLowerCase()+ paramType.substring(1);					
						try {
							method.invoke(commandAction,
									ApplicationContext.getApplicationContext().get(paramType));
						}catch (Exception e) {
							e.printStackTrace();
							throw e;
						} 
					}
				}
				//그래서 이 사이에 의존주입(service, dao....)
				//핸들러마다 셋메서드를 받아야할지모르니까 다 꺼내봐야함 : method가 해줌
				//메서드 이름에 셋이있냐 보고 가져오는거임
				//있으면, 극셋메서드 이름을 통해서 어플릿케이션컨텍스트에서 가져와야함 ( set빼고)
				//이번엔 파라미터타입을 직접 가져와서 써보겠다. > 무슨말이냐면 핸들러를 만들댸
				// setboardService (BoardService boardservice)의 파라미터 타입을 가져오겠다 타입가져오면
				//항상 패키지명(com.jquery.service) 까지 가져오니까 뺴고 클래스명(가져와서첫글자를소문자로)만 가져오겠다.
				//앞의패키지를 떼어야하니까 뒤에서부터.을 찾아서 잘라서 클래스명만 뽑음
				//그럼 그게 어플리케이션에잇는 서비스의 키가됨
				//셋메서드 호출하면서 해당 인스턴스 집어넣는게 트라이문아에있는문장임
//				포문이끝나면 핸들러에 필요한 인스턴스들이 다 주입되는거임
//				다끈타면 맵에 해당 인스턴스를 풋하는거임
				
				//리플렉션덕분에 주입이 되어있는 핸들러가 들어가는거임
				commandMap.put(command, commandAction);
				System.out.println("[HandlerMapper]"+command +":"+commandAction+ "이 준비되었습니다.");
				
				//주입이 되엇다는 sysout내보내자
				
				//***왜 이걸 리스너를 안만들고 인스턴스를 만들어서 집어넣었을까?
				//이걸 리스너로 만들면 리스너가 두개 (어플리케이션만드는 리스너랑 핸들러만드는 리스너)돌아가니까
				//applicationcontext가 준비가 되지않아서 안됨
				//서비스가 sqlsession등이랑 이어져잇어야하는데 그게 준비가안되어잇으면 널이됨
				//그래서 얘는 후자.. 서블릿이 로딩될때 만들어져야하므로 인스화하는거임
			}catch (ClassNotFoundException e) {						
				System.out.println("[HandlerMapper]"+ actionClassName + "이 존재하지 않습니다.");
				throw e;
			}catch (InstantiationException e) {
				System.out.println("[HandlerMapper]"+ actionClassName + "인스턴스를 생성할 수 없습ㄴ디ㅏ.");
				throw e;
			}catch (IllegalAccessException e) {
				e.printStackTrace();
				throw e;
			}
		}
		
	}
	
	public CommandHandler getAction(String url) {
		CommandHandler action = commandMap.get(url);
		return action;
	}

}

 

한가지 더 필요한얘가 있음

뷰리졸버

 

핸들러는 필요할때마다 그떄그떄 리다이렉트와 포워딩하게되는데

화면의 처리결과에 따라서 유알엘을 리달이렉트와 포워딩해야하는데

우리가 ㅜ원할때마나 하나으 ㅣ핸들러에서 리다이 혹은 포워드 가능하게하려면 지금 이 구조로는 안ㅇ됨

그게 될수있는 메카니즘은?

이게 리다이렉이냐 포워딩이냐는 서블릿은 몰라..핸들러만 알수있음

서블렛이 리다이렉인가 포워딩인가 파ㅇ악해서 해야하는데 그걸 해주는 똘마니인 리졸버를 하나만들어서

 

메카니즘이 (사인을 만들거임)

유라엘에 리다이렉트 콜론이붙으면 리다이렉트할거임

리다이렉트콜론이없으면 포워드할거임

앞으로 jsp가 유출되지않도옥 webinf view에 만들고잇는데 그걸 뷰를 넘길떄마다 쓰고있고,

포워딩할떄 jsp가 아니면 쓸수없으므로 .jsp를 쓰고있는데

이 두개를 리ㅂ졸버에서 앞에는 웹어쩌구붙이고 뒤에는 .jsp붙여줄거임

그렇게해주는 리졸버를 지금 만들거임

 

일단 유알에릉ㄹ받으면 리다이렉트콜론의 유무확인, 잇으면 그 콜론없애고 리다이렉트

몰론없으면 앞에 webinfview 뒤에 .jsp붙이고 포워딩

 

서블릿에서 사용알 뷰리졸버를 만들자

 

서블릿핸들러맵퍼랑(핸들러바뀔떄) 뷰리졸버 두 똘마니를 가지고잇음

 

 

스프링은 .do를 안써도되는데 do가 살아있는건

 

리졸버는 꼭 필요는 없으나 필요에의해섬 만든애다. 똘마니

 

package com.jquery.controller;

import java.io.IOException;

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

public class ViewResolver {

	public static void view(HttpServletRequest request, HttpServletResponse response, String url) throws ServletException, IOException{
		if(url == null) {
			return;
		}
		if(url.indexOf("redirect:") > -1) {
			url = request.getContextPath() + url.replace("redirect:", "");
			response.sendRedirect(url);
		}else {
			String prefix = "/WEB-INF/views";
			String subfix = ".jsp";
			url=prefix+url+subfix;
			request.getRequestDispatcher(url).forward(request, response);
		}
	}
}

 

우리가 만든 핸들러 ㅂ맵퍼와

뷰 리졸버가

실제로 서블릿에서 작동할수있도록 해줘야해서

서블릿을 새로만들거임

 

제일 앞단에서 필터를 제외하고 제일 앞단에서 받아주는애므로 front servlet 을 controller에 만들어준다.

 

package com.jquery.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//url에 따라 핸들러맵퍼를 가져올수있어야하는게 가장중요
 
public class FrontServlet extends HttpServlet {
	
//	private HandlerMapper handlerMapper = new HandlerMapper();
	private HandlerMapper handlerMapper;
	
	//어떤이유로???
	//initmethod를 오버라이딩할거임
	
	@Override
	public void init() throws ServletException {
		//이건 서블릿 로딩할때 실행됨
		//서블릿은 사용자의 요청이잇을떄 실ㅇ행되는데 그때하면 늦으니까
		//사용자의 요청이없어도 한번 서블릿을 로딩할수있도록 web.xml에 설정하러..
	}

 

 

web.xml

  <servlet>
  	<servlet-name>FrontServlet</servlet-name>
  	<servlet-class>com.jquery.controller.FrontServlet</servlet-class>
  	<init-param>
  		<param-name>handlerMapper</param-name>
  		<param-value>com.jquery.controller.HandlerMapper</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>FrontServlet</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

init param은 해당 서블릿내에서만 사용가능한 지역변수같은것

여기서 이닛파라미터로 handlerMapper넣어줫기때문에

frontservlet에 initmethod에서 config객체 이용해서 getinitparameter로 불러와서 써먹을수잇는거임

 

부팅할떄 한번 로드하라는뜻. 시작할때 ( 요청이없어도)로딩해라 번호는 그룹핑번호지 우선순위 번호는 아님

다시 프론트

 

package com.jquery.controller;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//url에 따라 핸들러맵퍼를 가져올수있어야하는게 가장중요
 
public class FrontServlet extends HttpServlet {
	
//	private HandlerMapper handlerMapper = new HandlerMapper();
	private HandlerMapper handlerMapper;
	
	//어떤이유로???
	//initmethod를 오버라이딩할거임
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		//이건 서블릿 로딩할때 실행됨
		//서블릿은 사용자의 요청이잇을떄 실ㅇ행되는데 그때하면 늦으니까
		//사용자의 요청이없어도 한번 서블릿을 로딩할수있도록 web.xml에 설정하러..
		String handlerMapperType = config.getInitParameter("handlerMapper");
		try {
			//그 이름을 클래스 로딩해서 인스턴스 부여하는 메서드 : injectionBean
			this.handlerMapper = (HandlerMapper) injectionBean(handlerMapperType);
			System.out.println("[FrontServlet] handlerMapper 가 준비되었습니다.");
		}catch (Exception e) {
			//핸들러가 뻑나면 이메세지가 뜰거임
			System.out.println("[FrontServlet] handlerMapper 가 준비되지않았습니다.");
		}
	}
	
	private Object injectionBean(String classType) throws Exception{
		Class<?> cls = Class.forName(classType);
		return cls.newInstance();
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

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

}

 

파라미터를 가져와서