• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Java EE 정리 06

05 Mar 2019

Reading time ~5 minutes

Java EE 정리 06 - Cookie 사용, init-param/ context-param


쿠키 사용 - 오늘 하루 이 창을 열지 않음(흐름)

  • 오늘 하루 이 창을 열지 않음 기능흐름
    • 클라이언트가 index.html 요청
    • 서버 index.html에서 location.href=”../index”로 응답
    • 클라이언트가 응답받고 리다이렉트로 index 서블릿을 재요청
      • 서버 index서블릿에서 클라이언트 요청으로부터 쿠키가 존재하는지 확인
        • 쿠키가 존재하지 않으면 팝업창을 띄움
          • “오늘 하루 이 창을 열지 않음” 체크 후 닫기 버튼 클릭 시 서버에 쿠키심는 서블릿 요청 후 쿠키 심고, 창닫기 수행
        • 쿠키가 존재하면 popup관련 쿠키 존재하는지 확인
          • 오늘 날짜와 동일하면 창을 띄우지 않음
          • 오늘 날짜가 아니면 창을 띄우는 코드 수행

쿠키 사용 - 오늘 하루 이 창을 열지 않음(코드)

<!-- index.html -->
...
<script type="text/javascript">
      window.onload = function() {
            location.href="../popup_cookie.do";
      }
</script>
...
  • DD(WebContent/WEB-INF/web.xml) 에서 서블릿 맵핑
    • .do는 URL Pattern에서 정해지는 것
<!-- web.xml -->
...
  <servlet>
    <servlet-name>popup_cookie</servlet-name>
    <servlet-class>date0305.PopupBody</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>popup_cookie</servlet-name>
    <url-pattern>/popup_cookie.do</url-pattern>
  </servlet-mapping>
</web-app>
// PopupBody.java
@SuppressWarnings("serial")
public class PopupBody extends HttpServlet {
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();
          ...
          // 쿠키가 존재하고 오늘 날짜와 같다면 팝업창을 띄우지  않는다.
          boolean popupFlag = false;
          
          // 1. 쿠키 읽기
          Cookie[] cookies = request.getCookies();
          
          if (cookies != null) { // 쿠키가 존재
               Cookie readCookie = null;
               for(int i=0; i<cookies.length; i++) {
                    readCookie = cookies[i];
                    if("popup_date".equals(readCookie.getName())) {
                         String value = readCookie.getValue();
                         String nowDate = new  SimpleDateFormat("yyyy-mm-dd").format(new Date());
                         if(nowDate.equals(value)) {
                                   popupFlag = true;
                         }
                    }
               }
          }
          out.println("<script type='text/javascript'>");
          out.println("\t window.onload = function() {");
          
          if (!popupFlag) { // 쿠키가 없으면 팝업 띄우기
               out.println("\t\t  window.open('date0305/popup.html','popup','width=755, height=510,  top=100, left=250')");
          }
          
          out.println("\t }");
          out.println("</script>");
          ...
          out.println("<h2>정윤이의 철권세상에 잘 오셨습니다.</h2>");
          out.println("<img src='common/images/img.png' title='게임은  수업시간에 해야 제맛'><br/>");
          out.println("<h3>이번 주 정모는 강남역 지하 게임센터에서  화요일 19:00시부터 진행됩니다.</h3>");
          out.println("<h3>많은 참여 부탁드립니다..</h3>");
          out.println("<img src='date0304/images/job.png'>");
          ...
     }
}
<!-- popup.html -->
...
<script  src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
     $(document).ready(function() {
          $("#closeWin").click(function() {
               $("form").submit();
          });
     });
</script>
...
<body>
<div id="wrap">
     <div id="container">
          <img src="../common/images/popup.jpg">
          <br/>
          3월 디잘잘배 철권대회 오픈!!<br/>
          일시 : 3월 8일 19:00시부터 토너먼트 진행<br/>
          경품 : 1등 - 김정윤 1일 사용쿠폰, 2등 - 김정윤 반나절 쿠폰,  3등 - 최지우 한달사용 쿠폰<br/>
     </div>
     <div id="footer">
          <form action="../popup_close.do" name="frm">
               <input type="checkbox" name="popupFlag"/>오늘하루  그만보기
               <a href="#void" id="closeWin">닫기</a>
          </form>
     </div>
