스프링 입문 - Servlet & JSP
network의 기본개념은 생략, 철저하게 java에 초점 맞춰서 정리를 해보자
java에서 web 프로그래밍, 특히 dynamic한 페이지는 어떻게 만들어져 왔는가?
🔥 앞서 jsp 관련 사진은 https://gmlwjd9405.github.io/2018/11/03/jsp.html 에서 가져왔습니다! 정리를 기가 막히게 잘해두셨습니다!! 관련 예시도 좋습니다!!
Servlet
개요
- 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
- Java를 웹어플리케이션에 조금 더 개발하기 쉽게 하기 위해 만든 API(라이브러리, 클래스 들)이며 이 규약에 맞는 라이브러리나 클래스들을 상속 및 구현하여 만든 클래스들을 서블릿이라고 한다.
- 위 사진이 servlet 클래스 다이어 그램이다.
- 우리는 실제로 ServletEx와 같은 Class만 만들면 된다.
요약 특징 링크
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- Java Thread를 이용하여 동작한다!
- MVC 패턴에서 Controller로 이용한다.
- 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송합니다.
- 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
- web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
- 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출합니다.
- doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.
실습
package com.servlet.test;
import java.io.IOException;
import java.io.PrintWriter;
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("/hs")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public HelloServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("</head>");
out.print("<body>");
out.print("<div>");
out.print("<h1> HELLO SERVLET </h1>");
out.print("</div>");
out.print("</body>");
out.print("</html>");
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- HttpServletRequest : 요청에 대한 정보를 가지고 있는 객체
- request.getCookies();
- request.getSession();
- request.getAttribute(null);
- request.setAttribute(null, null);
- request.getParameter(null);
- request.getParameterNames();
- request.getParameterValues(null);
- HttpServletResponse : 응답에 대한 정보를 가지고 있는 객체
- response.addCookie(null);
- response.getStatus();
- response.sendRedirect(null);
- response.getWriter();
- response.getOutputStream();
Life Cycle, 생명주기
- 생성(init) 단계에서 body(request 패킷에서 data에 대해)등의 자원 관련 작업을 많이 한다.
- service에서 http req에 해당하는 method가 실행된다!
JSP
개요
- Java Server Pages의 약자, Java를 이용한 서버 사이드 스크립트 언어이다.
- 서버 사이드 스크립트 언어는 php가 대표적이다~
나도 php로 웹 입문했다 :)
- 잘못된 비교일 수 있지만 비슷한 예시로 flask의 template, node 사용할때 view engine -> pug(jade) 정도로 생각해 볼 수 있다.
- java언어 기반으로 동적인 웹 페이지를 구성할 수 있다.
java에서 jsp
- jsp page request부터 response를 받기까지 work flow를 도식화 한 그림이다.
- jsp파일은 javax.servlet.http.HttpServlet 클래스를 상속받은 Java 소스 코드로 변환한 다음 컴파일되어 실행된다.
- 위 사진과 같이 <%= %>으로 java코드를 html파일에 삽입하는 방식으로 사용 가능하다.
실습
- 선언태그와 비슷한 스크립트릿 태그 와 간단한 표현식 태그!
- 스크립트릿 태그를 자연스럽게 가장많이 쓴다.
- 지시어
- page는 거의 동일하다! (보통 default)
- page import="java.util.ArrayList" 와 같이, java코드를 넣을때 필요한 라이브러리 import 할때도 page를 사용한다!
- include는 외부 다른 파일 가져올때 많이 사용한다! -> header / footer 등과 같은 반복되는 덩어리들에 대한 처리로 include를 많이 사용한다!
- taglib은 외부 라이브러리 (예를 들어 jQuery등과 같은)를 import할때 사용!
request, response
- 요청, getParameterValues 메서드로 array(배열)형태로 받아올 수 있다.
- 응답, 현제 요청 페이지에서 다른 페이지로 리다이렉트 하는 코드.
- jsp에서 request를 통해 어떻게 소통하는지 가볍게 코드로 살펴보자
- action은 request가 갈 target url이다! 사진에서는 생략되었지만 jsp파일 경로 (mSignUp.jsp)를 넣어주자! / method는 http request의 형태! -> 기본적인 세부 개념은 스킵!
- 위 html form태그로 query string 형태로 action url에 request가 갈 것 이다.
- jsp파일에서 request가 들어온 (query string value 기반) 데이를 기반으로 page를 render한다!
내장객체
- request, response 외 jsp에서 기본적으로 제공하는 다른 내장 객체는 무엇이 있을까
1. config객체
- web.xml에서 init param와 같은 xml태그를 이용해 -> jsp에서 getInitParameter() 메소드를 이용해 confing된, (미리 정의된) 파라미터를 이용할 수 있다.
- target servelt xml 태그 안에 위와 같은 추가 정보 xml이 정의 되어야 한다!
2. application 객체
- config에서 스코프가 확장되었다고 생각하면 편하다!
- global 영역에서, application 전역에서, 미리 정의한 이 객체에 대해 접근할 수 있다.
getServletContext().setAttribute("key", "value");
와 같이 정의되어 있는 것을 update하는 형식으로 set이 가능하다!
- 물론 apllication.set---으로 바로 추가 정의도 가능하다!
3. out 객체
- out.print와 같이 html 태그를 바로 출력가능하다. 단순!
4. exception 객체
- error handle할때, 에러 발생시 어떻게 처리할지!
- jsp파일 상단에
<%@ page errorPage = "targetError.jsp" %>
와 같은 page 지시어를 추가해놓아야 한다. /
- 특정 페이지를 에러 전용 페이지로 사용하겠다 ->
<%@ page isErrorPage = "true" %>
로 해준다!
- 그 에러 페이지 jsp에서 어떤 에러인지 접근하기 위해 exception객체에 접근 가능하다!
데이터 공유
- 내장 객체를 응용해서 servlet에서 데이터를 공유하는 방법에 대해 체크해보자!
servlet parameter
- config객체를 jsp페이지 내부 뿐 아니라, web.xml에서 정의한 뒤 servlet class에서도 사용이 가능하다.
- 위 예시 그대로 servlet class내부에서
String adminId = getServletConfig().getInitParameter("key");
와 같이 사용하면 된다.
- application 객체 -> context parameter 또한 똑같이 사용가능하다!