01. JSP 입문
1. 웹 애플리캐이션의 개요
1.1 웹 프로그래밍이란?
- 웹 상에서 사용자와 기업 또는 사용자들간의 연결을 가능하게 하는 프로그래밍 언어
- HTML(HyperText Markup Language)은 동적인 데이터를 처리할 수 없음. > 이를 극복하기 위한 기술이 CGI, ASP, PHP, JSP.
- 클라이언트/서버 구조 : 클라이언트가 요청(request) -> 서버가 데이터를 처리한 후 결과를 응답(response)
1.2 웹 프로그래밍 언어 소개
1.2.1 CGI (Common Gateway Interface)
- 응용 프로그램과 웹 서버 사이의 정보를 주고받는 방식이나 규약들을 정해 놓은 것.
- 크게 보면 ASP나 PHP, Perl, JSP 등이 모두 이 범주에 들어감.
- DBMS(데이터베이스)와의 연동이 매우 불편하고, 쉽게 익히기 어려움.
1.2.2 ASP (Active Server Page)
- Visual Basic 언어를 기반으로 만들어진 VBScript라는 스크립트 언어를 사용해서 구성된 웹 프로그래밍 기술.
- 장점 : 쉬운 문법, Active-X 및 DDL 컴포넌트를 사용하여 어느 정도의 확장성도 갖춤.
- 단점 : 웹 서버로 오직 Windows 기반의 IIS만 사용 가능 -> 플랫폼에 비독립적 / JAVA 기반의 JSP에 비해 시스템 자원의 효율성과 확장성이 떨어짐.
1.2.3 PHP (Personal Hypertext Preprocessor)
- ASP처럼 스크립트 기반의 언어, C를 기반으로 만들어져서 빠른 속도를 가지고 있음.
- 장점 : 다양한 플랫폼에서 사용 가능, 100% 무료
- 단점 : 서버측의 지원 인프라 매우 부족 / 확장성 떨어짐 / 보안상의 약점
1.2.4 JSP
- ASP, PHP처럼 스크립트 기반으로 개발되어 서버 페이지를 훨씬 쉽게 작성할 수 있으며 서블릿과 함께 구동함으로써 서블릿의 기능을 그대로 사용할 수 있고 자바빈즈, EJB같은 기술로 보다 강력한 객체지향적 지원이 가능하게 됨.
- 장점 : JSTL을 지원하게 되면서 가독성이 좋아지고 유지 보수가 훨씬 쉬워짐.
1.3 웹 애플리케이션의 구조
- 3-tier 구조 : 서버는 일반적으로 사용자의 요청을 받아들이고 결과 페이지를 전송하는 웹 서버와 사용자의 요청을 실질적으로 처리할 수 있는 비즈니스 로직(자바에서 Service 클래스같은...)이 구현되어 있는 애플리케이션 서버로 이루어짐.
2. JSP와 서블릿 (Servlet)
2.1 JSP 개요 (Java Server Page)
- 자바를 이용하여 동적인 웹 페이지를 만들기 위해 Sun Microsystems사가 개발한 기술.
- 예) 현재 시각 표시해주는 웹 페이지 : 사용자가 요청을 보낼 때마다 서버가 그 때의 시간을 표시해 줄 수 있음.
2.1.1 JSP 문서 소스 확인하기
-- CurrentTime.jsp
<%@page import="java.util.Calendar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
int a = 10; // 저장-실행하면 자동 생성된 .java파일에 실시간으로 반영 됨.
%>
<meta charset="UTF-8">
<title>2021. 3. 15. 오전 10:08:22</title>
</head>
<body>
<h1>현재 시간은 <%=hour %>시 <%=minute %>분 <%=second %>초 입니다.</h1>
</body>
</html>
- 기본적인 HTML 형식과 JAVA의 문법 형식이 혼합되어 있음.
- 사용자가 JSP 페이지를 요청하면 웹 서버(JSP 컨테이너)는 HTML 코드가 아닌 부분을 분석해서 JVM을 통해 자바 코드를 실행하게 되고 그 결과를 브라우저가 인식할 수 있는 HTML 코드 형식으로 변환해서 웹 페이지를 만들어 사용자 측으로 전송함.
- JSP가 동적인 웹 페이지를 만들어 준다는 의미 : 사용자의 요청이 들어오면 그 요청이 JSP 페이지의 자바 코드 부분에 의해 처리되어 결과가 동적으로 생산되고, 생산된 결과가 브라우저가 인식할 수 있는 HTML 코드로 변환된다는 의미.
(js와 다름. 소스코드 노출X / .java, .class 파일 자동 생성 됨.)
2.2 JSP의 특징
2.2.1 강력한 이식성
- SOA (Service Oriented Architecture) : 프로젝트 중심의 개발이 아닌 서비스를 중심으로 개발하고자 하는 것이 핵심. 하나의 서비스를 개발하면 그 서비스를 다른 프로젝트에서도 연계해서 사용할 수 있음. 재활용성이 높음. 비용절감과 효율성 증대.
2.2.2 서버 자원의 효율적인 사용
- 최초의 요청이 웹 서버에 들어오면 서버는 그 요청에 맞는 JSP 페이지에 대한 서블릿 인스턴스를 단 한 번 생성하고 이후 같은 페이지를 요청받으면, 이미 생성되어 있는 인스턴스에 스레드 단위로 요청을 전송하여 처리함.
2.2.3 간편한 MVC 패턴 적용 (Model - View - Controller)
- 디자인 패턴.
- 사용자에게 보이는 화면인 View, 실제 비즈니스 로직이 들어가는 Model, View와 Model을 연결시켜주는 Controller.
- JSP(View)와 자바빈즈(Model), 서블릿(Controller)을 이용해 구현.
- 자바빈즈를 사용하여 비즈니스 로직을 분리하면 컴포넌트화할 수 있으므로 공통 로직의 재사용 가능 -> 생산성 높아짐.
2.2.4 JSTL, 커스텀 태그 등을 이용한 개발 용이성
2.2.5. 서블릿과 비교되는 장점
- 서블릿 페이지는 전체 코드가 자바로 이루어져 있고 HTML 코드를 자바 코드 안에서 생성해야 함.
- JSP는 전체 틀은 HTML 태그로 구성되고 JSP 코드가 필요한 부분은 <% %> 안에 삽입하면 되므로 화면 내용 구성 편리.
2.3 서블릿의 개요
- 단적으로 말하면 웹 서버 상에서 실행되는 자바의 클래스 파일.
- 반드시 javax.servlet.Servlet 인터페이스를 구현해서 작성해야 하며 입력과 출력을 HTTP 프로토콜의 요청과 응답의 형태로 다룸.
- JSP로 요청이 전송되어 오면 컨테이너는 JSP 파일을 서블릿 형태의 자바 코드로 자동 변환한 후 서블릿의 라이프사이클을 거치면서 클라이언트의 요청을 처리해 줌.
- 서블릿에 대한 내용을 정확히 이해하면 JSP 대부분의 내용은 같은 개념이라 빠른 이해에 도움이 됨.
2.4 HTTP 프로토콜의 이해
2.4.1 HTTP 프로토콜의 구조
- HTML 구조와 비슷함
2.4.2 HTTP 요청(Request) 페이지
- 기본 구성 : HTTP 메소드, 접근할 주소(URL), 폼 파라미터(서버에 전달할 데이터)
- HTTP 메소드 : 클라이언트가 웹 서버가 해야 할 행동을 정해주는 정보.
대표 - GET 메소드, POST 메소드
2.4.3 HTTP 응답 메시지
2.5 웹 컨테이너란 ?
- JSP와 서블릿을 사용한 웹 서버는 크게 URL 주소의 해석을 담당하는 HTTP 서버 / JSP 파일의 실행 요청을 처리해주는 웹 컨테이너로 구성됨.
- 요청된 URL에 맞는 서블릿 클래스 또는 JSP 파일을 실행하여 그 결과를 HTTP 서버에 넘겨주게 되고 이는 응답 메시지의 형태로 사용자의 브라우저에 전송됨.
- 예) 아파치 톰캣, 웹로직, Resin 등
2.6 서블릿의 동작 원리
03. Servlet의 핵심 사항들
1. 클라이언트에서 서블릿으로 요청하는 방식
1.1 GET 방식
1.2 POST 방식
- 특정 페이지로 많은 양의 파라미터를 전송하여 파라미터를 관한 처리를 할 때 사용.
- 예) 회원 가입 요청, 게시판 글쓰기 요청, 자료실 업로드 등 -> 공통점 : 데이터베이스에서 INSERT
package chapter03;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorld extends HttpServlet{
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
arg1.setContentType("text/html; charset=utf-8");
arg1.getWriter().println("<h1>hello world</h1>");
Enumeration<String> paramNames = getInitParameterNames();
while(paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
getInitParameter(name);
System.out.println(name + "::" + getInitParameter(name));
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
resp.getWriter().println("<h1>hello world2</h1>");
}
}
05. 내장 객체와 액션 태그
1. 내장 객체
1.1 내장 객체의 개요
package chapter03;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.catalina.Session;
@WebServlet(urlPatterns = {"/hello2", "/hello3", "/hello4"}, initParams = {
@WebInitParam(name="name", value="이름값1"),
@WebInitParam(name="age", value="나이값"),
@WebInitParam(name="addr", value="주소값")
})
public class HelloWorld2 extends HttpServlet{
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
arg1.setContentType("text/html; charset=utf-8");
arg1.getWriter().println("<h1>hello world</h1>");
HttpSession session = arg0.getSession();
Enumeration<String> paramNames = getInitParameterNames();
while(paramNames.hasMoreElements()) {
String name = paramNames.nextElement();
getInitParameter(name);
System.out.println(name + "::" + getInitParameter(name));
}
}
}
package chapter03;
import java.io.IOException;
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("/login-form")
public class ServletStruct extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 페이지 포워드
req.getRequestDispatcher("form.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 아이디, 패스워드 값 확인 (파라미터로 넘어옴)
req.setCharacterEncoding("utf-8"); // HTTP 세상은 1바이트라. 한글처리
System.out.println(req.getParameter("id"));
System.out.println(req.getParameter("pw"));
// get으로 리다이렉트 (없으면 주소는 같은데 흰 페이지임 > 그래서 페이지 이동시킴)
resp.sendRedirect("login-form");
}
}
- doGet 방식
'JSP & Servlet' 카테고리의 다른 글
회원제 게시판(03), 파일첨부 21. 03. 22. (0) | 2021.03.22 |
---|---|
회원제 게시판(02), JSTL과 EL 21. 03. 19. (0) | 2021.03.19 |
자바빈, 예외처리, 파일 업로드, 회원제 게시판 만들기(01) 21. 03. 18. (0) | 2021.03.18 |
index 페이지에서 로그인, 로그아웃 처리 21. 03. 17. (0) | 2021.03.17 |
회원가입, 로그인, 로그아웃 21. 03. 16. (0) | 2021.03.16 |