백엔드 - Servlet/JSP

이상해씨·2022년 9월 16일
0

웹 풀스택(JAVA)

목록 보기
46/54

✔ Web Architecture

◾ Web 동작 흐름.


1.Client 요청.
2.Web Server 접속.

  • 정적 파일 요청 처리.
    3.Application Server Logic 처리(필요하다면 DB와 연동).
  • 동적 파일 요청 처리.
    4.Web Server 응답 처리.
    5.Client 확인.

◾ Project 생성

  • Dynamic Web Project 선택
  • Project name, Target runtime 선택
  • context root, content directory 확인
    • module 버전이 3.0 미만일 경우 반드시 web.xml 생성

◾ response 한글 설정.

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("/Hellogood")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private String name;
	
    // 초기화 함수.
	public void init() {
		name = "김남규";
	}
	
    // doGEt, doPost 등의 메소드가 있음.
    // https://docs.oracle.com/javaee/7/api/toc.htm
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1. data get
		// - 단순히 출력하는 예시이므로 패스.
        
		// 2. logic
        // - 단순히 출력하는 예시이므로 패스.
		
		
		// 3. reponse page => html
		// 한글이 깨지지 않게 설정.
		response.setContentType("text/html;charset=utf-8");
        // response.setContentType("text/html");
        // response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("	<body>");
		out.println("		<h2>Hello Servlet!!!</h2>");
		out.println("		<h2>"+ name + "님 안녕하세요!</h2>");
		out.println("	</body>");
		out.println("</html>");
	}
}

✔ Servlet

1. Servlet

