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서블릿에서 클라이언트 요청으로부터 쿠키가 존재하는지 확인
쿠키 사용 - 오늘 하루 이 창을 열지 않음(코드)
<!-- 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>
// 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을 재실행하기만 하면 된다.
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>
// 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>");
...
}
}
// 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에서만 사용 가능
...
}
}
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>");
...
}
}