Skip to content

Commit

Permalink
feat: 서블릿 기능 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
woo-chang committed Sep 10, 2023
1 parent 83bbd10 commit 7ce5a11
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package nextstep.jwp.controller;

import nextstep.jwp.handle.ViewResolver;
import org.apache.coyote.common.HttpMethod;
import org.apache.coyote.common.HttpStatus;
import org.apache.coyote.request.HttpRequest;
import org.apache.coyote.response.HttpResponse;

public abstract class AbstractController implements Controller {

@Override
public void service(final HttpRequest request, final HttpResponse response) throws Exception {
if (request.getHttpMethod() == HttpMethod.GET) {
doGet(request, response);
return;
}
if (request.getHttpMethod() == HttpMethod.POST) {
doPost(request, response);
return;
}
ViewResolver.renderPage(response, HttpStatus.NOT_FOUND, "404.html");
}

protected abstract void doPost(final HttpRequest request, final HttpResponse response) throws Exception;

protected abstract void doGet(final HttpRequest request, final HttpResponse response) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package nextstep.jwp.exception;

public class HandlerMappingException extends RuntimeException {

public HandlerMappingException() {
super("Handler Mapping Fail");
}
}
78 changes: 78 additions & 0 deletions tomcat/src/main/java/nextstep/jwp/servlet/DispatcherServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package nextstep.jwp.servlet;

import nextstep.jwp.controller.FileController;
import nextstep.jwp.controller.HelloWorldController;
import nextstep.jwp.controller.LoginController;
import nextstep.jwp.controller.RegisterController;
import nextstep.jwp.exception.HandlerMappingException;
import nextstep.jwp.handle.HandlerMapping;
import nextstep.jwp.handle.HandlerMethod;
import nextstep.jwp.handle.mapping.GetFileMappingInfo;
import nextstep.jwp.handle.mapping.GetHelloWorldMappingInfo;
import nextstep.jwp.handle.mapping.GetLoginMappingInfo;
import nextstep.jwp.handle.mapping.GetRegisterMappingInfo;
import nextstep.jwp.handle.mapping.PostLoginMappingInfo;
import nextstep.jwp.handle.mapping.PostRegisterMappingInfo;
import org.apache.catalina.core.Servlet;
import org.apache.coyote.request.HttpRequest;
import org.apache.coyote.response.HttpResponse;

public class DispatcherServlet implements Servlet {

private HandlerMapping handlerMapping;

public DispatcherServlet() {
try {
this.handlerMapping = new HandlerMapping();
handlerMapping.addMappingInfo(
new GetFileMappingInfo(),
new HandlerMethod(
FileController.getInstance(),
FileController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class)
)
);
handlerMapping.addMappingInfo(
new GetHelloWorldMappingInfo(),
new HandlerMethod(
HelloWorldController.getInstance(),
HelloWorldController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class)
)
);
handlerMapping.addMappingInfo(
new GetLoginMappingInfo(),
new HandlerMethod(
LoginController.getInstance(),
LoginController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class)
)
);
handlerMapping.addMappingInfo(
new PostLoginMappingInfo(),
new HandlerMethod(
LoginController.getInstance(),
LoginController.class.getDeclaredMethod("doPost", HttpRequest.class, HttpResponse.class)
)
);
handlerMapping.addMappingInfo(
new GetRegisterMappingInfo(),
new HandlerMethod(
RegisterController.getInstance(),
RegisterController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class)
));
handlerMapping.addMappingInfo(
new PostRegisterMappingInfo(),
new HandlerMethod(
RegisterController.getInstance(),
RegisterController.class.getDeclaredMethod("doPost", HttpRequest.class, HttpResponse.class)
)
);
} catch (NoSuchMethodException e) {
throw new HandlerMappingException();
}
}

@Override
public void service(final HttpRequest request, final HttpResponse response) throws Exception {
final HandlerMethod handlerMethod = handlerMapping.getHandlerMethod(request);
handlerMethod.invokeMethod(request, response);
}
}
24 changes: 24 additions & 0 deletions tomcat/src/main/java/org/apache/catalina/core/ContextManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.apache.catalina.core;

import java.util.ArrayList;
import java.util.List;
import nextstep.jwp.servlet.DispatcherServlet;
import org.apache.coyote.exception.NotFoundServletException;
import org.apache.coyote.request.HttpRequest;
import org.apache.coyote.response.HttpResponse;

public class ContextManager {

private static final List<Servlet> servlets = new ArrayList<>();

static {
servlets.add(new DispatcherServlet());
}

public static void invoke(final HttpRequest request, final HttpResponse response) throws Exception {
final Servlet servlet = servlets.stream()
.findFirst()
.orElseThrow(NotFoundServletException::new);
servlet.service(request, response);
}
}
9 changes: 9 additions & 0 deletions tomcat/src/main/java/org/apache/catalina/core/Servlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.apache.catalina.core;

import org.apache.coyote.request.HttpRequest;
import org.apache.coyote.response.HttpResponse;

public interface Servlet {

void service(final HttpRequest request, final HttpResponse response) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.apache.coyote.exception;

public class NotFoundServletException extends RuntimeException {

public NotFoundServletException() {
super("Match Servlet Not Found");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import org.apache.catalina.core.ContextManager;
import org.apache.coyote.Processor;
import org.apache.coyote.handle.HandlerMapping;
import org.apache.coyote.handle.HandlerMethod;
import org.apache.coyote.request.HttpRequest;
import org.apache.coyote.response.HttpResponse;
import org.slf4j.Logger;
Expand Down Expand Up @@ -33,12 +32,11 @@ public void process(final Socket connection) {
final var outputStream = connection.getOutputStream();
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))
) {
final HttpRequest httpRequest = HttpRequest.parse(bufferedReader);
final HttpResponse httpResponse = new HttpResponse(httpRequest.getHttpVersion());
final HandlerMethod handlerMethod = HandlerMapping.getHandlerMethod(httpRequest);
handlerMethod.invokeMethod(httpRequest, httpResponse);
final HttpRequest request = HttpRequest.parse(bufferedReader);
final HttpResponse response = new HttpResponse(request.getHttpVersion());
ContextManager.invoke(request, response);

outputStream.write(httpResponse.toString().getBytes());
outputStream.write(response.toString().getBytes());
outputStream.flush();
} catch (Exception e) {
log.error(e.getMessage(), e);
Expand Down

0 comments on commit 7ce5a11

Please sign in to comment.