Servlet/JSP 2일차

0

이 글은 유튜브에 뉴렉처님의 강의를 보며 작성하는 것입니다.

Servlet 문자열 출력

아래에 있는 코드는 원격에 있는 클라이언트에게 전달된다.

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class Nana extends HttpServlet
{
	public void service(HttpServletRequest request, 
                             HttpServletResponse response)
                             throws IOException, ServletException
    {
    	OutputStream os = response.getOutputStream();
        PrintStream out = new PrintStream(os, true);
        out.println("Hello Servelt!!");
    }
}
  • 서버로 데이터를 요청하는 것을 request라 한다. 이때의 객체를 request 객체라고 한다.
  • 서버는 클라이언트의 데이터를 처리하여 클라이언트 측으로 다시 응답해 주는데 이때의 데이터를 response라고 하고 이 객체를 response 객체라고 한다.

HttpServlet 클래스

  • 웹 서버에 request와 response 기능을 담고 있는 추상클래스이다.
  • Request : 사용자의 요청이다.
  • Response : Web-Server의 응답이다.

<HttpServletRequest 객체>
: 사용자가 서버쪽으로 데이터를 요청할 때, 요청에 대한 기능과 속성들을 가지고 있는 객체이다.

  • request.getCookies()
    - 쿠키정보 얻기
  • request.getSession()
    - 세션정보 가져오기
  • request.getAttribute(null)
    - request 속성 값
    • request.setAttribute()로 저장한 값을 불러올 수 있다.
  • request.setAttribute("key", value)
    • request를 key를 지정하여 value값을 request 객체에 저장할 수 있다.
  • request.getParameter(null)
    -폼에서 전송된 파라미터 받기(파라미터가 하나의 값을 가질 때)
  • request.getParameterValues(null)
    - 폼에서 전송된 파라미터 받기(파라미터가 여러 값을 가질 때)
  • request.getParameterNames()
    - 파라미터 이름 집합

<HttpServletResponse 객체>
: 서버에서 만든 데이터를 사용자에게 넘겨줄 때 사용하는 객체

  • response.addCookies(null)
    - 쿠키 추가/수정
  • response.getStatue()
    - status 값
  • response.SendRedirent(null)
    - 페이지 이동
  • response.getWriter()
    - 텍스트 출력
    • 문자열을 쓰는데 다국어라면 Writer 개념을 기본으로 쓴다.
  • response.getOutputStream()
    - 바이트 출력

이때까지는 메모장을 활용하여 jsp를 작성하였지만 이후에는 이클립스를 활용하여 작성한다. 이클립스를 활용하여 jsp를 작성하려면 EE버전을 다운로드 받아야한다.

Annotation을 이용한 URL 매핑

  • 이전에는 web.xml 이라는 파일을 통해 URL 매핑을 이용하였다.
  • Annotation을 이용하면 더욱 쉽게 매핑을 가능하게 하였다.
@WebServlet("/hello") // Annotation
public class Nana extends HttpServlet {
	protected void service(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException
    {
    	PrintWriter out = response.getWriter();
        
        out.println("Hello Servlet!!");
    }
}
  • 다만 서블릿 3.0 이상에서 Annotation을 사용하려면 아래의 사진에서 metadata-complete 부분을 "false"로 설정하여야한다.
  • 기존에 web.xml 파일을 이용하면 협업을 하기 힘들었다.
  • 왜냐하면 일종의 공유하여 사용하는 설정파일이기 때문이다.
  • Annotation을 이용하면 협업을 하기 좋아지고 코드도 깔끔해 보인다.

Servlet 출력 형식의 이해

public class Nana extends HttpServlet {
	protected void service(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException
    {
    	PrintWriter out = response.getWriter();
        
        for(int i=0; i<100; i++)
        {
        	out.println((i+1)+": Hello Servlet!!");
        }
    }
}
  • 위의 코드에서 println()을 사용하여 출력하였다.
  • 일반적인 출력에서는 라인별로 줄바꿈되어 출력되는 것이 정상이다.
  • 위의 코드를 크롬과 엣지에서 각각 실행하면 결과가 다르다.
  • 이는 브라우저에 컨텐츠 형식을 알려주지 않아서 자의적인 해석을 했기 때문이다.
  • 하지만 브라우저 상에서는
    태그를 통해서만 줄바꿈이 되어야한다.

한글 출력하기

