Servlet
서블릿은 웹 페이지를 만들 때 사용되는 response와 request을 간단하게 다룰 수 있게 해주는 자바 기반 웹 기술
JSP | Servlet | |
공통점 | 웹 페이지를 동적으로 생성하기 위한 서버 프로그램 | |
정의 | 자바 언어를 기반으로 하는 Server Side 스크립트 언어 | 자바 언어를 기반으로 HTML을 작성하여 웹페이지를 만드는 프로그램 |
특징 1 | 화면 로직 처리에 적합 | DB 통신, Business logic, 데이터를 읽고 처리하는 작업에 유용 |
특징 2 | HTML(Java) | Java(HTML) |
서블릿의 동작 과정
클라이언트가 웹 서버에 request(요청)를 하면 웹 서버는 WAS에 요청을 넘겨주고 WAS에서 각 요청에 해당하는
서블릿을 실행한다. 실행 이후 결과 값을 클라이언트에 response(응답)한다.
1. 클라이언트의 URL 요청
<form action="PatternName" method="get">
<input type="submit" value="get으로 이동">
</form>
<a href="PatternName">get으로 이동</a>
<button onclick="move()">이동</button>
<script type="text/javascript">
function move() {
location.href="PatternName";
}</script>
등 다양한 방식으로 URL을 요청할 수 있다. 기본적으로 method는 get을 가리키며 post 방법을 하기 위해서는
method를 post로 지정해야 한다.
특징 | 장점 | 단점 | |
get | 서버에서 데이터를 가져와 보여줄 때 사용하며 페이지 연결이 주목적 | 속도가 빠름 | 서버로 보내는 데이터를 사용자가 확인할 수 있어 보안에 취약하다. |
post | 서버상의 데이터 값이나 상태를 변경할 때 사용하며 데이터 전달이 주목적 | 서버로 보내는 데이터를 사용자가 확인할 수 없어 보안에 강하다. | 한글 처리를 해줘야 함 |
2. 웹 서버는 웹 클라이언트한테 받은 HTTP요청 해석 후, 서블릿 요청인지를 확인한 후, 서블릿 컨테이너로 요청 전달
3. HTTP 요청 처리를 위한 HttpServletRequset 객체 및 HttpServletResponse 객체 생성
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{
//.....구현..
}
HttpServletRequest | HTTP 요청 정보를 제공하는 인터페이스로 서블릿에게 request 정보를 전달하기 위한 목적으로 사용 |
HttpServletResponse | HTTP 응답 정보를 제공하는 인터페이스로 HttpServletResponse객체에 정보를 담아 전송하기 위해 사용 |
4. web.xml 분석을 통해 요청된 서블릿 클래스을 탐색
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>ProjectName.ClassName</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/PatternName</url-pattern>
</servlet-mapping>
servlet 과 servlet-mapping 모두 name을 같게 적어야 하며 해당 PatternName 호출 시 해당 Class로 이동한다.
5. 해당 서블릿에서 서비스를 수행하도록 service() 메서드 호출
- 처음 실행 시 : 인스턴스 생성 -> init() -> 초기화 -> 스레드 생성
- 이미 실행 시 : 기존 인스턴스에 스레드 생성
init() | 서블릿 요청 시 맨 처음 한번 호출되며 주로 초기화 작업에 수행 |
destroy() | 서블릿 수행 후 메모리에서 소멸될 때 호출되며 주로 마무리 작업에 수행 |
6. doGet() 또는 doPost() 호출
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//... 구현 ..
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//... 구현 ..
}
HttpServletRequest 객체와 HttpServletResponse 객체를 전달받아 HttpServletResponse 객체를 전달
7.HttpServletResponse 객체를 서블릿 컨테이너에서 HTTP 형태로 변환 후 웹서버로 전송
8. HttpServletRequest객체와 HttpServletResponse 객체의 메모리 소멸 및 스레드 종료
서블릿 출력 형식 지정
서블릿에서 클라이언트의 요청에 대한 응답은 텍스트 형태가 될 수 있다. 그러므로 데이터를 컨트롤하기 위해서는
텍스트 형태로 응답을 보내도록 설정해야 한다.
즉 서블릿에서 들어온 요청을 HTML형태로 응답을 보내기 위해서는 내보낼 출력 스트림을 얻어야 한다.
PrintWriter pw = resp.getWriter();
PrintWriter | 바이트를 문자 형태로 가지는 객체로 변경해주는 클래스 |
getWriter() | 출력 스트림 인스턴스를 제공하는 메서드 |
페이지 이동 방식
전달하는 데이터의 양이 적을 경우에는 sendRedirect("서블릿이름?data=value"))으로 전달하면 되지만
데이터의 양이 큰 경우 RequestDispatcher의 바인딩 기능을 사용한다.
바인딩 : 웹 프로그램 실행 시 데이터를 서블릿 관련 객체에 저장하는 방법으로 주로 HttpServletRequest, httpSession에서 사용된다. 저장된 데이터는 서블릿 또는 JSP에서 공유하여 사용한다.
- 바인딩 관련 메서드
메소드 | 설명 |
setAttribute(String name, Object value) | 이름이 name인 속성의 값을 value로 지정한다. |
getAttribute(String name) | 이름이 name인 속성의 값을 구한다. 존재하지 않을 경우 null을 반환한다. 이 메소드는 리턴타입이 Object 타입이므로 사용시 실제 할당된 객체 타입으로 형변환(casting)을 해야한다 |
removeAttribute(String name) | 이름이 name인 속성을 삭제한다. |
redirect
- URL이 변경된다.
- 요청 객체와 응답 객체가 유지되지 않는다.
- 속도가 느리다.
- 송신
resp.sendRedirect("world?name="+ename+"&age="+age+"&address"+eaddress);
//특정 사이트로 파라미터를 넘기는 경우
- 수신
String name=req.getParameter("name");
String address=req.getParameter("address");
int age=Integer.parseInt(req.getParameter("age"));
ex) 넘겨받은 파라미터 변수 할당
pw.println("<p>"+name+"</p>");
pw.println("<p>"+age+"</p>");
pw.println("<p>"+address+"</p>");
forward
- URL이 변경되지 않는다.
- 요청 객체와 응답 객체가 유지된다.
- 속도가 빠르다.
- 받는 쪽에서 키와 값을 받을 수 있다.
- 서블릿에서 다른 서블릿에 요청하는 방법
- 송신
- setting
String name= req.getParameter("name");
int age=Integer.parseInt(req.getParameter("age"));
String address=req.getParameter("address");
human h1= new human(name,age,address);
req.setAttribute("Human1",h); //짐싸기
- sendding
req.getRequestDispatcher("world").forward(req, resp); //이동하기
- 수신
Human human =(Human)req.getAttribute("Human1");
ex) Human 객체 전달 시 값 접근 방법
pw.println("<p> 이름은"+h.getName()+"입니다. </p>");
pw.println("<p> 나이는"+h.getAge()+"입니다. </p>");
pw.println("<p> 주소는"+h.getAddress()+"입니다. </p>");
'멀티잇 풀스택' 카테고리의 다른 글
8 week_3 Java_HashMap (0) | 2023.02.08 |
---|---|
8 week_2 JSP (0) | 2023.02.07 |
7 week_3 JQuery (0) | 2023.02.02 |
7 week_2 XML, JSON (0) | 2023.02.01 |
7 week_1 JavaScript (0) | 2023.01.30 |