각각의 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_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); ...%>
<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: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"><% }%>