[Server] TIL no.41 | Servlet(2023.09.15)

유은서·2023년 9월 15일
0

Server

목록 보기
1/6

1. Servlet

=> 웹 서비스를 위한 자바 클래스
(자바를 이용한 웹을 만들기 위해 필요한 기술)

=> 자바 어플리케이션 코딩을 하듯
웹 브라우저용 출력 화면(HTML) 을 만드는 방법

웹 프로그래밍에서 클라이언트의 '요청(Request)'을 처리하고
그 결과를 다시 클라이언트에게 '응답(Response)'하는
Servlet클래스의 구현 규칙을 지킨 자바 프로그래밍 기술

브라우저 -> 서버 ( Request )
서버 -> 브라우저 ( Response )

  • 정적 서비스 : html, css , js
    ex) 웹서버(아파치, Nginx)
  • 동적 서비스 : 요청에 따라 다른 결과를 나타냄
    ex) WAS(Web Application Server) == Servlet Container == 아파치 톰캣
    => HTML을 사용하여 요청에 응답
    => MVC Model2패턴에서 Controller로 이용
    => http프로토콜 서비스를 지원하는javax.servlet.http.HttpServlet 클래스를 '상속' 받음

[ 단점 ]
servlet에 작성한 html 코드 변경 시 재컴파일 해야 하는 단점이 있음

  • Servlet 동작 방식

  1. 사용자(클라이언트)가 URL(Uniform Resource Locator)을
    클릭하면 HTTP Request(요청)를 Servlet Container로 전송

-> 다음 장 설명 참고

  1. Http Request를 전송 받은 Servlet Container는 아래 두 객체를 생성
    HttpServletRequest(요청 관련 내용이 저장된 객체),
    HttpServletResponse(응답 관련 내용이 저장된 객체)

  2. DD (배포서술자, Deployment Descriptor) = web.xml은
    사용자가 요청한 URL을 분석하여 어떤 서블릿 클래스에 요청 내용을 전달할지 찾음

  3. 해당 서블릿에서 init() 메소드를 먼저 호출한 후 service() 메소드를 호출하여
    클라이언트로부터 전송 받은 방식인 GET, POST 여부에 따라 해당 메소드(doXXX()) 를 호출함.

  4. doGet() / doPost() 메소드는 동적 페이지를 생성 후 HttpServletResponse객체에 응답을 보냄

  5. 응답 종료 시 HttpServletRequest, HttpServletResponse 객체 소멸

2. Get VS Post 방식

클라이언트(브라우저)가 서버로 요청을 보내는 방법

Get 방식

  • URL에 변수(데이터)를 포함시켜 요청
    보안 유지를 안 하기 때문에 로그인 같은 경우는 get방식으로 하면 부적합
  • Get을 통한 요청은 URL 주소 끝에 파라미터로 포함되어 전송되며, 이 부분을 query string이라고 부름.
    방식은 URL 끝에 "?"를 붙이고 그다음 변수명1 = 값1&변수명2 = 값2 ...
    ex) www.example.com/show?Name1 = 홍길동&Name2 =유은서...
    -> 서버에서는 Name1과 Name2라는 파라미터 명으로 각각 value1과 value2파라미터 값을 전달받을 수 있다.

[ 장점 ]

  • 단순함
  • 캐싱(caching, 저장) 가능
    => 주소 저장 == 북마크, 즐겨찾기, 주소 공유

[ 단점 ]

  • 글자수 제한이 있다.
  • 보안에 취약함. (비밀번호 주소에 보임..)

POST 방식

  • 데이터를 서버로 제출하여 추가 또는 수정하기 위해 데이터를 전송하는 방식
  • URL에 변수(데이터)를 노출하지 않고 요청 데이터를 HTTP Body에 포함하여 전송
  • 헤더필드 중 Body의 데이터를 설명하는 Content-Type이라는 헤더필드가 들어가고
    어떤 데이터 타입인지 명시해주어야 함

ex) Name1 = 홍길동&Name2 =유은서의 경우

json 타입이라면
{
"Name1" : "value1"
"Name2" : "value2"
....
}

[ 장점 ]

  • 길이 제한 X
  • 데이터를 숨겨서 전달 ( 보안성 향상 )

[ 단점 ]

  • 캐싱 불가능 (북마크 하면 원하는 페이지 볼 수 없음)
  • 서버에서 추가적인 문자 인코딩 처리 필요

3. Servlet 이용방법

=> Tomcat9.0 설치

[ 처음 설정 ]
=> Window-> preferences
1) 메모리 정리하기
General-> Show heap status

2) 빌드하기전에 리프레시를 자동 진행
General -> Workspace -> Refresh using native hooks or polling

3) 한글도 출력될 수 있게 설정
General -> Workspace -> Text file encoding =>"UTF-8"

4) 다른 파일도 한글 출력될 수 있게 설정
검색에 "enc" -> Content Types -> Text -> Default encoding => "UTF-8"
                ->CSS Files -> Encoding => "ISO 10646/Unicode(UTF-8)
                ->HTML Files -> Encoding => "ISO 10646/Unicode(UTF-8)
                ->JSP Files -> Encoding => "ISO 10646/Unicode(UTF-8)

5) 실행할 서버가 어디있는지 등록
Server-> Runtime Enviroments -> Add -> Apache -> "9.0V" -> Browser-> 톰캣 저장소 연결

