ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSP피피티 05강 Get/Post 방식의 상태유지(정규표현식)
    JSP 피피티 2020. 8. 20. 12:03

    Get 방식의 상태유지 기법

    • 여러 단계에 걸친 페이지 이동 
      -ex)설문조사 페이지는 페이지 이동이 거듭되는 동안 이전 페이지에서 사용자가 선택한 답변들을 기억하고 있어야 한다.
    • 이전 페이지에서 넘어온 값과 새로운 값을 누적
      -이전페이지에 선택했던 값들을 파라미터로 전달받아 새 페이지에서도 이전값들이 유지되도록 한다.
    • 결과 페이지의 파라미터 수신 
      -최종 페이지에서는 지금까지 페이지 이동이 거듭되면서 누적되어진 GET파라미터를 모두 수신해야한다.
    • 이와 같이 URL에 GET파라미터가 누적되어 전달되는 기법을 URL Rewrite처리라고 한다.

    3단계로 구성되는 설문조사의 첫 번째 단계 페이지
    -일반적인 GET파라미터를 전송한다.
    q01.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%
    	//WebHelper의 객체를 생성하는 것 만으로 실행중인 페이지가 log에 기록된다.
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1> Q1)당신의 직업은 무엇입니까?</h1>
        
        <ul>
        	<!-- 숫자값이나 영뭄ㄴ은 별다른 처리 없이 파라미터 전달 가능함 -->
        	<li><a href="q02.jsp?ans1=Backend">백엔드 프로그래머</a></li>
        	<li><a href="q02.jsp?ans1=Frontend">프론트엔드 프로그래머</a></li>
        	<li><a href="q02.jsp?ans1=Designer">디자이너</a></li>
        	<li><a href="q02.jsp?ans1=PM">프로젝트 관리</a></li>
        </ul>
    </body>
    </html>

    이 페이지에서 직업으로 백엔드 프로그래머 라고 선택하면 a태그의 ans1의 파라미터 값(Backend)이 전달된다.

     

    q02.jsp

    <%@page import="study.jsp.model1.helper.WebHelper"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="java.net.URLEncoder" %>
    <%
    	//WebHelper 객체 생성
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    
    	//GET 파라미터 수신
    	String ans1 = request.getParameter("ans1"); 
        	//↑↑↑webHelper에서 request객체가 가지고 있는 함수를 쓰는거가틈
    	
    	if(ans1 == null || ans1.equals("")){
    		webHelper.redirect(null, "첫 번째 문항에 대한 응답이 없습니다.");
    		return;
    	}
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>Q2)당신의 취미는 무엇입니까?</h1>
        <ul>
        	<li><a href="q03.jsp?ans1=<%=ans1%>&ans2=<%=URLEncoder.encode("음악감상","utf-8")%>">음악감상</a></li>
        	<li><a href="q03.jsp?ans1=<%=ans1%>&ans2=<%=URLEncoder.encode("스포츠","utf-8")%>">스포츠</a></li>
        	<li><a href="q03.jsp?ans1=<%=ans1%>&ans2=<%=URLEncoder.encode("사진촬영","utf-8")%>">사진촬영</a></li>
        	<li><a href="q03.jsp?ans1=<%=ans1%>&ans2=<%=URLEncoder.encode("등산","utf-8")%>">등산</a></li>
        </ul>
    </body>
    </html>

    -q01.jsp페이지에서 선택된 값이 없으면 q01.jsp페이지로 가는거고 있다면 'Q2)당신의 취미는 무엇있니까?'로 간다.

     

    -Q2에서 보면 a태그 ans1에 q01.jsp페이지에서 받아온 ans1 파라미터값(Backend)을 출력시킨다. 

     

    -ans2의 파라미터값에 새로 전달할 파라미터 값들을 추가했는데 한글이나 공백이 포함되었기 때문에 URLEncode처리-  가 필수적으로 필요하다. 

     

    -'사진촬영'을 선택했다면 ans2 파라미터값은 '사진촬영'이 URLEncoding이 적용되어 출력된다.

     

    q03.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%@ page import="java.net.URLEncoder" %>
    <%
    	//WebHelper 객체 생성
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    
    	//GET파라미터 수신 --> URLEncode가 적용된 파라미터는 수신과정에서 자동으로 디코딩됨
    	String ans1 = request.getParameter("ans1");
    	String ans2 = request.getParameter("ans2");
    	
    	if (ans1 == null || ans1.equals("")){
    		webHelper.redirect(null, "첫 번째 문항에 대한 응답이 없습니다.");
    		return;
    	}
    	
    	if(ans2 == null || ans2.equals("")){
    		webHelper.redirect(null, "두 번째 문항에 대한 응답이 없습니다.");
    		return;
    	}
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>Q3)당신의 성별은 무엇입니까?</h1>
        <ul>
        	<li>
        		<!-- 다 코딩된 an2값을 재전송하기 위해선느 다시한번 인코딩이 필요함 -->
        		<a href="result.jsp?ans1=<%=ans1%>&ans2=<%=URLEncoder.encode(ans2,"utf-8")%>&ans3=M">남자</a>
        	</li>
        	<li>
        		<a href="result.jsp?ans1=<%=ans1%>&ans2=<%=URLEncoder.encode(ans2,"utf-8")%>&ans3=F">여자</a>
        	</li>
        </ul>
    </body>
    </html>

    -q03.jsp에서도 똑같이 그 전 페이지들에서 입력된 값을 모두, 각각 검사해야 한다.

     

    -이전 페이지들에서 입력값 받고, ans3 파라미터값 하나 더!

     

    result.jsp↓

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%
    	//WebHelper 객체생성
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    
    	//지금까지 누적된 모든 GET 파라미터 수신
    	String ans1 = request.getParameter("ans1");
    	String ans2 = request.getParameter("ans2");
    	String ans3 = request.getParameter("ans3");
    	
    	//지금까지 누적된 모든 파라미터에 대한 유효성 검사
    	if(ans1 == null || ans1.equals("")){
    		webHelper.redirect(null, "첫 번째 문항에 대한 응답이 없습니다.");
    		return;
    	}
    	
    	if(ans2 == null || ans2.equals("")){
    		webHelper.redirect(null, "두 번째 문항에 대한 응답이 없습니다.");
    		return;
    	}
    	
    	if(ans3 == null || ans3.equals("")){
    		webHelper.redirect(null, "세 번째 문항에 대한 응답이 없습니다.");
    		return;
    	}
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>응답결과</h1>
        <p>직업: <%=ans1%></p>
        <p>취미: <%=ans2%></p>
        <p>성별: <%=ans3%></p>
    </body>
    </html>

    -여기까지 누적된 값들을 모두 받아와 다시 확인하고 결과 출력 

     

    -중간 과정에서 파라미터가 유실되지 않고 마지막 페이지까지 전달되도록 처리하는 것이 중요하다.

     

    문항이 많아지면 많아질수록 이런처리가 귀찮지만 선생님께서 대안이 없다고 하셨다.

    나중에 설문조사페이지 만들거나 비슷한 페이지 만들때 쓰면 될듯.

     

    POST방식의 상태유지 기법

    JSP model1 : 자바와 HTML코드를 같이 쓰는 것

    JSP model2 : 자바, HTML코드 따로 쓰는 것, MVC(Model, View, Controller) <자바스프링의 기본>

     

    정규표현식(Regular expression)?? 더보기클릭

    더보기

    정규표현식(Regular expression)

    • 은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 '형식언어'
    • 많은 텍스트 편집기와 프로그래밍 언어에서 '문자열의 검색과 치환'을 위해 지원

    정규식표현의 사용(js에서)

    var regex = /정규표현식/;
    if( !regex.test("검사할문자열")){...}

     

    • JS는 정규표현식을 슬래시(/)로 감싸서 표현. 자바에선 쌍따옴표(")
    • 정규표현식은 하나의 객체 형태가 되고, 내장하고 있는 test() 메서드를 통해 문자열이 그 식에 부합할 경우 true, 그렇지 않을경우 false를 리턴
    • 검사결과는 문자열이 식에 부합되지 않을 때에 대한 예외처리가 대부분, 조건문으로 리턴값을 부정하여 문자열이 부합하지 않을 경우에 대한 처리를 구현 

     

    정규표현식에 의한 문자열 검사를 수행하기 위한 싱글톤 클래스(더보기)

    더보기
    package study.jsp.model1.helper;
    
    import java.util.regex.Pattern;
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    public class RegexHelper {
    	//------싱글톤 객체 생성 시작 -------
    	private static RegexHelper current = null;
    	
    	public static RegexHelper getInstance() {
    		if(current == null) {
    			current = new RegexHelper();
    		}
    		return current;
    	}
    	
    	public static void freeInstance() {
    		current = null;
    	}
    	
    	private RegexHelper() {super();}
    	
    	//----------싱글톤 객체 생성 끝---------
    	
    	
    	/**
    	 * 주어진 문자열이 공백이거나 null인지를 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 공백,null이 아닐경우 true 리턴
    	 */
    	public boolean isValue(String str) {
    		boolean result = false;
    		if(str != null) {
    			result = !str.trim().equals("");
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 빈 문자열이 아닙니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 빈 문자열입니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * 숫자 모양에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isNum(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^[0-9]*$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 숫자 형식이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 숫자 형식이 아닙니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * 영문으로만 구성되었는지에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isEng(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^[a-zA-Z]*$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 영어로만 구성되어 있습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 영어로만 구성되어 있지 않습니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * 한글로만 구성되었는지에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isKor(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^[ㄱ-ㅎ가-힣]*$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 한글로만 구성되어 있습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 한글로만 구성되어 있지 않습니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * 영문과 숫자로만 구성되었는지에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isEngNum(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^[a-zA-Z0-9]*$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 영어+숫자 조합이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 영어+숫자 조합이 아닙니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * 한글과 숫자로만 구성되었는지에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isKorNum(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^[ㄱ-ㅎ가-힣0-9]*$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 한글+숫자 조합이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 한글+숫자 조합이 아닙니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * 이메일 형식인지에 대한 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isEmail(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("[0-9a-zA-Z]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 이메일 형식이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 이메일 형식이 아닙니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * -없이 핸드폰번호인지에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isCellPhone(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 핸드폰 번호 형식이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 핸드폰 번호 형식이 아닙니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * -없이 전화번호인지에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isTel(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^\\d{2, 3}\\d{3, 4}\\d{4}$",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 전화번호 형식이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 전화번호 형식이 아닙니다.",str));
    		}
    		return result;
    	}
    	
    	/**
    	 * -없이 주민번호에 대한 형식 검사
    	 * @param str - 검사할 문자열
    	 * @return boolean - 형식에 맞을 경우 true, 맞지않을 경우 false
    	 */
    	public boolean isJumin(String str) {
    		boolean result = false;
    		if(isValue(str)) {
    			result = Pattern.matches("^\\\\d{6}[1-4]\\\\d{6}",str);
    		}
    		
    		if(result) {
    			log.debug(String.format("(regex) -> `%s`(은)는 주민번호 형식이 맞습니다.",str));
    		}else {
    			log.debug(String.format("(regex) -> `%s`(은)는 주민번호 형식이 아닙니다.",str));
    		}
    		return result;
    	}
    }

     

    이전 페이지의 입력값을 받아서 다음 페이지로 재전송 하기

    • 이전 페이지에서 입력한 값을 request 내장 객체를 사용해 받는다.
    • 이렇게 받은 값을 새로운 <input>태그의 value 속성에 출력한다.
    • <input>태그에 이전의 입력값을 설정하는 방식으로 상태유지를 구현하면, 사용자가 입력한 내용들이 페이지 이동을 거듭하면서 누적된다.
    • 페이지 이동이 거듭될 수록 이전 입력값을 출력해 주는 <input>태그는 증가할 것이다.
    • 결과 페이지에서는 지금까지 누적된 모든 값을 받아서 출력할 수 있다.

    <input type="hidden">의 활용

    • 이전의 입력값이 그대로 화면에 노출된다면 실제 서비스를 구현하면서 적절한 UI(user interface?)는 아닐것이다.
    • 실제 페이지 구현 시에는 이전 화면의 입력값을 누적하기 위하여<input type='hidden'>태그를 활용해 이전의 입력값이 화면에 노출되지 않도록 구현한다.
    <input type='hidden' name='user_name' value='<%=userName%>' />

    q01.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%
    	//WebHelper 객체 생성
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>간단 설문조사 1/3</h1>
        <h2>기본정보 입력</h2>
        <form name="myform" method="post" action="<%=request.getContextPath() %>/03_post/q02.jsp">
        	<div>
        		<label for="user_name">이름</label>
        		<input type="text" name="user_name" id="user_name" />
        	</div>
        	<div>
        		<label for="user_email">이메일</label>
        		<input type="text" name="user_email" id="user_email" />
        	</div>
        	<div>
        		<label for="user_tel">연락처</label>
        		<input type="tel" name="user_tel" id="user_tel" />
        	</div>
        	<button type="submit">다음단계</button>
        </form>
    </body>
    </html>

    위에 form태그 action 속성에서 "request.getContextPath()( → 현재프로젝트이름을 대신함 )/폴더명/파일명" 형식으로 절대경로를 지정

    form태그에 method속성 'post' 확인 

     

    아니 q01.jsp페이지를 실행했을때 형식검사가 되어서 잠깐 놀랐다. 분명 위 코드에 형식검사클래스(RegexHelper.java)를 참조 하지 않았는데 왜 될까 했는데 곰곰히 생각해보니 '다음단계' 버튼을 누르면 입력받은 값들이 action속성에 명시한 페이지(q02.jsp)로 이동하게 되는데 거기서 형식검사를 해준거였어!!

     

    q02.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%@ page import="study.jsp.model1.helper.RegexHelper" %>
    <%
    	//WebHelper 객체 생성
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    	//RegexHelper 객체 생성
    	RegexHelper regexHelper = RegexHelper.getInstance();
    	
    	//POST 파라미터 수신. 값이 없을 경우 기본값 null이 리턴됨
    	String userName = request.getParameter("user_name");
    	String userEmail = request.getParameter("user_email");
    	String userTel = request.getParameter("user_tel");
    	//이름에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    	if(!regexHelper.isValue(userName)){
    		webHelper.redirect(null,"이름을 입력하세요.");
    		return;
    	}
    	
    	//이름이 한글 이외의 글자가 포함되어 있다면 메시지 출력 후 이전 페이지로 강제 이동 후 종료(return)
    	if(!regexHelper.isKor(userName)){
    		webHelper.redirect(null,"이름은 한글만 입력 가능합니다.");
    		return;
    	}
    	
    	//이메일에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    	if(!regexHelper.isValue(userEmail)){
    		webHelper.redirect(null,"이메일을 입력하세요.");
    		return;
    	}
    	
    	//이메일에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    	if(!regexHelper.isEmail(userEmail)){
    		webHelper.redirect(null,"이메일 형식이 잘못되었습니다.");
    		return;
    	}
    	
    	//연락처가 입력되지 않았다면  메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    	if(!regexHelper.isValue(userTel)){
    		webHelper.redirect(null,"연락처를 입력하세요.");
    		return;
    	}
    		
    	//연락처가 핸드폰 셩식도 아니고 집전화 형식도 아니라면 메시지 출력 후 이전 페이지로 강제 이동후 종료(return)
    	if(!regexHelper.isCellPhone(userTel) && !regexHelper.isTel(userTel)){
    		webHelper.redirect(null,"연락처 형식이 잘못되었습니다.");
    		return;
    	}
    	
    	
    	
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>간단 설문조사 2/3</h1>
        <h2>성별 선택</h2>
        
        <form name="myform" method="post" action="<%=request.getContextPath() %>/03_post/q03.jsp">
        	<!-- 이전 화면에서 넘어온 값에 대한 상태 유지 -->
        	<input type='hidden' name='user_name' value='<%=userName%>' />
        	<input type='hidden' name='user_email' value='<%=userEmail%>' />
        	<input type='hidden' name='user_tel' value='<%=userTel%>' />
        	
        	<!-- 설문항목 -->
        	<div>
        		<label><input type="radio" name="gender" value="남자" checked>남자</label>
        		<label><input type="radio" name="gender" value="여자" >여자</label>
        	</div>
        	<button type="submit">다음단계</button>
        </form>
    </body>
    </html>

    RegexHelper에서 형식검사를 하고 그 결과에 대한 처리를 q02.jsp에서 함

     

    -q01.jsp페이지의 input태그의 name속성 값으로 파라미터를 전달받음(request.getParameter(name속성))

    *Get방식에서는 a태그에서 href속성 url에서 파라미터 전달 형식? 으로 파라미터 값을 전달 받음

     

    -이전에 입력한 값들은 type에 hidden 줘가지고 안보이게 해놈q02.jsp 실행하면 남자,여자 라디오체크만 보임

     

    갑자기 get방식에서 한글로된 파라미터 값을 받을때 인코딩을 했는데 왜 여기서 이름값을 받을때 인코딩을 안하나 하는 의문이 들었으나 get방식에선 url안에 들어가는 값을 받았기 때분에 인코딩을 해주어야 한듯, input으로 들어온 값은 한글이어도 되는거 가틈 url같은데 쓸게 아니니까.

     

    q03.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%@ page import="study.jsp.model1.helper.RegexHelper" %>
    <%
    	//WebHelper 객체 생성
    	WebHelper webHelper =  WebHelper.getInstance(request, response);
    	//RegecHelper 객체 생성
    	RegexHelper regexHelper = RegexHelper.getInstance();
    	
    	//Post파라미터 수신. 값이 없을 경우 기본값 null이 리턴됨
    	String userName = request.getParameter("user_name");
    	String userEmail = request.getParameter("user_email");
    	String userTel = request.getParameter("user_tel");
    	String gender = request.getParameter("gender");
    	
    	//이름에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    		if(!regexHelper.isValue(userName)){
    			webHelper.redirect(null,"이름을 입력하세요.");
    			return;
    		}
    		
    		//이름이 한글 이외의 글자가 포함되어 있다면 메시지 출력 후 이전 페이지로 강제 이동 후 종료(return)
    		if(!regexHelper.isKor(userName)){
    			webHelper.redirect(null,"이름은 한글만 입력 가능합니다.");
    			return;
    		}
    		
    		//이메일에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    		if(!regexHelper.isValue(userEmail)){
    			webHelper.redirect(null,"이메일을 입력하세요.");
    			return;
    		}
    		
    		//이메일에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    		if(!regexHelper.isEmail(userEmail)){
    			webHelper.redirect(null,"이메일 형식이 잘못되었습니다.");
    			return;
    		}
    		
    		//연락처가 입력되지 않았다면  메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    		if(!regexHelper.isValue(userTel)){
    			webHelper.redirect(null,"연락처를 입력하세요.");
    			return;
    		}
    			
    		//연락처가 핸드폰 셩식도 아니고 집전화 형식도 아니라면 메시지 출력 후 이전 페이지로 강제 이동후 종료(return)
    		if(!regexHelper.isCellPhone(userTel) && !regexHelper.isTel(userTel)){
    			webHelper.redirect(null,"연락처 형식이 잘못되었습니다.");
    			return;
    		}
    		
    		//성별이 입력되지 않았다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    		if(!regexHelper.isValue(gender)){
    			webHelper.redirect(null,"연락처를 입력하세요.");
    			return;
    		}
    		
    		//성별의 경우 입력값이 둘중 하나이므로 그 외의 경우는 걸러내야 한다.
    		if(!gender.equals("남자") && !gender.equals("여자")){
    			webHelper.redirect(null, "성별이 올바르지 않습니다.");
    			return;
    		}
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>간단 설문조사 3/3</h1>
        <h2>취미를 선택해 주세요</h2>
        
        <form name="myform" method="post" action="<%=request.getContextPath() %>/03_post/result.jsp">
        	<!-- 이전 화면에서 넘어온 값에 대한 상태 유지 -->
        	<input type='hidden' name='user_name' value='<%=userName%>' />
        	<input type='hidden' name='user_email' value='<%=userEmail%>' />
        	<input type='hidden' name='user_tel' value='<%=userTel%>' />
        	<input type='hidden' name='gender' value='<%=gender %>' />
        	
        	<!-- 설문항목 -->
        	<div>
        		<label><input type="checkbox" name="hobby[]" value="음악감상" >음악감상</label>
        		<label><input type="checkbox" name="hobby[]" value="영화감상" >영화감상</label>
        		<label><input type="checkbox" name="hobby[]" value="게임" >게임</label>
        	</div>
        	<button type="submit">결과보기</button>
        </form>
    </body>
    </html>

    q03.jsp에서도 그 전 페이지들에서 받입력받은 값들에 대한 정규표현식 검사 결과를 처리 해주고 그 전 페이지에서 입력받은 값들은 보이지 않게 hidden 처리를 해두었음 

     

    체크박스타입 input에서 name 속성을 hobby[]로 끝에 []을 쓴 이유는 배열임을 표현하기 위함임 다중 선택이 가능하니까.

     

     

    result.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ page import="study.jsp.model1.helper.WebHelper" %>
    <%@ page import="study.jsp.model1.helper.RegexHelper" %>
    <%
    	//WebHelper 객체 생성
    	WebHelper webHelper = WebHelper.getInstance(request, response);
    	//RegexHelper 객체 생성
    	RegexHelper regexHelper = RegexHelper.getInstance();
    	
    	//Post 파라미터 수신. 값이 없을 경우 기본값 null이 리턴됨
    	String userName = request.getParameter("user_name");
    	String userEmail = request.getParameter("user_email");
    	String userTel = request.getParameter("user_tel");
    	String gender = request.getParameter("gender");
    	
    	//체크박스는 배열로 처리도니다.
    	String[] hobby = request.getParameterValues("hobby[]");
    	
    	//이름에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    			if(!regexHelper.isValue(userName)){
    				webHelper.redirect(null,"이름을 입력하세요.");
    				return;
    			}
    			
    			//이름이 한글 이외의 글자가 포함되어 있다면 메시지 출력 후 이전 페이지로 강제 이동 후 종료(return)
    			if(!regexHelper.isKor(userName)){
    				webHelper.redirect(null,"이름은 한글만 입력 가능합니다.");
    				return;
    			}
    			
    			//이메일에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    			if(!regexHelper.isValue(userEmail)){
    				webHelper.redirect(null,"이메일을 입력하세요.");
    				return;
    			}
    			
    			//이메일에 대한 값이 없다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    			if(!regexHelper.isEmail(userEmail)){
    				webHelper.redirect(null,"이메일 형식이 잘못되었습니다.");
    				return;
    			}
    			
    			//연락처가 입력되지 않았다면  메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    			if(!regexHelper.isValue(userTel)){
    				webHelper.redirect(null,"연락처를 입력하세요.");
    				return;
    			}
    				
    			//연락처가 핸드폰 셩식도 아니고 집전화 형식도 아니라면 메시지 출력 후 이전 페이지로 강제 이동후 종료(return)
    			if(!regexHelper.isCellPhone(userTel) && !regexHelper.isTel(userTel)){
    				webHelper.redirect(null,"연락처 형식이 잘못되었습니다.");
    				return;
    			}
    			
    			//성별이 입력되지 않았다면 메시지 출력후 이전 페이지로 강제 이동 후 종료(return)
    			if(!regexHelper.isValue(gender)){
    				webHelper.redirect(null,"연락처를 입력하세요.");
    				return;
    			}
    			
    			//성별의 경우 입력값이 둘중 하나이므로 그 외의 경우는 걸러내야 한다.
    			if(!gender.equals("남자") && !gender.equals("여자")){
    				webHelper.redirect(null, "성별이 올바르지 않습니다.");
    				return;
    			}
    			
    			//배열 항목에 대한 유효성 검사
    			if(hobby == null || hobby.length <1){
    				webHelper.redirect(null,"취미는 최소 하나 이상 선택하셔야 합니다.");
    				return;
    			}
    %>
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello JSP</title>
    </head>
    <body>
        <h1>결과보기</h1>
        <ul>
        	<li>이름 - <strong><%=userName %></strong></li>
        	<li>이메일 - <strong><%=userEmail %></strong></li>
        	<li>연락처 - <strong><%=userTel %></strong></li>
        	<li>성별 - <strong><%=gender %></strong></li>
        	<li>취미 - <strong><%=String.join(",", hobby) %></strong></li>
        </ul>
    </body>
    </html>

    result.jsp서 hobby[]에 대한 값을 어떻게 처리하는 지확인' request.getParameterValues(hobby[]) '

    모든 입력값에 대한 정규표현식 결과를 처리하고 입력받은 값들을 출력한다.

    '취미'에서 String.join(",",hobby)는 hobby배열 값 사이 ","를 넣으라는 뜻같음 

    이것도 설문조사나 비슷한거  할때 쓰면 되는거 가틈

전설의 개발자