</div>
</body>

01

// PopupClose.java

@SuppressWarnings("serial")
public class PopupClose extends HttpServlet {
       
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {
          
          // checkbox에 value가 없을 때 체크하고 submit 되면 "on"이  들어오고
          // checkbox를 선택하지 않고 submit되면 "null"이 입력된다.
          String popupFlag = request.getParameter("popupFlag");
          
          if(popupFlag != null) { // 체크박스가 선택된 경우 "on"
               
               // 쿠키 심기 : 팝업창을 보여주지 않을 목적으로 날짜를  가진 쿠키를 심는 것
               SimpleDateFormat sdf = new  SimpleDateFormat("yyyy-mm-dd");
               
               // 1. 쿠키 생성
               Cookie popupCookie = new  Cookie("popup_date",sdf.format(new Date()));
               
               // 2. 쿠키의 생존시간
               popupCookie.setMaxAge(60*60*24); // 하루
               
               // 3. 쿠키 심기
               response.addCookie(popupCookie);
          }
          
          response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();
          
          out.println("<script type='text/javascript'>");
          out.println("\twindow.onload = function() {");
          out.println("\t\tself.close();"); // 쿠키 심고 창 종료
          out.println("\t}");
          out.println("</script>");
          // 쿠키가 심어지면 하루동안 팝업이 안뜬다.
     }
}

init-param/ context-param

  • DD에 설정하여 서블릿에 값을 전달하는 노드들
    • 편의성이 보장됨
    • 보안성이 향상됨
  • 값이 class 안에 있을 때 특징
    • 값이 변경되는 상황이 생기면 자바코드를 열어 값을 수정, 컴파일, 배포, Tomcat 재실행(번거롭다)
  • 값이 class 밖에 있으면 값만 바꾸고 Tomcat을 재실행하기만 하면 된다.

02

init-param

  • 특정 서블릿에만 값을 넣어 사용할 때
    • 다른 Servlet에서 사용할 수 없다.
    • 값은 String만 가능
  • ServletConfig 객체를 사용하여 값을 얻는다.
<!-- 1. DD(web.xml)에 init-param 설정 -->
<servlet>
    <servlet-name>서블릿객체명</servlet-name>
    <servlet-class>패키지명.클래스명</servlet-class><!-- 여기서 init-param  사용가능-->
    <init-param>
        <param-name>파람이름</param-name>
        <param-value>값</param-value>
    </init-param>
</servlet>

03

// 2. Servlet 내에서 사용
// 2-1. ServletConfig 얻기
ServletConfig sc = getServletConfig(); // GenericServlet의 method

// 2-2. init-param의 이름들 얻기
Enumeration<String> en = sc.getInitParameterNames();

while(en.hasMoreElements()) {
    // en.nextElement();
}

// 2-3. 값 얻기
String val = sc.getInitParameter("이름"); // 없으면 null
  • init-param 사용 예
<!-- DD(web.xml) -->
...
<servlet>
  <servlet-name>use_init_param</servlet-name>
  <servlet-class>date0305.UseInitParameter</servlet-class>
  <init-param>
      <param-name>name</param-name>
      <param-value>김정윤</param-value>
  </init-param>
  <init-param>
      <param-name>addr</param-name>
      <param-value>서울시 강남구 역삼동</param-value>
  </init-param>
  <init-param>
      <param-name>birth</param-name>
      <param-value>1989</param-value>
  </init-param>
</servlet>
...
// UseInitParameter.java
@SuppressWarnings("serial")
public class UseInitParameter extends HttpServlet {
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();
          
          ...

          // DD의 <init-param>에 설정된 값 얻기.
          // 1. ServletConfig 얻기 (HttpServlet으로부터 얻는다.)
          ServletConfig sc = getServletConfig();
          