◾ Java Servlet(자바 서블릿)

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양
    • 웹 서버 성능 향상을 위해 사용하는 자바 클래스의 일종.
    • JSP와 비슷.
      • JSP(___.html) : HTML문서 안에 Java 코드 포함.
      • 서블릿((___.java) : 자바 코드 안에 HTML 포함.

◾ Servlet 동작 흐름.

◾ Servlet API : JAVA EE Docs

  • Servlet : 최상위 인터페이스
    • destroy(), getServletConfig(), getServletInfo(), init(), service()
  • GenericServlet : service()를 구현해야하는 추상 클래스.
  • HttpServlet : Get, Post 구분을 위한 의미상을 추상 클래스.

2. Servlet Life-Cycle

◾ Servlet Life-Cycle

  • main method가 없음.
    • 객체 생성, 사용 등의 주체가 Servlet Container(WAS)에게 있음.
  • Client 요청(request)
    • Servlet Container 객체 생성(한 번만, 생성자), 초기화(한 번만, init())
    • 요청에 대한 처리(요청시 매번 반복, service()/doXXX())
  • Servlet 객체가 필요없게 되면 제거하는 일 까지 Container가 담당.

◾ Servlet Life-Cycle 주요 메서드

  • 생성자 : 최초 한번 호출.
  • init() : 서블릿이 로드될 때 한번 호출.
    • 코드 수정으로 인해 다시 로드되면 다시 호출.
  • doGet() : GET 방식으로 data 전송 시 호출.
  • doPOST() : POST 방식으로 data 전송 시 호출.
  • service() : 모든 요청은 service()를 통해 doXXX()메서드로 이동.
  • destroy() : 서블릿이 메모리에서 해제되면 호출.
    • 코드가 수정되면 호출.

3. Servlet Parameter 처리

◾ 전송 방식.

  • GET
    • 전송되는 데이터가 URL뒤에 Query String으로 전달.
    • 입력 값이 적은 경우나 데이터가 노출이 되도 문제가 없을 경우 사용.
    • 장점.
      • 간단한 데이터 빠르게 전송.
      • form tag뿐만 아니라 직접 URL에 입력하여 전송 가능.
    • 단점.
      • 데이터 양에 제한(location bar(URL+parameters)로 최대 2kb(2048byte))
  • POST
    • URL과 별도로 전송.
    • HTTP header 뒤 body에 입력 스트림 데이터로 전달.
      • Reuqest = Header + Payload
    • 장점.
      • 데이터의 제한이 없음.
      • 최소한의 보안 유지 효과.
    • 단점.
      • 전달 데이터의 양이 같을 경우 GET방식보다 느림.(전송 패킷을 body에 데이터를 구성해야 하므로.)

URI = URL + Query String

  • URL ? parameter1=value1 & parameter2=value2
    • ? : Query String Begin
    • & : Query String Separator

✔ JSP

1. JSP(Java Server Page)

◾ JSP

  • HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어.
    • Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작.
  • 자바 서버 페이지는 실행시 자바 서블릿으로 변환된 후 실행.
    • 서블릿보다 느리지만 HTML 표준에 따라 작성되므로 웹 디자인하기 편리.

◾ JSP 동작 흐름

2. JSP Scriptlet

◾ JSP Scripting Element - 선언

  • <%! %> : 멤버 변수 선언이나 메소드를 선언하는 영역.
<%!
String name;
public void init(){
	name = "Test";
}
%>

◾ JSP Scripting Element - 스크립트릿

  • <% %> : Client 요청시 매번 호출 영역. Servlet으로 변환시 service() 에 해당하는 영역. request, response에 관련된 코드 구현.
for(int dan = 2; dan < 10; dan++){
	out.println("<tr>";
    String classname = dan % 2 == 0 ? "color1" : "color2";
    for(int i = 1; i < 10; i++){
    	out.println("<td class=\"" + classname + "\">" + dan + " * " + i + " = " + dan * i + "</td>");
    }
    out.println("</tr>");
}

◾ JSP Scripting Element - 표현식

  • <%= %> : 데이터를 브라우저에 출력할 때 사용.
    • 문자열 뒤에 세미콜론(;) 작성 금지.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>Hello JSP!!!</h2>
	<h2>안녕 <%= name %>제이에스피 </h2>
</body>
</html>

◾ JSP Scripting Element - 주석

  • <%-- > : 코드 상에서 부가 설명 작성.
    • Client에 넘어갈 때 제거.
    • 웹 사이트 소스 코드에서 보이지 않음.
<!-- HTML 주석 -->
<%-- JSP 주석 -->

3. JSP Directive

◾ JSP 지시자(Directive)

  • page Directive : 컨테이너에 현재 JSP페이지를 어떻게 처리할 것인가에 대한 정보 제공
    • 인코딩 적용 순서
      - pageEncoding > contentType > ISO-8859-1
      - pageEncoding을 사용하면 복잡해질 수 있으므로 contentType으로 적용.
      <%@ page attr1="val1" attr2 = "val2" ... %>
  • include Directive : 특정 jsp file을 페이지에 포함. 반복 사용되는 jsp페이지를 포함하여 사용.
    <%@ include file="/template/header.jsp %>
  • taglib Directive : JSTL 또는 사용자에 의해 만든 커스텀 태그를 이용할 때 사용.
    <%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core %>

◾ JSP 지시자 page

속성기본값설명
languagejava스크립트에서 사용할 언어 지정
info현재 JSP 페이지에 대한 설명
contentTypetext/html;charset=ISO-8859-1브라우저로 내보내는 내용의 MIME 형식 지정 및 문자 집합 지정
pageEncodingISO-8859-1현재 JSP 페이지 문자 집합 지정
import현재 JSP 페이지에 사용할 Java 패키지나 클래스 지정.
sessiontrue세션의 사용 유무 설정
errorPage에러가 발생할 때에 대신 처리될 JSP 페이지 설정.
isErrorPagefalse현재 JSP 페이지가 에러 핸들링 하는 페이지인지 지정하는 요소.
buffer8KB버퍼 크기.
autoflushtrue버퍼의 내용을 자동으로 브라우저로 보낼지 설정.
isThreadsafetrue현재 JSP 페이지가 멀티 쓰레드로 동작해도 안전한지 여부 설정.
extendsjavax.servlet.jsp.HttpJspPage현재 JSP페이지를 기본적인 클래스가 아닌 다른 클래스로부터 상속하도록 변경.

4. JSP 기본 객체

◾ JSP 기본 객체

기본 객체명Type설명
requestjavax.servlet.http.HttpServletRequestHTML 폼 요소의 선택 값 등 사용자 입력 정보 읽을 때 사용.
responsejavax.servlet.http.HttpServletResponse사용자 요청에 대한 응답 처리.
pageContextjavax.servlet.jsp.Page.Context각종 기본 객체를 얻거나 forward 및 include 기능 활용
sessionjavax.servlet.http.HttpSession클라이언트에 대한 세션 정보 처리. page directive의 session = "false"일 경우 생성 X
applicationjavax.servlet.ServletContext웹 서버의 애플리케이션 처리와 관련된 정보 레퍼런스.
outjavax.servlet.jsp.JspWriter사용자에게 전달하기 위한 output 스트림 처리할 때 사용.
configjavax.servlet.ServletConfig현재 JSP에 대한 초기화 환경 처리.
pagejava.lang.Object현재 JSP페이지에 대한 참조 변수.
exceptionjava.lang.ExceptionError를 처리하는 JSP에서 isErrorPage 속성을 true로 설정하면 exception 내장 객체 사용 가능. 기본은 false. 전달된 오류 정보를 담고 있음.

◾ JSP 기본 객체의 영역(Scope)

기본 객체설명
pageContext하나의 JSP페이지를 처리할 때 사용되는 영역.
한 번의 클라이언트 요청에 대하여 하나의 JSP 페이지 호출. (단 한 개의 page객체만 대응)
페이지 영역에 저장한 값은 페이지를 벗어나면 사라진다.
커스텀 태그에서 새로운 변수를 추가할 때 사용.
request하나의 HTTP 요청을 처리할 때 사용되는 영역
웹 브라우저가 요청을 할 때마다 새로운 request객체 생성
request영역에 저장한 속성은 그 요청에 대한 응답이 완료되면 사라짐.
session하나의 웹 브라우저와 관련된 영역
같은 웹브라우저 내에서 요청되는 페이지들은 같은 session 공유.
로그인 정보 등 저장.
application하나의 웹 어플리케이션과 관련된 영역
웹 어플리케이션당 1개의 application 객체 생성.
같은 웹 어플리케이션에서 요청되는 페이지들은 같은 application 객체 공유.

◾ JSP 기본 객체의 영역(Scope) - 공통 Method

  • servlet과 jsp 페이지 간에 특정 정보를 주고 받거나 공유하기 위한 메소드 지원.
method설명
void setAttribute(String name, Object value)문자열 name이름으로 Object형 데이터 저장. Object이므로 어떤 Java 객체라도 저장 가능.
Object getAttribute(String name)문자열 name에 해당하는 속성값이 있다면 Object형태로 반환. 없다면 null 반환. 적절한 형 변환 필요.
Enumeration getAttributeNames()현재 객체에 저장된 속성들의 이름들을 Enumeration형태로 반환.
void removeAttribute(String name)문자열 name에 해당하는 속성 삭제.

◾ WEB Page 이동

forward(request, response)sendRedirect(location)
사용 방법RequestDispatcher dispatcher = request/getRequestDispatcher(path);
dispatcher.forward(request, response);
response.sendRedirect(location);
이동 범위동일 서버(project)내 경로동일 서버 포함 타 URL 가능.
location bar기존 URL유지(실제 이동되는 주소 확인 불가)이동하는 page로 변경.
객체기존의 request와 response 그대로 전달.새로운 request와 response 생성
속도비교적 빠름forward()에 비해 느림.
데이터 유지request의 setAttribute(name, value)를 통해 전달.request로는 data 저장 불가능.
session이나 cookie 이용.
profile
후라이드 치킨

0개의 댓글