6) Servers / Console / Package Explorer 작업화면에 표시

[ 작업 ]
1) Server 설정
=> New Server -> Apache => Tomcat 9.0 -> name => "Servlet Server"
=> 포트 번호 확인가능

2) 자바 프로젝트 열기
=> New -> Other -> Dynamic Web Project -> 프로젝트 이름
                                                          -> Target runtime : Tomcat9.0
                                                          -> Dynamic -> 4.0
                                                          -> Confignuration -> Default Configuration for Apache Tomcat v9.0
=> Next => Next -> Context root : / (최상위 주소 )
                        -> Generate web.xml deployment descriptor (배포 서술자 생성)

+) web.xml(배포 서술자(설명서))
Server가 켜지자 마자(Start) 제일 처음 읽는 문서

  <display-name>ServletProject</display-name> 
  <!-- 메인페이지로 사용할 파일 명 목록 (webapp 폴더에 파일 생성)-->
  <welcome-file-list> 
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>    
  </welcome-file-list>


4. Servlet 작성

1) index.html 파일을 src\main\webapp에 표시 => 메인페이지 화면 출력

2) web.xml에서 연결시키기

<!-- 특정 클래스(/example1)를 Servlet으로 등록하고 이름을 지정하는 태그 -->
<servlet> 
  <!-- 등록할 Servlet을 지칭할 명칭 -->
  <servlet-name>ex1</servlet-name>

  <!-- Servlet으로 등록할 클래스의 패키지명 + 클래스명 -->
  <servlet-class>edu.kh.servlet.controller.ExampleController1</servlet-class>
</servlet>

3) web.xml에서 요청 주소를 처리할 Servlet 연결

<servlet-mapping>
  <!--  등록할 Servlet을 지칭할 명칭 -->
  <servlet-name>ex1</servlet-name>

  <!--  연결할 요청 주소 -->
  <url-pattern>/example1</url-pattern>
</servlet-mapping>

4) java 코드 작성
=> get 방식 또는 post 방식 이용하여 처리 가능
먼저, HttpServletRequest와 HttpServletResponse 이용

public class ExampleController1 extends HttpServlet {

	//	오버라이딩해서 사용해야 함.
	// doGet() 메서드
	// -> Get 방식 요청을 처리하는 메서드
	// HttpServlet의 메서드를 오버라이딩 
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// HttpServletRequest
		// - 클라이언트 요청 시 생성되는 객체 
		// - 클라이언트 데이터 + 요청관련 데이터 

		// HttpServeltResponse
		// - 클라이언트 요청 시 서버에서 생성하는 객체
		// - 서버가 클라이언트에게 응답하기 위한 방법을 제공하는 객체

		System.out.println("--- 이름, 나이를 입력받아 처리하는 코드 ---");

		// 요청 시 입력된 이름, 나이를 전달 받아오기
		// parameter : 매개변수 == 다른곳의 값을 전달 받아올 때 사용 

		// req.getParameter("name 속성값");
		// -> 요청 시 전달된 데이터 중 
		//    name 속성 값이 일치하는 데이터의 value를 얻어와 
		//    String 형태로 반환 


		String name = req.getParameter("inputName");  // 홍길동을 반환 
		String age = req.getParameter("inputAge");    // 12 (number Type이지만, String으로 얻어옴) 
		//number 값으로 받아와도 html에서 얻어온 값은 모두 String 형태

		System.out.println("입력 받은 이름 : " + name);
		System.out.println("입력 받은 나이 : " + age);



		// 서버 -> 클라이언트 응답하기
		//HttpServletResponse객체 이용

		// 응답하는 문서의 형식과 문자 인코딩을 지정
		// - text/html : 글자가 작성된 html 문서 
		// - charset=UTF-8 : UTF-8 형식의 문자 인코딩으로 작성됨
		resp.setContentType("text/html; charset=UTF-8");




		// 서버 -> 클라이언트로 연결되는 스트림 얻어오기
		PrintWriter out = resp.getWriter();

		// 서버 -> 클라이언트에게 쓰다 (출력)
		out.println("<!DOCTYPE html>");

		out.println("<html>");

		out.println("<head>");
			out.println("<title>서버 응답 결과</title>");
		out.println("</head>");

		out.println("<body>");
			out.println("<h1>");

			out.println(name + "님의 나이는 " + age + "세 입니다.");

			out.println("</h1>");
		out.println("</body>");

		out.println("</html>");

		// Servlet만 사용하면 위와 같은 형태로 html형태를 작성해야함 .	




	}

5) jsp이용하여 server의 값들을 받아 동작

		<%-- jsp 표현식
			<% %> : 스크립틀릿 -> 자바코드 작성
			<%= %> : 표현식 -> 자바, 서버에서 받아온 값을 표현할 때, 출력  %-->

	    <h3 style="color:palevioletred"><%= requst.getPa%>님의 가입을 환영합니다.</h3>

        <ul>
            <li>id : user01</li>
            <li>pw : pass01</li>
        </ul>

        <h4>자기소개</h4>

        <p>안녕하세요?</p>

✨오늘의 프로그래밍 Tip ✨

1) 동작이 제대로 안되는 경우

① Server -> clean
② Project -> clean
③ 강제 새로고침 -> Ctrl + shift + R

0개의 댓글