Recent Posts
Recent Comments
Link
11-22 00:01
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

Servlet request response 본문

DEV&OPS/Java

Servlet request response

ALEPH.GEM 2022. 6. 8. 14:20

자바 웹 어플리케이션은 브라우저에서 아래 처럼 접근 할 수 있습니다.

http://서버주소:포트번호/웹어플리케이션이름/서블릿orJSP

 

서블릿 경로(build path)

프로젝트 이름을 우클릭하고 Build Path -> Configure Build Path 를 선택합니다.

여기 source 탭에 아래 부분에 Default output folder: 항목에 Browse... 버튼을 클릭합니다.

폴더 목록에서 jsp> WebContent > WEB-INF 폴더를 선택한 후 Create New Folder를 선택합니다.

폴더이름을 classes 를 입력한 후 OK

그러면 자바 소스 파일들이 컴파일 후에 방금 지정한 WEB-INF/classes 에 생성되는 것입니다.

 

서블릿 작성(package 경로: net.aacii.test)

src 경로에 net.aacii.test 패키지를 만든 뒤 아래와 같이 FirstServlet.java  클래스를 생성합니다.

package net.aacii.test;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	//서블릿이 최초로 실행 되었을 때 한번만 실행	
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 실행");
	}

	//클라이언트 요청이 있을 때마다 실행	
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service() 실행");
	}
}

소스 파일을 빌드하게 되면 build path에 지정한 경로에 .class 파일이 생성됩니다.

tomcat서버에 deploy되면 WEB-INF/classes 경로에 이 .class 파일들이 위치합니다.

이 WEB-INF 경로에 있는 파일들은 클라이언트(브라우저, 주소창)에서 직접 접근할 수 없는 경로 입니다.

클라이언트에서 WEB-INf/classes 에 있는 서블릿에 접근하려면 web.xml 이나 어노테이션을 이용해서 접근 경로를 지정해줘야 합니다.

 

/WebContent/WEB-INF/web.xml 을 통한 서블릿 접근(실행) 방법

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>jsp</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>	
  
	<servlet>
		<servlet-name>first</servlet-name>
		<servlet-class>net.aacii.test.FirstServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>first</servlet-name>
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>  
	
</web-app>

web.xml 에서 <servlet>과 <servlet-mapping>에서 클라이언트에서 접근 경로를 지정해줘야 합니다.

<servlet-class>  에서는 패키지 포함해서 클라이언트가 접근 해야할 서블릿 이름을 적습니다.

<url-pattern>에서는 클라이언트에서 주소 입력시 해당 서블릿을 실행하도록 매핑시켜주는 역할을 합니다.

<servlet-name>은 <servlet>과 <servlet-mapping> 을 연결 시켜주는 이름이므로 둘이 같은 이름을 입력해야 합니다. 

 

톰캣을 실행 시키고

http://localhost:8080/jsp/hello 

를 입력시키면 콘솔에

init() 실행
service() 실행

이 표시되며 서블릿이 실행된것을 확인할 수 있습니다.

여기서 /jsp 가 웹 어플리케이션 이름이고, /hello가 서블릿 접근 경로입니다.

 

@WebServlet 어노테이션(annotation)을 통한 서블릿 접근 방법

package net.aacii.test;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet("/hello2")
public class FirstServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;

	//서블릿이 최초로 실행 되었을 때 한번만 실행
	public void init(ServletConfig config) throws ServletException{
		System.out.println("init() 실행");
	}
	
	//클라이언트 요청이 있을 때마다 실행
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException{
		System.out.println("service() 실행");
	}

}

@WebServlet이 web.xml의 <servlet> <servlet-mapping> 태그 역할을 하기 때문에 해당 태그를 주석하거나 제거합니다.

@WebServelt 어노테이션을 이용하면 URL패턴을 일일이 web.xml에 지정할 필요 없이 자바(서블릿)에서 URL패턴을 지정할 수 있습니다.

하지만 어노테이션 방법의 단점은 수정시 다시 자바 파일을 컴파일 해야하는 단점이 있습니다.

 

tomcat을 실행하고 브라우저 주소창에

http://localhost:8080/Servlet/hello2 

를 입력하면 FirstServelt이 실행되는 것을 볼 수 있습니다.

 

GET방식 요청과 응답

URL요청을 /second로 해서 get 방식으로 요청한 경우

