package servlet.generic;
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 GenericServletTest1 extends GenericServlet{
/*
클라이언트가 요청을 하면 호출되는 메소드 입니다.
이떄 클라이언트의 요청정보를 servletRequest에 저장합니다. ----- Command
요청을 수행한 후 응답할 정보를 ServletResponse에 저장합니다. --- Command Result
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//요청을 받았다는 가정하에 바로 응답을 보내보겠습니다. (클라이언트의 브라우저로 응답해야합니다.)
PrintWriter out =res.getWriter();//printWriter를 얻어와야합니다.요청에 대한 정보를 찾으려면 res에서 찾아야합니다.
out.println("<html><body bgcolor='yellow'>");//브라우저로 응답해서 출력합니다. html로 뿌립니다.그래서 html tag를 넣어야 합니다.
out.println("<h2>hellow~~~ GenericServlet!!!</h2>");
out.println("</body></html>");
out.close();
}
}
//http://127.0.0.1:8888/web01_GenericServlet/GenericServletTest1
//저 요청이 있으면, service가 받아서 응답합니다.
// servlet 작성- server 가동-> context단위로 배포-> 브라우저 열어서 요청합니다. -> 서버상에서 돌고 있는 service가 받아서 응답합니다.
//404가 뜹니다. 경로 문제, file문제가 될 수 있습니다.
실행을 했는데, 404가 뜹니다.
tomcat안에 들어가보니 만든 문서가 없습니다.
그 위치는 아래와 같습니다.
package 다시 만들어주고, 다시 실행했는데, 결론은 여전히 404가 떴습니다.
이론: 요청을 수행할 서버사이드의 컴포넌트가 먼저 만들어져 있어야합니다. 즉, 객체가 있어야합니다.
SE는 객체 생성 주체가 개발자에게 있으나, EE에서는 객체 생성의 주체가 WAS에게 있습니다. WAS는 어떻게 객체를 생성하고, 그 mechanism은 어떻게 되나? WAS는 GenericServletTest1.class를 인식하지 못합니다. WAS는 XML만을 인식하고 객체를 생성할 수 있습니다.
WAS는 web.xml을 읽어 들이고, 객체를 만들어야합니다.
GenericServletTest1을 만들때 우리는 class로 만들었다. 그러면 INF 아래 web.xml에 아무 내용이 없습니다. 3버전 부터는 annotation기법으로 할 수 있지만, 지금은 원리는 배우는 것이기 때문에 xml에 직접 기입해줍니다. 개발자 입장에서는 annotation이 편합니다. 기업 입장에서는 annotation보다는 유지보수가 편한 xml로 가야합니다.
그래서 이클립스에서 web.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_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>GenericServletTest1</servlet-name>
<servlet-class>servlet.generic.GenericServletTest1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GenericServletTest1</servlet-name>
<url-pattern>/GST1</url-pattern>
</servlet-mapping>
</web-app>
풀네임(servlet-class)을(servlet.generic.GenericServletTest1) 닉네입 servletname으로 만든다.
이것을 클라이언트에서 부르는 이름하고 서버에서 사용하는 이름하고 다르게 해서 보안을 유지합니다.
아래 mapping을 해서 한번더 꼬아줍니다. 이때 url pattern에 꼭 /를 해줘야합니다.
servlet을 실행할때 web.xml을 읽는데, 이게 잘 못 되면, 코드를 볼 필요 없이 xml을 봐야합니다. 실행할 때 오류가 생길 수 있습니다. 이때는 xml 부분이 잘못 작성되어 있을 경우가 있으니, 잘 확인해야합니다.
위와 같이 servlet으로 만들어 줍니다.
package servlet.generic;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* Servlet implementation class GenericServletTest2
*/
public class GenericServletTest2 extends GenericServlet {
private static final long serialVersionUID = 1L;
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//printWriter
PrintWriter out= response.getWriter();
out.println("<html><body><h2>");
out.println("Hello GenericTest2");
out.println("<h2><body><html>");
out.close();
}
}
/*
* servlet instance mapping information --> was
* (servlet의 객체를 만들어 주는 주체가 was니까 어떤 이름으로 만들지 정해야합니다.)
* (레퍼런스 변수 가 두개 필요합니다, 서버 내부 변수와 클라이언트가 url을 치고 들어오는 변수입니다.)
* FQCN: servlet.generic.GenericServletTest2
* Server 내부이름 매핑:GenericServletTest2
* 클라이어트 url 매핑ㅣ GS2
*/
<?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_2_5.xsd" id="WebApp_ID" version="2.5">
<servlet>
<servlet-name>GenericServletTest1</servlet-name>
<servlet-class>servlet.generic.GenericServletTest1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GenericServletTest1</servlet-name>
<url-pattern>/GST1</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>GenericServletTest2</display-name>
<servlet-name>GenericServletTest2</servlet-name>
<servlet-class>servlet.generic.GenericServletTest2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GenericServletTest2</servlet-name>
<url-pattern>/GS2</url-pattern>
</servlet-mapping>
</web-app>
servlet instance mapping information --> was
- servlet의 객체를 만들어 주는 주체가 was니까 어떤 이름으로 만들지 정해야합니다.
- 레퍼런스 변수 가 두개 필요합니다, 서버 내부 변수와 클라이언트가 url을 치고 들어오는 변수입니다.
- FQCN: servlet.generic.GenericServletTest2
- Server 내부이름 매핑:GenericServletTest2
- 클라이어트 url 매핑ㅣ GS2
'컴퓨터 프로그래밍 > servlet' 카테고리의 다른 글
get과 post (0) | 2020.06.02 |
---|---|
CGI(Common gateway interface) 기술 (0) | 2020.06.01 |
web server와 WAS (0) | 2020.06.01 |
servlet API 관계도 (1) | 2020.06.01 |
eclipse-apache tomcat server 연동 (0) | 2020.06.01 |