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>
<!-- 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>
내장객체 - 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"><!-- 이동 페이지만 변경 -->
...
<!-- 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>
- JSP에서 줄이 길어져서 줄을 바꾸고 싶으면 JSP태그내에서 줄바꿈 수행 * 그래야 HTML소스보기 했을 때 줄바꿈 없이 잘 나온다
<marquee scrollamount="10"><%= ses_name %>(<%=ses_id
%>)님의 작업페이지2</marquee>
- 로그아웃 기능(세션 무효화)
<!-- 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
<%@ 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>
파라미터 처리
- 파라미터 = 접속자가 입력한 값
- 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();
%>
...
- 윈도우에서 다음줄로 변경하는건
\r\n
, HTML에서 줄 바꿈은<br/>
* 때문에\n
을<br/>
로 변경해주면 줄바꿈을 해줄 수 있다.
<li>가입인사 : <%=greeting.replaceAll("\n","<br/>") %></li>
페이지 이동
- 요청 시 페이지 이동 (forward) * 브라우저는 페이지의 이동을 알 수 없다. (URL 유지) * 데이터 처리 페이지와 화면 구성 페이지가 분리될 수 있다. * 데이터처리페이지(Servlet) * 화면구성페이지(JSP) * 단점) 파일의 개수가 많아짐 * 서버내 이동만 가능(URI)
- 응답 시 페이지 이동 (redirect) * 브라우저는 페이지의 이동을 알게된다. * 브라우저가 지정된 페이지를 재요청 * 정상적인 요청인 경우 보여줄 페이지에서 비정상적인 요청이 발생한 경우에 대한 대비 * 서버외부로 보낼 수 있다.(URL)
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>
<!-- 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가 들어올 수 있다.
- 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>