레이블이 자바인스턴스변수인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바인스턴스변수인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 8일 목요일

[오라클자바커뮤니티, oraclejavanew.kr]Struts와 JSTL(JSP,JSTL,Struts EL,Struts를 이용한 계산기) Example 입니다.

Struts와 JSTL(JSP,JSTL,Struts EL,Struts를 이용한 계산기) Example 입니다.
열공하세요~


  오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



Struts 1.1.부터는 JSTL을 지원하며 Struts에서 JSTL을 사용하기 위해 http://www.apache.org/dist/jakarta/taglibs/standard/ 에서 jakarta-taglibs-standard-current.zip 파일을 다은 받은 후 jar 파일을 /WEB-INF/lib 폴더에 복사 합니다.

JSTL에서는 스트럿츠의 logic, bean 태그 중 일부가  삭제 되었습니다.

Struts-EL – Logic Tags
Logic Tag              Struts-EL          Related JSTL Mechanisms
empty/notEmpty          No              c:if, c:when, EL ([not] empty)
equal/notEqual            No              c:if, c:when, EL (eq, ne)
forward                  No                None (jsp:forward)
greaterThan/Equal        No              c:if, c:when, EL (gt, ge)
iterate                    Yes              c:forEach
lessThan/Equal            No                c:if, c:when, EL (lt, le)
match/notMatch          Yes              EL*
messages[Not]Present    Yes              EL ([not] empty)
present/notPresent        Yes              EL ([not] empty)
redirect                  Yes              c:redirect



Struts-EL – Bean Tags
Bean Tag              Struts-EL            Related JSTL Mechanisms
cookie                    No                c:set, EL (cookie)
define                    No                  c:set, EL
header                    No                c:set, EL (header, headerValues)
include                    Yes*                c:import
message                  Yes                fmt:bundle, fmt:message
page                      Yes                EL (pageContext)
parameter                No                c:set, EL (param, paramValues)
resource                  Yes                None
size                        Yes                c:forEach, varStatus
struts                      Yes                None
write                      No                c:out


[계산기 예제]


아래 예제의 경우 전 Login이라는 Tomcat Project를 만들고 그 아래에 폴더(jstl)를 만들어서 JSP 파일을 두었으며 /WEB-INF/src/ 아래에 jstl 패키지를 만들어 CalcAction.java를 만들었습니다.



--------------------
Calc.jsp
--------------------

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<h2>JSP Calculator</h2>
<form action="">
<input type="text" name="j1" value='<%=request.getParameter("j1") == null ? "" : request.getParameter("j1")%>'/>
<br>
<input type="text" name="j2" value='<%=request.getParameter("j2") == null ? "" : request.getParameter("j2")%>'/>
<input type="submit"/>
</form><p>

<%= request.getParameter("j1") == null ? 0 :Float.parseFloat(request.getParameter("j1")) +  Float.parseFloat(request.getParameter("j2")) %>

<h2>Struts Calculator</h2>
<bean:parameter id="b1" name="b1" value="0"/>
<bean:parameter id="b2" name="b2" value="0"/>
<form action="">
<input type="text" name="b1" value='<bean:write name="b1"/>'/><br>
<input type="text" name="b2" value='<bean:write name="b2"/>'/>
<input type="submit"/>
</form><p>
<bean:define id="bsum" value="<%=String.valueOf(Float.parseFloat(b1) + Float.parseFloat(b2))%>"/>
<bean:write name="bsum"/>

<h2>JSTL Calculator</h2>
<form action="">
<input type="text" name="v1" value='<c:out value="${param.v1}"/>'/><br>
<input type="text" name="v2" value='<c:out value="${param.v2}"/>'/>
<input type="submit"/>
</form><p>
<c:out value="${param.v1 + param.v2}" default="0.0"/>

<h2>Struts-EL Calculator</h2>
<!-- 아래의 Action 처리 위해 Struts에서 Action Mapping을 해야 함 -->
<html:form action="Calc.do"> 
<html:text property="s1" /><br>
<html:text property="s2" />
<html:submit/>
</html:form><p>
<c:out value="${requestScope.calcSum}" default="0.0"/>


-----------------------
struts-config.xml
-----------------------

적절히 수정 하세요~

<!-- ========= Form Bean Definitions ============== -->
    <form-beans>
<form-bean name="CalcForm" type="jstl.CalcForm">                 
            <form-property name="s1" type="java.lang.String" />                   
            <form-property name="s2" type="java.lang.String" />   
        </form-bean>
    </form-beans>

<!-- ========== Global Forward Definitions ============= -->
    <global-forwards>
