본문 바로가기
[Naver Cloud Camp 7] 교육 정리

네이버 클라우드 캠프 86일차 230825

by 우기37 2023. 8. 24.

## 교육정리

1) 서블릿 배치

2) JSP 1편

 

 

 

#1 서블릿 배치

 

web.xml 코드

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="false">

  <!-- 컨텍스트 초기화 파라미터 등록 -->
  <context-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </context-param>
  <context-param>
    <param-name>aaa</param-name>
    <param-value>오호라!</param-value>
  </context-param>
  <context-param>
    <param-name>jdbc2.driver</param-name>
    <param-value>aaa</param-value>
  </context-param>
  <context-param>
    <param-name>jdbc2.url</param-name>
    <param-value>bbb</param-value>
  </context-param>
  <context-param>
    <param-name>jdbc2.username</param-name>
    <param-value>ccc</param-value>
  </context-param>
  <context-param>
    <param-name>jdbc2.password</param-name>
    <param-value>ddd</param-value>
  </context-param>
  <!-- 필터 객체 등록 -->
  <!--
  <filter>
    <filter-name>ex06.f1</filter-name>
    <filter-class>eomcs.servlet.ex06.Filter01</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>aaa</param-name>
      <param-value>오호라...</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>ex06.f1</filter-name>
    <url-pattern>/ex06/*</url-pattern>
  </filter-mapping>
  -->

  <!-- 서블릿 객체 등록 -->
  <!--
  <servlet>
    <servlet-name>s1</servlet-name>
    <servlet-class>eomcs.servlet.ex01.Servlet01</servlet-class>
  </servlet>
  -->
  <!-- 서블릿에 경로 설정 -->
  <!--
  <servlet-mapping>
    <servlet-name>s1</servlet-name>
    <url-pattern>/ex01/first</url-pattern>
  </servlet-mapping>
  -->

  <!--
  <servlet>
    <servlet-name>ex06.s2</servlet-name>
    <servlet-class>eomcs.servlet.ex06.Servlet02</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ex06.s2</servlet-name>
    <url-pattern>/ex06/s2</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ex06.s4</servlet-name>
    <servlet-class>eomcs.servlet.ex06.Servlet04</servlet-class>
    <init-param>
      <param-name>jdbc.driver</param-name>
      <param-value>aaa</param-value>
    </init-param>
    <init-param>
      <param-name>jdbc.url</param-name>
      <param-value>bbb</param-value>
    </init-param>
    <init-param>
      <param-name>jdbc.username</param-name>
      <param-value>ccc</param-value>
    </init-param>
    <init-param>
      <param-name>jdbc.password</param-name>
      <param-value>ddd</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>ex06.s4</servlet-name>
    <url-pattern>/ex06/s4</url-pattern>
  </servlet-mapping>
  -->

  <servlet>
    <servlet-name>ex12.s1</servlet-name>
    <servlet-class>eomcs.servlet.ex12.Servlet01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ex12.s1</servlet-name>
    <url-pattern>/ex12/s1</url-pattern>
  </servlet-mapping>
</web-app>

 

 

Listener

package eomcs.servlet.ex12;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.annotation.WebListener;

@WebListener
public class Listener01 implements ServletContextListener {
  @Override
  public void contextInitialized(ServletContextEvent sce) {
    System.out.println("웹애플리케이션 시작!!");
    System.out.println("서블릿 배치!");

    // 1) 서블릿 컨테이너에 등록할 서블릿 객체를 준비한다.
    Servlet03 servlet = new Servlet03();

    // 2) 서블릿 정보를 관리하는 객체를 꺼낸다.
    ServletContext sc = sce.getServletContext();

    // 3) ServletContext 객체를 통해 서블릿 객체를 등록한다.
    Dynamic 서블릿설정정보 = sc.addServlet("ex12.s3", servlet);

    // 4) 등록된 서블릿의 배치 정보를 설정한다.
    서블릿설정정보.addMapping("/ex12/s3");

  }
}

 

 

서블릿 배치: 1) web.xml 에 배치 정보를 등록

// 서블릿 배치: 1) web.xml 에 배치 정보를 등록
package eomcs.servlet.ex12;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet01 extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    resp.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = resp.getWriter();
    out.println("안녕하세요!");
  }
}

 

 

실행결과)

 

 

서블릿 배치: 2) 애노테이션으로 배치 정보를 등록

// 서블릿 배치: 2) 애노테이션으로 배치 정보를 등록
package eomcs.servlet.ex12;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/ex12/s2")
public class Servlet02 extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    resp.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = resp.getWriter();
    out.println("안녕하세요!");
  }
}

 

 

실행결과)

 

 

서블릿 배치: 3) 객체를 직접 생성하여 등록 : 웹 애플리케이션을 시작할 때

// 서블릿 배치: 3) 객체를 직접 생성하여 등록 : 웹 애플리케이션을 시작할 때
package eomcs.servlet.ex12;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet03 extends HttpServlet {
  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    resp.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = resp.getWriter();
    out.println("안녕하세요!");
  }
}

 

 

실행결과

 

 

 

#2 JSP 1편

JSP ?)

JSP(JavaServer Pages)는 서버 측에서 동적인 웹 페이지를 생성하기 위한 Java 기반의 웹 프로그래밍 기술입니다. JSP는 HTML 코드 안에 Java 코드를 삽입하여 웹 페이지를 생성할 수 있는 강력한 방법을 제공합니다. 아래에서 JSP의 주요 개념과 특징에 대해 설명해보겠습니다.

 

JSP 특징)

 

1. 동적 웹 페이지 생성: JSP를 사용하면 HTML 코드 내에 Java 코드를 포함하여 동적인 웹 페이지를 생성할 수 있습니다. 이렇게 생성된 페이지는 클라이언트의 요청에 따라 서버에서 동적으로 생성되며, 데이터베이스 조회, 계산, 로직 처리 등 다양한 작업을 수행할 수 있습니다.

2. 서버 측 스크립트 언어: JSP는 서버 측에서 실행되며, 웹 브라우저로부터 요청이 들어오면 서버에서 Java 코드를 실행하여 동적인 컨텐츠를 생성하고 그 결과를 웹 브라우저에 전송합니다.

3. Servlet 기반: JSP는 내부적으로 서블릿으로 변환되어 실행됩니다. 웹 컨테이너(예: Apache Tomcat)에서 JSP 파일을 컴파일하여 서블릿 클래스로 변환하고, 이후 서블릿으로서 실행됩니다.

4. 스크립트 요소: JSP 페이지에서는 HTML 코드와 함께 Java 코드를 사용할 수 있습니다. Java 코드는 <% %> 태그 내에 작성되며, 페이지 처리 로직, 데이터 처리, 반복문, 조건문 등을 포함할 수 있습니다.

5. 표현 언어(EL): JSP 페이지에서는 표현 언어(EL, Expression Language)를 사용하여 변수의 값을 출력하거나 연산을 수행할 수 있습니다. ${} 형식으로 사용하며, 보다 간결한 코드 작성을 가능하게 합니다.

6. 액션 태그: JSP 페이지에서는 특수한 목적을 위한 액션 태그를 사용할 수 있습니다. 예를 들어, 데이터베이스 연동, 제어 구문, 페이지 포함 등의 작업을 수행할 수 있는 액션 태그가 제공됩니다.

7. MVC 구조: JSP는 주로 View(표시) 역할을 수행하는 데 사용되며, Model(데이터 처리)과 Controller(로직 제어)를 분리하여 웹 애플리케이션을 개발하는 MVC(Model-View-Controller) 패턴과 잘 조합하여 사용할 수 있습니다.

8. 웹 애플리케이션 개발: JSP를 활용하여 회원 가입, 로그인, 게시판, 쇼핑 카트 등 다양한 웹 애플리케이션을 개발할 수 있습니다.

JSP는 웹 개발에서 효율적이고 강력한 기능을 제공하며, Java 기반의 유연한 프로그래밍 방식을 웹 페이지 생성에 적용할 수 있도록 도와줍니다.

 

 

JSP 구동원리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex01</title>
</head>
<body>
<h1>JSP 구동 원리</h1>
<pre>
1) 웹브라우저 ==> 서블릿 컨테이너 
   - JSP 실행 요청
     예) http://localhost:8080/java-web/jsp/ex01.jsp
2) 서블릿 컨테이너가 실행
   2.1 JSP의 서블릿 객체를 찾는다
   2.2 있으면,
     2.2.1 그 서블릿 객체를 호출한다. service() ---> _jspService()
   2.3 없으면,
     2.3.1 JSP 엔진을 이용하여 JSP 파일을 가지고 서블릿 자바 소스 파일을 생성한다.
     2.3.2 자바 컴파일러를 이용하여 소스 파일을 컴파일 한다.
     2.3.3 서블릿 객체를 생성한다. - init() 호출 ---> jspInit()
     2.3.4 그 서블릿 객체를 호출한다. - service() 호출 ---> _jspService()
   2.4 JSP 파일이 변경된 상태라면,
     2.4.1 다시 "2.3"을 반복한다.
3) 서블릿 컨테이너 ==> 웹브라우저 
   - 서블릿 실행 결과를 응답

JSP 파일을 가지고 생성한 서블릿 소스(.java)와 클래스 파일(.class)의 위치
- org.eclipse.wst.server.core/tmpx/work/...

정리!
- JSP 파일은 Python이나 PHP 처럼 직접 그 스크립트가 인터프리팅 되는 것이 아니다.
- JSP 엔진의 역할은 JSP 파일을 분석하여 서블릿 클래스를 생성하는 것이다.
- 즉 JSP 파일이 직접 실행되지 않는다!

JSP 
- 자바 서블릿 클래스를 만드는 재료로 사용된다.
- 그래서 서블릿 클래스를 만드는 "틀"이라 해서 "템플릿(template)"이라 부른다.
- JSP를 템플릿 기술이라 부르기도 한다.

JSP 공부법
- JSP를 작성할 때 사용하는 특정 태그들이 어떤 자바 코드를 생성하는지 이해하는 것이 중요하다.

JSP 실행을 요청하기
- JSP 파일이 있는 위치를 지정한다.
  예) http://localhost:8080/java-web/jsp/ex01.jsp

JSP를 변경한 후 실행을 요청하기
- 그냥 JSP 파일이 있는 위치를 지정하면 된다.
- 위에서 설명한대로 JSP 구동 원리에 따라 동작된다.

JSP 엔진이 서블릿을 만들 때 지켜야할 규칙:
- JSP 파일을 가지고 서블릿을 만들 때 HttpJspPage를 구현해야 한다.
- 클래스 계층도
  Servlet
    - init(ServletConfig):void
    - destroy():void
    - service(ServletRequest, ServletResponse):void
    - getServletInfo():String
    - getServletConfig():ServletConfig
    +---> JspPage
      - jspInit():void
      - jspDestroy():void
      +---> HttpJspPage
        - _jspService(HttpServletRequest, HttpServletResponse):void
        
</pre>
</body>
</html>

 

 

템플릿 데이터

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex02</title>
</head>
<body>
<h1>템플릿 데이터(template data)</h1>
<pre>
- JSP 파일에 그냥 작성하는 텍스트는 자바 출력 코드를 생성한다.
- 예) 
  out.write("템플릿 데이터")
  out.print("템플릿 데이터")
</pre>
</body>
</html>

 

 

스크립트릿(scriptlet)과 JSP 주석

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<% // _jspService() 메서드에 안에 넣을 코드를 작성하라!
int i;
%>
<html>
<head>
<meta charset="UTF-8">
<title>ex03</title>
</head>
<%
i = 5;
%>
<body>
<h1>스크립트릿(scriptlet)과 JSP 주석<%out.print(i);%></h1>
<!-- 
  이것은 HTML 주석이다.
  JSP 엔진 입장에서는
  단지 출력문으로 바꿀 템플릿 데이터일 뿐이다. 
 -->
<%-- 
JSP 주석 
- 이 태그는 JSP 주석이다. JSP 엔진이 무시한다.
- 이 태그 안에 작성한 것은 자바 클래스를 생성할 때 제거된다.

스크립트릿
- JSP 파일 안에 실행할 자바 코드를 넣은 태그
- 예)
  <%  자바 코드 %>
- 스크립트릿 안에 작성한 코드는 자바 클래스를 생성할 때 
  _jspService() 메서드 안에 작성한 순서 그대로 복사된다. 
--%>
<%
if (i < 10) {
  for (int x = 0; x < i; x++) {
    out.println("<p>" + x + "</p>");
  }
}
%>
</body>
</html>

 

 

스크립트릿(scriptlet) 응용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String[] names = {"홍길동", "임꺽정", "유관순"};
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ex04</title>
</head>
<body>
<h1>스크립트릿(scriptlet) 응용</h1>
<ul>
<%
for (String name : names) {
  out.println("<li>" + name + "</li>");
}
%>
</ul>
</body>
</html>