-
Notifications
You must be signed in to change notification settings - Fork 309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[톰캣 구현하기 3 & 4단계] 홍고(홍여진) 미션 제출합니다 #483
Changes from all commits
7582b78
3719d7e
8da9f57
3a9ee9e
b936de3
d2258d0
06b723d
981f06a
f31be2d
64a8acc
d73bedc
d87febe
078f8ed
a3a1f28
f1433c9
45136ef
a8091b5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,18 @@ | ||
package nextstep; | ||
|
||
import org.apache.catalina.startup.Tomcat; | ||
import nextstep.jwp.controller.LoginController; | ||
import nextstep.jwp.controller.RegisterController; | ||
import nextstep.jwp.controller.RootController; | ||
import org.apache.catalina.controller.ControllerStatus; | ||
|
||
public class Application { | ||
|
||
public static void main(String[] args) { | ||
final var tomcat = new Tomcat(); | ||
tomcat.addController(new ControllerStatus("/"), new RootController()); | ||
tomcat.addController(new ControllerStatus("/login"), new LoginController()); | ||
tomcat.addController(new ControllerStatus("/register"), new RegisterController()); | ||
tomcat.start(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.util.Map; | ||
import java.util.Optional; | ||
import nextstep.jwp.db.InMemoryUserRepository; | ||
import nextstep.jwp.model.User; | ||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.coyote.http11.Session; | ||
import org.apache.coyote.http11.SessionManager; | ||
import org.apache.coyote.http11.message.HttpStatus; | ||
import org.apache.coyote.http11.message.request.Request; | ||
import org.apache.coyote.http11.message.response.Response; | ||
|
||
public class LoginController extends AbstractController { | ||
|
||
private static final String INDEX_TEMPLATE = "index.html"; | ||
private static final String USER = "user"; | ||
private static final String ACCOUNT = "account"; | ||
private static final String PASSWORD = "password"; | ||
private static final String LOGIN_TEMPLATE = "login.html"; | ||
private static final String JSESSIONID = "JSESSIONID"; | ||
|
||
@Override | ||
protected void doPost(final Request request, final Response response) { | ||
final Map<String, String> requestForms = request.getRequestForms().getFormData(); | ||
final Optional<User> optionalUser = login(requestForms.get(ACCOUNT), requestForms.get(PASSWORD)); | ||
optionalUser.ifPresentOrElse(user -> loginSuccess(request, response, user), () -> loginFail(response)); | ||
} | ||
|
||
private void loginSuccess(final Request request, final Response response, final User user) { | ||
response.setLocation(INDEX_TEMPLATE); | ||
response.setStatus(HttpStatus.FOUND); | ||
|
||
if (request.noSession()) { | ||
final Session session = new Session(); | ||
session.setAttribute(USER, user); | ||
SessionManager.add(session); | ||
response.addCookie(JSESSIONID, session.getId()); | ||
} | ||
} | ||
|
||
private void loginFail(final Response response) { | ||
final Response failedResponse = Response.createByTemplate(HttpStatus.UNAUTHORIZED, "401.html"); | ||
response.setBy(failedResponse); | ||
} | ||
|
||
private Optional<User> login(final String account, final String password) { | ||
return InMemoryUserRepository.findByAccountAndPassword(account, password); | ||
} | ||
|
||
@Override | ||
protected void doGet(final Request request, final Response response) throws Exception { | ||
if (request.getSessionValue(USER) != Optional.empty()) { | ||
response.setLocation(INDEX_TEMPLATE); | ||
response.setStatus(HttpStatus.FOUND); | ||
return; | ||
} | ||
final Response createdResponse = Response.createByTemplate(HttpStatus.OK, LOGIN_TEMPLATE); | ||
response.setBy(createdResponse); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import java.util.Map; | ||
import nextstep.jwp.db.InMemoryUserRepository; | ||
import nextstep.jwp.model.User; | ||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.coyote.http11.message.HttpStatus; | ||
import org.apache.coyote.http11.message.request.Request; | ||
import org.apache.coyote.http11.message.response.Response; | ||
|
||
public class RegisterController extends AbstractController { | ||
|
||
private static final String ACCOUNT = "account"; | ||
private static final String EMAIL = "email"; | ||
private static final String PASSWORD = "password"; | ||
private static final String INDEX_TEMPLATE = "index.html"; | ||
private static final String REGISTER_TEMPLATE = "register.html"; | ||
|
||
@Override | ||
protected void doPost(final Request request, final Response response) throws Exception { | ||
final Map<String, String> requestForms = request.getRequestForms().getFormData(); | ||
final String account = requestForms.get(ACCOUNT); | ||
final String email = requestForms.get(EMAIL); | ||
final String password = requestForms.get(PASSWORD); | ||
InMemoryUserRepository.save(new User(account, password, email)); | ||
|
||
response.setLocation(INDEX_TEMPLATE); | ||
response.setStatus(HttpStatus.FOUND); | ||
} | ||
|
||
@Override | ||
protected void doGet(final Request request, final Response response) throws Exception { | ||
final Response createdResponse = Response.createByTemplate(HttpStatus.OK, REGISTER_TEMPLATE); | ||
// response.setStatus(HttpStatus.OK); | ||
// final ResponseBody responseBody = ResponseBody.from(REGISTER_TEMPLATE); | ||
// response.setBody(responseBody); | ||
response.setBy(createdResponse); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.catalina.exception.UnsupportedRequestException; | ||
import org.apache.coyote.http11.message.ContentType; | ||
import org.apache.coyote.http11.message.HttpStatus; | ||
import org.apache.coyote.http11.message.request.Request; | ||
import org.apache.coyote.http11.message.response.Response; | ||
import org.apache.coyote.http11.message.response.ResponseBody; | ||
|
||
public class RootController extends AbstractController { | ||
|
||
private static final String ROOT_MESSAGE = "Hello world!"; | ||
|
||
@Override | ||
protected void doPost(final Request request, final Response response) throws Exception { | ||
throw new UnsupportedRequestException(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 커스텀 예외 멋지네요👍 |
||
} | ||
|
||
@Override | ||
protected void doGet(final Request request, final Response response) throws Exception { | ||
final Response createdResponse = Response.createByResponseBody(HttpStatus.OK, | ||
new ResponseBody(ROOT_MESSAGE, ContentType.HTML)); | ||
response.setBy(createdResponse); | ||
Comment on lines
+21
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. setBody, setStatus 대신 response 객체 자체를 새로 만들어주신 이유를 공유해주실 수 있나요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 기존에 유효한 정보(status, body)들을 받아 Response를 생성해주는 로직이 존재했는데, 3단계 요구사항에서 물론 사용하지 않을 복사용 Response 객체가 생기긴 하지만...ㅎㅎ 이 정도는 괜찮지 않을까 했어요...ㅎㅎ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저도 큰 차이는 없다고 생각하는데 혹시 제가 생각못한 장단점이 있을까해서 여쭤봤습니다! 🫡 일반적인 서블릿 프로그래밍과 약간의 차이가 있다면 공통 헤더를 처리해주는 filter들을 따로 두어 doFilter 메서드로 리스폰스에 필요한 것들을 계속해서 set해주는 과정으로 가져가는 것 정도 같네요! |
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package nextstep.jwp.controller; | ||
|
||
import org.apache.catalina.controller.AbstractController; | ||
import org.apache.catalina.exception.UnsupportedRequestException; | ||
import org.apache.coyote.http11.message.request.Request; | ||
import org.apache.coyote.http11.message.response.Response; | ||
|
||
public class StaticFileController extends AbstractController { | ||
|
||
@Override | ||
protected void doPost(final Request request, final Response response) throws Exception { | ||
throw new UnsupportedRequestException(); | ||
} | ||
|
||
@Override | ||
protected void doGet(final Request request, final Response response) throws Exception { | ||
final Response createdResponse = Response.createByTemplate(request.getRequestURI()); | ||
response.setBy(createdResponse); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
request.getSessionValue(USER).isEmpty() 처럼 옵셔널 내부 메서드로 검사해주는게 더 옵셔널스럽게 사용하는 방법 같네요! 그러면 null 비교에 비해 이점을 확실하게 가져갈 수 있을 것 같아요😎
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
request.getSessionValue(USER).isEmpty()
너무 좋아요~~~ 다른 Optional들도 동일하게 수정했습니다!