STUDY/JSP

Jsp 11일차 - 서블릿(Servlet)

Anne of Green Galbes 2019. 2. 25. 17:58

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 추가