doGet 메서드를 통해 HttpServletRequest객체로 요청 정보를 담고, HttpServletResponse객체로 응답정보를 담아서 처리합니다.

package net.aacii.test;

import java.io.IOException;
import java.io.PrintWriter;

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("/second")
public class Second extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//GET방식 Http request와 response를 처리
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
		//서버 콘솔에 출력
		System.out.println("SecondServelt");
		//클라이언트 브라우저에 출력
		PrintWriter out = resp.getWriter();
		out.print("<html><head><title>테스트</title></head>");
		out.print("<body><h1>get방식 요청 처리 테스트</h1></body>");
		out.print("</html>");
		out.close();
	}
}

브라우저에 http://localhost:8080/jsp/second 을 입력하여 테스트 해봅시다.

그러면 한글 인코딩이 깨져서 나오게 됩니다.

기본 한글 인코딩이 8859_1 이어서 그렇습니다.

이때 response 객체에 setContentType() 메서드를 통해 UTF-8로 변경합니다.

package net.aacii.test;

import java.io.IOException;
import java.io.PrintWriter;
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("/second")
public class Second extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//GET방식 Http request와 response를 처리
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
		//서버 콘솔에 출력
		System.out.println("SecondServelt");
		//response 객체에 한글 인코딩 세팅
		resp.setContentType("text/html;charset=UTF-8");
		//클라이언트 브라우저에 출력
		PrintWriter out = resp.getWriter();
		out.print("<html><head><title>테스트</title></head>");
		out.print("<body><h1>get방식 요청 처리 테스트</h1></body>");
		out.print("</html>");
		out.close();
	}
}

 

request 네트워크 정보 출력

package net.aacii.test;

import java.io.IOException;
import java.io.PrintWriter;

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("/netInfo")
public class NetInfo extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
		res.setContentType("text/html;charset=UTF-8");
		PrintWriter out = res.getWriter();
		out.print("<html>");
		out.print("<head><title>네트워크 요청 정보</title></head>");
		out.print("<body>");
		out.print("Request Scheme: "+req.getScheme() +"<br/>");
		out.print("Server Name: "+ req.getServerName()+"<br/>");
		out.print("Server Address: "+req.getLocalAddr()+"<br/>");
		out.print("Server Port: "+req.getServerPort()+"<br/>");
		out.print("Client Address: "+req.getRemoteAddr()+"<br/>");
		out.print("Client host: "+req.getRemoteHost()+"<br/>");
		out.print("Client Port: " + req.getRemotePort()+"<br/>");
		out.print("Request URI: " + req.getRequestURI()+"<br/>");
		out.print("Request URL: " + req.getRequestURL()+"<br/>");
		out.print("Context Path: " + req.getContextPath()+"<br/>");
		out.print("Request Protocol: " + req.getProtocol()+"<br/>");
		out.print("Servlet Path: " + req.getServletPath()+"<br/>");
		out.print("</body></html>");
		out.close();
	}
}

 

Request header 정보

package net.aacii.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
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("/headerInfo")
public class HeaderInfo extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
		res.setContentType("text/html;charset=UTF-8");
		PrintWriter out = res.getWriter();
		out.print("<html>");
		out.print("<head><title>request header 정보</title></head>");
		out.print("<body>");
		Enumeration<String> em = req.getHeaderNames();
		while(em.hasMoreElements()) {
			String s = em.nextElement();
			out.println(s + ": "+req.getHeader(s) + "<br/>");
		}
		out.print("</body></html>");
		out.close();
	}
}

 

만약 web.xml에 아래와 같이 servlet을 매핑하면

	<servlet>
		<servlet-name>infomation</servlet-name>
		<servlet-class>net.aacii.test.HeaderInfo</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>infomation</servlet-name>
		<url-pattern>/info/*</url-pattern>
	</servlet-mapping>

http://localhost:8080/jsp/info

으로 시작하는 모든 URL에 대해서 HeaderInfo 서블릿이 실행되게 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

서블릿 설정(web.xml)과 변수  (0) 2022.06.10
Method GET POST  (0) 2022.06.10
자바 웹 어플리케이션  (0) 2022.06.02
OkHttp 를 이용한 REST Client 구현 예제  (0) 2022.05.26
byte 와 16진수(Hex) String 변환  (0) 2022.05.26