<forward name="calcjsp" path="/jstl/Calc.jsp" /> 
    </global-forwards>

<action-mappings>
        <action         
                path="/Calc"
                type="jstl.CalcAction"
                          name="CalcForm"                       
                    validate="false"
                    input="/jstl/Calc.jsp"
        />
</action-mappings>




-------------------
CalcForm.java
-------------------

package jstl;

import org.apache.struts.action.ActionForm;
public class CalcForm extends ActionForm {
        private String s1=null;
        private String s2=null;
                             
        public String getS1() {
                return s1;
        }
               
        public void setS1(String s1) {
                this.s1 = s1;
        }   
       
        public String getS2() {
            return s2;
        }
           
        public void setS2(String s2) {
            this.s2 = s2;
        }
}




-------------------
CalcAction.java
-------------------

package jstl;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;


public class CalcAction extends Action {
       
    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
           
            int s1 = Integer.parseInt(((CalcForm)form).getS1());
            int s2 = Integer.parseInt(((CalcForm)form).getS2());
            int sum = s1 + s2;
           
            request.setAttribute("calcSum",new Integer(sum));
           
            return mapping.findForward("calcjsp");     
    }
   
}

Struts 커스텀 태그 개요 (custom tag)

JSP의 커스텀 태그에 관련 부분은 JSP강좌를 참고 하시기를 바라며 여기서는 Struts의 Taglib에 대해 살펴 보도록 하겠습니다.


------------------------------------------------------------------
먼저 TagLib을 위한 설치/사용 과정에 대해 잠시 정리해 보도록 하겠습니다.
------------------------------------------------------------------

1. taglib을 사용하기 위해서는 우선 JAR파일을 /WEB-INF/lib에 복사를 한 후 tld파일들은 꼭은 아니지만 대부분 /WEB-INF/ 폴더에 위치를 시킵니다.

2. 필수 사항은 아니지만 web.xml에 uri와 location을 설정 합니다. 아래의 예를 볼까요…

<web-app>
        <taglib-uri>/tags/struts-bean</taglib-uri>
        <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</web-app>

이러한 식으로 매핑을 하게 되는데 이 과정을 생략하고 JSP에서 직접 tld 파일을 부르게 되는 경우에는 추후 파일의 이름이나 위치가 바뀌는 경우 모든 JSP 파일에서 일일이 수정을 해야 하는 번거로움이 있으니 web.xml에서의 매핑은 필요한 것 입니다. 또한 uri와 location을 같게 하면 추후 TLD 파일의 위치가 변경되면 문제가 발생할 수도 있습니다.

때에 따라서는 tld와 jar를 /WEB-INF/lib에 두기도 하며 tld를 위해 별도의 폴더를 만들기도 합니다.

3. 새롭게 정의한 taglib을 JSP에서 사용 하기
taglib을 가지고 올 때 web.xml의 uri를 통해 참조하게 되는데 taglib 지시자에서 다음과 같이 정의 합니다.

<%@ taglib uri=”/tags/struts-bean” prefix=”bean” %>

그런 다음 JSP페이지에서 prefix를 이용하여 다음과 같이 사용 합니다.

<bean:write name=”userInfo” property=”lastName”/>



--------------------------------
자바 빈 사용하기
--------------------------------

애플리케이션을 만들 때 스트럿츠에서 제공하는 태그 라이브러리만 이용하라는 법은 없습니다. SUN의 JSTL, Jakarta Taglibs, Improve의 Struts-Layout등의 다른 표준 태그 라이브러리도 이용 가능 합니다.

스트럿츠에는 bean, html, logic, nested와 같은 4가지의 핵심 태그 라이브러리를 제공 합니다.

bean : 자바빈의 프로퍼티에 접근하기가 용이하며 새로운 자바 빈을 정의하는데도 사용 됩니다.

html : 스트럿츠 프레임워크와 상호 작용 가능한 HTML 입력 폼을 생성하는데 사용 또는 HTML Tag와 관련된 태그

logic : 조건적인 결과물의 실행, 반복실행, 애플리케이션의 흐름을 관리하는 태그
nested : 다른 스트럿츠 태그들의 기능을 포함하는 확장된 성능을 제공 하는 태그


-------------------------------------------
Struts 태그와 함께 자바 빈 사용 하기
-------------------------------------------

대부분의 경우 태그 라이브러리에 있는 태그들을 자바 빈즈와 함께 사용 합니다. 태그들과 함께 사용되는 자바 빈즈는 HTML의 입력 폼 필드에 대응하는 ActionForm 일 수도 있지만 ActionForm이 아닌 경우 보통 MODEL Layer의 VO(Value Object) 입니다. 이러한 VO는 Page, Request, Session, Application등의 Scope안에 존재 할 수 있습니다.



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



