도와줄 무언가가 필요하다!
정의
Servlet
과 JSP
등 웹 관련 부분만 구현한 서버역할
제품
서블릿 컨테이너는 요청정보를 통해 HttpServletRequest와 HttpServlerResponse 객체를 생성합니다.
서블릿 컨테이너는 요청 정보를 분석하여, 서블릿을 찾습니다.
만약 서블릿이 없다면, 서블릿 클래스를 로딩하고 인스턴스를 준비한 후 생성자를 호출합니다. 그리고 서블릿 초기화 메서드인 init()을 호출합니다.
이후 서블릿 컨테이너는 서블릿을 할당하는 스레드를 생성하여 Request/Resonse 객체를 인자로 넘겨줍니다.
service() 메서드에서 만든 동적인 결과를, HttpServlerResponse 객체에 실어 컨테이너에게 전달한다.
컨테이너는 HttpServlerResponse 객체를 HTTP 프로토콜에 맞추어 클라이언트에 응답하는 것으로 요청처리를 완료합니다.
사용이 끝난 스레드와 HttpServletRequest와 HttpServlerResponse 객체는 소멸합니다.
서블릿은 싱글톤으로 한번 생성이되면, 컨테이너가 종료될 때까지 유지됩니다.
기업용 애플리케이션 제작에 필요한 기술들의 사양을 정의한 것
기능 확장이 쉽고, 이기종 간의 이식이 쉬우며, 신뢰성과 보안성이 높고, 트랜잭션 관리와 분산 기능을 쉽게 구현할 수 있는 기능 제공
Java EE 구현체
)@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter w = response.getWriter();
w.write("<html>\n" +
"<head>\n" +
" <meta charset =\"UTF-8\">\n" +
"</head>\n" +
"<body>\n" +
"성공\n" +
"<ul>\n" +
" <li> id = " + member.getId() +
" </li>\n " +
" <li> username = " + member.getUsername() +
" </li>\n " +
" <li> age = " + member.getAge() + " </li >\n " +
"</ul>\n" +
"<a href=\"/index.html\">메인</a>\n" +
"</body>\n" +
"</html>");
}
}
// members.jsp
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// jsp도 결국엔 sevlet으로 변환됨
// 즉, request, response, out은 임포트 없이 사용 가능
MemberRepository memberRepository = MemberRepository.getInstance();
List<Member> members = memberRepository.findAll();
%>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/index.html">메인</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<%
for (Member member : members) {
out.write("<tr>");
out.write(" <td>" + member.getId() + "</td>");
out.write(" <td>" + member.getUsername() + "</td>");
out.write(" <td>" + member.getAge() + "</td>");
out.write("</tr>");
}
%>
</tbody>
</table>
</body>
</html>
개발자는 서버에 JSP 파일을 작성해둡니다. 클라이언트가 JSP를 실행해달라고 요청하면, 서블릿 컨테이너는 JSP 파일에 대응하는 자바 서블릿을 찾아서 실행합니다.
만약 JSP에 대응하는 서블릿이 없거나 JSP 파일이 변경되었다면, JSP 엔진을 통해 JSP 파일을 해석하여 서블릿 자바 소스를 생성합니다.
서블릿 자바 소스는 자바 컴파일러를 통해 서블릿 클래스 파일로 컴파일됩니다.
JSP파일을 바꿀 때마다 이 과정을 반복합니다.
JSP로 부터 생성된 서블릿은 서블릿 구동 방식에 따라 실행됩니다. 즉 서블릿의 service() 메서드가 호출되고, 출력 메서드를 통해 서블릿이 생성한 HTML 화면을 웹 브라우저로 보냅니다.