JSP
JSP는 언어가 아닙니다. JAVA를 이용한 Server Side Template Engine입니다. JAVA를 web server에서 쓰기 위한 기술입니다. 확장자는 .jsp
.jsp를 실행하면 Servlet 클래스를 상속받은 Java 소스 코드로 변환한 다음 컴파일되어 실행됩니다.
JSP를 Servlet 클래스로 변환하고 실행하는 역할을 Servlet Container가 합니다. 대표적으로 Tomcat이 있습니다.
참고로 JAVA의 공식 Template Engine은 Thymeleaf입니다. 이에 Spring 5버전부터는 jsp 공식지원을 중단하기도 했습니다. jsp는 오래된 기술이지만 규모가 크고 안정적인 서비스가 중요한 곳에서는 아직도 jsp를 사용합니다.
서버 실행 전, 몇 가지 설정을 합니다.
① Deploy 수정
[-]를 눌러 .war를 제거하고 (exploded)가 추가된 항목을 지정합니다.
Application context 주소를 수정합니다.
소스 파일의 변경을 서버 재시작없이 바로 적용하고 싶다면 'On Update action', 'On frame deactivation'을 수정합니다.
이제 톰캣을 실행하고 http://localhost:8080/ 혹은 http://127.0.0.1:8080/에 접속합니다.
① Servlet/JSP 모두 JAVA EE 스펙의 일부
② Servlet/JSP를 실행하기 위해서는 Servlet Container가 필요함
③ Servlet Contaier가 Servlet/JSP 객체를 생성하고 생명 주기를 관리함
④ JSP는 내부적으로 Servlet과 같은 방식의 코드로 변환됨
⑤ JSP는 HTML내에 자바 코드를 추가하는 방식이고, Servlet은 자바 코드 안에 HTML을 추가하는 방식임.
① Client가 Tomcat(Servlet Container)에 요청(request)합니다.
② Tomcat은 요청에 맞는 Servlet Class를 로딩하고 객체를 생성합니다. 이 때 init() 메소드가 먼저 실행됩니다.
③ 서블릿 객체가 생성되면 Client의 요청에 대한 정보를 분석해서 GET/POST 등의 정보, 함께 전달되는 파라미터(query string)들을 HttpServletRequest 타입의 파라미터로 전달받습니다. 응답에 필요한 기능은 HttpServletResponse 타입의 객체로 전달받습니다.
④ Servlet Container에서 GET/POST 등에 맞게 doGet()/doPost()의 메소드를 실행합니다.(이후 동일한 요청이 있을 때 Servlet은 동일한 하나의 객체만을 이용해 처리합니다.)
⑤ Tomcat 종료 시에는 destroy()가 실행됩니다.
@WebServlet(name = "sampleServlet", value = "/sample")
public class SampleServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init() 실행@@@");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet() 실행@@@");
}
@Override
public void destroy() {
System.out.println("destroy() 실행@@@");
}
}
@WebServlet(name = "myServlet", urlPatterns = "/my")
public class Myservlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<h1>MyServlet</h1>");
out.println("</body></html>");
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Test JSP PAGE</h1>
</body>
</html>
그렇기에 index.jsp(jsp)는 소스코드를 변경하면 바로 반영됩니다. 그러나 HelloServlet.java(Servlet)는 다릅니다. 소스코드를 변경하더라도 바로 반영되지 않습니다.
Servlet의 변경사항을 적용하려면 Deploy all을 실행해야 합니다. 즉 코드를 다시 빌드해야 합니다.
① JSTL library를 추가합니다.
② name space에 directives(지시자)를 추가합니다.
dependencies {
implementation group: 'jstl', name: 'jstl', version: '1.2'
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
덕분에 좋은 정보 얻어갑니다, 감사합니다.