상세 컨텐츠

본문 제목

Spring 기본 세팅, 기본 출력, doPost, doGet메소드

IT/프로그래밍

by James Lee. 2015. 12. 1. 12:55

본문


Dynamic Web Project 생성한다.

Spring Suite 실행 후 File(단축키 : Shift + Alt + N) - Dynamic Web Project





Server 오픈해서 포트번호 확인

Servers 탭에서 마우스 오른쪽 버튼 클릭 -> Open을 하면 아래와 같은 창이 나온다.

bio.http.port가 포트이고 8080이 기본 포트번호이다.

Web.xml 생성

WEB-INF폴더의 하위에 web.xml을 생성한다.

단축키 : ctrl + N을 누르면 XML폴더 밑에 있다.


서블릿 매핑

아래와 같은 기본 내용을 작성한다.

사용자가 <url-pattern>에 정해져있는 url을 입력하면 서블릿은 <servlet - mapping>과 <servlet> 사이에서 <servlet-name>이 동일한 지점으로 간다.

그리고 해당 <servlet-name>아래의 <servlet-class>에 있는 위치의 클래스를 실행한다.



서블릿 클래스 생성

서블릿 클래스를 작성하는 방법은 2가지가 있다. 

  1. 클래스를 생성 후 HttpServlet을 상속받는다
  2. Select a wizard 창을 켠다(ctrl + N) 이후 web 카테고리 아래에 Servlet을 선택한다.


doPost, doGet메소드를 오버라이드한다.













메소드 실행을 확인

doGet, doPost메소드가 잘 실행되는지 확인하기 위하여 print문을 추가한다.

console창에 doGetFirstTest가 실행되는 것을 볼 수 있다.

왜 doPost는 실행이 되지 않는지는 모르겠다.


왜 doPost메소드는 실행이 안되는지에 대한 의문점 해결

doGet은 form에서 method에 get방식으로 호출했을때 실행된다.

하지만 아무것도 하지 않았을때 기본적으로 doGet메소드가 실행되기도 한다.

그렇기 때문에 html 문서를 만들지 않고 실행했을때도 doGet메소드가 실행된 것이다

그렇다면 doPost방식은 어떻게 실행시킬까?

doPost메소드 실행시키기

doPost메소드를 실행시키기 전에 분석부터 해 보자

doGet메소드는 기본적으로 실행되기도 하지만 <form>태그의 method="get"으로 데이터를 전송했을때 실행된다고 했다.

즉, <form>의 method속성값에 따라 서블릿 클래스에서 doGet메소드를 실행시킬지, doPost메소드를 실행시킬지가 결정되는 것이다.

doPost메소드를 실행시키려면 <form>의 method속성에 post라는 값을 넣어줘야 한다.

따라서 html문서를 하나 생성한다.

WebContent - New(단축키 : ctrl + N) - HTML파일 생성

그리고 아래와 같은 예시 <form>을 작성한다.

<form>의 action속성은 값을 전송할 서블릿 클래스의 <url-pattern>명이다.

이메일과 이름을 입력하고 submit버튼을 누르면 

FirstTest에 매치되는 서블릿 클래스에 값을 post방식으로 전송한다.

testPost.html을 실행한다.

아래와 같은 입력창이 나온다.

submit type은 form에 있는 데이터를 전송하기 위한 버튼이다. 클릭 시 form에 있는 정보가 전송된다.

빈칸을 채우고 submit버튼을 누른다.

doPost메소드에 있는 내용이 그대로 출력되었다.

doPost메소드가 실행되었음을 알 수 있다.

URL이 같아도 doGet, doPost가 서로 다르게 실행될 수 있다?

doPost가 실행된 상태의 브라우저 화면은 아래와 같다.

그런데 현재 URL주소인 http://localhost:8080/TestProject/FirstTest을 그대로 다시 입력하면 아래와 같은 화면이 나온다.

분명히 URL 주소는 일치하는데 왜 다른 페이지를 출력하는 것일까?

그 답은 전송 방식의 차이에 있다.

위에도 설명했다시피 doPost메소드를 실행시키려면 <form>에서 post로 전송하는 과정이 필요하다.

그러면 form의 action속성에 있는 FirstTest와 일치하는 url pattern을 찾아 servlet-name과 매핑시켜서 FirstTest.java 서블릿을 실행시키는 것이다.

하지만 URL창에다가 바로  http://localhost:8080/TestProject/FirstTest 을 입력하면 어떻게 될까?

<form>을 거치지 않기 때문에 post가 실행이 되지 않고 기본값인 get으로 넘어오게 된다.

따라서 동일한 주소를 입력해도 doGet메소드에 있는 내용이 실행되는 것이다.


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


브라우저 창에 protocol://hostname[ : port번호]/프로젝트파일명/url-pattern 형식으로도 실행할 수 있다

hostname은 자신의 컴퓨터가 서버인 경우에 localhost로 대체 가능하다.

PrintWriter 객체를 이용하여 페이지 내부에 HTML 출력

하지만 아래와 같이 한글은 인코딩이 제대로 되지 않음을 확인할 수 있다.

찾아본 바로는 HTML의 기본 인코딩은 ISO-8859-1이다.

ISO-8859-1이란?

  1. 8비트로 문자를 나타내기위한 ISO와 IEC의 공동 표준어.(8비트=1바이트)
  2. 대부분 서유럽 언어를 지원하며, 당연히 한글은 지원하지 않는다.
  3. HTML의 기본 인코딩이다.


HTML은 1바이트로 한글을 지원하지 않는다. 이것이 한글이 깨지는 대부분의 이유다.
윈도우의 MS949 , 리눅스 기반의EUC-KR 등의 캐릭터셋으로 작성한 문서는 1바이트의 인코딩(ISO-8859-1)으로 만들어진 HTML규격에 맞지 않는다. 자료가 변형되거나 손실 된다.
따라서 변환과정을 거쳐야한다

한글 인코딩을 위한 인코딩 메소드

따라서 한글 인코딩을 지원하기 위한 UTF-8로 인코딩을 해준다.

UTF-8은 모든 문자를 지원한다. 하지만 3바이트를 차지한다. (한글은 2바이트이므로 1바이트가 낭비된다)

이제 실행해도 한글이 잘 나온다.


'IT > 프로그래밍' 카테고리의 다른 글

웹 프로토콜 동작 원리  (0) 2015.12.06
URL 구조 분석  (0) 2015.12.06
[리팩토링] 레거시 코드 리팩토링 예제  (1) 2015.12.01
[TDD] TDD로 SoundEX개발하기 첫번째  (0) 2015.12.01
BBD란 무엇인가  (0) 2015.12.01

관련글 더보기

댓글 영역