Backend/Servlet & JSP

[Servlet]클라이언트에게 에러메세지 보내기 & 서블릿을 요청할 때 전달된 값을 반환받아 저장하기

sukii 2024. 1. 10. 20:33
반응형

입력페이지(form.html : 이미 만들어져 있으나 코드 따로 첨부하지 않음)로부터 전달받은 입력값(회원정보)을 반환받아 클라이언트에게 HTML 문서를 전달하여 응답하는 서블릿
=> 입력페이지의 form 태그를 사용하여 POST 방식으로 요청해야 실행되는 서블릿 작성

 

전체코드 👩‍💻

주의해서 볼 부분은 코드 아래 정리해놓음!!

package xyz.itwill.servlet;

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;

//입력페이지(form.html)로부터 전달받은 입력값(회원정보)을 반환받아 클라이언트에게 HTML 문서를
//전달하여 응답하는 서블릿
// => 입력페이지의 form 태그를 사용하여 POST 방식으로 요청해야 실행되는 서블릿
@WebServlet("/join.itwill")
public class JoinServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//서블릿을 GET 방식으로 요청한 경우 비정상적인 요청으로 클라이언트에게 에러코드(4xx or 5xx)를 전달하여 응답하거나
		//에러페이지로 이동되도록 URL 주소를 전달하여 응답
		//HttpServletRequest.getMethod() : 서블릿을 요청한 요청방식(GET or POST)을 반환하는 메소드
		System.out.println("요청방식 = "+request.getMethod());
		if(request.getMethod().equals("GET")) {//서블릿을 GET 방식으로 요청한 경우
			/*
			//HttpServletResponse.sendError(int sc) : 클라이언트에게 에러코드를 전달하여 응답하는 메소드
			// => 상태코드(StatusCode)는 HttpServletResponse 인터페이스에 상수로 선언되어 제공
			//[web.xml]파일에서 error-page 엘리먼트를 사용해 에러코드에 따른
			//에러페이지를 전달하여 출력하는 기능 제공
			// => 클라이언트의 요청 URL 주소는 변경되지 않고 에러페이지 출력
			//response.sendError(400);
			response.sendError(HttpServletResponse.SC_BAD_REQUEST);
			//response.sendError(405);
			//response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
			return;//서블릿 종료
			*/
			
			/*
			//HttpServletResponse.sendRedirect(String url) : 클라이언트에게 301 상태코드와
			//URL 주소를 전달하는 메소드
			// => 301 상태코드를 전달받은 클라이언트는 응답받은 URL 주소로 브라우저의 요청
			//URL 주소를 변경하여 재요청하여 실행결과를 응답받아 출력 - 페이지 이동(리다이렉트 이동)
			response.sendRedirect("error.html");
			return;
			*/
			
			//클라이언트에서 HTML 문서에 자바스크립트를 저장하여 응답 처리
			// => 경고창을 사용하여 메세지 출력 후 원하는 페이지로 이동 처리
			out.println("<script>");
			out.println("alert('비정상적인 방법으로 페이지를 요청하였습니다.');");
			out.println("location.href='form.html';");
			out.println("</script>");
			return;
		}
		
		//서블릿을 POST 방식으로 요청한 경우 사용자 입력값을 리퀘스트 메세지의 몸체부에
		//문서파일에 저장하여 전달
		// => 리퀘스트 메세지의 몸체부에 만들어진 문서파일의 문자형태가 서유럽어(ISO-8859-1)로 설정되어 제공
		// => 리퀘스트 메세지의 몸체부에 만들어진 문서파일의 문자형태를 변경한 후 전달값을 반환
		//HttpServletRequest.setCharacterEncoding(String enclding) : 리퀘스트 메세지의 몸체부에 만들어진
		//문서파일의 문자형태를 변경하는 메소드
		// => GET 방식으로 요청한 경우 리퀘스트 메세지의 몸체부를 사용하지 않기 때문에 메소드 호출 불필요
		request.setCharacterEncoding("utf-8");
		
		//서블릿을 요청할 때 전달된 값을 반환받아 저장
		//HttpServletRequest.getParameter(String name) : 매개변수로 전달받은 이름의 전달값을
		//문자열(String 객체)로 반환하는 메소드
		// => 매개변수로 전달받은 이름의 전달값이 없는 경우 [null] 반환
		String id=request.getParameter("id");
		/*
		//전달된 값에 대한 검증
		if(id==null || id.equals("")) {//전달값이 없는 경우 - 비정상적인 요청
			response.sendError(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
			
		if(!Pattern.matches("^[a-zA-Z]\\W{5,19}$", id)) {//전달값이 정규표현식의 패턴과 다른 경우 - 비정상적인 요청
			response.sendError(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		*/
		
		String passwd=request.getParameter("passwd");
		String name=request.getParameter("name");
		String eamil=request.getParameter("eamil");
		String gender=request.getParameter("gender");
		//동일한 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 저장
		//String hobby=request.getParameter("hobby");
		//HttpServletRequest.getParameterValues(String name) : 매개변수로 전달받은 이름의 모든 전달값을
		//문자열(String[])로 반환하는 메소드
		String[] hobby=request.getParameterValues("hobby");
		String job=request.getParameter("job"); 
		String profile=request.getParameter("profile");
		
		//HTML 문서를 생성하여 클라이언트에게 전달하여 응답
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='utf-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>회원가입확인</h1>");
		out.println("<hr>");
		out.println("<p>아이디 ="+id+"</p>");
		out.println("<p>비밀번호 ="+passwd+"</p>");
		out.println("<p>이름 ="+name+"</p>");
		out.println("<p>이메일 ="+eamil+"</p>");
		out.println("<p>성별 ="+gender+"</p>");
		//out.println("<p>취미 ="+hobby+"</p>");//그냥 hobby를 쓰면 배열의 주소가 출력됨
		out.println("<p>취미 =");
		for(int i=0;i<hobby.length;i++) {
			out.println(hobby[i]);
			if(i < hobby.length-1) {
				out.println(",");
			}
		}
		out.println("<p>직업 ="+job+"</p>");
		//전달값의 엔터(Enter)를 <br> 태그로 변환해야만 줄바꿈 처리되어 출력
		out.println("<p>자기소개 = <br>"+profile.replace("\n", "<br>")+"</p>");
		out.println("</body>");
		out.println("</html>");
	}
}

 


 

