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);