[Servlet]클라이언트에게 에러메세지 보내기 & 서블릿을 요청할 때 전달된 값을 반환받아 저장하기
입력페이지(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(",");
}
}