서블릿을 GET 방식으로 요청한 경우

1번 방법) 비정상적인 요청으로 클라이언트에게 에러코드(4xx or 5xx)를 전달하여 응답하거나 에러페이지로 이동되도록 URL 주소를 전달하여 응답

HttpServletRequest.getMethod() : 서블릿을 요청한 요청방식(GET or POST)을 반환하는 메소드

HttpServletResponse.sendError(int sc) : 클라이언트에게 에러코드를 전달하여 응답하는 메소드
=> 상태코드(StatusCode)는 HttpServletResponse 인터페이스에 상수로 선언되어 제공

if(request.getMethod().equals("GET")) {//서블릿을 GET 방식으로 요청한 경우

 

response.sendError(400); //에러코드를 직접 입력해도 되고, 아래와 같은 방법을 이용해도 됨

response.sendError(HttpServletResponse.SC_BAD_REQUEST);

response.sendError(405); //400 대신 405 에러코드를 보낸다면, 405를 직접 작성하거나 아래와 같이 작성하면 됨

response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);

return;//서블릿 종료

 

 

2번 방법) URL 주소를 변경하여 재요청하여 실행결과를 응답받아 출력 - 페이지 이동(리다이렉트 이동)

HttpServletResponse.sendRedirect(String url) : 클라이언트에게 301 상태코드와 URL 주소를 전달하는 메소드
=> 301 상태코드를 전달받은 클라이언트는 응답받은 URL 주소로 브라우저의 요청