1.        단순 프로퍼티의 접근


단순 프로퍼티의 접근은 JSP의 <jsp:getProperty>액션과 동일하게 수행 됩니다. “property=firstName”이라는 프로퍼티는 메소드 getForstName()이나 setFirstName()의 호출로 변환 됩니다.

2.        중첩된 프로퍼티의 접근

중첩된 프로퍼티들은 마침표(.)로 구분되는 이름 계층구조를 사용하여 프로퍼티에 접근 합니다. 다음과 같은 프로퍼티 레퍼런스가 있다면

“property=user.address.city” 이 레퍼런스는 다음과 같은 자바 구문으로 변환 됩니다.

getUser().getAddress().getCity()

만약 입력 폼에서 수행되는 setter에서 중첩된 레퍼런스를 사용 했다면 중첩된 레퍼런스의 맨마지막  프로퍼티에서는 setter가 호출 됩니다. 이 경우 앞의 프로퍼티 레퍼런스는 다음과 같은 자바 구문으로 변역 됩니다.

getUser().getAddress().setCity()

3.        인덱스 프로퍼티

인덱스가 있는 프로퍼티에서는 첨자를 사용하여 프로퍼티에 속한 각 요소에 접근 합니다. 예를 들어 다음과 같은 프로퍼티 레퍼런스가 있다고 할 때

“property=”address[2]”

이 레퍼런스 구문은 다음과 같은 자바 구문으로 변환 됩니다.

getAddress(2);

setter에서 같은 프로퍼티 레퍼런스를 사용했다면 setAddress(2, address); 와 같은 자바 구문으로 변환 됩니다. 

2013년 8월 1일 목요일

(instance member, field, method)클래스멤버 - 인스턴스변수(필드)/인스턴스 메소드

인스턴스 필드(변수)
 static으로 선언되지 않은 모든 변수(필드)는 인스턴스필드
  public double r;
 클래스의 인스턴스와 연관, 생성된 모든 객체는 자신만의 
  복사본을 가진다.
 클래스 내부에서 이름하나만으로 지칭된다.
  public double r;
  public double area() {
      return PI * r * r;
  }
 클래스 외부에서는 클래스를 인스턴스화한 객체.변수명 형
  태로 사용한다. 인스턴스 필드(변수)의 값은 한객체를 다른
  객체와 구분한다.
  Circle c = new Circle();    c.r=2.0;
  Circle c1 = new Circle();  c1.r=5.0;


 인스턴스 메소드
 static으로 선언되지 않은 모든 메소드
  public double area();
 클래스의 인스턴스(객체)와 연관된다.
 static이든, 아니든 모든 클래스멤버 사용가능
 클래스 외부에서는 클래스를 인스턴스화한 객체.메소드명 형태로 사용한다. 
  인스턴스 필드(변수)의 값은 한객체를 다른객체와 구분한다.
  Circle c = new Circle();    c.r=2.0;
  double a = c.area(); //객체 c에는 이미 r 값이 setting됨

   


- 매개변수가 없는 c.area()가 어떤 데이터에 대해 수행될건지 어떻게 아는가? 사실 모든 인스턴스 메소드는 암시적인 this 매개변수를 가지고 실행된다. This는 메소드가 호출되는 객체(Circle)이다. This 매개변수는 항상 필요하지는 않기에 메소드 시그네쳐에 보이지 않는다.
메소드가 그자신의 필드(변수)등을 접근한다는것을 명시적으로 this를 이용하여 지정할수 있다.
  public double area() {
return Circle.PI * this.r * this.r;
  }


클래스 멤버예제(Circle1.java)
class Circle {
        //클래스 변수(필드), 상수정의
public static final double PI = 3.141592; 
//클래스 메소드
public static double radianToDegree(double rads) {
return rads * 180 / PI;
}
//인스턴스 필드(변수), 원의반지름
public double r;
//인스턴스 메소드, 원의 면적계산
public double area() {  return PI * r * r; }
//인스턴스 메소드,원주계산
public double circumference() {  return 2 * PI * r; } 
}


public class Circle1 {
  public static void main(String[] args) {
Circle c = new Circle();
c.r = 4.0;
//인스턴스 메소드 이용
System.out.println("반지름이 4인 원의 면적은 : " + c.area());
System.out.println("반지름이 4인 원의 원주는 : " + c.circumference());
        //클래스 메소드및 클래스변수(필드) 이용
System.out.println("2 * PI의 Degree는 : " +
                    Circle.radianToDegree(2.0*Circle.PI) + "도 입니다.");
}
}