실행방법에 따른 자바 클래스의 구분
- Application(main메소드)
- Applet
- Servlet
Servlet
- 클라이언트의 요청을 처리하기 위한 기술
- 서버에서 클라이언트의 요청을 처리하고 응답할 수 있도록 만들어진 객체
- 클라이언트가 요청을 하면 서버에서 실행되면서 DB에 대한 처리, 서버의 리소를 이용해서 만들어진 결과를 클라이언트에 응답
- 클라이언트가 요청하면 서버가 자동으로 요청한 서블릿을 찾아서 실행하므로 서버가 인식하는 위치에 있어야 한다.
** 서버가 인식하는 위치 : 서블릿 디렉토리(표준화된 폴더 구조의 classes폴더)
- 서버를 구성하는 많은 클래스내부에서 우리가 만든 서블릿 객체가 실행되도록 하기 위해서는 서버가 인식할 수 있는 규칙에 맞게 클래스를 작성해야 한다.
1. 서블릿 작성 규칙
1) 표준화된 폴더 구조 안에 서블릿 클래스가 위치해야 한다.
서블릿이 저장될 폴더 - classes
[표준화된 폴더 구조]
context
|
|---------------------jsp, html, css, js, image ...
|
ㅡㅡㅡWEB-INF
|---- web.xml
|---- lib (폴더) - objdbc6.jar와 같은 라이브러리
ㅡㅡㅡ classes(폴더) - 서블릿, dao, dto, ... 자바클래스
=> 서블릿클래스가 classes폴더에 없으면 서버가 찾을 수 없다!!!!!
2) 서버에 의해서 호출될 것이므로 반드시 public클래스로 작성해야 한다.
3) 서블릿클래스가 되기 위해서 무조건 서블릿 클래스를 상속받아야 한다.
sevlet
^
|
GenericServlet ---- 서블릿의 일반적인 내용이 정의된 서블릿클래스
^
|
HttpServlet ----- http프로콜에 특징적인 내용이 정의된 서블릿클래스
^
|
MyServlet --- 사용자가 만든 서블릿
4) 서버가 호출할 메소드를 오버라이딩 해야 한다.
- 서버가 자동으로 호출하는 메소드를 callback메소드라고 한다.
- 클라이언트가 요청을 하면 서버가 요청을 분석해서 서블릿 디렉토리에 존재하는 서블릿클래스를 찾아서 적절한 상황에 해당 메소드를 자동으로 호출한다.
따라서 상황에 맞게 적절하게 처리하고 싶은 내용이있다면 각각의 메소드를 오버라이딩해서 내용을 정의해야 한다.
- 서블릿의 lifesycle을 서버가 관리
--------------
ㄴ> 객체가 생성되고 생성된 객체를 사용하고 객체를 메모리에서 해제하는 모든 작업
-오버라이딩 해야 하는 메소드는 lifecycle이랑 관련있는 메소드
[오버라이딩 할 메소드]
- init : 서블릿객체가 초기화될 때 호출되는 메소드
- service : 클라이언트가 요청할 때마다 호출되는 메소드
=> 클라이언트의 요청을 처리하는 메소드로 요청을 받고 처리할 내용을 구현
ex) 로그인, 게시판목록읽기, 메일읽기, 장바구니조회, 구매 ,예약 ....
- doGet : 클라이언트가 get방식으로 요청할 때 호출되는 메소드
- doPost : 클라이언트가 post방식으로 요청할 때 호출되는 메소드
- destroy : 서블릿객체가 소멸될 때 호출되는 메소드
* 서블릿 클래스가 컴파일됐을 때
* WAS가 재부팅
* Context가 reload
5) 서블릿을 등록
- 서버가 요청을 분석해서 서블릿디렉토리에서 서블릿을 찾아서 실행할 수 있도록 요청별로 실행할 서블릿을 등록
- 설정파일에 등록(web.xml)
- 실제 작업은 annotation으로 설정
- web.xml파일은 xml형식의 파일이므로 태그로 작성하고 작성규칙이 정해져 있기 때문에 정확하게 작성해야 한다.
** 작성규칙 : dtd - xml안에서 정의하고 사용할 엘리먼트를 정의한 명세서(엘리먼트의 순서, 값의 타입...)
①서블릿 클래스를 등록
=> 어떤 클래스를 사용해야 하는지 등록 : 무엇을 ???
ex)basic패키지에 작성한 FirstServlet을 First라는 이름의 서블릿으로 등록
<servlet>
<servlet-name>서블릿명(별칭)</servlet-name>
<servlet-class>패키지명.서블릿의 실제 클래스명</servlet-class>
</servlet>
<servlet>
<servlet-name>First</servlet-name>
<servlet-class>basic.FirstServlet</servlet-class>
</servlet>
②서블릿 매핑
=> 등록된 서블릿을 어떻게 요청할 것인지 등록(어떤 url로 요청할 것인지)
=> 반드시 <servlet>엘리먼트 다음에 위치해야 한다. 즉, <selvlet>엘리먼트와 함께 한 쌍으로 정의해야 한다.
=> 위에서 등록한 서블릿을 어떻게 요청할 것인지 등록하는 엘리먼트
<servlet-mapping>
<servlet-name>위에서 정의한 서블릿의 이름</servlet-name>
<url-pattern>요청할 서블릿의 path</url-pattern>
------------------------------------
반드시 / or . 으로 시작해야 한다.
</servlet-mapping>
ex) Frist로 등록된 서블릿을 /first.sds로 요청했을 때 실행하겠다.
<servlet-mapping>
<servlet-name>First</servlet-name>
<url-pattern>/first.sds</url-pattern>
</servlet-mapping>
2. 서블릿 요청방법(서블릿 실행방법)
[일반 html문서]
http://서버ip:port/context명/정적파일명(폴더포함)
html폴더의 basic.html
http://http://172.30.1.37:8088/clientweb/html/basic.html
[서블릿의 요청]
- http://서버ip:port/context명/서블릿매핑명
---------------------
ㄴ> web.xml에 <url-pattern>에 등록하거나 annotation으로 등록한path
=> http://172.30.1.37:8088/serverweb/first.sds
프로토콜// ip :포트 / context명 / url매핑명
- 서블릿을 못찾는 경우 : 404
=> http://서버ip:port/context명/servlet/요청한 서블릿클래스의 경로(basic.FirstServlet)
1) get방식
: 클라이언트가 입력한 내용을 요청헤더에 저장해서 서버로 전송하는 방식
서버에 있는 데이터를 가져오기
① 주소표시줄에 직업 입력해서 가져오는 방식
=> 테스트용으로 사용하거나 첫 번째 페이지에서 요청하는 경우
② 하이퍼링크 클릭
텍스트나 이미지를 클릭해서 서블릿을 요청
=> <a href = "http://172.30.1.37:8088/serverweb/first.sds">로그인</a>
=> <a href = "/context명/서블릿요청path">로그인</a>
<a href = "/serverweb/first.sds">로그인</a>
<a href = "/serverweb/second.sds.html">서블릿요청</a>
<a href = "/serverweb/second.sds.html">
<img alt="" src="/serverweb/images/yc03.jpg" width='300' height='300' />
</a>
③<form>태그에 method속성에 get을 적용하고 submit을 누른 경우
: method를 생략하면 get방식
<from action = "요청할 web application path" method = "요청방식">
</form>
ex) first.sds으로 요청하는 서블릿을 get방식으로 요청하기
<form action="/serverweb/first.sds"> <!-- method="get" 생략해도 get방식, 생략 안 해도 get방식임 -->
아이디:<input type="text" name="id"/><br/>
패스워드:<input type="password" name="pass"/><br/>
<input type="submit" value="로그인">
</form>
<form action="/serverweb/first.sds" method="get">
아이디:<input type="text" name="id"/><br/>
패스워드:<input type="password" name="pass"/><br/>
<input type="submit" value="로그인">
</form>
=> submit버튼을 누르면 폼태그 사이에 정의된 모든 양식 태그의 name과 value가 action속성에 정의된 어플리케이션으로 get반식으로 전송
2) post방식
<form>태그의 method속성에 post로 정의하고 submit버튼을 눌러서 요청한 경우
<form action="/serverweb/first.sds" method="post">
아이디:<input type="text" name="id"/><br/>
패스워드:<input type="password" name="pass"/><br/>
<input type="submit" value="로그인">
</form>
<예제>
1. 서블릿 등록, 매핑
<servlet>
<servlet-name>paramtest</servlet-name>
<servlet-class>basic.ParamTestServelt</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>paramtest</servlet-name>
<url-pattern>/param.do</url-pattern>
</servlet-mapping>
2. 서블릿 요청
<form action="/serverweb/param.do" method="post">
아이디:<input type="text" name="id"/><br/>
패스워드:<input type="password" name="pass"/><br/>
<input type="submit" value="로그인">
</form>
3. request, response
1) 한글 설정하기 - 출력유형도 설정해야 함(응답데이터의 형식 - MIME타입 text/html)
2) 응답객체에 클라이언트에게 전송할 메세지를 전달 - 서버에서 클라이언트에 전송하는 메세지가 웹 페이지에 출력되도록 작업하기
3) 응답정보를 클라이언트로 전송하기 위해서 출력스트림객체를 response에서 받아오기
package basic;
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class ParamTestServelt extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("요청성공");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter pw = resp.getWriter(); //화면에 출력
pw.print("<h2>안녕</2>");
String id = req.getParameter("id"); //리퀘스트 안의 값을 꺼냄
String pass = req.getParameter("pass");
System.out.println("클라이언트가 입력한 아이디 : "+id);
System.out.println("클라이언트가 입력한 패스워드 : "+pass);
}
}
* HttpServletRequest객체와 HttpServletResponse객체는 클라이언트의 요청과 응답을 처리하기 위한 객체로 클라이언트가 요청한 내용과 클라이언트에 응답할 내용을 서버가 객체로 만들어서 service메소드를 호출할 때 전달한다.
* 서블릿클래스가 되기 위해서 무조건 서블릿 클래스를 상속받아야 한다.
public class ParamTestServelt extends HttpServlet { }
* 한글 설정하기 - 출력유형도 설정해야 함(응답데이터의 형식 - MIME타입 text/html)
resp.setContentType("text/html;charset=UTF-8");
* 응답객체에 클라이언트에게 전송할 메세지를 전달 - 서버에서 클라이언트에 전송하는 메세지가 웹 페이지에 출력되도록 작업하기
응답정보를 클라이언트로 전송하기 위해서 출력스트림객체를 response에서 받아오기
PrintWriter pw = resp.getWriter(); //화면에 출력
pw.print("<h2>안녕</2>");
'Spring' 카테고리의 다른 글
2022-11-23 스프링 customer패키지 리뷰 (0) | 2022.11.24 |
---|---|
2022-11-23 Spring에 대해서 (0) | 2022.11.23 |
2022-11-11 JDBC 이론 정리 (0) | 2022.11.12 |
2022-11-09~10 JDBC 2. select - 전체 사원 조회하기 (0) | 2022.11.11 |
2022-11-09~10 JDBC 1. insert - 사원등록하기 / 드라이버 로딩, DB서버 연결, 자원반납 (0) | 2022.11.11 |
댓글