response.sendRedirect("error.html");

return;

 

error.html 파일은 아래와 같이 따로 만들어놓음⬇️

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Servlet</title>

</head>

<body>

<h1>에러페이지</h1>

<hr>

<p>비정상적인 방법으로 웹자원을 요청 하였습니다. 정상적인 방법으로 사이트를 이용해 주세요.</p>

<div><a href="form.html">페이지 이동</a></div>

</body>

</html>

 

그런데 이 두번째 방법을 사용하면 클라이언트의 요청 URL 주소가 변경됨.

 

 

3번 방법) [web.xml]파일에서 error-page 엘리먼트를 사용해 에러코드에 따른 에러페이지를 전달하여 출력하는 기능 제공  => 클라이언트의 요청 URL 주소는 변경되지 않고 에러페이지 출력

response.sendError(HttpServletResponse.SC_BAD_REQUEST);

return;//서블릿 종료

 

1번 방법과 똑같아 보이나, [web.xml]파일에 error-page 엘리먼트 작성해놔야함.⬇️

<!-- error-page : 클라이언트에게 전달할 에러페이지를 설정하기 위한 엘리먼트 -->

<!-- error-code 엘리먼트(exception-type 엘리먼트)와 location 엘리먼트를 반드시 자식 엘리먼트로 작성 -->

<error-page>

<!-- error-code : 에러코드를 설정하기 위한 엘리먼트 -->

<error-code>400</error-code>

<!-- location : 에러페이지의 URL 주소를 설정하기 위한 엘리먼트 -->

<location>/error.html</location>

</error-page>

 

 

4번 방법) 클라이언트에서 HTML 문서에 자바스크립트를 저장하여 응답 처리
=> 경고창을 사용하여 메세지 출력 후 원하는 페이지로 이동 처리

out.println("<script>");

out.println("alert('비정상적인 방법으로 페이지를 요청하였습니다.');");

out.println("location.href='form.html';");

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

return;

 

 

 

 

서블릿을 요청할 때 전달된 값을 반환받아 저장
HttpServletRequest.getParameter(String name) : 매개변수로 전달받은 이름의 전달값을 문자열(String 객체)로 반환하는 메소드 => 매개변수로 전달받은 이름의 전달값이 없는 경우 [null] 반환

String passwd=request.getParameter("passwd");

String name=request.getParameter("name");

String eamil=request.getParameter("eamil");

String gender=request.getParameter("gender");

out.println("<p>비밀번호 ="+passwd+"</p>");

out.println("<p>이름 ="+name+"</p>");

out.println("<p>이메일 ="+eamil+"</p>");

out.println("<p>성별 ="+gender+"</p>");

 

🔘체크박스 값을 반환받는 경우

동일한 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 저장이 되므로, getParameterValues 메소드를 사용해야함

HttpServletRequest.getParameterValues(String name) : 매개변수로 전달받은 이름의 모든 전달값을 문자열(String[])로 반환하는 메소드

String[] hobby=request.getParameterValues("hobby");

//out.println("<p>취미 ="+hobby+"</p>");//그냥 hobby를 쓰면 배열의 주소가 출력됨

out.println("<p>취미 =");

for(int i=0;i<hobby.length;i++) {

out.println(hobby[i]);

if(i < hobby.length-1) {

out.println(",");

}

}

 

🔘 전달값에 줄바꿈이 되어 있는 경우

엔터(Enter)를 <br> 태그로 변환해야만 줄바꿈 처리되어 출력

out.println("<p>자기소개 = <br>"+profile.replace("\n", "<br>")+"</p>");

//out.println("<p>취미 ="+hobby+"</p>");//그냥 hobby를 쓰면 배열의 주소가 출력됨

out.println("<p>취미 =");

for(int i=0;i<hobby.length;i++) {

out.println(hobby[i]);

if(i < hobby.length-1) {

out.println(",");

}

}

반응형