Jsp 11일차 - 서블릿(Servlet)
Servlet
1. 서블릿 처리 구조 개요
○ 일반적인 HTML 요청은 웹서버 수준에서 직접 html을 찾고 응답
○ 서블릿 요청시 웹 서버는 요청 정보를 서블릿 컨테이너에게 전달
○ 서블릿 컨테이너는 해당 서블릿을 찾아서 실행 및 처리 결과를 응답
- HttpServletRequest 및 HttpServletResponse 객체 생성
- 서블릿 클래스 로딩 및 객체 생성
- 요청에 따라 서블릿 클래스의 doGet 또는 doPost 메서드 호출
2. 서블릿 클래스 상속 구조
○ Servlet을 구현할 때 보통 HttpServlet를 상속하여 구현
○ ServletConfing
- 서블릿 환경을 위한 인터페이스
○ Servlet
- 서블릿 기능 구현을 위한 인터페이스
○ Serializable
- 서블릿 직렬화를 위한 인터페이스
3. 서블릿 클래스
○ HttpServlet 클래스 상속
○ doGet / doPost를 반드시 사용해야한다
4. 서블릿 요청 처리 메서드 호출
○ 서블릿 컨테이너에 의해 실행, 관리된다.
- 서블릿 컨테이너 : 클라이언트의 요청(request)을 받고, 응답(response)할 수 있도록 웹 서버와 소켓을 만들어 통신
- 서블릿 컨테이너의 예 : 톰캣(Tomcat)
① 클라이언트가 웹서버에 요청(get/post)
② 웹서버는 서블릿 컨테이너를 통해 서블릿 객체를 실행
③ 요청이 Get → doGet() / Post → doPost()를 통해 메서드 실행
④ 웹서버는 응답에 요청
5. HttpServletRequest 와 HttpServletResponse
○ HttpServletRequest 객체
- 클라이언트의 모든 요청 정보를 포함
- 요청 HTTP 헤더 정보
- 서블릿으로 전달된 파라미터 정보
- 세션과 쿠키와 같은 기타 정보를 포함
○ HttpServletResponse 객체
- 클라이언트로 보내지는 응답 정보를 포함
- 응답 HTTP 헤더 정보
- 세션과 쿠키 설정
6. 서블릿 한글 지원 문제
○ response 객체의 한글 인코딩
- 응답으로 전송되는 response 객체의 한글 표현을 위해 한글 인코딩을 설정
response.setContentType("text/html;charset=utf-8");
7. 의존성과 주소
○ 의존성 : 하나의 파일을 여러명의 사용자가 나눠서 같이 사용
○ 하나의 파일에 jsp영역의 데이터를 만들고, 그 데이터를 html영역에서 사용 → 의존성 발생
○ 의존성 문제를 해결
- class파일에 jsp코드를 모아두고, jsp파일에서 받아서 사용
- class에서 만들어진 데이터를 jsp로 넘겨주는 방법 : request.setAttribute / request.getAttribute → 형변환 작업이 필요
○ 기존에는 주소가 다 들어나 보안이 약하지만, 서블릿에서는 주소를 숨길 수 있다.
- web.xml에서 클라이언트가 들어가는 주소를 서버에서 사용하는 주소와 매핑
8. GenericServlet 이용
① src > com.svt >Test1.java 생성
package com.svt;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//서블릿 파일
public class Test1 extends GenericServlet {
private static final long serialVersionUID = 1L;
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
//response 객체의 한글 인코딩
response.setContentType("text/html;charset=utf-8"); //여기서 내가 전해줄 파일의 형식을 지정
try {
//자신이 필요하면 서블릿에게 요청을 해서 사용해야한다.
PrintWriter out = response.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>");
out.print("<예제 프로그램></title></head>");
out.print("<body style='font-size:19pt;'>");
out.print("화면 디자인은 서블릿 보다 JSP가 더 편하다");
out.print("</body>");
out.print("</html>");
} catch (Exception e) {
// TODO: handle exception
}
}
}
② web.xml 수정
○ xml은 서버가 시작할 때 실행
○ xml에 오류가 생기면 서버가 시작되지 않는다
○ xml을 수정했을 경우에는 톰캣서버를 종료시키고 재 시작해야한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>study</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.svt.Test1</servlet-class>
</servlet>
<!-- 사용자가 hello란 주소를 사용하면, helloServlet를 찾아가라 -->
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
◈ <servlet-mapping>의 <servlet-name>과 <servlet>의 <servlet-name>은 같아야 한다
◈ 사용자가 주소에 url을 입력하면, name을 찾아가라.
<servlet-mapping>
<servlet-name> name </servlet-name>
<url-pattern> /url </url-pattern>
</servlet-mapping>
결과
9. HttpServlet 이용
① web.xml 수정
○ xml은 톰캣서버가 시작할 때 실행되므로 공통적인 변수 값은 web.xml에서 사용한다.
<!-- 1.ServletConfig 인터페이스 -->
<!-- 해당 Servlet에서만 사용 가능 : Test2.java에서만 -->
<!-- Test2에 가면서 2개의 param을 같이 가지고 간다. / get방식 -->
<servlet>
<servlet-name>test2Servlet</servlet-name>
<servlet-class>com.svt.Test2</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>배수지</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>25</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>test2Servlet</servlet-name>
<url-pattern>/itwill</url-pattern>
</servlet-mapping>
<!-- 2.ServletContext 인터페이스 -->
<!-- 동일 웹프로그램안에 서블릿 또는 JSP에서 사용 가능 -->
<context-param>
<param-name>gender</param-name>
<param-value>여자</param-value>
</context-param>
② src > com.svt > Test2.java
package com.svt;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test2 extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1.ServletConfig 인터페이스
ServletConfig config = getServletConfig();
String name = config.getInitParameter("name");
String age = config.getInitParameter("age");
//2.ServletContext 인터페이스
ServletContext context = getServletContext();
String gender = context.getInitParameter("gender");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>");
out.print("<예제 프로그램 2></title></head>");
out.print("<body style='font-size:10pt;'>");
out.print("name: " +name+ "</br>");
out.print("age: " +age+ "</br>");
out.print("gender: " +gender+ "</br>");
out.print("</body>");
out.print("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}
10.
① WebContent > servlet > test3.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="<%=cp%>/ss1" method="post">
이름:<input type="text" name="name"></br>
나이:<input type="text" name="age"></br>
<input type="submit" value="확인"></br>
</form>
</body>
</html>
② src > com.svt > Test3.java
package com.svt;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test3 extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
String age = req.getParameter("age");
String str = name + "의 나이는 " + age + "살 입니다.";
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>");
out.print("<예제 프로그램 3></title></head>");
out.print("<body style='font-size:10pt;'>");
out.print("str: " +str+ "</br>");
out.print("</body>");
out.print("</html>");
}
}
◈ doPost(req, resp);
get방식으로 넘어온 데이터를 doPost로 보내서 doPost에서 같이 처리한다.
보통은 이렇게 해서 사용
③ web.xml 수정
<servlet>
<servlet-name>test3Servlet</servlet-name>
<servlet-class>com.svt.Test3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test3Servlet</servlet-name>
<url-pattern>/ss1</url-pattern>
</servlet-mapping>
◈ 주소에 ss1이 입력되면 com.svt.Test3이 실행
ss1은 test3.jsp의 form에서 action으로 실행
<form action="<%=cp%>/ss1" method="post">
결과
① test3.jsp 실행
② Test3.java가 실행
servlet-api.jar 추가
① study > Build path > add External JARs
② servlet-api.jar 추가