Java EE 정리 10
11 Mar 2019
Reading time ~6 minutes
Java EE 정리 10 - JSP Tags(2), JSP 요청방법, 내장객체
JSP Tags - Expression(표현식)
<%= 값 %>
- Web Browser에 출력할 때 사용
- 값을 하나만 출력할 수 있다.
- 값에는 ‘;’을 붙일 수 없다. * 표현식은 out.println( 값 ); 으로 변경되어 들어감.* * 때문에 println메소드의 매개변수는 1개만 입력 가능하고 ‘;’이 들어가지 않는다.
- expression 사용 예
<%
// scriptlet
String name = "김정윤";
String addr = "서울시 강남구 역삼동";
%>
<ul>
<li>이름 : <%=name %></li>
<li>주소 : <%=addr %></li>
</ul>
JSP Tags - Declaration (선언)
<%! ... %>
- 정의되는 코드는 class field에 생성된다.
- 때문에 선언 내에서는 내장객체를 사용할 수 없다.
<!-- jsp -->
<%! // declaration
int i;
public void test() {
...
}
%>
// java로 변환된 jsp
public Test extedns HttpJSPBase {
int i;
public void test() {
...
}
public void _jspService(HttpServletRequest req, HttpServletResponse res) {
// 선언 내에서는 내장 객체를 사용할 수 없음
...
}
}
- declaration 사용 예
<%! // declaration
int i; // instance 변수, 자동 초기화된다.
%>
i=<%= i %>
<% // scriptlet
int i; // 지역 변수
%>
i=<%= i %>
<%! // declaration
public String test() {
return "공선의";
}
%>
이름 : <%=test() %>
<%
//int i; // instance 변수
/* public String test() {
return "공선의";
} */
%>
<%-- JSP 주석 <%
//int i; // instance 변수
/* public String test() {
return "공선의";
} */
%> --%>
- scriptlet, expression 사용 예
<%
String[] names = { "공선의","김건하","이재찬","정택성","김희철" };
%>
<table>
<tr>
<th id="nameTitle">이름</th>
<th id="scoreTitle">점수</th>
</tr>
<% for(int i=0; i<names.length; i++) { %>
<tr>
<td><%=names[i] %></td>
<td>
<% for(int j=0; j<11; j++) { %>
<input type="radio" name="score_<%=i %>" value="<%=j %>"/><%=j %>점
<%} %>
</td>
</tr>
<%} %>
</table>
- 위 예제에서 라디오버튼을 만드는 걸 method로 처리
<%! // declaration
/**
라디오버튼을 생성하는 method
createRadio(라디오버튼개수, 라디오버튼이름, 기본체크값)
*/
public String createRadio(int rCnt, String rName, int rDefault) {
StringBuilder radio = new StringBuilder();
if(rCnt < rDefault) { // 선택할 버튼 수보다 기본체크값이 크면 0으로 설정
rDefault = 0;
}
for(int i=0; i<=rCnt; i++) {
radio.append("<input type='radio' name='").append(rName)
.append("' value='").append(i).append("'");
if (i == rDefault) {
radio.append(" checked='checked'");
}
radio.append(">").append(i).append("점 ");
}
return radio.toString();
}
%>
...
<% // scriptlet
String[] names = { "공선의","김건하","이재찬","정택성","김희철" };
%>
<table>
<tr>
<th id="nameTitle">이름</th>
<th id="scoreTitle">점수</th>
</tr>
<% for(int i=0; i<names.length; i++) { %>
<tr>
<td><%=names[i] %></td>
<td>
<%= createRadio(11, "name_"+i, 5) %>
</td>
</tr>
<%} %>
</table>
JSP Tags - Comment (주석)
- JSP Tag의 실행을 막을 때 사용
- 감싸고 있는 JSP 태그의 코드 생성을 막는 일을 함.
<%-- ... --%>
JSP Tags - Page Directive (페이지 지시자)
- 일반적으로 JSP 파일 첫 줄에 기술 * 지시자의 위치는 상관 없음
- 속성은 설정하지 않으면 기본값을 갖는다. * 속성명은 대소문자 구분
<%@ page 속성="값" %> <%@ page 속성="값" %> ...
<!-- 한 속성을 갖는 여러 지시자 정의 또는 한 지시자 안에 여러 속성 정의-->
<%@ page 속성="값" 속성명="값" ... %>
- 페이지 지시자 사용 예
<!-- 지시자 하나에 여러 속성을 사용하는 경우 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" info="Page Directive 연습"%>
<!-- 지시자 하나 당 한 속성을 사용하는 경우 -->
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat,java.util.Calendar" %>
...
<strong>EL(Expression Language)</strong>
<br/>
3+11 = ${ 3+11 }<br/>
web parameter : <%=request.getParameter("name") %><br/>
web parameter(EL) : ${param.name}<br/>
<a href="page_directive.jsp?name=heechul">요청</a>
<!-- isELIgnored 속성을 true로 하면 EL이 무시된다. -->
<%@ page isELIgnored="true" %>
- 페이지 지시자 errorPage, isErrorPage 속성 사용 예
<!-- page_directive.jsp -->
<!-- 에러가 발생 시 이동할 페이지를 설정할 수 있다. -->
<!-- 에러 발생 시 페이지 이동은 foward, URL은 바뀌지 않는다. -->
<%@ page errorPage="page_directive1.jsp" %>
...
<%
if(new Random().nextBoolean()) {
throw new Exception("예외 강제 발생");
}
%>
<!-- page_directive1.jsp -->
<!-- 예외를 처리할 페이지 -->
<!-- isErrorPage가 false라면 이전페이지에서 발생한 예외(exception)를 받을 수 없다. -->
<%@ page isErrorPage="true" %>
...
에러의 이유 : <%=exception %>
<div>
문제발생 : 요청하신 페이지에서 문제가 발생했습니다.
</div>
- 페이지 지시자 session 속성 사용 예
<%@ page session="true" %>
<!-- 페이지 지시자 session속성에 따라 session을 사용여부를 설정 -->
<%
session.setAttribute("name", "정택성"); // false면 에러발생
%>
JSP Tags - Include Directive (인크루드 지시자)
- 브라우저에서 여러개의 JSP를 동시에 보여줘야 할 때
<!-- include directive와 동일한 include일을 하는 태그들(동작은 다름) -->
<jsp:include>, <c:import>
<!-- include directive> -->
<%@ include file="끼워넣을 jsp의 URI" %>
- JSP가 하나의 소스코드로 생성된다.
- 다른 include보다 속도가 빠르다.
- 변수나 메소드가 공유된다. * 페이지 지시자의 충돌이 발생가능 * contentType, pageEncoding, … 등 설정한 값이 다르다면 에러 발생 * 모든 JSP가 같은 값을 가져야 한다.
- 많은 JSP에서 공통 소스코드를 병합할 때 사용 * 세션에 대한 체크 등
<!-- include_a.jsp, 외부 JSP -->
<div>
외부 JSP
<div>
<%@ include file="include_b.jsp" %>
</div>
외부 JSP
</div>
<!-- include_b.jsp, 내부 JSP -->
<body>
<strong>끼워지는 JSP</strong>
</body>
<!-- include_b.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 끼워지는 JSP에서는 코드가 들어가는 태그의 자식 태그로 들어가기 때문에
<html>은 가지지 않고 포함되는 태그로만 구성한다. -->
<strong>끼워지는 JSP</strong>
- 외부 JSP에서 제공하는 변수는 외부 JSP에 존재할 수도 있고 존재하지 않을 수도 있다. * 따라서 내부 JSP에서 외부 JSP의 변수를 사용하는 코드는 에러를 유발하는 원인이 될 수도 있다. * 가급적이면 내부 JSP에선 외부 JSP의 변수를 사용하지 않는다.
<!-- include_a.jsp -->
<div>
외부 JSP
<%
String name = "김정윤";
%>
<div>
<%@ include file="include_b.jsp" %>
</div>
외부 JSP
<br/>
<!-- 외부 JSP에서 끼워지는 JSP의 변수는 에러없이 사용할 수 있다. -->
나이 : <%=age %>, 주소 : <%=addr %>
</div>
<!-- include_b.jsp -->
<%
// 끼워지는 모든 JSP에서의 공통코드를 정의
int age = 30;
String addr = "서울시 강남구 역삼동";
%>
<div>
<strong>끼워지는 JSP</strong>
나이 : <%=age %><br/>
주소 : <%=addr %><br/>
<strong>외부 JSP 변수 : <%=name %></strong>
</div>
- 페이지 지시자 충돌 예
- 한글자라도 다르면 충돌발생
- 똑같이 사용해줘야 한다.
<!-- include_a.jsp -->
<%@ page ... info="include 연습"%>
...
<!-- include_b.jsp -->
<%@ page ... info="include 연습 "%><!-- 공백 하나 차이로 에러가 발생 -->
...
JSP 요청처리
- JSP는 요청이 GET방식이든 POST방식이든 모두 가능하다. * 어떤 방식의 요청이든 _jspService가 처리한다.
<!-- call_jsp.jsp -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$("#btnGet").click(function() {
$("[method='get']").submit();
});
$("#btnPost").click(function() {
$("[method='post']").submit();
});
$("#btnLoc1").click(function() {
location.href="call.jsp";
});
$("#btnLoc2").click(function() {
location.replace("call.jsp");
});
});
</script>
...
<div id="container">
<div>
<strong>GET방식으로 JSP 요청</strong>
<ul>
<li><a href="call.jsp">GET 요청</a></li>
<li>
<form action="call.jsp" method="get">
<input type="button" value="GET방식 요청" class="btn" id="btnGet">
</form>
</li>
<li><input type="button" value="location.href사용 요청" class="btn" id="btnLoc1"/></li>
<li><input type="button" value="location.replace사용 요청" class="btn" id="btnLoc2"/></li>
</ul>
</div>
<div>
<strong>POST방식으로 JSP 요청</strong>
<ul>
<li>
<form action="call.jsp" method="post">
<input type="button" value="POST방식 요청" class="btn" id="btnPost">
</form>
</li>
</ul>
</div>
</div>
<!-- call.jsp -->
<style type="text/css">
<% if("GET".equals(request.getMethod())) { %>
#method { font-weight: bold; font-size:14px; color:#00FFFF; }
<% } else { %>
#method { font-weight: bold; font-size:16px; color:#FF00FF; }
<% } %>
</style>
...
<div id="container">
<ul>
<li><strong>요청방식</strong> :<span id="method"><%=request.getMethod() %></span></li>
<li><strong>접속자의 IP Address</strong> : <%=request.getRemoteAddr() %></li>
<li><a href="javascript:history.back();">뒤로</a></li>
</ul>
</div>
내장(내재) 객체
- _jspService method안에 선언된 객체들
- scope 객체(pageContext, request, session, application)
- JSP에서 발생한 값을 저장하고 사용하는 객체
- 객체마다 사용범위가 달라진다.
- 내장객체 request 사용 예
<div id="container">
<ul>
<li><strong>접속 URL</strong> : <%=request.getRequestURL() %></li>
<li><strong>요청 Protocol</strong> : <%=request.getProtocol() %></li>
<li><strong>요청 서버명</strong> : <%=request.getServerName() %></li>
<li><strong>요청 서버명</strong> : <%=request.getServerPort() %></li>
<li><strong>요청 URI</strong> : <%=request.getRequestURI() %></li>
<li><strong>요청 Servlet Path</strong> : <%=request.getServletPath() %></li>
<li><strong>요청 Context Path</strong> : <%=request.getContextPath() %></li>
<li><a href="request.jsp?name=jinkyung&addr=강서구&age=30">JSP QueryString 요청</a></li>
<li><strong>요청 Query String</strong> : <%=request.getQueryString() %></li>
<li><strong>요청 Parameter</strong> : <%=request.getParameter("name") %></li>
<li><strong>요청 방식</strong> : <%=request.getMethod() %></li>
<li><strong>접속자 IP Address</strong> : <%=request.getRemoteAddr() %></li>
<li><strong>접속자 PORT</strong> : <%=request.getRemotePort() %></li>
</ul>
</div>