• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

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

Java EE 정리 11

11 Mar 2019

Reading time ~7 minutes

Java EE 정리 11 - 내장객체(2), 파라미터 처리, 페이지 이동, 액션태그(1)


내장객체 - out

  • 내장객체 out을 사용하면 scriptlet을 끊지 않고 브라우저로 출력할 수 있다.
  • 내장객체 out 사용 예
<%
      String subject = "JSP(Java Server Page) : SSS(Server Side Script)  중 하나";
      out.println(subject);
      
      String[] link = { "http://daum.net", http://youtube.com",  "http://naver.com" };
      String[] link_name = { "공선의", "이재찬", "김건하" };
%>
<table border="1">
<tr>
      <th width="100">out 사용</th>
</tr>
<%
for(int i=0; i<link.length; i++) {
      out.println("\t<tr>");
      out.print("\t\t<td><a href='");
      out.print(link[i]);
      out.print("'>");
      out.print(link_name[i]);
      out.println("\t</a></td>");
      out.println("\t</tr>");
}
%>
</table>

01

<!-- expression을 이용하면 더 간편(소스 tab맞추는 걱정 안해도 된다) -->
<table border="1">
<tr>
      <th width="100">expression 사용</th>
</tr>
<% for(int i=0; i<link.length; i++) { %>
<tr>
      <td><a href="<%=link[i]%>"><%=link_name[i] %></a></td>
</tr>
<% } %>
</table>

02

내장객체 - session

  • 접속자의 정보를 서버측 메모리에 저장
  • 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"><!-- 이동 페이지만 변경 -->
...

03

<!-- 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>

04

<!-- 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>
...

05

<!-- 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>

06

  • JSP에서 줄이 길어져서 줄을 바꾸고 싶으면 JSP태그내에서 줄바꿈 수행 * 그래야 HTML소스보기 했을 때 줄바꿈 없이 잘 나온다
<marquee scrollamount="10"><%= ses_name %>(<%=ses_id
      %>)님의 작업페이지2</marquee>

07

  • 로그아웃 기능(세션 무효화)
<!-- use_session_c.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
      // 세션의 값을 삭제(로그아웃)
      session.removeAttribute("user_id");
      session.removeAttribute("user_name");
      
      // 세션 무효화
      session.invalidate();
      response.sendRedirect("http://localhost:8080/jsp_prj/date0312/use_session.html"); // 뒤로가기 가능(location.replace가 아니므로)
%>

내장객체 - exception

08

<%@ page isErrorPage = "true" %>
  • 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>

09

파라미터 처리

  • 파라미터 = 접속자가 입력한 값
  • 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>

10

11

<div id="container">
      <%
            // POST방식의 요청일 때 한글 처리
            request.setCharacterEncoding("UTF-8");
            String method = request.getMethod();
      %>
...

12

  • 윈도우에서 다음줄로 변경하는건 \r\n, HTML에서 줄 바꿈은 <br/> * 때문에 \n을 <br/>로 변경해주면 줄바꿈을 해줄 수 있다.
<li>가입인사 : <%=greeting.replaceAll("\n","<br/>") %></li>

13

페이지 이동

  • 요청 시 페이지 이동 (forward) * 브라우저는 페이지의 이동을 알 수 없다. (URL 유지) * 데이터 처리 페이지와 화면 구성 페이지가 분리될 수 있다. * 데이터처리페이지(Servlet) * 화면구성페이지(JSP) * 단점) 파일의 개수가 많아짐 * 서버내 이동만 가능(URI)

14

  • 응답 시 페이지 이동 (redirect) * 브라우저는 페이지의 이동을 알게된다. * 브라우저가 지정된 페이지를 재요청 * 정상적인 요청인 경우 보여줄 페이지에서 비정상적인 요청이 발생한 경우에 대한 대비 * 서버외부로 보낼 수 있다.(URL)

15

JSP 페이지 이동 - forward

// 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>

16

<!-- URL 변경없이, request, response객체를 전달받으므로 -->
<!-- forward로 이동한 페이지에서 이전페이지의 Parameter를 사용할 수  있다. -->
<a href="forward_a.jsp?name=jungyun&age=30">parameter 요청</a>
<br/>
파라미터 이름 : <%=request.getParameter("name") %><br/>
파라미터 나이 : <%=request.getParameter("age") %>

17

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>

18

<!-- 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>

19

액션태그(표준액션)

  • JSP에서 제공하는 기능을 가진 태그들
  • 외부 개발자가 만들어 제공하면 “taglib”라고 한다.

  • include * 다른 JSP를 끼워넣어 보여줄 때 * 두 개의 JSP가 보여지는 (HTML 생성단계) 쪽에서 합쳐진다. * 변수나 method 공유가 안된다. * include directive는 코드를 합칠 때 좋고 include 액션태그는 디자인을 합칠 때 좋다. * 공통 디자인을 만들어 두고 필요한 곳에서 사용하기 위해 사용 * page directive의 충돌이 발생하지 않는다.
<jsp:include page="끼워넣을 jsp"/>

20

  • 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가 들어올 수 있다.
      • Default scope는 page
<!-- Java Bean 생성 -->
<jsp:useBean id="객체명" class="패키지명.클래스명" scope="page"></jsp:useBean>
<!-- setter 호출 -->
<jsp:setProperty name="객체명" property="setter명" value="값"/>
<!-- getter 호출 -->
<jsp:getProperty name="객체명" property="getter명" />
  • include 액션태그 사용 예
<!-- include_action_a.jsp -->
...
<div id="container">
      <div>
            <strong>외부 JSP</strong>
            <jsp:include page="include_action_b.jsp"/>
            <strong>외부 JSP</strong>
      </div>
</div>
<!-- include_action_b.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div>
      <img src="../common/images/img.png"/>
      <br/>
      내부 JSP
</div>

21

22



Java EEJSP