GenericServlet์ ์์ํ๋ ์๋ธ๋ฆฟ ์์ฑ ๋ฐ ๋ฐฐ์น
์ง๋ ํฌ์คํ ์์ ์๋ธ๋ฆฟ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ Servlet ์ธํฐํ์ด์ค ๊ตฌํ์ ๋ํด ์์๋ณด์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Servlet์ ๊ตฌํํ๋ GenericServlet ์ถ์ ํด๋์ค์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
- ์ง๋ ํฌ์คํ
- Servlet ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ธฐ๋ณธ ์๋ธ๋ฆฟ ์์ฑ ๋ฐ ๋ฐฐ์น
Servlet ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ฏ ๊ฐ์ ๋ฉ์๋์ธ init(), service(), destroy(), getServiceConfig(), getServiceInfo()๋ฅผ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์๋ธ๋ฆฟ์ ๊ตฌํํ ๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ๋ฉ์๋๋ ์์ฒญํ ๋๋ง๋ค ํธ์ถ๋๋ service() ํ๋ ๋ฟ์ด๋ค. ๋๋จธ์ง ๋ฉ์๋๋ค์ ํ์์ ์ด์ง ์๋ค. ๊ทธ๋์ ๋๋จธ์ง ๋ฉ์๋๋ค์์๋ ๋ฑํ ํ ์์ ์ด ์๋๋ผ๋ ๋น ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํ๋ ๋ถํธํจ์ด ์๋ค. GenericServlet์ service()๋ฅผ ์ ์ธํ ๋๋จธ์ง 4๊ฐ ๋ฉ์๋์ธ init(), destroy(), getServiceConfig(), getServiceInfo() ๊ฐ ๋ฏธ๋ฆฌ ๊ตฌํ๋์ด ์์ด ์ด๋ฐ ๋ถํธํจ์ ํด์ํด์ค๋ค. service()๋ง ๋ณ๋๋ก ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
1. GenericServlet์ ์์ํ๋ ๊ณ์ฐ๊ธฐ ์๋ธ๋ฆฟ ์์ฑ
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class CalculatorServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
javax.servlet.GenericServlet์ ์์ํ๋ ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
GenericServlet์ ์ถ์ ํด๋์ค์ด๋ฏ๋ก service()๋ฅผ overrideํด์ผ ํ๋ค.
service()๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง๋ค ํธ์ถ๋๋ ๋ฉ์๋๋ก ์ค์ง์ ์ธ ์๋น์ค ์์ ์ ์ํํ๋ค.
service()์ ๊ฐ๋จํ ํผ์ฐ์ฐ์ 2๊ฐ๋ฅผ ๋ฐ์ ์ฌ์น์ฐ์ฐ๊ณผ % ์ฐ์ฐ์ ์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
int operand1 = Integer.parseInt(servletRequest.getParameter("operand1"));
int operand2 = Integer.parseInt(servletRequest.getParameter("operand2"));
}
service()์ ๋งค๊ฐ๋ณ์ ์ค ServletRequest ๊ฐ์ฒด๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ๋ ์ฌ์ฉํ๋ค.
ServletRequest์ getParameter()๋ GET/POST ์์ฒญ์ผ๋ก ๋ค์ด์จ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๊บผ๋ผ๋ ์ฌ์ฉํ๋ค.
์ธ์๋ก ๋งค๊ฐ๋ณ์๋ช ์ ๋๊ธด๋ค.
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
int operand1 = Integer.parseInt(servletRequest.getParameter("operand1"));
int operand2 = Integer.parseInt(servletRequest.getParameter("operand2"));
servletResponse.setContentType("text/plain");
servletResponse.setCharacterEncoding("UTF-8");
}
ServletResponse ๊ฐ์ฒด๋ ์๋ต ๊ด๋ จ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ServletResponse์ setContentType()์ ํด๋ผ์ด์ธํธ์๊ฒ ์ถ๋ ฅํ ๋ฐ์ดํฐ์ ํ์๊ณผ ๋ฌธ์ ์งํฉ์ ์ง์ ํ๋ค. ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ๋ณด๊ณ ๊ทธ ํ์์ ๋ง์ถฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ๋ฉด์ ์ถ๋ ฅ(Rendering)ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด HTML ํ์์ด๋ฉด ํ๊ทธ ๊ท์น์ ๋ง์ถฐ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ XML ํ์์ด๋ฉด ๊ฐ ํ๊ทธ๋ฅผ ํธ๋ฆฌ ๋ ธ๋๋ก ํํํ๋ค.
setContentType("text/plain")์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ๋ณ๋์ ๋ฉํ์ ๋ณด๊ฐ ์๋ ์์ํ ํ ์คํธ์์ ์ง์ ํ๋ค.
setCharacterEncoding()์ ์ถ๋ ฅํ ๋ฐ์ดํฐ์ ๋ฌธ์ ์งํฉ์ ์ง์ ํ๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ ๋๊ณ setContentType()์ ๋ค์๊ณผ ๊ฐ์ด ํจ๊ป ๋๊ฒจ๋ ๋๋ค.
setContentType("text/plain;charset=UTF-8")
๊ธฐ๋ณธ ๋ฌธ์ ์งํฉ์ ISO-8859-1์ด๋ค. ์ ์ฝ๋์ ๊ฐ์ด UTF-8๋ก ์ง์ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๋ ์ ๋์ฝ๋ ๊ฐ์ UTF-8 ํ์์ผ๋ก ๋ณํํ๋ผ๋ ์๋ฏธ์ด๋ค. ๋ฌธ์ ์งํฉ์ ์ง์ ํ์ง ์์ผ๋ฉด ํ๊ธ์ด ๊นจ์ ธ์ ์ถ๋ ฅ๋๋ค.
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
int operand1 = Integer.parseInt(servletRequest.getParameter("operand1"));
int operand2 = Integer.parseInt(servletRequest.getParameter("operand2"));
servletResponse.setContentType("text/plain");
servletResponse.setCharacterEncoding("UTF-8");
PrintWriter writer = servletResponse.getWriter();
writer.println("operand1=" + operand1 + ", operand2" + operand2 + "์ ๊ณ์ฐ ๊ฒฐ๊ณผ์
๋๋ค.");
writer.println(operand1 + " + " + operand2 + " = " + (operand1 + operand2));
writer.println(operand1 + " - " + operand2 + " = " + (operand1 - operand2));
writer.println(operand1 + " * " + operand2 + " = " + (operand1 * operand2));
writer.println(operand1 + " / " + operand2 + " = " + ((double) operand1 / (double) operand2));
writer.println(operand1 + " % " + operand2 + " = " + (operand1 % operand2));
}
ServletResponse์ getWriter()๋ ํด๋ผ์ด์ธํธ๋ก ์ถ๋ ฅํ ์ ์๋ ๋ฌธ์ ๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ง๊ธ์ ํ ์คํธ๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ฏ๋ก getWriter()๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ ์ด๋ฏธ์ง๋ ๋์์๊ฐ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ ค๋ฉด ๋ฐ์ดํธ ๊ธฐ๋ฐ์ getOutputStream()์ ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ๊น์ง ์์ฑํ CalculatorServlet์ ์ ์ฒด ํ์ผ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค. (import๋ฌธ ์ ์ธ)
public class CalculatorServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
int operand1 = Integer.parseInt(servletRequest.getParameter("operand1"));
int operand2 = Integer.parseInt(servletRequest.getParameter("operand2"));
servletResponse.setContentType("text/plain");
servletResponse.setCharacterEncoding("UTF-8");
PrintWriter writer = servletResponse.getWriter();
writer.println("operand1=" + operand1 + ", operand2" + operand2 + "์ ๊ณ์ฐ ๊ฒฐ๊ณผ์
๋๋ค.");
writer.println(operand1 + " + " + operand2 + " = " + (operand1 + operand2));
writer.println(operand1 + " - " + operand2 + " = " + (operand1 - operand2));
writer.println(operand1 + " * " + operand2 + " = " + (operand1 * operand2));
writer.println(operand1 + " / " + operand2 + " = " + ((double) operand1 / (double) operand2));
writer.println(operand1 + " % " + operand2 + " = " + (operand1 % operand2));
}
}
2. ๋ฐฐ์น ๋ฐ ํ ์คํธ
web.xml์ CalculatorServlet์ ๋ฐฐ์น ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค.
<servlet>
<servlet-name>Calculator</servlet-name>
<servlet-class>com.atoz_develop.servelets.CalculatorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Calculator</servlet-name>
<url-pattern>/calc</url-pattern>
</servlet-mapping>
์๋ฒ ์ฌ๊ธฐ๋ ํ URL์ operand1๊ณผ operand2์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ถ์ฌ ์์ฒญํ๋ค.
์ฐธ๊ณ - @WebServlet ์ด๋ ธํ ์ด์ ์ ์ด์ฉํ ์๋ธ๋ฆฟ ๋ฐฐ์น ์ ๋ณด ์ค์
์์์๋ web.xml์ ์๋ธ๋ฆฟ ๋ฐฐ์น ์ ๋ณด๋ฅผ ์์ฑํ์ง๋ง Servlet 3.0๋ถํฐ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ์๋ธ๋ฆฟ ๋ฐฐ์น ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์๋ค.
@WebServlet("/calc")
public class CalculatorServlet extends GenericServlet {
//...
}
์์ ๊ฐ์ด ์ค์ ํ๊ณ web.xml์ ์๋ณตํ ๋ค ์ฌ์คํํ๋ฉด ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
๋๊ธ