이클립스에서 웹개발까지 하려면 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되는 것이다.
서버가 시작될 때 띄워야한다.