WEB/Study

[0322] [Web - JSP] JSP 개발 환경 및 기초 문법

JSP 개발 환경 및 기초 문법

  • 1. 개발 환경 구축

- Eclipse(이클립스) 설치 , Tomcat (톰캣, 웹컨테이너, WAS - 웹어플리케이션 서비스)

: Tomcat 웹어플리케이션 서버 중에 하나이다. (동적 데이터 처리)

HttpServletRequest, HttpServletResponse

: WebServer - Apache는 웹서버 중에 하나이다. (정적 데이터 처리)

HttpRequest, HttpResponse

 

 

=> https://www.eclipse.org/downloads/packages/

     or drive.google.com/file/d/1vi_uSndiIl_DCZwspiCSZFYB7SEAdPR_/view?usp=sharing     

    Eclipse IDE for Enterprise Java and Web Developers >>>  Windows x86_64

 

=> tomcat.apache.org/

     or drive.google.com/file/d/1Lp-WlzljDMBwsnh43w2qux_2OcHW4v17/view?usp=sharing

     Download >> Tomcat9 >> 9.0.44 >> Binary Distributions >> 64-bit Windows zip 파일 다운로드

 

eclipse-jee-2020-12-R-win32-x86_64 압축 해제후 eclipse.exe 실행 : 

실행 오류시 shshsh.tistory.com/88 참고

워크스페이스 경로 지정
012345678910111213

 

01234567891011121314
012345678910
012345


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" id="WebApp_ID" version="4.0">

  <display-name>servlet_0322</display-name>
  
  <servlet>
  	<servlet-name>hello</servlet-name>
  	<servlet-class>ex1.EX1_HelloWebServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>hello</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  
  <servlet>
  	<servlet-name>MyProfile</servlet-name>
  	<servlet-class>exam.MyProfile</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>MyProfile</servlet-name>
  	<url-pattern>/MyProfile</url-pattern>
  </servlet-mapping>
  
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

EX1_HelloWebServlet.java

package ex1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// HttpServlet을 상속 받았기 때문에 WAS에 의해서 관리 될 객체가 된다.
public class EX1_HelloWebServlet extends HttpServlet{
	// 알트 + 시프트 + S
	public EX1_HelloWebServlet() {
		System.out.println("생성자 호출!");
		// TODO Auto-generated constructor stub
	}
	
	// doGet, service 메서드는 thread에 의해서 관리된다.
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
		System.out.println("service 메서드 호출!");
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("get 메서드 호출!");
		// resp : 서버가 브라우저에게 응답하는 객체
		// MIME TYPE을 전송한다.
		resp.setContentType("text/html; charset=EUC-KR");
		PrintWriter out = resp.getWriter();
		out.println("<h1>");
		out.println("안녕하세요오!! 나의 첫번째 서블릿입니다!!.");
		out.println("</h1>");
		out.close();
	}
}

MyProfile.java

package exam;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyProfile extends HttpServlet{

	public MyProfile() {
		System.out.println("MyProfile 생성자 호출!");
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("MyProfile doget 메서드 호출!");			
		resp.setContentType("text/html; charset=EUC-KR");
		PrintWriter out = resp.getWriter();
		String name = "홍길동";
		out.println("<h2>");
		out.println("나의 소개 </br>");
		out.println("이름은 " + name + "입니다.</br>");
		out.println("지금 가산에 있습니다.</br>");
		out.println("</h2>");
		out.close();
	}

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(req, resp);
		System.out.println("MyProfile service 메서드 호출!");
	}
}

GugudanServlet.java

package ex1;

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;

/**
 * Servlet implementation class GugudanServlet
 * Servlet 3.0부터 어노테이션 기반이 제공, web.xml 작성이 불필요하다.
 */
@WebServlet("/GugudanServlet") // web.xml을 대신한다.
public class GugudanServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
		// SetvletResponse 객체, 즉 웹 브라우저로 전송하는 스트림
		response.setContentType("text/html; charset=EUC-KR"); // 최상위
		PrintWriter out = response.getWriter();
		StringBuffer sb = new StringBuffer();
		sb.append("<!DOCTYPE html>");
		sb.append("<html>");
		 sb.append("<head>");
		  sb.append("<meta charset=\"euc-kr\">");
		  sb.append("<title> 구구단").append("</title>");
		 sb.append("</head>");
		 sb.append("<body>");
		  sb.append("<table border=\"1\">");

		  // tr 태그는 하나의 row, td는 하나의 column
		  // <td>데이터</td>
		  // 최소한 한개의 td는 반드시 한개의 tr로 이루어진다
		  for (int i=0; i<=9; i++) {
			  sb.append("<tr>");	  
			  for (int j=2; j<=9; j++) {
				  if(i == 0) {
					  sb.append("<td>").append(j);
					  sb.append("단");
					  sb.append("</td>");  
				  } else {
					  sb.append("<td>").append(j);
					  sb.append("x").append(i);
					  sb.append("=").append(i*j);
					  sb.append("</td>");
				  }
			  }
			  sb.append("</tr>");
		  }
		  sb.append("</table>");
		 sb.append("</body>");
		sb.append("</html>");
		out.println(sb.toString());
	}
}