          // 2. <init-param>의 값들을 얻기
          Enumeration<String> en = sc.getInitParameterNames();
          
          out.println("<ul>");
          String nodeName = "";
          while(en.hasMoreElements()) {
               nodeName = en.nextElement();
               out.print("<li> 노드 명 : <strong>");
               out.print(nodeName);
               out.print("</strong> 노드의 값 : ");
               out.println(sc.getInitParameter(nodeName));
          }
          out.println("</ul>");
          out.println("<div style='width:300px; height:200px;  border:1px solid #333;'>");
          // 값 얻기
          out.print("<marquee>");
          out.print(sc.getInitParameter("name"));
          out.println("</marquee>");
          out.print("<strong>");
          out.print(sc.getInitParameter("addr"));
          out.println("</strong><br/>");
          out.print("<mark>");
          out.print(sc.getInitParameter("birth"));
          out.println("</mark><br/>");
          out.println("<a href='use_dd_param'>init-param 정의하지 않은  Servlet</a>");
          out.println("</div>");
          ...
     }
}

04

// UseDDParam.java
@SuppressWarnings("serial")
public class UseDDParam extends HttpServlet {
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();
          ...
          // init-param은 다른 Servlet에서 사용할 수 없다.
          out.println("<div style='width:300px; height:250px;  border:1px solid #FF0000;'>");
          out.println("<h2>다른 서블릿에 init-param 사용</h2>");

          // 1. ServletConfig 얻기
          ServletConfig sc = getServletConfig();
          out.print("<strong>이름</strong> : ");
          out.print(sc.getInitParameter("name")); // null
          out.println("<br/>");
          out.println("<a href='use_init_param'>init-param 정의  Servlet</a>");
          out.println("</div>");
          // init-param은 특정 Servlet에서만 사용 가능

          ...
     }
}

05

context-param

  • 모든 서블릿에서 값을 넣어 사용할 때 사용
    • 공통의 값
  • ServletContext 객체를 사용하여 값을 얻는다.
<!-- 1. DD(web.xml) web-app 태그 내에 생성 -->
<context-param>
    <param-name>이름</param-name>
    <param-value>값</param-value>
</context-param>
// 2. Servlet 내에서 사용
// 2-1. ServletContext 얻기
ServletContext sc = getServletContext();

// 2-2. context-param 이름들 얻기
Enumeration<String> en = sc.getInitParameterNames();

while(en.hasNextElements()) {
    // en.nextElement();
}

// 2-3. 값 얻기
String val = sc.getInitParameter("이름");
  • context-param 사용 예
<!-- DD(web.xml) -->
...
<context-param>
  <param-name>name</param-name>
  <param-value>이재찬</param-value>
</context-param>
<context-param>
  <param-name>addr</param-name>
  <param-value>인천시 소래포구</param-value>
</context-param>
<context-param>
  <param-name>birth</param-name>
  <param-value>1992</param-value>
</context-param>
...
// UseContextParameter.java
@SuppressWarnings("serial")
public class UseContextParameter extends HttpServlet {
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {
          
          response.setContentType("text/html;charset=UTF-8");
          PrintWriter out = response.getWriter();
          
          ...
          // 모든 Servlet에서 사용할 수 있는 <context-param>의 사용
          // 1. ServletContext를 얻기
          ServletContext sc = getServletContext();
          
          // 2. 모든 이름 얻기
          Enumeration<String> en = sc.getInitParameterNames();
          
          out.println("<table border='1'>");
          out.println("\t<tr>");
          out.println("\t\t<th>파라미터이름</th><th>파라미터의  값</th>");
          out.println("\t</tr>");
          
          String nodeName = "";
          while(en.hasMoreElements()) {
               nodeName = en.nextElement();
                         
               out.println("\t<tr>");
               out.print("\t\t<td>");
               out.print(nodeName);
               out.println("\t\t</td>");
               out.print("\t\t<td>");
               out.print(sc.getInitParameter(nodeName)); // 값 얻기
               out.println("\t\t</td>");
               out.println("\t</tr>");
          }
          out.println("</table>");
          ...
     }
}

06



Java EEServlet