page directive의 session="true"인 상태에서 내장객체로 지원되고 사용할 수 있다.
<%@ page session="true" %>
// 값 설정session.setAttribute("이름", 값);// 값 얻기session.getAttribute("이름");// 생존시간 설정, Tomcat default는 30분, 초*분*시*일// 한번만 설정하면 모든 페이지에 동일하게 적용된다.session.setMaxInactiveInterval(초);// 값 삭제, 세션은 살아있기 때문에 값 삭제 이후 값을 얻으면 null이 나온다.session.removeAttribute("이름");// 세션 무효화, 세션 자체가 죽기 때문에 값을 얻을 수 없다.session.invalidate();
세션을 이용한 로그인 예
로그인 성공 시 세션에 값 설정
로그인 실패 시 로그인 페이지로 리다이렉트
로그인 후 이동하는 페이지들은 include directive로 세션값이 존재하는지 체크하는 jsp파일을 포함시킴
세션이 없으면 로그인 페이지로 리다이렉트
<!-- use_session.html, 0304 server_prj에 공부한 내용 그대로 사용 -->...<form method="post" action="use_session_a.jsp"><!-- 이동 페이지만 변경 -->...
<!-- use_session_a.jsp --><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" info="session 내장객체 사용" %>...<div id="container"><%! private Map<String, String> logMap = new HashMap<String, String>();{ // instance 영역 : 클래스가 실행될 때 자동 호출되며 // 한번만 실행된다. (이름이 없으므로 개발자가 직접 호출할 수 없다.) logMap.put("kim","김희철"); logMap.put("lee","이재찬"); logMap.put("gong","공선의");}%><% String id = request.getParameter("id"); String pass = request.getParameter("pass"); if (logMap.containsKey(id) && "1234".equals(pass)) { // 로그인 성공 // 세션에 값 설정(아이디, 이름) session.setAttribute("user_id", id); session.setAttribute("user_name", logMap.get(id)); // 세션 생존시간 설정 session.setMaxInactiveInterval(60*1); // Servlet이나 JSP에서 Console로 출력할 때 log method 사용. log("----------- 로그!!!!!"+session.getAttribute("user_id")); String name=(String)session.getAttribute("user_name");%> 로그인 성공<br/> <a href="use_session_c.jsp">로그아웃</a> <%=name %>님 로그인 하셨습니다.<br/> <a href="job_a.jsp">작업페이지</a><% } else { // 로그인 실패%> 아이디나 비밀번호를 확인해주세요.<br/> <a href="use_session.html">로그인</a><% }%></div>
<!-- use_session_b.jsp --><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 세션에서 값을 얻어와서 값이 존재하지 않는다면 로그인 페이지로 이동 String ses_id = (String)session.getAttribute("user_id"); String ses_name = (String)session.getAttribute("user_name"); if (ses_id == null || "".equals(ses_id)) { // url로 설정해서 어디서 이 코드를 끼워넣어도 이동가능하도록 설정 response.sendRedirect("http://localhost:8080/jsp_prj/date0312/use_session.html"); // return; }%>
1분 뒤 세션이 만료하면 작업페이지에서 새로고침 시 로그인 페이지로 이동한다.
<!-- job_a.jsp -->...<div id="container"><%@ include file="use_session_b.jsp" %> <!-- 세션체크하는 코드를 끼워 사용 --><strong><%= ses_name %></strong>님의 작업 페이지<br/><a href="job_b.jsp">작업페이지2</a><br/><a href="use_session_c.jsp">로그아웃</a><br/><img src="../common/images/img.png"/></div>...
<!-- job_b.jsp --><div id="container"><%@ include file="use_session_b.jsp" %><!-- 세션체크하는 코드를 끼워 사용 --><a href="use_session_c.jsp">로그아웃</a><br/><marquee scrollamount="10"><%= ses_name %>(<%=ses_id %>)님의 작업페이지2</marquee><br/><img src="../common/images/img2.jpg"/></div>
page directive의 속성인 isErrorPage가 true인상태에서 제공되는 내장객체
예외를 전달받아 처리할 때 사용
page directive 속성으로 errorPage를 가진 JSP에서 발생한 예외객체를 전달받는다.
내장객체 exception 사용 예
<!-- use_exception_a.jsp, 예외를 발생시킬 페이지 --><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="use_exception_b.jsp" %>...<div id="container"><% int num = new Random().nextInt(3); if(num == 0) { throw new Exception("최상위 예외"); // 컴파일 Exception } else if (num == 1) { throw new IOException("IO 예외"); // 컴파일 Exception } else if (num == 2) { throw new NumberFormatException("숫자만 넣으세요."); // 런타임 Exception }%></div>
<!-- use_exception_b.jsp, 예외를 처리하는 페이지 --><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %>...<div id="container">받아들인 예외 메시지 : <%= exception %><br/></div>
파라미터 처리
파라미터 = 접속자가 입력한 값
HTML Form Control에 입력된 값을 서버에서 처리
// 이름이 유일한 경우String val = request.getParameter("param name");// 이름이 중복된 경우String[] vals = request.getParameterValues("param name");// 파라미터의 이름만 얻기Enumeration<String> paramNames = request.getParameterNames();
JSP 파라미터 처리 예
<!-- test_param.html, date0312 test_param.html 그대로 사용 이동 페이지만 변경 -->...<form method="get" action="parameter.jsp" id="getFrm">...<form method="post" action="parameter.jsp" id="postFrm">...
<!-- parameter.jsp --><div id="container"> <% String method = request.getMethod(); %> <strong><%= method %></strong> <% // Web Parameter 받기(사용자가 HTML Form Control에 입력한 값 받기.) // Tomcat 8.X이상은 GET방식일 때 한글처리가 된다. ////// parameter name이 유일한 경우 => String으로 처리 ///////// String name = request.getParameter("name"); // text String age = request.getParameter("age"); // password String mailing = request.getParameter("mailing"); // checkbox가 하나인 경우 체크 시 on, 체크 안할 시 null String gender = request.getParameter("gender"); // radio String addr = request.getParameter("addr"); // hidden String email = request.getParameter("email"); // select String greeting = request.getParameter("greeting"); // textarea ////// parameter name이 중복된 경우 => String[]처리 ///////// String[] hobby = request.getParameterValues("hobby"); %> <div> <ul> <li>--- HTML Form Control에 name속성이 유일한 경우 ---</li> <li>이름 : <%=name %></li> <li>나이 : <%=age %></li> <li>메일링여부 : <%=mailing %></li> <li>성별 : <%=gender %></li> <li>주소 : <%=addr %></li> <li>이메일 : <%=email %></li> <li>가입인사 : <%=greeting %></li> <li>--- HTML Form Control에 name속성이 중복된 경우 ---</li> <li> <% if(hobby != null) { // 취미 있음 for(int i=0; i < hobby.length; i++) { // 출력 내장객체 : out out.print(hobby[i]); out.println(" "); } } else { out.print("선택하신 취미가 없습니다."); } %> </li> </ul> </div></div>
<div id="container"> <% // POST방식의 요청일 때 한글 처리 request.setCharacterEncoding("UTF-8"); String method = request.getMethod(); %>...
// 1. 이동할 페이지 설정RequestDispatcher rd = request.getRequestDispatcher("URI");// 2. 이동rd.forward(request, response);
jsp forward 사용 예
<!-- forward_a.jsp --><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" info="접속자에게 응답되지 않고 데이터처리를 목적으로 하는 페이지" %><% // 업무로직에 집중할 수 있다.(BO, Business Object) String[] names = { "공선의", "이재현", "김건하", "최혜원", "박정미", "오영근" }; // 처리한 결과를 화면 구성 페이지로 전달(scope 객체 : 값의 사용범위를 정하는 객체) // request 내장 객체는 값을 forward로 이동한 페이지에서 사용할 수 있다. request.setAttribute("group3", names); // 이동할 페이지의 URI 설정 RequestDispatcher rd = request.getRequestDispatcher("forward_b.jsp"); rd.forward(request, response);%>
<!-- forward_b.jsp --><div id="container"><% // 이전페이지에서 처리된 결과 받기 String[] member = (String[])request.getAttribute("group3");%><% if (member == null) { response.sendRedirect("forward_a.jsp"); // sendRedirect는 아래줄의 코드를 실행한다. return으로 막아야 함. return; }%> <table border="1"> <tr> <th width="100">이름</th> </tr> <% for(int i=0; i<member.length; i++) { %> <tr> <td><%=member[i] %></td> </tr> <% } %> </table></div>
<!-- URL 변경없이, request, response객체를 전달받으므로 --><!-- forward로 이동한 페이지에서 이전페이지의 Parameter를 사용할 수 있다. --><a href="forward_a.jsp?name=jungyun&age=30">parameter 요청</a><br/>파라미터 이름 : <%=request.getParameter("name") %><br/>파라미터 나이 : <%=request.getParameter("age") %>
JSP 페이지 이동 - Redirect
servlet과 동일
jsp redirect 예
<!-- redirect_a.jsp --><div id="container"><% // 정상적인 요청으로 이 페이지를 방문하면 정상적인 응답을 해주지만 // 비정상적인 요청이 있다면 다른 페이지로 이동할 때 사용. if(new Random().nextBoolean()) { // 비정상적인 요청이라 가정 response.sendRedirect("redirect_b.jsp"); // URL을 받으므로 외부 site로 이동도 가능 return; }%><img src="../common/images/img.png" title="내 목뼈는 정상임."/></div>
<!-- redirect_b.jsp --><div id="container">비정상적인 요청이 있을 때 보여질 페이지<br/><a href="redirect_a.jsp?name=jungyun&age=20">요청</a><br/><div><!-- forward와는 다르게 이동한 페이지에서 파라미터 값을 사용할 수 없다. 비정상적인 요청이 있을 때 제공될 페이지이므로 이전페이지의 값들을 사용할 필요가 없다.--> 파라미터 이름 : <%=request.getParameter("name") %><br/> 파라미터 나이 : <%=request.getParameter("age") %><br/></div></div>
액션태그(표준액션)
JSP에서 제공하는 기능을 가진 태그들
외부 개발자가 만들어 제공하면 **"taglib"**라고 한다.
include
다른 JSP를 끼워넣어 보여줄 때
두 개의 JSP가 보여지는 (HTML 생성단계) 쪽에서 합쳐진다.
변수나 method 공유가 안된다.
include directive는 코드를 합칠 때 좋고 include 액션태그는 디자인을 합칠 때 좋다.
공통 디자인을 만들어 두고 필요한 곳에서 사용하기 위해 사용
page directive의 충돌이 발생하지 않는다.
<jsp:include page="끼워넣을 jsp"/>
forward
forward방식으로 이동할 때
<jsp:forward page="이동할 jsp" /><!-- 또는 이동하는 페이지로 parameter를 붙여서 넘길 수 있다. --><jsp:forward page="이동할 jsp"> <jsp:param name="파라미터명" value="파라미터값" /> <jsp:param name="파라미터명" value="파라미터값" /> ...</jsp:forward>
useBean
VO나 DTO를 생성할 때
객체를 생성하는 것과 같다.
scope엔 request, session, application, page가 들어올 수 있다.