본문 바로가기

컴퓨터 프로그래밍/servlet

servlet과 XML

 

 

 

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