자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램
@ServletComponentScan
: 서블릿을 직접 등록해서 사용가능하도록 지원한다.
@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
서블릿 등록
@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 올시 실행된다.
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*@WebServlet 서블릿 애노테이션
name: 서블릿 이름
urlPatterns: URL 매핑*/
String username = request.getParameter("username");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello " + username);
}
}
@WebServlet
서블릿 애노테이션HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행
protected void service(...)
서블릿 컨테이너에 내장 톰캣 서버가 등록한 서블릿ex) helloServlet
을 생성
Http 요청이 오면 WAS(톰캣)는 Http 요청 메시지를 기반으로 request,response를 생성하고 helloServlet을 실행(service 메소드)
여기서 request의 내용을 확인하거나 response를 작성가능
톰캣 서버가 response 객체 정보로 http 응답을 생성하여 보낸다.
application.properties logging.level.org.apache.coyote.http11=debug // debug 레벨의 로그 확인
Http 요청 메시지를 편리하게 사용 가능하게끔 Http 요청 메시지를 파싱 후, HttpServletRequest
객체에 담아서 제공
해당 Http 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
request.setAttribute(name, value)
request.getAttribute(name)
세션 관리 기능
request.getSession(create: ture)
request.getMethod() = 메소드
request.getProtocol() = HTTP/1.1, 2.0 3.0
request.getScheme() = http
request.getRequestURL() = url 정보
request.getRequestURI() = uri 정보
request.getQueryString() = 쿼리 파라미터
request.isSecure() = 시큐리티 true/false
// 전체 조회
request.getHeaderNames().asIterator()
.forEachRemaining(headerName ->
System.out.println(headerName + ": " + request.getHeader(headerName)));
// Accept-Language 조회
request.getLocales().asIterator()
.forEachRemaining(locale -> System.out.println("locale = " +
locale));
// 선호도 젤 높은 것
request.getLocale();
// Host 조회
request.getServerName();
request.getServerOirt();
//Cookie 조회
if (request.getCookies() != null) {
for (Cookie cookie : request.getCookies()) {
System.out.println(cookie.getName() + ": " + cookie.getValue());
}
}
// Content 조회
request.getContentType();
request.getContentLength();
request.getCharacterEncoding();
기타 정보
[Remote 정보]
request.getRemoteHost()
request.getRemoteAddr()
request.getRemotePort()
[Local 정보]
request.getLocalName()
request.getLocalAddr()
request.getLocalPort()
http://localhost:8080/request-param?username=hello&age=20
쿼리 파라미터 ?
로 시작
&
추가 파라미터 구분
String username = request.getParameter("username"); //단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들
모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map
으로 조회
String[] usernames = request.getParameterValues("username"); //복수 파라미터 조회
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);
// Json 결과를 파싱 및 자바 객체로 변환하는 스프링 MVC 라이브러리 (ObjectMapper) 제공
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8);
HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
}
편의 기능 제공
response.setStatus(HttpServletResponse.SC_OK); //200
//[response-headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("my-header","hello");
// Header 편의 메서드
// Content 편의 메서드
private void content(HttpServletResponse response) {
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
}
// 쿠키 편의 메서드
private void cookie(HttpServletResponse response) {
Cookie cookie = new Cookie("myCookie", "good");
cookie.setMaxAge(600); //600초
response.addCookie(cookie);
}
// redirect 편의 메서드
private void redirect(HttpServletResponse response) throws IOException {
//Status Code 302 자동 적용
//Location: /basic/hello-form.html 자동 적용
response.sendRedirect("/basic/hello-form.html");
}
내용을 담아서 전달
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>");
writer.println(" <div>안녕?</div>");
writer.println("</body>");
writer.println("</html>");
}
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("content-type", "application/json");
response.setCharacterEncoding("utf-8");
HelloData data = new HelloData();
data.setUsername("kim");
data.setAge(20); //{"username":"kim","age":20}
String result = objectMapper.writeValueAsString(data);
response.getWriter().write(result);
}
🔖 학습내용 출처