본문으로 바로가기

Servlet 과 Request 객체

category WEB/Servlet,JSP 2020. 6. 8. 20:04

KITRI에서 배운 Servlet을 토대로 작성해봤습니다.
서블릿은 자바의 웹프로그래밍을 하기 위한 기술로 서블릿 컨테이너의 탑재되어
사용자의 요청과 응답을 동적으로 처리하기 위한 프로그래밍입니다.

클라이언트(html)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="http://localhost:8080/webTesting/com/java/servlet/Example03" name="msg" method="post">
        <label>메시지</label>
        <input type="text"    name="msg">
        <br><br>
        <input type="submit"value="전송">
        <input type="reset"    value="취소">
    </form>
</body>
</html>

클라이언트 측에서 post로 서버에 메시지데이터를 넘겨준다.

web.xml (웹서버설정)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>webTestting</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>Example03</servlet-name>
      <servlet-class>com.java.servlet.Example03</servlet-class>
  </servlet>

  <servlet-mapping>
      <servlet-name>Example03</servlet-name>
      <url-pattern>/com/java/servlet/Example03</url-pattern>
  </servlet-mapping>

</web-app>

톰캣 설정 파일인 web.xml 에서 servlet과 servlet-mapping을 명시해준다.
은 사용자가 요청할 URL을 입력하면 된다.

Servlet (서버 처리)

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Example03 extends HttpServlet{

    private static final long serialVersionUID = 1L;

    public Example03() { // 생략가능이 가능하다.
        super();
    }

    @Override
    public void init() throws ServletException { // 생략이 가능
        System.out.println("init() 생략가능, 처음 서버메모리에 올라갈때 한번 실행");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = req.getParameter("msg");
        System.out.println(msg);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String msg = req.getParameter("msg");
        System.out.println(msg);
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service() 생략가능, 스레드 처리되서 반복 실행");
//        doGet(req,resp);
        doPost(req, resp);
    }

    @Override
    public void destroy() {
        System.out.println("destory() 생략가능, 서버종료 및 업데이트 시");
    }
}

실제 개발자가 구현할 때는 doGet(), doPost() 메소드만 구현하면 된다.

사용자가 http://localhost:8080/webTesting/com/java/servlet/Example03

요청을 하여 서버로 데이터를 넘기고 web.xml로 mapping된 servlet을 찾아 알맞는 servlet을

호출한다 호출된 서블릿이 doGet,doPost 에 알맞는 메소드를 호출하고 구현된 로직을 실행한다.

Request 객체

  • 한글 Encoding 기능
  • 파라미터 읽기 기능
  • 서버와 관련된 정보 읽기 기능
  • 웹브라우저 관련 정보 읽기 기능
  • 헤더 읽기 기능
  • 쿠키 읽기 기능
  • 속성 처리 기능

위와 같은 기능들은 전부가 아니고 더 있지만 우리가 배운것에는 이 정도만 기술한다.

doGet() 메소드의 구현된 Request 객체의 다양한 함수들을 살펴보자
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 인코딩(UTF-8) 설정, 한글가능
        request.setCharacterEncoding("utf-8");

        // su 파라미터 가져오기
        int su = Integer.parseInt(request.getParameter("su"));    
        System.out.println(su);

        // 서버 관련 정보 읽기
        String serverName = request.getServerName();
        int serverPort = request.getServerPort();
        System.out.println("서버이름 : " + serverName);
        System.out.println("서버포트 : " + serverPort);

        // URL, URI, ContextPath, ServletPath는 진짜 중요중요 정말 많이 쓴다.
        // 파라미터 가져오는건 하도 많이 쓰니 까먹지 않겠지만 다음 기능들은 잘 익혀두자.

        // Uniform Resource Location(URL),      http://localhost:8080/webTesting/com/java/servlet/Example06
        StringBuffer url = request.getRequestURL(); 
        // Uniform Resource Identifier(URI), /webTesting/com/java/servlet/Example06
        // 해당 컨텍스트패스부터 시작해서 서블릿까지의 경로
        String uri = request.getRequestURI();
        // URI , URL 의 차이를 확실히 알고가자.
        String contextPath = request.getContextPath(); // /webTesting
        String servletPath = request.getServletPath();// /com/java/servlet/Example06
        System.out.println("url : "+url);
        System.out.println("uri : "+uri);
        System.out.println("contextPath : "+contextPath);
        System.out.println("servletPath : "+servletPath);
        System.out.println("요청방식 : "+request.getMethod());

        // 클라이언트 및 웹브라우저 관련 정보 읽기(자주 쓰지는 않는다)
        System.out.println("요청프로토콜: " + request.getProtocol());
        System.out.println("클라이언트 주소: " + request.getRemoteAddr()); // 로컬서버에서 동작하면 클라 주소가 나오지 않는다.
        System.out.println("클라이언트 포트: " + request.getRemotePort());

        // 헤더 읽기, HashMap의 대해 알고접근하자.(Enumeration과 비슷)
        // 나중에 header의 정보를 바꿔 response하는 법을 배울것이다. 이종화바보
        Enumeration<String> header = request.getHeaderNames();
        while(header.hasMoreElements()) {
            String key = header.nextElement();
            String value = request.getHeader(key);
            System.out.println("key : " + key + ", value : "+ value);
        }
        //쿠키 읽기(request) - 쿠키 저장(Response)
        //속성 처리(session과 같은)
        // html -> servlet, servlet -> servlet 데이터가 이동할 때 모두 Request 객체를 타고 이동한다.
    }

다음 시간에 Response객체에 대해 알아보도록 하자.

'WEB > Servlet,JSP' 카테고리의 다른 글

JSP의 표현언어 EL이란?  (0) 2020.06.11
컨텍스트 리스너(Context Listener)란??  (0) 2020.06.10
쿠키(Cookie)와 세션(Session)  (0) 2020.06.09
sendRedirect, include, forward의 차이점  (0) 2020.06.09
Servlet, JSP의 객체 범위  (0) 2020.06.09