파게로그

Eclipse를 통한 웹 개발 기본 본문

콤퓨타 왕기초/JSP

Eclipse를 통한 웹 개발 기본

파게 2020. 12. 9. 15:05

초기 세팅

Eclipsed Java EE > New > Dynamic Web Project

  • Project Name: 프로젝트명
  • Target Runtime: WAS 선택

 

기초적인 설명

  • 홈 디렉터리
    WebContent/
  • Eclipse IDE에서 웹 페이지를 볼 때 브라우저 설정하기
    Window > Web Browser
  • 파일을 직접 여는 것과 Run의 차이
    문서 작성 후 Run을 하면, 문서가 Tomcat의 디렉터리로 옮겨진 후, Tomcat이 실행된 후, Eclipse로 돌아와서 내용이 표시된다. 즉, 파일 자체가 열리는 게 아니라 배포된 문서를 볼 수 있는 것이다.
  • 프로젝트명을 context name으로 쓰지 않기
    기본 프로젝트를 root project가 되어야 한다.
    프로젝트 우클릭 > Web Project Settings > Context root를 '/'로 바꾸어준다.
    서버 중지 후 서버 아래 프로젝트를 삭제해준다.

 

 

Servlet 생성

  • Servlet 클래스 파일 생성 위치
    Java Resources > src
  • 클래스 생성
    Package: 패키지명(eg. com.ddoongi.web)
    Name: 클래스명(eg. Hello)
  • URL mapping
    1. web.xml을 이용한 URL mapping
    2. annotation을 이용한 URL mapping

 

방법1. web.xml을 이용한 URL mapping

Tomcat 경로에 있는 web.xml을 WEB-INF로 복사한다.

이 때 servlet-class는 반드시 패키지명까지 포함한다.

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">
  
  <servlet>
  	<servlet-name>HelloServlet</servlet-name>
  	<servlet-class>com.ddoongi.web.Hello</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>HelloServlet</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

</web-app>

 

방법2. annotation을 이용한 URL mapping

HttpServlet을 상속받는 클래스 즉 실행될 Servlet 위에 annotation을 다음과 같이 달아준다.

@WebServlet("/hello")

Servlet 3.0부터 annotation을 이용한 URL mapping이 지원되므로 web.xml을 사용하지 않아도 된다. 다만 web.xml에서 metadata-complete 속성을 "false"로 바꾸어야함. 이 bool 값은 모든 메타데이터가 web.xml에 있는지를 나타내는 것이다. web.xml을 이용하면 xml 파일을 분할해야 하거나, 또는 분업한 다른 개발자가 모두 하나의 파일에 접근해야한다. annotation을 이용하면 이러한 문제점이 사라진다.

 

 

Servlet의 출력 형식과 콘텐츠 형식 지정

아래 코드는 웹브라우저마다 실제 출력 형식이 서로 다르다. 이는 브라우저에 컨텐츠 형식을 알려주지 않았기에, 브라우저가 html 또는 text로의 자의적인 해석을 거쳤기 때문이다. 또 한글은 깨져서 출력된다.

package com.ddoongi.web;

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

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

@WebServlet("/hello")
public class Hello extends HttpServlet {
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		
		PrintWriter out = res.getWriter();
		
		for (int i = 0; i < 10; i++) {
			out.println((i+1)+": Hello, Servlet!");
			out.println((i+1)+": hii안녕<br>");
		}
		
	}
}

 

 

원인1. 서버에서 한글을 지원하지 않는 문자코드로 인코딩한 경우

웹 서버에서 클라이언트로 보내는 기반 단위가 ISO-8859-1 (1바이트씩 쪼개서 전달됨)

 

원인2. 서버에서는 인코딩해서 보냈지만 브라우저가 다른 코드로 잘못 해석한 경우

웹 서버에서는 UTF-8로 보냈지만 클라이언트가 EUC-KR로 해석함

 

해결1. 전송방식을 변경한다.

response.setCharacterEncoding("UTF-8");

 

(이 라인만 추가했다면 브라우저에서 깨져 보이지만 사용자가 인코딩을 선택해서 제대로 된 내용을 볼 수는 있다.)

 

해결2. 브라우저의 해석 방식도 알려준다. 즉 클라이언트에게 문서의 형식과 인코딩을 알려준다(브라우저에서 개발자도구 > Network > Headers(응답헤더) > Reponse Headers를 확인해보면 Content-Length, Date가 있는데, 여기에 다른 속성도 추가해주는 것이다).

response.setContentType("text/html; charset=UTF-8");

 

'콤퓨타 왕기초 > JSP' 카테고리의 다른 글

POST 요청  (0) 2020.12.09
GET 요청과 쿼리 스트링  (0) 2020.12.09
REST API 설계  (0) 2020.11.23
(IDE 없이) 클라이언트에게 출력  (0) 2020.10.20
IDE 없이 간단한 Servlet 만들어보기  (0) 2020.10.20
Comments