• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

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

Java EE 정리 12

13 Mar 2019

Reading time ~6 minutes

Java EE 정리 12 - 액션태그(2)


액션태그 - include

  • 액션태그는 변수나 method의 공유가 되지 않는다. * 각각의 class로 생성되고 JVM에서 각각의 instance가 생성되므로 다른 instance내의 변수는 사용할 수 없다.
  • 지시자에 대한 충돌이 발생하지 않는다.

01

액션태그 - 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 사용 예

02

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

03

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

04

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

05

  • 주의! * jsp 액션태그 안에 주석(HTML, JSP주석 모두 해당)을 달면 에러발생
<jsp:forward page="<%= url %>">
<%-- 액션태그안에 주석이 존재할 경우 --%>
      <jsp:param value="<%= lang %>" name="lang" />
      <jsp:param name="date" value="<%= sdf.format(new Date()) %>"/>
</jsp:forward>

06

액션태그 - 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/>

07

<%
      // <jsp:useBean>으로 생성된 객체는 자바코드로 접근하여 사용할 수  있다.
      // setter 호출
      t_vo.setFirstName("정윤");
      t_vo.setAge(30);
%>
<!-- getter 호출 -->
<div>
재설정 이름 : <%= t_vo.getFirstName() %><br/>
재설정 나이 : <%= t_vo.getAge() %><br/>
</div>

08

  • page directive로 클래스를 import해도 useBean 액션태그 사용 시 class 속성값으로 패키지명을 포함한 클래스명을 명시해줘야 한다.

09

  • 다른 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>

10

  • 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">
<%
      }
%>

11

액션태그 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">
...

12

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

13



Java EEJSP