[목차]
1. 서블릿 작성 규칙
2. 서블릿 요청방법(서블릿 실행방법)
3. 서블릿 요청정보 추출
4. JDBC
[내용]
서블릿
- 클라이언트의 요청을 처리하기 위한 기술
- 클라이언트가 요청하면 서버에서 실행되며 DB에 대한 처리, 서버의 리소스를 이용해서 만들어진 결과를 클라이언트에 응답한다.
- 서버에 의해서 호출되기 때문에 서버가 인식하는 위치에 있어야 하며 서버가 찾아서 실행할 수 있도록 정해진 규칙에 따라 작성되어야한다.
(Context/WEB_INF/classes폴더)
1. 서블릿 작성 규칙
1) 표준화된 폴더 구조 안에 서블릿 클래스가 위치해야한다.
서블릿이 저장될 폴더 - classes폴더(서블릿 디렉토리)
[표준화된 폴더 구조]
Context | WEB_INF | web.xml |
lib | ||
classes | ||
html, image, css, jsp |
=> classes 폴더에 서블릿이 없으면 서버가 찾을 수 없다. (매핑 시엔 가능)
2) 서버에 의해서 호출될 것이므로 반드시 public으로 작성해야한다.
3) 서블릿 클래스가 되기 위해서 무조건 서블릿 클래스를 상속받아야한다.
Servlet(interface) | |
↑ | |
Generic Servlet(abstact class) | 서블릿의 일반적인 내용이 정의된 서블릿 클래스. |
↑ | destory(), init(), service() |
HttpServlet(abstact class) | http프로토콜에 특화된 내용이 정의된 서블릿 클래스. |
↑ | service(), do~~() |
사용자 정의 Servlet |
4) 서버가 내부에서 호출할 메소드를 오버라이딩
- 서버가 자동으로 호출하는 메소드를 call back메소드
- 클라이언트가 요청을 하면 서버가 요청을 분석해서 서블릿 디렉토리에 존재하는 (미리 만들어서 저장해놓은)
서블릿 클래스를 찾아서 적절한 상황에 해당 메소드를 자동으로 호출할 것이므로 그 상황에 맞게처리하고
싶은 내용을 각 메소드를 오버라이딩해서 구현한다.
- 서버가 서블릿의 life cycle을 관리(객체가 생성돠고 객체를 메모리에서 해제하는 모든 작업)
- 오버라이딩할 메소드는 life cycle과 연관되어 있는 메소드
[오버라이딩할 메소드]
- init() : 서블릿 객체가 초기화될때 호출되는 메소드.
- service() : 클라이언트가 요청할때마다 호출되는 메소드
=> 클라이언트의 요청을 처리하는 메소드로 요청을 받고 처리할 내용을 구현.
ex) 로그인, 게시판 목록보기, 메일읽기, 장바구니 조회, 구매, 예약, 예약정보 확인...
- doGet() : 클라이언트가 get방식으로 요청할때 호출되는 메소드.
- doPost() : 클라이언트가 post방식으로 요청할때 호출되는 메소드.
- destory() : 서블릿 객체가 소멸될때 호출되는 메소드.
[객체 소멸 case]
- 서블릿 클래스가 컴파일될 경우
- WAS가 재부팅될 경우
- context가 reload될 경우
* WAS 처리 동작
실행하려는 서블릿 객체가 메모리에 Loading되어 있는지 확인 (클라이언트 개수와 상관없이 한 서블릿당 1 객체로 운영) |
----------------------------------------> No : 서블릿 객체생성 ->init() -> 쓰레드 생성 -> 응답, 요청객체 생성 |
service() -> doGet() or doPost() -> 비지니스 로직 |
-----------------------------------------> Yes |
5) 서블릿을 등록
- 서버가 요청을 분석해서 서블릿 디렉토리에서 서블릿을 찾아서 실행할 수 있도록 등록.
- 설정파일에 등록(web.xml)
- 실제 작업은 anotation으로 설정.(servlet 3.0이상)
- web.xml파일은 xml형식의 파일이며, 태그로 작성하며, 작성규칙(DTD - xml안에서 정의할 엘리먼트(태그)의 순서
정의해야하는 필수 엘리먼트, 속성 등이 명시되어 있는 파일)에 따라 정확하게 등록해야한다.
① 서블릿 클래스 등록
=> 무엇을
<servlet>
<servlet-name>서블릿명(alias)</servlet-name>
<servlet-class>서블릿클래스의 실제 경로(패키지를 포함한 서블릿클래스)</servlet-class>
</servlet>
ex) basic패키지에 작성한 FisrtServlet을 first라는 서블릿명으로 등록.
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>basic.FisrtServlet</servlet-class>
</servlet>
② 서블릿 매핑
=> 어떻게
=> 등록된 서블릿을 어떻게 요청할 것인지 등록(어떤 url로 요청할 것인지)
=> 반드시<servlet>엘리먼트 다음에 위치해야한다. 즉 <servlet>엘리먼트와 함께 한 쌍으로 정의해야한다.
=> 위에서 등록한 서블릿을 어떻게 요청할 것인지 등록하는 엘리먼트
<servlet-mapping>
<servlet-name>위에서 정의한 서블릿의 이름</servlet-name>
<url-patten>요청할 서블릿의 path</url-patten>
(반드시 /나 .으로 시작해야한다)
</servlet-mapping>
ex) 위에서 fisrt라는 이름으로 등록한 서블릿을 first.do
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first.do</url-pattern>
</servlet-mapping>
③ @어노테이션 이용 서블릿 매핑하기
Project Explorer창에서 Project 오른쪽 클릭 -> New -> Servlet -> Class name입력 -> Name(alias) 입력 -> |
@WebServlet(name = "alias", urlPatterns = { "/URL" })
public class PostFormServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
2. 서블릿 요청방법(서블릿 실행방법)
[일반 html문서]
=> http://서버ip:port/context명/정적파일명
(프로토콜)
[서블릿]
=> http://서버ip:port/context명/서블릿매핑명(web.xml <url-patten>에 등록한 path)
1) get방식으로 요청
=> 클라이언트가 입력한 내용을 요청헤더에 저장하여 서버로 전송하는 방식 (255Byte미만)
=> 외부에 노출되어도 상관없는 데이터 송부시 사용.
=> 인코딩/디코딩 작업이 필요없어 처리속도가 빠름.
=> name1=value1&name2=value2, 공백은 +, %16진수로 전달.(영문, 숫자, 일부 특수문자 제외), ?뒤에 Query
String입력하여 전달가능.
① 주소표시줄에 입력해서 요청하는 방식
=> 테스트용으로 사용되거나 첫 번째 페이지에서 요청하는 경우
② 하이퍼링크로 요청 => 텍스트나 이미지를 클릭해서 서블릿을 요청
<a href="http://서버ip:port/context명/서블릿매핑명">서블릿 요청</a>
<a href="/context명/서블릿 요청url">서블릿 요청</a>
<a href="/serverweb/서블릿 매핑명">서블릿 요청</a>
③ <form>태그의 method속성을 get으로 정의하고 submit버튼을 눌러서 요청하는 경우
=> method속성을 생략하면 get방식(default)
<form action="요청할 web application파일의 path" method="get">
<input type="text" name="id" />
<input type="password" name="pass">
<input type="submit" value="서블릿요청">
</form>
=> submit버튼을 누르면 <form></form>태그 사이에 정의된 모든 양식 태그의 name과 value가 action속성에
정의된 서블릿에 요청(실행)하며 등록된 서블릿에게 method속성 요청방식(get)으로 전송한다.
2) post방식으로 요청
① <form>태그의 method속성을 post로 정의하고 submit버튼을 눌러서 요청하는 경우
<form action="요청할 web application파일의 path" method="post">
<input type="text" name="id" />
<input type="password" name="pass">
<input type="submit" value="서블릿요청">
</form>
=> submit버튼을 누르면 <form></form>태그 사이에 정의된 모든 양식 태그의 name과 value가 action속성에
정의된 서블릿으로 요청(실행)하며 등록된 서블릿에게 method속성 요청방식(post) 방식으로 전송한다.
3. 서블릿 요청정보 추출
public class 서블릿 클래스명 extends HttpServlet{
public 서블릿 클래스명() { // 생성자
}
public void init() { // 생성자 호출 후 한번만 호출
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
// 상위클래스의 service 메소드에서 메소드 요청방식에 따라 doGet,doPost를 자동으로 호출함으로
// 오버라이딩할 경우 사용자에 맞게 doGet(), doPost()를 연결하여야 한다.
if(req.getMethod().equals("GET")) {
doGet(req,res);
}else {
doPost(req,res);
}
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); //요청정보에 문자셋을 적용하여 한글을 셋팅
resp.setContentType("text/html;charset=UTF-8");
//text/html; : MIME타입(응답형식), charset=UTF-8 : 응답데이터에 적용할 문자셋
//응답정보를 클라이언트로 전송하기 위한 스트림객체를 response에서 구하기
PrintWriter out = resp.getWriter();
//요청정보를 추출
String id = req.getParameter("id"); // name(key)으로 값(value) 추출
String pass = req.getParameter("pass");
String[] item = req.getParameterValues("item"); // value가 여러개일 경우 배열로 받는다.
}
public void destroy() {//객체 소멸시 호출.
}
}
1) setCharacterEncoding("UTF-8") : 요청정보에 문자셋을 적용하여 한글을 셋팅
2) setContentType("text/html;charset=UTF-8") :
text/html; : MIME타입(응답형식)
charset=UTF-8 : 응답데이터에 적용할 문자셋
3) PrintWriter out = resp.getWriter() : 응답정보를 클라이언트로 전송하기 위한 스트림객체를 response에서 구하기
4) 요청정보를 추출
String id = req.getParameter("name") : name(key)으로 값(value) 추출
String[] item = req.getParameterValues("name") : value가 여러개일 경우 배열로 받는다.
5) String str = req.getQueryString() : get방식에서만 사용가능하며, 요청정보의 ? 다음 문자열 전체를 받아온다.
6) ServletInputstream in= req.getInputStream() : post방식에서 사용. 요청정보의 몸체와 연결된 입력스트림을
받아온다.
ServletInputstream in= req.getInputStream();
int len = req.getContextLength();
byte[] buffer = new byte[len];
in.readLine(buffer,0,len);
String str = new String(buffer);
<tip>
* 웹구조
Web browser (client) |
request (header+body) ---------------> <--------------- response |
WAS (Web Server + Contationer) |
---------------> <--------------- |
Servlet | 서버의 자원 ---------------> <--------------- |
DBMS |
* 비지니스 로직 분리
Servlet 1. 클라이언트의 요청정보를 추출 2. 비지니스 메소드 호출 3. 클라이언트에 응답할 메시지를 생성 |
매개변수 ---------------> <--------------- 리턴값 |
비지니스 로직 |
* import가 되지않을때
Project Explorer창 - Dynamic 파일 오른쪽 클릭 - Build Patch - Configure Build Patch -Libraries - Add library - Server Run time - Next - finish - Apply |
* 이클립스 창 확대 단축키 : ctrl + M
* error
404 - 파일을 찾을 수 없다.
405 - 요청한 방식의 메소드가 없을 경우
'BACK END > Servlet' 카테고리의 다른 글
[Servlet] Servlet 정리6 - EL, JSTL (0) | 2021.01.04 |
---|---|
[Servlet] Servlet 정리5 - Ajax (0) | 2021.01.03 |
[Servlet] Servlet 정리4 - Cookie, Session (0) | 2021.01.02 |
[Servlet] Servlet 정리3 - jsp, mvc, forward, include, request (0) | 2020.12.30 |
[Servlet] Servlet 정리2 - JDBC (0) | 2020.12.28 |