Java EE 정리 12
13 Mar 2019
Reading time ~6 minutes
Java EE 정리 12 - 액션태그(2)
액션태그 - include
- 액션태그는 변수나 method의 공유가 되지 않는다. * 각각의 class로 생성되고 JVM에서 각각의 instance가 생성되므로 다른 instance내의 변수는 사용할 수 없다.
- 지시자에 대한 충돌이 발생하지 않는다.
액션태그 - forward
- 페이지 이동(RequestDispatcher 사용)
- 데이터 처리와 화면 디자인을 분리하여 작성할 때
<!-- parameter를 생성하지 않고 이동할 때 -->
<jsp:forward page="이동할 jsp uri" />
<!-- 이동하는 페이지로 parameter를 생성하여 이동할 때 -->
<jsp:forward page="이동할 jsp uri">
<jsp:param name="파라미터명" value="파라미터값" />
<jsp:param name="파라미터명" value="파라미터값" />
...
</jsp:forward>
<!-- JSP에서 <jsp:param>을 받을 땐 request.getParameter("이름") 사용 -->
- 액션태그 forward 사용 예
<!-- forward_a.jsp -->
<div id="container">
<% // 접속자의 IP 주소를 얻는다.
String ipAddr = request.getRemoteAddr();
String nameLabel = "name";
String ageLabel = "age";
String addrLabel = "addr";
String btnLabel = "submit";
<!-- localhost인 경우 IPv6로 나온다. (0:0:0:0:0:0:0:1) -->
if("0:0:0:0:0:0:0:1".equals(ipAddr)){ //localhost
nameLabel="이름";
ageLabel="나이";
addrLabel="주소";
btnLabel="전송";
}
%>
<table>
<tr>
<td><label><%=nameLabel %></label></td>
<td><input type="text" name="name" class="inputBox"></td>
</tr>
<tr>
<td><label><%=ageLabel %></label></td>
<td><input type="text" name="age" class="inputBox"></td>
</tr>
<tr>
<td><label><%=addrLabel %></label></td>
<td><input type="text" name="addr" class="inputBox"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="<%=btnLabel %>" class="btn"></td>
</tr>
</table>
<a href="http://localhost:8080/jsp_prj/date0313/forward_a.jsp">한국어</a>
<a href="http://211.63.89.144:8080/jsp_prj/date0313/forward_a.jsp">English</a>
</div>
<!-- forward_b.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
info="localhost 또는 ip를 식별하여 다른 언어를 사용하는 페이지로 이동하는 일"
%>
<%
String ip = request.getRemoteAddr();
String url = "eng.jsp";
String lang = "English";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if("0:0:0:0:0:0:0:1".equals(ip)) { // 한국어 페이지로 이동
url="kor.jsp";
lang="한국어";
}
%>
<%-- 이 페이지에서 생성한 파라미터가 없을 때
<jsp:forward page="<%= url %>"/>
--%>
<%-- 이 페이지에서 생성한 파라미터가 있을 때 --%>
<jsp:forward page="<%= url %>">
<jsp:param name="lang" value="<%= lang %>">
<jsp:param name="date" value="<%= sdf.format(new Date()) %>">
</jsp:forward>
<!-- kor.jsp -->
<div id="container">
<%
// HTML Form Control에서 입력된 값
String name=request.getParameter("name");
String age=request.getParameter("age");
String addr=request.getParameter("addr");
// <jsp:param>으로 생성된 값
String lang = request.getParameter("lang");
String date = request.getParameter("date");
%>
<strong>안녕하세요? 한국어 페이지입니다.</strong>
<strong>입력하신 값은 아래와 같습니다.</strong>
<ul>
<li>이름 : <strong><%= name %></strong></li>
<li>나이 : <strong><%= age %></strong></li>
<li>주소 : <strong><%= addr %></strong></li>
<li>사용언어 : <strong><%= addr %></strong></li>
<li>접속시간 : <strong><%= date %></strong></li>
</ul>
<a href="forward_a.jsp">입력폼으로 이동</a>
</div>
<!-- eng.jsp -->
<div id="container">
<%
// HTML Form Control에서 입력된 값
String name=request.getParameter("name");
String age=request.getParameter("age");
String addr=request.getParameter("addr");
// <jsp:param>으로 생성된 값
String lang = request.getParameter("lang");
String date = request.getParameter("date");
%>
<strong>Hello? This is a English Page.</strong>
<strong>These are what you entered</strong>
<ul>
<li>name : <strong><%= name %></strong></li>
<li>age : <strong><%= age %></strong></li>
<li>address : <strong><%= addr %></strong></li>
<li>language : <strong><%= addr %></strong></li>
<li>access time : <strong><%= date %></strong></li>
</ul>
<a href="forward_a.jsp">back to the page</a>
</div>
- request객체에 attribute를 등록하면 forward로 이동한 페이지에서도 사용할 수도 있다.
<!-- forward_b.jsp -->
<%
...
String[] loc = {"서울","경기","강원","충청","경상","전라","제주"};
request.setAttribute("loc",loc);
...
%>
<!-- kor.jsp -->
...
<ul>
...
<select>
<%
String[] loc = (String[])request.getAttribute("loc");
for(int i=0; i<loc.length; i++) {
%>
<option value="<%= loc[i] %>"><%= loc[i] %></option>
<%
}
%>
</select>
</ul>
...
- 주의! * jsp 액션태그 안에 주석(HTML, JSP주석 모두 해당)을 달면 에러발생
<jsp:forward page="<%= url %>">
<%-- 액션태그안에 주석이 존재할 경우 --%>
<jsp:param value="<%= lang %>" name="lang" />
<jsp:param name="date" value="<%= sdf.format(new Date()) %>"/>
</jsp:forward>
액션태그 - useBean
- JSP에서 태그로 객체를 생성할 때 사용
package test;
public class TestVO {
private String name;
private int age;
public TestVO() {
// use Bean은 기본 생성자만 사용해서 객체화한다.
// 인자있는 생성자가 없으면 컴파일러가 기본 생성자를 만들어줌
// 인자있는 생성자만 있고 기본 생성자가 없으면 에러발생
}
... // getters, setters
- 객체 생성 * 기본 생성자만 사용해서 객체화한다.
<jsp:useBean id="객체명" class="패키지명.클래스명" scope="page" />
- scope - 생성된 객체의 사용범위 * page - Default * 페이지가 요청될 때마다 객체 생성 * 생성된 객체는 해당 페이지에서만 사용가능 * request * 페이지가 요청될 때마다 객체 생성 * 생성된 객체는 forward로 이동한 페이지에서도 사용가능 * session * 페이지가 요청되면 접속 브라우저(접속자)를 구분하여 객체를 생성 * 접속자마다 따로 사용 * 접속을 종료하면 사라진다. * 모든페이지에서 사용 * application * 최초 접속자에 의해 하나만 생성되고 모든 접속자가 하나의 객체를 사용(공용) * Container나 WAS가 종료되어야 사라진다. * 모든 페이지에서 사용할 수 있다.
- setter method 호출
<jsp:setProperty name="객체명" property="set을 제외한 method명(소문자로)" value="값"/>
- getter 호출
<jsp:getProperty name="객체명" property="get을 제외한 method명(소문자로)"/>
- userBean 사용
<!-- Java Bean 생성 -->
<jsp:useBean id="t_vo" class="test.TestVO" scope="page"/>
<!-- setter로 객체에 값 설정 -->
<!-- property 첫단어는 모두 소문자, 나머지는 대소문자 구분 -->
<jsp:setProperty name="t_vo" property="name" value="김희철"/>
<jsp:setProperty name="t_vo" property="age" value="27"/>
<-- getter로 Java Bean에서 값 얻기 -->
이름 : <jsp:getProperty name="t_vo" property="name" />
나이 : <jsp:getProperty name="t_vo" property="age" />
- useBean 사용 예
package date0313;
public class TestVO {
private String firstName;
private int age;
public TestVO() {
System.out.println("TestVO의 기본 생성자");
}
public TestVO(String firstName, int age) {
this.firstName = firstName;
this.age = age;
System.out.println("TestVO의 인자있는 생성자");
}
...// getters, setters
}
<!-- user_bean_action.jsp -->
...
<div id="container">
<!-- 객체 생성 -->
<jsp:useBean id="t_vo" class="date0313.TestVO" scope="page"></jsp:useBean>
<!-- setter 호출, set을 제외한 method명을 소문자로 시작(뒤는 대소문자구분) -->
<jsp:setProperty name="t_vo" property="firstName" value="영근"/>
<jsp:setProperty name="t_vo" property="age" value="30"/>
<!-- getter 호출, get을 제외한 method명을 소문자로 시작(뒤는 대소문자 구분)
Expression을 사용하지 않아도 화면 출력이 된다. -->
이름 : <jsp:getProperty name="t_vo" property="firstName" /><br/>
나이 : <jsp:getProperty name="t_vo" property="age" /><br/>
<%
// <jsp:useBean>으로 생성된 객체는 자바코드로 접근하여 사용할 수 있다.
// setter 호출
t_vo.setFirstName("정윤");
t_vo.setAge(30);
%>
<!-- getter 호출 -->
<div>
재설정 이름 : <%= t_vo.getFirstName() %><br/>
재설정 나이 : <%= t_vo.getAge() %><br/>
</div>
- page directive로 클래스를 import해도 useBean 액션태그 사용 시 class 속성값으로 패키지명을 포함한 클래스명을 명시해줘야 한다.
- 다른 scope 사용 예
package date0313;
/**
* scope 속성에 따라 다르게 생성되는 객체
* @author owner
*/
public class CounterVO {
private int cnt;
public CounterVO() {
System.out.println("CounterVO");
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt += cnt;
}
}
<!-- use_bean_scope.jsp -->
<div id="container">
<!--
page : 기본 속성, 요청할 때마다 객체가 생성되며, 생성된 객체는 현재페이지에서만 사용
request : 요청할 때마다 객체가 생성되며, 생성된 객체는 현재 페이지와
forward로 이동한 페에지에서 사용
session : 접속자 마다 하나의 객체가 생성되며, 생성된 객체는 모든 JSP에서 사용가능
접속을 종료하면 사라진다.
application : 최초 접속자에 의해 하나의 객체가 생성된다. 생성된 객체는 모든 JSP에서
모든 접속자가 사용한다.(공용) Container가 종료되면 사라진다.
-->
<jsp:useBean id="cnt_vo" class="date0313.CounterVO" scope="page"/>
<jsp:setProperty name="cnt_vo" property="cnt" value="1"/>
안녕하세요?<br/>
이 페이지의 [<strong><jsp:getProperty property="cnt" name="cnt_vo"/></strong>]
번째 방문자입니다.
</div>
- cnt 수를 이미지로 보여주기
<jsp:useBean id="cnt_vo" class="date0313.CounterVO" scope="session"/>
<jsp:setProperty name="cnt_vo" property="cnt" value="1"/>
안녕하세요?<br/>
이 페이지의 [<strong><jsp:getProperty property="cnt" name="cnt_vo"/></strong>]
번째 방문자입니다.
<!-- 접속자의 숫자를 images/에 저장된 이미지파일로 보여주기 -->
<div>
<%
String cnt = String.valueOf(cnt_vo.getCnt());
String c = "";
for(int i=0; i<cnt.length(); i++) {
c = cnt.substring(i,i+1);
%>
<img src="images/num_<%= c %>.png">
<%
}
%>
액션태그 useBean으로 Parameter 처리
- HTML Form Control의 이름과 VO의 인스턴스 변수명이 반드시 같아야 한다. * VO에 데이터형이 int라면 알아서 parseInt처리한 값을 넣어준다.
<!-- 1. jsp에서 Java Bean(객체)를 생성 -->
<jsp:useBean id="객체명" class="패키지명.클래스명" scope="page" />
<!-- 2. setter 호출 -->
<jsp:setProperty name="객체명" property="*" />
- useBean으로 Parameter처리 예
<!-- bean-param.html, 강사님이 제공해주신 HTML -->
...
<form action="bean_param.jsp" name="joinFrm" id="joinFrm" method="post">
...
/**
* HTML Form Control의 이름과 VO의 instance 변수명이 반드시 같아야 한다.
*/
public class BeanParamVO {
private String id, pass, name, ssn1, ssn2, gender, marrigeFlag, m_year, m_month, m_day,
zipcode, addr1, addr2, greetings;
private int b_year, b_month, b_day, age;
private String[] interestlang;
... // getters
<!-- bean_param.jsp -->
<div id="container">
<% request.setCharacterEncoding("UTF-8"); // POST방식으로 전달되는 값 한글처리 %>
<!-- HTML Form Control의 값 받기 -->
<!-- 1.Java Bean 생성 -->
<jsp:useBean id="bp_vo" class="date0313.BeanParamVO" scope="page" />
<!-- 2.setter method를 호출하여 값 저장 -->
<jsp:setProperty property="*" name="bp_vo"/>
<%= bp_vo %>
</div>