Java Server Pages

Servlet

나주나주 2024. 1. 30. 11:03

: 웹 클라이언트의 요청으로 웹서버에서 수행되는 Java 프로그램, JSP도 Servlet을 기반으로 하는 만큼 구현 방법과 수행 방법, 수행구조를 알아야 한다.  servlet 클래스를 생성할 때 구현하려는 기능과 관계 없이 HttpServlet 클래스를 상속해야 한다.

Servlet의 상속 구조, 점선:  implements, 실선: extends

 

http:// 192.168.111.101 :8000 /edu /FirstServlet
Protocol 통신규약 IP Port 내선 번호 Context-Path (프로젝트명이 들어감) servlet

 

package core;

import java.io.IOException;
import javax.servlet.ServletConfig;
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: Servlet 프로그램의 등록과 매핑(URL mappings)을 정의
@WebServlet("/FirstServlet") //http://192.168.111.101:8000/edu/FirstServlet 요청에 대한 응답
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public FirstServlet() {
        super();
    }

	public void init(ServletConfig config) throws ServletException {
		System.out.println("웹 접속 초기화 시작"); //init(): 웹 접속 초기화, 처음에만 실행
	}

	public void destroy() { 
		System.out.println("웹 접속 종료"); //destroy(): 웹 접속 종료
	}

	//request, response 매개변수 두 가지를 통로로 생각해
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("모든 요청 처리"); //service(): 모든 요청 처리, 클라이언트 새로 고침 시 실행
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
		System.out.println("get방식의 메서드 처리"); //doGet(): get방식의 메서드 처리
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
		System.out.println("post방식의 메서드 처리"); //doPost(): post방식의 메서드 처리
	}

}

Tip1) javax(Tomcat 9), Jakarta(Tomcat 10)

Tip2) Tomcat이 구동된 상태인 경우  Ctrl + Alt + R로 Restart 하세요. Tomcat은 구동되는 시점에서 새로 생성된 Servlet을 인식하기 때문입니다.

 

URL mapping

: 서블릿 생성 시  /로 시작하는 매핑명을 변경할 수 있다. 

servlet클래스 파일의 경우에는 servlet프로그램으로 인식되어 처리되도록 등록과 매핑이ㅏ는 설정을 web.xml(deployment descriptor)에  

 

<welcome-file>

url의 파일명을 적지 않으므로 도와주는 용도 보안상 좋지 않으므로 만들어놓은 하나 빼고 삭제할 것 (add는 쉬운데 overwrite는 어려움)

 

용어 기능
WAS (Web Application Server) 일반적인 웹서버 + Servlet과 같은 서버용 웹 애플리케이션을 수행, 그 결과를 HTTP 기반으로 서비스하는 서버 ≒ Tomcat
Web Container 웹 어플리케이션을 관리하고 수행시키는 프로그램
Web Application 웹 컨테이너가 관리하는 웹 자원들, Eclipse에서 생성하는 하나의 Dynamic Web Project 
Web components Servlet, JSP와 같이 웹서버에서 수행되는 자원
web.xml
(web application DD(Deployment Descriptor))
웹 어플리케이션만의 환경 파일
static resources HTML, CSS, JavaScript 등 정적인 콘텐츠
Library Servlet이 내장하고 있는 API 외 확장 API, 주로 jar 파일로 구성되어 있다

: 하나의 웹 컨테이너에 두 개 이상의 웹 어플리케이션이 배치deploy 될 수 있으며, 웹 어플리케이션 단위로 수행하고 관리합니다. 웹 컨테이너는 구동될 때 인식되는 웹 애플리케이션들을 하나 하나 컨텍스트 객체로 생성하여 관리합니다. 이 때 컨텍스트 객체마다 고유의 이름이 부여되는데, 이를 컨텍스트명이라고 합니다.

 

 

 

Tomcat도 다중 스레드!

 

Servlet의 멤버 변수와 지역 변수 점검

필드(멤버 변수)

생성자

메서드(지역 변수)

 

Servlet의 요청과 응답

doGet() : 헤더

doPost() : 바디

 

GET 방식 Query 문자열 처리

Query 문자열: name과 value의 쌍으로 구성

GET: '지정된 URI에 대한 콘텐츠 요청'의 의미로서 다음과 같이 대부분의 요청은 GET 방식이 기본입니다.

  • 하이퍼링크 텍스트( <A> 태그)를 클릭하여 요청
  • URL을 주소 필드에 입력하여 요청
  • <IMG> 태그로 요청
  • method 속성이 GET으로 속성된 <FORM> 태그로 요청
  • <IFRAME> 태그로 요청

GET 방식 요청은 Query 문자열이 없는 요청과 Query 문자열을 추가한 요청 모두 가능합니다.

Query 문자열을 추가하여 요청하는 경우:

  • 전달되는 Query 문자열의 길이에 제한이 있고 내용이 브라우저의 주소 필드에 보입니다.
  • <FORM> 태그를 사용해도 되고 요청 URL에 '?' 기호로 직접 Query 문자열을 붙여서 전달할 수 있습니다.

 

GET / POST 방식으로 전달되는 문자열 추출

//name으로 하나의 value 값이 전달되는 경우:
//String address = request.getParameter("address");

//name으로 여러 개의 value 값이 전달되는 경우:
//String hobby[] = request.getParameterValues("hobby");

package core;

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({ "/qget", "/qpost" }) // http://192.168.111.101:8000/edu/qget?guestName=kkw&guestAge=40, http://192.168.111.101:8000/edu/qpost?guestName=kkw&guestAge=40
public class QueryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// URI요청을 get방식으로 받아 처리하는 doGet()
		resp.setContentType("text/html;charset=utf-8"); // html형식의 유니코드 지원
		PrintWriter out = resp.getWriter();
		String userName = req.getParameter("guestName"); // URI에서 온 parameter값을 userName에 넣음
		int age = Integer.parseInt(req.getParameter("guestAge"));
		out.print("<h2> 요청방식: " + req.getMethod() + "</h2>");
		out.print("<h2> 요청 URI: " + req.getRequestURI() + "</h2>");
		out.print("<h2> 요청 이름: " + userName + "</h2>");
		out.print("<h2> 요청 나이: " + age + "</h2>");
		out.print("<a href='" + req.getHeader("referer") + "'>입력 화면으로 돌아가기</a>");
		out.close();
	}
    //GET 방식은 서버마다 한글 문제가 다르게 나타나는데, Tomcat 8.0 이후에서는 발생하지 않는다

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8"); //POST 방식은 Query 문자열을 추출할 때 한글이 깨지기 때문에, 한글 처리 필수
		doGet(req, resp);
	}
}

URL로 들어오는 값 == Parameter

URL = http:// + URI(ip주소부터)

 

포워드랑 리다이렉트 게시물 작성 후 사용자를 어느 페이지로 보낼지

Forward

: 동일 서버

RequestDispatcher rd = request.getRequestDispatcher("/servletexam/output.html");
rd.forward(request, response);

 

 

Redirect

:  다른 서버(다른 웹사이트)

 

Tip) 파일 업로드 시 POST 방식으로! 파일에 key value는 없으니까

'Java Server Pages' 카테고리의 다른 글

JSP 세팅 순서  (0) 2024.01.31
JSP 클라이언트 에러 암기  (0) 2024.01.31
JDBC를 이용하는 프로그램 작성  (0) 2024.01.16
Java Data Base Connectivity  (0) 2024.01.15
컬렉션 프레임워크  (1) 2024.01.04