  • 서버에서 한글을 지원하지 않는 문자코드로 인코딩한 경우
  • 서버에서는 UTF-8로 인코딩해서 보냈지만 브라우저가 다른 코드로 잘못 해석한 경우
    response.etCharacterEncoding("UTF-8");
    // 인코딩 방식을 지정해줘야 한다.
    response.setContentType("text/html; charset=UTF-8");
    // 어떠한 인코딩 방식을 사용해야하는지 set
public class Nana extends HttpServlet {
	protected void service(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException
    {
    	response.etCharacterEncoding("UTF-8");
        // 인코딩 방식을 지정해줘야 한다.
        response.setContentType("text/html; charset=UTF-8");
        // 어떠한 인코딩 방식을 사용해야하는지 set
        PrintWriter out = response.getWriter();
        
        for(int i=0; i<100; i++)
        {
        	out.println((i+1)+": 안녕 Servlet!!");
        }
    }
}

GET 요청과 쿼리 스트링

  • 사용자가 입력한 것을 어떻게 처리해야 하는가?

http://localhost/hello?cnt=3
--> 여기서 cnt=3에 해당되는 부분을 쿼리 스트링이라고 한다.

  • 위의 코드에서는 100번을 출력하는데 사용자는 3번만 출력하고 싶을 수도 있다.
  • 그래서 사용자는 횟수를 요청하고 서버는 그에맞는 페이지를 생성하여 전송한다.
@WebServlet("/hello")
public class Nana extends HttpServlet {
	protected void service(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException
    {
    	response.setCharacterEncoding("UTF-8");
    	response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
        
		int cnt=Integer.parseInt(request.getParameter("cnt")); 
        // 입력도구
        // 문자열로 전송되기에 Integer.parseInt() 함수를 사용하여 정수로 변환하여 사용한다.
		
        for(int i=0; i<cnt; i++)
        {
        	out.println((i+1)+": 안녕 Servlet!!<br >");
        }
    }
}
  • 위의 코드를 바로 실행하면 오류가 뜨는데 이는 cnt 값을 넘겨주지 않았기 때문이다.
  • 이 문제 때문에 기본값을 설정해줘야 한다.

기본 값 사용하기

@WebServlet("/hello")
public class Nana extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		PrintWriter out = response.getWriter();

		String temp = request.getParameter("cnt"); // cnt 값을 받아온다.
		int cnt = 1; // 기본 값 설정
		if (temp != null && !temp.equals("")) // 전달된 값이 null이 아니라면 temp를 정수형으로 변환
			cnt = Integer.parseInt(temp);

		for (int i = 0; i < cnt; i++) {
			out.println((i + 1) + ": 안녕 Servlet!!<br >");
		}
	}
}

입력할 내용이 많은 경우는 POST 요청

  • 전달할 내용이 많다면 일정한 양식을 통해서 전달을 한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div>
		<form action="notice-reg" method="post">
			<div>
				<label>제목:</label><input name="title" type="text">
			</div>
			<div>
				<label>내용:</label>
				<textarea name="content"></textarea>
			</div>
				<input type="submit" value="등록" />
		</form>
	</div>
</body>
</html>
@WebServlet("/notice-reg")
public class Nana2 extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		PrintWriter out = response.getWriter();

		String title = request.getParameter("title");
		String content = request.getParameter("content");

		out.println(title);
		out.println(content);
	}
}

한글 입력 문제

  • 위에서 한글을 POST하면 한글이 깨진다.
    request.setCharacterEncoding("UTF-8");
@WebServlet("/notice-reg")
public class Nana2 extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
        // 위에 request 설정으로 UTF-8로 지정을 하면 한글이 깨지지 않고 전달된다.

		PrintWriter out = response.getWriter();

		String title = request.getParameter("title");
		String content = request.getParameter("content");

		out.println(title);
		out.println(content);
	}
}

GET과 POST

  • GET
    • 클라이언트에서 서버로 어떠한 정보를 요청하기 위해 사용되는 메서드
    • 값이나 내용, 상태등을 바꾸지 않는 경우에 사용한다.
  • POST
    • 서버상의 데이터 값이나 상태를 바꾸기 위해서 사용한다.
    • 클라이언트에서 서버로 리소스를 생성하거나 업데이트하기 위해 데이터를 보낼 때 사용 되는 메서드이다.

9장 부터 19장까지

0개의 댓글