-
JSP | ServletJAVA/JSP 2020. 2. 18. 17:24
Servlet
서버 내부에서 실행되는 웹 프로그램
웹 브라우저로 실행 결과를 전송함↔ JavaScript: 클라이언트에서 실행
- JSP 페이지를 요청하면 .jsp 파일이 .java 파일로 변환되는데
변환된 자바 파일을 서블릿이라고 함 - .java 파일에 문제가 없다면 class 파일로 변환되어 메모리에 올라가게 됨
서블릿 객체가 생성되며 요청에 따른 응답을 실행 - 자바 코드가 많이 사용되기 때문에 접근이 어려워서 JSP가 개발됨
- 요청에 바로 응답하기 때문에 jsp보다 속도가 빠름
- 모델 2에 사용되며 JSP와 적절하게 혼합해서 사용된다고 함
Servlet 작성_in Eclipse
- New → Servlet
Class 파일로도 작성은 가능하지만
Servlet으로 사용하기 위한 환경설정을 일일이 다 해주어야 함 - Class name 작성
- URL mappings: 서블릿 요청 경로 지정, 실행할 서블릿 클래스명과 동일함
변경 시에는 xml파일 설정이 필요함[모델 2(스프링) 환경설정 시 사용]
ex) /HelloTest - 필요에 따라 생성자 및 메소드 선택
- 서블릿은 자바 파일이기 때문에 프로젝트의 src 폴더에 저장해야 함
이클립스에서 볼 때는 Java Resources 폴더 내부에 src폴더가 있음
Servlet 조건
- 서블릿, http 관련 클래스를 import 해야함
- 반드시 public class로 작성해야 함
홈페이지에 누구나 접속이 가능하게 만들기 위함 - HttpServlet 클래스를 상속받아야 함
doGet(), doPost() 등의 메소드를 사용하기 위함
doGet(): 사용자가 GET으로 요청을 보냈을 때 자동으로 호출되는 메소드(콜백 계열)
doPost(): POST로 요청 했을 때 자동으로 호출되는 메소드
Servlet Method
Servlet: 모든 서블릿이 구현해야 하는 메소드를 정의한 인터페이스
HttpServlet 클래스만 상속하는 경우에는 반드시 할 필요 없음메소드 설명 void init(ServletConfig config) 서블릿 컨테이너가 서비스를 시작한 서블릿을 가리킬 때 호출되는 메소드
프로그램 실행시 최초 한 번만 실행되기 때문에 서블릿을 초기화하는 생성자 역할을 함void destroy() 서블릿 컨테이너가 서비스를 종료하는 서블릿을 가리킬 때 호출되는 메소드
서버를 끄지 않은 상태에서 서블릿의 내용을 변경하고 저장하면
변경 사항을 반영하기 위해 서블릿을 재시작하려고 종료할 때 실행됨void service(ServletRequeset req, ServletResponse res) 서블릿 컨테이너가 서블릿이 요청에 응답하도록 허가할 때 호출되는 메소드
HttpServlet Method
HttpServlet: 웹 사이트에 적합한 HTTP 서블릿을 생성하기 위해
상속되어야 하는 추상 클래스
최소 하나 이상의 메소드를 오버라이딩 해야함메소드 설명 protected void doGet(HttpServletRequest req, HttpServletResponse res) service 메소드에 의해 서버가 서블릿에게 GET 요청을 처리하도록 할 때 호출되는 메소드 protected void doPost(HttpServletRequest req, HttpServletResponse res) 위 메소드와 처리 과정은 동일하며 POST 요청을 처리할 때 호출되는 메소드 void service(HttpServletRequest req, HttpServletResponse res) 사용자 요청을 protected service()에 급파 protected void service(HttpServletRequest req, HttpServletResponse res) public service()로부터 표준 HTTP 요청을 받아서 doXXX 메소드로 요청을 급파함 ※ GET방식으로 데이터를 전달하는 경우
URI에서 /요청페이지/?매개변수1=값1&매개변수2=값2&... 형식으로 데이터가 전달됨
?이하의 데이터를 QueryString이라고 함
데이터 양이 적으며 보안에 상관없는 내용을 전달하는 경우 적합※ POST로 데이터를 전달하는 경우
URL에 전달 데이터가 출력되지 않으며
데이터 양이 많거나 보안이 중요한 내용을 전달하는 경우 적합
Servlet 기본 구조
1234567891011121314151617181920212223242526272829303132333435import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;@WebServlet("/HelloTest")// 서블릿은 HttpServlet을 반드시 상속해야 하고// 모든 사용자가 접근할 수 있도록 public으로 설정해야 함public class HelloTest extends HttpServlet {// init() 서블릿이 메모리에 올라갈 때 단 한 번만 호출되는 메소드public void init(ServletConfig config) throws ServletException {// 서블릿 초기화 등 생성자 역할}// destroy() 서블릿이 메모리에서 해제될 때 호출되는 메소드public void destroy() {}// GET 방식 요청에 대한 응답을 실행하는 메소드protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}// POST 방식 요청에 대한 응답을 실행하는 메소드protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter- javax.servlet.ServletConfig: 서블릿 환경설정 관련 클래스
- javax.servlet.ServletException: 서블릿 예외 처리 클래스
- javax.servlet.annotation.WebServlet: 어노테이션 관련 클래스
- javax.servlet.http.HttpServlet: 상속받을 상위 클래스
HttpServlet 클래스를 상속받기 위해서 import 해주어야 함 - javax.servlet.http.HttpServletRequest: ServletRequest 인터페이스를 상속하며,
HTTP 서블릿에 대한 요청 정보를 제공하는 인터페이스 - javax.servlet.http.HttpServletResponse: ServletResponse 인터페이스를 상속하며,
응답을 보낼 때 HTTP의 특정 기능을 제공하는 인터페이스 - java.io.IOException: 입출력 예외 처리 클래스,
데이터 전송 시 입출력을 사용하게 되면 반드시 예외 처리를 해야 함
※ 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 만들고
그것을 서블릿의 서비스 메소드들(doGet, doPost, etc)에 인자로 전달함
@WebServlet() 어노테이션
@WebServlet()의 괄호 내부에 실제 경로가 아닌
"가상 경로"를 상대 경로로 지정해서 보안을 향상시킬 수 있음- 실제 경로: /HelloTest
- 가상 경로: /test/imsi/HelloTest
- 프로그램 실행시 가상 경로를 포함한 URL이 출력됨
예제
WebContent/sub/send.html 에서 이름과 주소 데이터를 받아서
src/GetDate.java 서블릿에서 처리하는 예제WebContent/sub/getdate.jsp 와 비교
WebContent/sub/send.html
사용자의 요청을 받는 html 페이지
12345678910111213141516<!doctype html><html lang="ko"><head><meta charset="UTF-8" /><title>이름, 주소 전달</title></head><body><!-- <form method="post" action="getdate.jsp"> --><!-- 서블릿에 데이터 전송시 action="/프로젝트명/실행 서블릿 클래스명" --><form method="get" action="/ServletTest/GetDate">이름: <input type="text" name="name" /><br/>주소: <input type="text" name="addr" /><br/><input type="submit" value="보내기"/></form></body></html>http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
src/GetDate.java
사용자의 요청을 처리해서 응답하는 서블릿 파일
12345678910111213141516171819202122232425262728293031323334353637import java.io.IOException;import java.io.PrintWriter;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import javax.servlet.http.*;@WebServlet("/GetDate")public class GetDate extends HttpServlet {// GET 방식으로 요청해도 service() 메소드가 호출됨protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// service() 호출 확인용System.out.println("service 호출");// 응답 문서의 타입과 인코딩 지정response.setContentType("text/html;charset=utf-8");// 데이터 전송을 위한 I/O 클래스, response의 getWriter() 메소드로 객체 반환PrintWriter out = response.getWriter();out.println("<html><head></head>");out.println("<body>");// 요청 데이터를 utf-8 인코딩으로 얻어 와서 변수에 저장request.setCharacterEncoding("utf-8");String name = request.getParameter("name");String addr = request.getParameter("addr");// 출력out.println("이름: " + name + ", 주소: " + addr);out.println("</body>");out.println("</html>");}}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
WebContent/sub/getdate.jsp
사용자의 요청을 처리해서 응답하는 JSP 파일
123456789101112131415161718192021222324<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>응답 페이지</title><%// 한글 인코딩 설정request.setCharacterEncoding("utf-8");%><%String name = request.getParameter("name");String addr = request.getParameter("addr");// 출력out.println("이름: " + name + ", 주소: " + addr);%></head><body></body></html>http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
서블릿의 개요에 대해서는 이전에 한 번 살펴보았고
이번에는 서블릿을 직접 작성하는 방법에 대해 알아보았습니다.서블릿은 .jsp 파일이 컴파일된 형태임과 동시에
JSP와 동일하게 사용자 요청을 처리해서 응답하는 역할도 수행할 수 있습니다.서블릿과 jsp파일의 코드를 비교해 보면 jsp로 작성하는 것이 더 간단해 보이지만
자바에 숙달된 분들이라면 서블릿으로 작성하는 것이 더 편할 수도 있다고 합니다.
기능에 차이는 없기 때문에 자신에게 더 편리한 형식으로 작성하시면 될 것 같습니다.
'JAVA > JSP' 카테고리의 다른 글
JSP | 내장 객체 개요 & Method &객체 영역 (0) 2020.02.19 JSP | Page Directives_< %@include% > (0) 2020.02.19 JSP | Page Diretives_<%@ page %> (0) 2020.02.18 JSP | Script 3대 요소 & Comment 주석 (0) 2020.02.17 JSP | JSP 환경 설정 (0) 2020.02.14 - JSP 페이지를 요청하면 .jsp 파일이 .java 파일로 변환되는데