너와 나의 연결고리, JSP 🔗(3) - 웹 컨테이너, 서블릿, 서블릿필터

joyfulwave·2022년 10월 12일
0

이제 진짜 웹 서버와 연결해 볼 차례




📚 WAS

Web Application Server

📌 웹 서버

웹 서버(Web Server)는 HTTP 요청을 받아 정적 컨텐츠(static contents)를 제공하는 서버이며 동적인 컨텐츠(dynamic contents)제공을 위한 요청을 전달하는 일을 수행해요.

📌 웹 컨테이너 (Web Container)

웹 서버가 보낸 JSP, PHP 등의 파일을 실행하고 수행결과를 다시 웹 서버로 보내주는 역할을 해요.




📚 서블릿(Servlet)

  • 자바를 사용하여 웹을 만들기 위해 필요한 기술이다.
  • 클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현을 지킨 자바 웹 프로그래밍 기술

📌 서블릿 연결

⚫ (1)

[apache-tomcat-9.0.67]이 다운받아진 경로를 찾아가요. [lib] - [servlet-api.jar] 파일을 복사하여 서블릿을 연결할 [Dynamic Web Project]에서 [src] - [webapp] - [WEB-INF] - [lib]에 복사한 jar 파일을 붙여넣어줘요.

⚫ (2)

해당 [Dynamic Web Project]를 우클릭 후 [Properties]에 들어가요. 작업창 좌측 메뉴에서[Java Build Path] - [Libraries]로 들어가줘요.

⚫ (3)

[Classpath] 클릭 후 우측 메뉴에서 [Add Jars...] 를 클릭하여 아까 복사, 붙여넣기한 [servlet-api.jar] 파일의 경로를 찾아 클릭한 후 [OK] 버튼을 클릭 - [Apply] 하여 [Classpath] 해당 jar 파일이 잘 들어가져있는지 확인해줘요. 그리고 [Apply and Close]로 완료해줘요.

⚫ (4)

서블릿을 연결한 [Dynamic Web Project]에서 [Java Resources] - [Libararies] - [Web App Libraries] 에 서블릿 jar 파일이 잘 들어가져있다면 무사히 서블릿을 연동해준거에요!


📌 xml파일에 서블릿 하드코딩

  	<!-- 
      url패턴의 /hello 요청이 들어오면 servelt의 myServelt으로 요청이 가고,
      com.koreait.web.servlet.MyServlet 클래스 호출
     -->

    // 어떤 서블릿?
    <servlet>
      <servlet-name>myServlet</servlet-name>
      <servlet-class>com.koreait.web.servlet.MyServlet</servlet-class>
    </servlet>

    // 요청의 형태 : /hello 라는 url이 들어오면 myServlet을 실행시켜라
    <servlet-mapping>
      <servlet-name>myServlet</servlet-name>
      <url-pattern>/hello</url-pattern>
    </servlet-mapping>

📌 서블릿 간편 방식

@WebServlet 어노테이션 방식으로 xml에 직접 하드 코딩하지 않아도 서블릿을 사용할 수 있어요.




📚 param

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("/cnt")
public class MyServlet4 extends HttpServlet{
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {

		arg1.setCharacterEncoding("UTF-8");
		arg1.setContentType("text/html; charset=UTF-8");
		
        // client가 입력한 값을 paramCnt에 담는다.
		String paramCnt = arg0.getParameter("cnt");
		int cnt = 100;
		
		if( paramCnt != null && !paramCnt.equals("")) {
        	// String 타입으로 들어온 값이 null 이거나 빈값이 아니라면 int 타입의 cnt 변수에 할당한다.
			cnt = Integer.parseInt(paramCnt);
		}

		PrintWriter out = arg1.getWriter();
        
        // 1부터 client가 param으로 입력한 값까지 for문을 실행한다.
		for(int i = 1; i <= cnt; i++) {
			out.println(i + " : 안녕 servlet<br>");
		}
		
	}
	
}

param의 형태
/cnt?cnt=3 -> "3"
/cnt?cnt= -> ""
/cnt? -> null
/cnt -> null




📚 GET방식과 POST방식 차이

📌 GET방식

  • 서블릿 데이터를 전송할 때 데이터가 URL뒤에 name=value 형태로 공개되어 전송하니 보안에 취약해요.
  • 전송 가능 데이터 최대 255자
  • 기본 전송 방식으로 사용이 쉬워요.
  • 웹 브라우저에서 직접 입력하여 전송 가능해요.
  • 여러개의 데이터를 전송할 때 '&'로 구분하여 전송해요.

⚫ html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="velog_get.jsp" method="get">
		<label>생일</label>
		<input type="text" name="birth">
		<input type="submit">
	</form>
</body>
</html>

⚫ jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	get 방식입니다.
</body>
</html>

⚫ 전송모습

📌 POST방식

  • 서블릿 데이터를 전송할 때 프로토콜의 데이터의 HEAD영역에 숨겨진 채 전송되므로 보안에 유리해요.
  • 전송 데이터 용량 무제한에 가까움
  • 전송 시 서블릿에서 또 다시 가져오는 작업이 필요하므로 GET방식보다 처리 속도는 느려요.

⚫ html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="velog_post.jsp" method="post">
		<label>생일</label>
		<input type="text" name="birth">
		<input type="submit">
	</form>
</body>
</html>

⚫ jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	post 방식입니다.
</body>
</html>

⚫ 전송모습





📚 Servlet Filter

클라이언트로부터 요청이 백엔드로 가기 전에 가로채기 위해서 서버로부터의 응답이 클라이언트로 보내지기 전에 조작하기 위해서 사용해요. 한글이 깨지는 것을 방지한다던지, 특정 인코딩 방식을 부여한다던지하는 필터링이 가능해져요.




포기하지 말고 JUST DO! ✔️




출처
https://media.giphy.com/media/dwmNhd5H7YAz6/giphy.gif
https://media.giphy.com/media/3o6Mb9EC7mNqXl9x7y/giphy.gif

0개의 댓글