본문 바로가기

Web/Servlet&JSP

[Servlet&JSP] 서블릿(Servlet) 이란!

Servlet이란

자바를 사용하여 클라이언트의 요청에 따라 동적으로 웹 서비스를 제공하는 서버측 프로그램입니다.

간단한 메소드 호출만으로 요청(Request)과 응답(Response)을 처리할 수 있게 해줍니다. 대표적인 메소드로는 doGet(), doPost()가 있습니다.

 


 

Servlet 등록 방식

(1) web.xml 사용

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  
<!-- 서블릿 이름과 해당 클래스 위치 등록 -->
<servlet>
	<servlet-name>helloServlet</servlet-name>
	<servlet-class>sample1.HelloServlet</servlet-class>
</servlet>

<!-- 서블릿 이름과 매핑될 URL 주소 등록 -->
<servlet-mapping>
	<servlet-name>helloServlet</servlet-name>
	<url-pattern>/location</url-pattern>
</servlet-mapping>  
  
</web-app>
package sample1;

import java.io.IOException;

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

//HttpServlet을 상속받아야 함
public class HelloServlet extends HttpServlet {

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("HelloServlet doPost");
	}

}

 

(2) WebServlet Annotation 이용

package sample5;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	
        //전송된 데이터 꺼내는 방법 
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        String food[] = req.getParameterValues("food");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
    }

}

 


 

페이지 이동 방식

(1) forward

forward는 특정 서블릿에 대한 요청을 다른 서블릿이나 JSP로 넘겨줍니다.

URL이 바뀌지 않으며 페이지 주소를 숨길 때 사용할 수 있습니다.

객체의 재사용이 가능하고 redirect보다 성능이 좋지만, 내부에서만 접근이 가능합니다.

StudentDto dto = new StudentDto(name, age, address);
req.setAttribute("student", dto);

RequestDispatcher rd = req.getRequestDispatcher("world");
rd.forward(req, resp);

 

(2) redirect

redirect는 다른 페이지로 넘어갈 수 있게 해줍니다.

요청받게되면 url을 클라이언트에게 전달하고 클라이언트가 새로 받은 url로 다시 요청을 보냅니다.

URL값이 넘어가기 때문에 길이에 제한이 있고, 객체의 재사용이 불가능합니다.

resp.sendRedirect("world?name="+name+"&age="+age+"&address="+address);

 

Session

package work;

import java.io.IOException;

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

import dto.HumanDto;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		String name = req.getParameter("name");
		int age = Integer.parseInt(req.getParameter("age"));
		String sex = req.getParameter("sex");
		String[] hobby = req.getParameterValues("hobby");
		
		HumanDto dto = new HumanDto(name, age, sex, hobby);
        
        	//session에 "dto"란 이름으로 HumanDto 객체를 저장
		req.getSession().setAttribute("dto", dto);
		
        	resp.sendRedirect("world");
	}

}

세션에 저장된 값을 사용하는 방법은 아래와 같습니다.

HumanDto dto = (HumanDto)req.getSession().getAttribute("dto", dto);