티스토리 뷰
📍 서블렛 (Servlet)
– 웹 서버측에서 사용자의 요구에 따라,
자동으로 생성된 HTML형식의 페이지를 생산하여 전송해 줄 수 있는 여러 기술 중 Java 진영의 기술이 바로 Servlet.
– 단적으로 말하자면 웹 서버 상에서 실행되는 Java의 클래스 파일이라 할 수 있음.
– 다만 일반적인 Java 클래스와 비교해 볼 때,
서블렛은 반드시 javax.servlet.Servlet 인터페이스를 구현해서 작성해야 하며,
입력과 출력을 HTTP 프로토콜의 요청과 응답의 형태로 다룬다는 점이 다름.
– 클라이언트가 요청을 보내오면 웹 서버는 그 요청에 해당하는 서블렛 클래스 파일을 실행,
서블렛 클래스에서는 요청을 처리해 결과물을 만들어 내면 웹 서버가 그 페이지를 클라이언트에 전송함.
– 'Server Side Applet' 즉, 서버 사이드의 Java 응용 프로그램이란 뜻.
▶ JSP와 Servlet
JSP |
Servlet |
• Java Server Page, 클라이언트의 요청 (동적 컨텐츠를 처리)을 처리하는 기술. → 동적 컨텐츠의 예시 ) DB 등 → 정적 컨텐츠의 예시 ) html, css, JS, 이미지 등 |
• JSP파일이 실행될 때, 컨테이너 (Tomcat)에서 서블릿 형태 (java파일)로 변경. • itwill.jsp → 실행 → itwill_jsp.java → itwill_jsp.class (서블릿)가 되면서 동작. |
html + java |
java |
– 컴파일러 필요 없음. – 인터프리티언어. – 새로고침만 눌러도 바로바로 반영됨. |
– 반드시 컴파일러가 필요. – 뭔가를 수정하면 매번 컴파일(다시실행)을 해줘야 함. – 속도도 느리고 불편함. → html코드 섞어서 빨리빨리 실행시키는 jsp 등장. |
▶ 서블렛의 동작 원리
1. 사용자의 URL 요청
2. request, reponse 객체 생성
3. 서블릿 인스턴스와 스레드 생성
4. service() 메서드 호출과 서블릿 클래스 실행
5. 응답과 스레드의 소멸
▶ 서블렛 작성 규칙
1. java.servlet.Servlet 인터페이스를 구현해야 함.
2. 인터페이스를 직접 구현하기 힘들 경우, javax.servlet.http.HttpServlet 클래스를 상속해야 함.
3. service() → doGet(), doPost() 메서드를 상황에 따라서 호출 (오버라이딩).
4. 3단계에서 javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse 전달인자를 포함해야 함.
→ 메서드 안에 있어야 한다는 뜻
5. java.io.IOException, javax.servlet.ServletException 예외를 던져서 (throws) 처리 해야함.
6. web.xml (배포서술자)를 통해서 서블릿 매핑을 수행.
→ 서블릿 3.0이후, 어노테이션 형태로 사용.
EX ) MyServlet 서블렛 생성하기 |
1. javax.servlet.http.HttpServlet 상속 받기
import javax.servlet.http.HttpServlet;
public class MyServlet extends HttpServlet{
}
– 클래스 생성 후, 서블렛 인터페이스를 직접 구현하기 힘드므로 javax.servlet.http.HttpServlet을 상속 받음.
2. init() 메서드 오버라이딩
@Override // init = 초기화
public void init() throws ServletException {
System.out.println("서블릿 객체 초기화 (= 생성)");
System.out.println(" 1회 실행 ");
}
– GenericServlet 클래스의 init() 메서드 오버라이딩.
– doget() 메서드보다 위에 위치하여 서블릿 초기화 (=생성)함. 객체 생성이라 처음 1회만 실행함.
→ 1회 실행 후, 화면을 새로고침하면 doGet(), doPost() 메서드만 호출됨.
3. doGet(), doPost() 메서드 오버라이딩
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGET 호출");
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPOST 호출");
}
– doGet(), doPost() 메서드 오버라이딩하여 메서드 호출 시 출력되는 간단한 출력문 작성.
– 메서드의 접근제한자는 protected.
→ 상속관계가 있을 때는 public, 상속관계가 없을 때는 private 형태로 사용할 수 있음.
4–1. web.xml 배포서술자를 통해 서블릿 매핑 수행
– web.xml에서 URL매핑을 직접 수행.
– URL매핑을 사용하는 이유는 서블릿을 호출할 때 서블릿명을 url에 입력해야 하는데,
실제 서블릿 클래스를 공개하지 않기 위함. (보안)
<!--서블릿 매핑-->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.itwillbs.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
코드 분석
4 | – 설정 파일 내부에서 사용되는 임의의 서블렛명. |
5 | – 실질적으로 요청에 대해 처리될 물리적인 서블렛 클래스명. |
9 | – 설정파일 내부에서 사용되는 임의의 서블렛명. '<servlet>' 엘리먼트에 정의된 이름과 일치해야함. |
10 |
– url 상에서 실질적으로 요청되는 서블렛명. |
4–2. 어노테이션을 활용한 서블릿 매핑 수행
• 어노테이션 (annotation)
– 문장이나 문서에 추가적인 정보를 기입하는 것, 컴파일시 환경설정 변경사항을 기입함.
→ 어노테이션을 사용 하여 서블릿 매핑을 수행하면 web.xml은 필요 없으므로 해당 내용 주석 처리함. (충돌 발생)
– 서블릿 3.0 이후 어노테이션 지원으로 간편하게 URL매핑을 할 수 있음.
– 이전에는 web.xml에서 URL매핑을 직접 하는게 필수였고 기본 기술을 알아야 해당 기술이 적용된 플젝도 다를 수 있음.
– URL매핑을 사용하는 이유는 서블릿을 호출할 때 서블릿명을 url에 입력해야 하는데,
실제 서블릿 클래스를 공개하지 않기 위함. (보안)
방법1 )
– MyServlet() 메서드 위에 @WebServlet("/MyServlet") 추가함.
→ 어노테이션에 매핑주소를 입력한 것.
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet{
// 서블렛 내용
}
방법2 )
– 생각해보면 위의 방법은 어노테이션 하나에 하나의 클래스밖에 연결 못함. (비효율적)
→ 어노테이션의 매핑주소를 바꿔봄.
→ @WebServlet("*.com")
– 대부분의 페이지의 url이 .com으로 끝나므로 url에 .com가 포함되기만하면 해당 페이지가 뜸.
→ 모든걸 뜻하는 * 기호를 넣었으므로 앞에 주소를 바꿔도 잘 뜸.
→ 하나의 어노테이션으로 다양한 페이지를 부를 수 있음.
@WebServlet("*.com")
public class MyServlet extends HttpServlet{
// 서블렛 내용
}
5. 페이지 실행
– 이제부터 서블릿 페이지 실행 시, 기존의 'Ctrl + F11'이 아닌 실행할 주소를 브라우저에 직접 타이핑하여 실행할 것.
– 간단하게 주소를 이클립스 상에 주석처리 해놓고 ctrl + url + 클릭으로 페이지 실행.
http://localhost:포트번호/프로젝트명(context path)/url상의 서블렛명
@WebServlet("*.com")
public class MyServlet extends HttpServlet{
// http://localhost:8088/JSP7/MyServlet.com
// 톰캣을 실행한 상태에서 ctrl + url + 클릭 → 실행
}
6. doGet() 메서드에 기능 추가
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 한글처리 (인코딩)
response.setContentType("text/html; charset=UTF-8");
// 화면출력1
// response.getWriter().append("Hello");
// response.getWriter().append("<h1> Hello </h1>");
// 화면출력2
// PrintWriter out = response.getWriter();
// ServletOutputStream out2 = response.getOutputStream();
// out.println("화면 출력!");
// out.println("<h1> Hello </h1>");
// out.close();
// 콘솔에 출력
System.out.println("doGET 호출");
// 인터페이스 RequestDispatcher 사용
// → 페이지 이동
RequestDispatcher dis
= request.getRequestDispatcher("./itwill.jsp");
dis.forward(request, response);
}
코드 분석
6 | – 서블릿에서 한글처리 (인코딩)시, response객체의 setContentType("text/html; charset=UTF-8") 사용. – 전달되는 데이터 자체에 인코딩을 거는 것. |
9, 10 | – 체이닝기법 = 간단하게 몇 개 정도는 괜찮지만 멀리봤을 땐 좋지 않은 기법. – 현재 콘솔창에만 출력하고 화면은 빈 화면임. – out.println 출력문을 사용하면 화면에 출력가능하지만 서블릿에서는 out 객체가 없어서 사용 못함. – 서블릿에서는 request와 response객체가 있음. → response 객체의 getWrite() 메서드에 .append("Hi")로 입력하면 됨 → .append("<h1> Hi </h1>") 이렇게 태그도 같이 적용 가능. |
13 | – response (응답=내가 보는것=화면같은 개념=결과물)에 내가 메세지 (write)를 보낼 수 있는 길을 만듬. (글자, 문자로) |
14 | – Stream 객체는 byte로 데이터(숫자)를 주고 받음. – out.println()으로 화면 출력 가능. – 파일 업로드때도 썼던 코드. (Stream 객체) |
17 | – 전화 다하면 끊어야 하듯이 자원해제 해야 함. – 데이터를 주고 받는 동작을 하고 난 뒤에는 항상 종료해 주는게 좋음. → 효율적인 메모리 사용. |
24~27 | – Dispatcher 방식을 이용하여 포워딩으로 페이지 이동함. → 주소 표시줄의 주소가 변경되지 않고 페이지만 이동함. (화면만 바뀜) → 즉, 하나의 요청이며 같은 request 영역을 공유함. ⇒ request 영역의 데이터를 가지고 이동. – 그래서 itwill.jsp 페이지를 열었을 때, 주소가 MyServlet이고 화면은 itwill.jsp 페이지 내용을 보여줌. → 데이터 노출없이 (가상주소를 노출) 보여주고자 하는 화면만 보여줄 수 있음. → 앞으로 이렇게 개발할 것! |
6. destroy() 메서드 오버라이딩
@Override
public void destroy() {
System.out.println("서블릿 소멸 (= 종료)");
}
– GenericServlet 클래스의 destroy() 메서드 오버라이딩.
– 제일 마지막에 위치하여 서블릿을 소멸 (= 종료)함.
– 서버를 종료시키면 콘솔창에 출력문이 출력됨.
💡 전체적인 서블렛 코드의 흐름
1. JSP파일을 만들어서 실행.
2. 해당 파일이 서블렛으로 바뀜. (= JAVA 코드)
3. init() 메서드 실행하여 서블렛 객체 초기화 (= 생성)
4. 바로 밑의 doGet() 메서드 혹은 doPost() 메서드 둘 중 하나 실행함.
5. 메서드가 종료되면 destroy() 메서드가 실행되어 페이지 종료.
'JSP' 카테고리의 다른 글
서블릿과 JSP페이지 연결 / 정보 (데이터) 전달 (0) | 2023.04.13 |
---|---|
JSTL (JSP Standard Tag Library)과 EL (Expression Language) (0) | 2023.04.13 |
게시판 만들기 (글 쓰기) (0) | 2023.04.10 |
DB 사용하기 (DB, Table, Data설정 / PK / AI / Where조건절) (0) | 2023.03.03 |
예외 처리 (에러 페이지) (0) | 2023.02.25 |
- Total
- Today
- Yesterday
- 출력문
- 제어문
- 주석문
- 논리형
- github
- 숫자형
- Object
- 업캐스팅
- gitbash
- mysql
- Method
- 매개변수
- 문자형
- 다형성
- Git
- javascript
- null
- JSTL
- Java
- 로컬저장소
- model2
- 내장객체
- 원격저장소
- jsp
- 단일행함수
- Dao
- DB
- 인자
- 데이터타입
- 오버라이딩
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |