728x90
반응형
Servlet 을 직접 다뤄보자
- @ServletComponentScan:
- 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan 을 지원한다.
- 서블릿 관련 어노테이션을 보고 알아서 등록해준다.
@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
HttpServlet 등록
- HttpServlet 을 상속받아 새로운 서블릿 클래스를 작성해준다.
- @WebServlet:
- name: 서블릿의 이름
- urlPatterns: 요청한 url에 해당하는 주소를 입력한다. - req.getParameter:
- 해당 함수로 쿼리에 대한 내용을 가져온다. - resp.setContentType:
- 데이터 타입을 정해준다. - resp.setCharacterEncoding:
- 인코딩 방식을 지정한다. 요즘은 전부 utf-8을 사용한다. - resp.getWriter().write(""):
- body 에 데이터를 넣는다.
// HTTPSetvlet 을 먼저 상속 받아야한다.
//name : 서블릿 이름
// urlpatterns url
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("req = " + req);
System.out.println("resp = " + resp);
String username = req.getParameter("username");
System.out.println("username = " + username);
resp.setContentType("text/plain");
resp.setCharacterEncoding("utf-8");
resp.getWriter().write("hello"+username); // body 에 데이터를 넣는다.
// 바디에 text를 담아 보낸다.
}
}
서블릿 컨테이너의 동작방식
요청을 보내면 다음과 같은 응답을 받는다고 생각하자.
요청
GET /hello?username=tom HTTP/1.1
Host: localhost:8080
응답
HTTP/1.1 200 OK
Content-Type: text/plain;charset=utf-8
Content-Length:11
hello world
동작과정
- 요청이 오면 웹서버에서 request, response 객체를 만든다.
- 서블릿을 찾고 request 와 response 를 파라미터로 넘겨 실행한다.
- 실행후 response 를 브라우저에게 보낸다.
HttpServletRequest 의 역할
- HttpServletRequest 를 파라미터로 받아 서블릿이 수행된다.
- 그렇다면 역할은 무엇인가? - HTTP 요청 메시지를 우리가 직접 파싱해도 되지만 불편하다.
- 서블릿이 파싱을 수행해준다.
- 그리고 결과를 HttpServletRequest 객체에 담아서 제공해준다.
- HttpServletRequest, HttpServletResponse 두개의 역할은 HTTP 요청 메시지, HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체이다.
필요이유?
편리함이다.
HTTP 요청 메시지
START LINE:
- HTTP 메소드
- URL
- 쿼리 스트링
- 스키마, 프로토콜
HEADER:
- 헤더조회
바디:
- form 파라미터 형식 조회
- message body 데이터 직접조회
임시저장소 기능
HTTP 요청이 시작 부터 끝날때 까지 유지뢰는 임시 저장소 기능
- 저장: request.setAttrbute(name, value)
- 조회: request.getAttribute(name)
세션관리기능
request.getSession
HttpServletRequest 사용법
request 에서 우리는 start-line, header, body 등 데이터를 조회 할 수 있다.
다음 예제를 보자
startLine 조회
private void printStartLine(HttpServletRequest request) {
String method = request.getMethod();
System.out.println("--- REQUEST-LINE - start ---");
System.out.println("request.getMethod() = " + request.getMethod()); //GET
System.out.println("request.getProtocal() = " + request.getProtocol()); //HTTP/1.1
System.out.println("request.getScheme() = " + request.getScheme()); //http
System.out.println("request.getRequestURL() = " + request.getRequestURL());
System.out.println("request.getRequestURI() = " + request.getRequestURI());
System.out.println("request.getQueryString() = " + request.getQueryString());
System.out.println("request.isSecure() = " + request.isSecure()); //https 사용 유무
System.out.println("--- REQUEST-LINE - end ---");
System.out.println();
}
printHeader 조회
private void printHeader(HttpServletRequest request) {
System.out.println("---- Headers - start ----");
// 예전 방식 모든 헤더를 다 뒤진다.
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println(headerName + ": "+headerName);
}
// 요즘방식
request.getHeaderNames().asIterator().forEachRemaining(headerName -> System.out.println(headerName + ":" + headerName));
// 특정 정보를 가져올수 있다.
request.getHeader("host");
System.out.println("---- Headers - end ----");
System.out.println();
}
//Header 편리한 조회
private void printHeaderUtils(HttpServletRequest request) {
System.out.println("--- Header 편의 조회 start ---");
System.out.println("[Host 편의 조회]");
System.out.println("request.getServerName() = " +
request.getServerName()); //Host 헤더
System.out.println("request.getServerPort() = " +
request.getServerPort()); //Host 헤더
System.out.println();
// getLocales 는 locale 정보를 다 꺼낼수 있다.
System.out.println("[Accept-Language 편의 조회]");
request.getLocales().asIterator()
.forEachRemaining(locale -> System.out.println("locale = " +
locale));
System.out.println("request.getLocale() = " + request.getLocale());
System.out.println();
System.out.println("[cookie 편의 조회]");
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
System.out.println();
System.out.println("[Content 편의 조회]");
System.out.println("request.getContentType() = " +
request.getContentType());
// get 방식일 경우 content를 보내지 않아서 null 이다.
System.out.println("request.getContentLength() = " +
request.getContentLength());
System.out.println("request.getCharacterEncoding() = " +
request.getCharacterEncoding());
System.out.println("--- Header 편의 조회 end ---");
System.out.println();
}
기타 정보조회
private void printEtc(HttpServletRequest request) {
System.out.println("--- 기타 조회 start ---");
System.out.println("[Remote 정보 요청한곳]");
System.out.println("request.getRemoteHost() = " +
request.getRemoteHost()); //
System.out.println("request.getRemoteAddr() = " + request.getRemoteAddr()); //
System.out.println("request.getRemotePort() = " + request.getRemotePort()); //
System.out.println();
System.out.println("[Local 정보 현재 내서버]");
System.out.println("request.getLocalName() = " +
request.getLocalName()); //
System.out.println("request.getLocalAddr() = " + request.getLocalAddr()); //
System.out.println("request.getLocalPort() = " + request.getLocalPort()); //
System.out.println("--- 기타 조회 end ---"); System.out.println();
}
참고:
728x90
반응형
'Spring > spring framework 구현 스터디' 카테고리의 다른 글
[Spring] Servlet 다루기 3: HttpServletResponse 예제 (0) | 2021.10.11 |
---|---|
[Spring] Servlet 다루기 2: HttpServletRequest 예제 (0) | 2021.10.10 |
[Spring] 멀티 쓰레드 (0) | 2021.10.05 |
[Spring] Servlet (0) | 2021.10.04 |
[Spring] Web server와 Was server (0) | 2021.10.04 |
댓글