Loading...

카테고리 없음 / / 2022. 6. 17. 12:14

어노테이션 이해

반응형

이클립스에서 웹개발까지 하려면 EE환경이여야 한다.

 

 

 

content directory 아파치 톰캣이 유일하게 외부에 오픈해주는 폴더 : URL: 접근이 가능

 

톰캣 라이브러리만 연결된 상태고 구동을 위한 연결은 아직 안되었다.

톰캣이 제공하는 requestㅇ나 response만 사용가능하고

이 프로젝트를 톰캣 위에 올려야한다.

 

일단 인코딩 utf-8 설정부터

webapp아래 index.jsp 파일 생성

ctrl 11 실행

 

 

 

 

 

 

 

package site.metacoding.reflect.config;

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("/")
public class DispatcherServlet extends HttpServlet {  // 톰캣이 들고있는 것, 모든 요청(Get, Post, Put, Delete)의 진입점이 됨
	 
	private static final long serialVersionUID = 1L;

	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doDelete()");
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet()");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doPost()");
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doPut()");
	}

}

서버를 잠깐 종료시키고 context path를 잡아주자.

...
<Context docBase="reflect" path="/" reloadable="true" source="org.eclipse.jst.jee.server:reflect"/></Host>
...

다시 서버를 키고 localhost:8080/asdfadsfdasf 아무주소로 들어가도 /을 타기때문에 doGet이 호출된다.

포스트맨으로 4개 메서드 모두 테스트했다.

 

 

근데 슬래쉬를 안적어주면 index파일을 찾는다. 어떻게하면 막을 수 있을까?

설정파일의 welcome file list를 날리고 서버를 재시작해준다.

이제 UrL 요청만 잡아주면 되겠다.

src > main > resources > static 여기만 노출시키고 webapp 폴더를 숨길 수 있다.

 

 


package site.metacoding.reflect.util;

// 싱글톤패턴
public class UtilsLog {
	
	private static UtilsLog instance = new UtilsLog();

	private UtilsLog() {} // private이라서 외부에서 new 불가능
	
	public static UtilsLog getInstance() {
		return instance;
	}
	
	public void info(String TAG, String msg) {
		System.out.println("====================INFO "+ TAG + msg);
	}
}
package site.metacoding.reflect.config;

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 site.metacoding.reflect.util.UtilsLog;

@WebServlet("/")
public class DispatcherServlet extends HttpServlet {  // 톰캣이 들고있는 것, 모든 요청(Get, Post, Put, Delete)의 진입점이 됨
	 
	private static final long serialVersionUID = 1L;
	private static final String TAG = "DispatcherServlet : ";

	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doDelete()");
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doGet");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doPost()");
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doPut()");
	}

}


dispatcherServlet이 controller를 제어하니까 여기서 설정

package site.metacoding.reflect.web;

import site.metacoding.reflect.util.UtilsLog;

// API
public class MemberController {
	
	private static final String TAG = "MemberController : ";

	/*	(GET) /join 요청이 오면 호출	*/
	public void join() {
		UtilsLog.getInstance().info(TAG, "join()");
	}
	
	/*	(GET) /login 요청이 오면 호출	*/
	public void login() {
		UtilsLog.getInstance().info(TAG, "login()");
	}
	
	/*	(GET) /findById 요청이 오면 호출	*/
	public void findById() {
		UtilsLog.getInstance().info(TAG, "findById()");
	}
}

 

 

 

 

 

package site.metacoding.reflect.config;

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 site.metacoding.reflect.util.UtilsLog;

@WebServlet("/")
public class DispatcherServlet extends HttpServlet {  // 톰캣이 들고있는 것, 모든 요청(Get, Post, Put, Delete)의 진입점이 됨
	 
	private static final long serialVersionUID = 1L;
	private static final String TAG = "DispatcherServlet : ";

	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doDelete()");
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doGet");
		UtilsLog.getInstance().info(TAG, req.getRequestURI()); // 끝주소
		UtilsLog.getInstance().info(TAG, req.getRequestURL().toString()); // 풀주소
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doPost()");
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		UtilsLog.getInstance().info(TAG, "doPut()");
	}

}

http://localhost:8000/join로 요청하면

protocol : http

host : localhost

port : 8000

identifier : /join

 

컨트롤러를 new한후에 자원을 공유할 필요없으니까 다 메서드만 때리니까 하나만 new해두고 공유하면 된다.

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	UtilsLog.getInstance().info(TAG, "doGet");
	UtilsLog.getInstance().info(TAG, req.getRequestURI()); // 끝주소
	UtilsLog.getInstance().info(TAG, req.getRequestURL().toString()); // 풀주소

	String identifier = req.getRequestURI();

	if (identifier.equals("/join")) {
		MemberController controller = new MemberController();
		controller.join();
	} else if (identifier.equals("/login")) {
		MemberController controller = new MemberController();
		controller.login();
	} else if (identifier.equals("/findById")) {
		MemberController controller = new MemberController();
		controller.findById();
	}
}

잘 실행은 된다.

생성자에서 하나로 관리하자.

public DispatcherServlet() {
	MemberController controller = new MemberController();
}

 

서블릿에는 생명 주기가 있다.

서블릿은 요청과동시에 객체가 생성되고 응답이 끝나면 destroy된다.

결국 요청하는 사람마다 하나씩 생성되고 따로 관리된다.

 

즉 계속 new되는 것이다.

 

서버가 시작될 때 띄워야한다.

반응형