- cgi : C언어 기반으로 웹 어플리케이션을 처리

         프로세스 단위로 이루어져 있다. 단점 : 무겁고 어렵다.

<Thread 기반>

- php : 인터프리터 기반, Apache의 웹 어플리케이션 모듈

- asp : 비주얼 베이직 기반의 웹 어플리케이션

- servletJSP : 자바 기반의 스레드 단위로 동작하는 웹 어플리케이션

 

- Servlet의 기본 아키텍처와 JSP

- JSP 표기법 - 스크립트 릿 방식

- JSP 개발 방법 : Model1, Model2 , 패턴 - > MVC 패턴

- JSP 내장 API : request,respose =>

- JSP Scope

 

***** < 웹 라이프사이클> *****

1. 클라이언트가 요청을 한다.

2. web.xml에서 해당 요청의 url을 확인한 후에 요청으로 매핑 된 Servlet을 최초로 생성한다

 (톰 캣이 처음 시작되었을 때...)

  2-1. WAS는 무조건 새로운 요청이 왔을 때 HttpServletRequest, HttpServletResponse를 생성해둔다.

3. init() 을 호출한다. - 서블릿 객체 초기화

4. service() 를 호출할 때 2-1에서 생성해둔 두 객체를 인자값으로 전달하면서 호출한다. (Thread)

5. service() 에서 분석 된 전송방식(get,post)에 따라서 doXXX 메서드를 호출하면서 

  HttpServletRequest, HttpServletResponse 를 전달하게 된다.

6. doGet() 이나 doPost()를 통해서 할일을 하고(비지니스 로직)

7. Response 객체를 통해서 브라우저로 전송한다.

 

============================================

HTTP 프로토콜 (웹 서버) - HttpRequest, HttpResponse

■ HTTP 프로토콜은 웹 서버와 웹 브라우저사이의 통신에 사용하는 프로토콜이다.

■ HTTP 프로토콜은 요청(Request)과 응답(Response)으로 이루어진 프로토콜이다.

■ HTTP 요청은 HTTP 메소드, 요청 URL, 서버에 전달한 정보로 이루어져 있다.

■ HTTP 응답은 요청에 대한 서버의 응답으로서 상태코드, 컨텐츠 타입정보, 컨텐츠로 구성되어 있다.

 

Web Container (웹 컨테이너, WAS) - HttpServletRequest, HttpServletResponse

■ 컨테이너는 웹서버와 서블릿 사이의 통신을 지원한다.

■ 컨테이너는 서블릿의 생명주기를 관리한다.

■ 컨테이너는 새로운 요청이 들어올 때 마다 자바 스레드를 생성해서 사용자의 요청을 처리한다.

■ 컨테이너는 선언적인 방법으로 보안관련 내용을 설정할 수 있다.

-> 사용자의 요청을 대기하는 스레드를 통해서 Servlet을 관리한다

 

서블릿

■ 서블릿은 웹 서버에서 실행되는 자바 프로그램이다. (톰캣[WAS]에서 관리되는..)

■ 서블릿은 사용자의 요구에 따라서 동적으로 웹 컨텐츠를 생산해서 클라이언트 측에 전송하는 자바 기술이다.

■ javax.servlet.http.HttpServlet 클래스를 상속받아서 사용자정의 서블릿 프로그램을 작성한다.

 

서블릿의 실행과정

■ 사용자가 url을 클릭해서 컨테이너(ex.톰캣)에 새로운 요청을 한다.

■ 컨테이너는 요청을 접수한 다음, HttpServletRequest와 HttpServletResponse 객체를 생성한다.

■ 접수된 url을 분석해서 해당 서블릿 객체를 생성하고, 사용자의 요청을 처리하기 위해 스레드를 생성한다.

■ 서블릿의 service() 메소드를 호출하고, 요청방식에 따라서 어떤 메소드를 호출할지 결정한다. get, post

■ 서블릿의 doGet()메소드를 호출해서 사용자의 요청을 처리하고, 응답을 작성한다.

■ 작성된 응답을 클라이언트에 전송한다.

■ 사용자의 요청을 처리하기 위해 생성한 스레드를 소멸시킨다.

 

배포 서술자(web.xml)

■ 배포 서술자는 서블릿과 jsp를 어떻게 실행하는냐에 관한 정보가 들어있다.

■ 배포 서술자에서는 서블릿과 URL을 매핑시키는 작업을 한다.

■ 배포 서술자는 URL 매핑외에 보안역할 설정, 오류 페이지 설정, 초기화 구성

등의 내용을 설정할 수 있다.