JSTL SQL Tags


JSTL sql 태그는 이름 그대로 sql 관련 작업을 처리하기 위한 태그 라이브러리이다.


JSP의 시작 부분에 taglib 정의를 추가한다.

1
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>



<sql:setDataSource> Tag

DataSource를 지정한다.

<sql:setDataSource {dataSource="데이터소스" | url="jdbc Url"}

                              driver="드라이버 클래스 명"

                              user="DB 사용자 계정"

                              password="DB 사용자 패스워드"

                              var="변수에 DataSource 스펙 저장"

                              scope="{page | request | session | application"} />

 Name

 Required

 Request-time  Type Desc

 var

 false  false  java.lang.String

 변수에 DataSource 스펙 저장

 scope

 false

 false 

 java.lang.String

 변수 공유 범위

 dataSource

 false

 true

 java.lang.String

 컨텍스트에 JNDI 설정 시 Resource Name

 driver

 false

 true

 java.lang.String

 드라이버 클래스 명

 url

 false

 true

 java.lang.String

 JDBC URL

 user

 false

 true

 java.lang.String

 DB 사용자 계정

 password

 false

 true

 java.lang.String

 DB 사용자 패스워드


MySQL의 경우로 예를 들어 보자.

MySQL Community Server 설치 시 기본적으로 만들어지는 world 테이블을 이용한다.

사용자 계정은 root를 사용하고 패스워드는 12345678 이다.

		<sql:setDataSource url="jdbc:mysql://localhost:3306/world" 
		                           driver="com.mysql.jdbc.Driver" 
		                           user="root" 
		                           password="12345678" 
		                           var="ds" 
		                           scope="session" />


이렇게 생성한 DataSource인 ds는 <sql:query> 태그에서 사용할 수 있다.


DataSource를 얻는 다른 방법으로 DBCP를 사용할 수 있다.

※ 참고: [Servlet] DBCP(Database Connection Pool)를 사용한 DB 연결


프로젝트/META-INF/Context.xml에 다음과 같이 연결 정보를 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource name="jdbc/myconn" 
		       auth="Container" 
		       type="javax.sql.DataSource"
		       factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
		       driverClassName="org.gjt.mm.mysql.Driver"
		       url="jdbc:mysql://localhost:3306/world?AutoReconnect=true" 
		       username="root"
		       password="12345678" 
		       maxActive="100" 
		       maxIdle="30" 
		       maxWait="60"
		       removeAbandoned="true" 
		       removeAbandonedTiemout="60" />
</Context>


DBCP를 사용할 때는 다음과 같이 dataSource 속성에 리소스 이름을 쓰면 된다. 

<sql:setDataSource dataSource="jdbc/myconn" var="ds" scope="session" />


<sql:param>, <sql:dateParam> Tag

날짜 형식 파라미터에는 <sql:dataParam>을 문자열 형식 파라미터에는 <sql:param> 을 사용한다.

<sql:param value="값" />

 Name

 Required

 Request-time

 Type

 Desc 

 value

 false

 true

 java.lang.String

 파라미터 값


<sql:dateParam value="값" type="{timestamp | time | date}"  />

 Name 

 Required 

 Request-time

 Type

 Desc

 value

 true

 true

 java.lang.String

 DATE, TIME, TIMESTAMP 값

 type

 false

 true

 java.lang.String

 data, time, timestamp 중 하나를 쓴다.


<sql:query> Tag

sql 태그의 속성 또는 body에 정의된 쿼리 문장을 실행한다.

<sql:qeury var="varName" 

                dataSource="dataSource"

                sql="sqlQuery" 

                scope="{page | request | session | application}" 

                maxRows="maxRows" 

                startRow="startRow" />

 Name

 Required

 Request-time

 Type

 Desc

 var

 true

 false

 java.lang.String

 쿼리의 결과를 저장. 

 dataSource

 false

 true

 java.lang.String

 JNDI Resource Name or DriverManager를 위한 파라미터

 sql

 false

 true

 java.lang.String

 쿼리 문장

 scope

 false

 false

 java.lang.String

 변수 공유 범위

 maxRows

 false

 true

 java.lang.String

 쿼리 결과에 포함될 최대 행의 수

 startRow

 false

 true

 java.lang.String

 쿼리 결과에 포함될 시작 행 번호. 0부터 시작.


다음은 모두 동일한 결과를 보인다.

        <sql:query sql="select * from country where Continent='Asia' and Region='Middle East'" 
                   var="rs" dataSource="${ds}" />
	<c:set var="param1" value="Asia" />
	<c:set var="param2" value="Middle East" />
	
	<sql:query sql="select * from country where Continent=? and Region=?" 
               var="rs" dataSource="${ds}">
		<sql:param value="${param1}" />
		<sql:param value="${param2}" />
	</sql:query> 

	<c:set var="param1" value="Asia" />
	<c:set var="param2" value="Middle East" />
	
	<sql:query var="rs" dataSource="${ds}">
		select * from country where Continent=? and Region=?
		<sql:param value="${param1}" />
		<sql:param value="${param2}" />
	</sql:query>


<sql:update> Tag

INSERT, UPDATE, DELETE 과 같은 데이터를 반환하지 않는 SQL 문장을 실행시키는데 사용한다.

<sql:update var="varName" 

                  dataSource="dataSource"

                  sql="sqlQuery" 

                  scope="{page | request | session | application}"  />

 Name

 Required

 Request-time

 Type

 Desc

 var

 true

 false

 java.lang.String

 쿼리에 영향을 받은 rows 카운트

 dataSource

 false

 true

 java.lang.String

 JNDI Resource Name or DriverManager를 위한 파라미터

 sql

 false

 true

 java.lang.String

 쿼리 문장

 scope

 false

 false

 java.lang.String

 변수 공유 범위


<sql:param> 태그 과 함께 사용하는 방법은 <sql:query> 태그와 동일하다.


<sql:transaction> Tag

transaction을 만들 때 사용한다. 한 transaction에 여러 개의 query, update를 사용할 수 있다.

<sql:transaction dataSource="dataSource" isolation="isolationLevel">

<sql:query>

<sql:update>

....

</sql:transaction>

 Name

 Required

 Request-time

 Type

 Desc

 dataSource

 false

 true

 java.lang.String

 JNDI Resource Name or DriverManager를 위한 파라미터

 isolation

 false

 true

 java.lang.String

 READ_COMMITED, READ_UNCOMMITED, REPEATABLE_READ, SERIALIZABLE 중 한 값을 가진다. 기본 값으로 dataSource에 설정된 값이 사용된다.


예제)


Posted by 후니아부지
:

JSTL Formatting Tags


JSP의 시작 부분에 taglib 정의를 추가한다.

1
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


<fmt:bundle> Tag

resource bundle을 불러온다. 

basename 속성에 지정된 properties 파일을 locale 에 맞는 것을 불러온다.

properties 파일은 패키지 형식의 이름을 가진다.

com\study\messages 에 messages.properties, messages_ko.properties, messages_en.properties 이 있다면

basename="com.study.messages.messages" 이라고 지정하면 된다.

locale이 ko 이라면 messages_ko.properties 파일을 불러오며, 해당되는 것이 없다면 message.properties 파일을 불러올 것이다.

<fmt:bundle basename="로드 할 번들 베이스 이름"

                 prefix="key명칭의 공통적인 부분" />


<fmt:message> Tag

메시지 키와 지역화된 메시지를 바꾸어 출력한다.

<fmt:message key="메시지 키"

                     bundle="사용할 번들" />


<fmt:setLocale> Tag

locale 변경

<fmt:setLocale value="locale" />


예제)


<fmt:setBundle> Tag

페이지 전체에 사용할 수 있는 번들을 지정

<fmt:setBundle basename="로드 할 번들 베이스 이름"

                      var="번들을 저장하는 변수명" />


예제)


<fmt:formatDate> Tag

날짜 형식을 표현

<fmt:formatDate value="날짜값" 

                      [type="{time|date|both}"] 

                      [dateStyle="{default|short|medium|long|full}"] 

                      [timeStyle="{default|short|medium|long|full}"] 

                      [pattern="customPattern"] 

                      [timeZone="timeZone"] 

                      [var="varName"] 

                      [scope="{page|request|session|application}"] />


예제)


<fmt:formatNumber> Tag

숫자 형식을 표현

<fmt:formatNumber value="수치값" 

                          [type="{number|currency|percent}"]

                          [pattern="customPattern"] 

                          [currencyCode="currencyCode"]

                          [currencySymbol="currencySymbol"] 

                          [groupingUsed="{true|false}"]

                          [maxIntegerDigits="maxIntegerDigits"]

                          [minIntegerDigits="minIntegerDigits"]

                          [maxFractionDigits="maxFractionDigits"]

                          [minFractionDigits="minFractionDigits"] 

                          [var="varName"]

                          [scope="{page|request|session|application}"] />


예제)


<fmt:parseDate> Tag

정해진 패턴의 문자열에서 날짜를 파싱

<fmt:parseDate value="dateString" 

                      [type="{time|date|both}"] 

                      [dateStyle="{default|short|medium|long|full}"] 

                      [timeStyle="{default|short|medium|long|full}"] 

                      [pattern="customPattern"]                       

                      [timeZone="timeZone"] 

                      [parseLocale="parseLocale"] 

                      [var="varName"] 

                      [scope="{page|request|session|application}"] />


<fmt:parseNumber> Tag

정해진 패턴의 문자열에서 수치를 파싱

<fmt:parseNumber value="numericValue" 

                          [type="{number|currency|percent}"] 

                          [pattern="customPattern"] 

                          [parseLocale="parseLocale"] 

                          [integerOnly="{true|false}"] 

                          [var="varName"] 

                          [scope="{page|request|session|application}"] />


예제)


Posted by 후니아부지
:

JSTL Core Tags


JSP의 시작 부분에 taglib 정의를 추가한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<c:set> Tag

JSP의 setAttribute()와 같은 역할

<c:set var="변수명" 

          value="변수에 넣을 값" 

          property="자바빈 객체나 Map 객체 값을 설정할 프로퍼티 명" 

          scope="변수 공유 범위"/>

		<c:set var="data1" value="100" scope="request" />
		<c:set var="data2" value="200" scope="session" />
		<c:set var="data3" value="<%=new int[] {1, 2, 3} %>" scope="request" />
		<c:set var="data4" value="<br/><br/>" scope="request" />
    
		data1 : ${requestScope.data1} <br/>
		data2 : ${sessionScope.data2} <br/>
		data1 + data2 = ${requestScope.data1 + sessionScope.data2} <br/>
		data3 : ${requestScope.data3[0]}, ${ requestScope.data3[1]}, ${ requestScope.data3[2]}


<c:remove> Tag

JSP의 removeAttribute()와 같은 역할

<c:remove var="변수명" 

                scope="변수 공유 범위" />

		<c:remove var="data1" scope="request" />
		
		data1 : ${requestScope.data1} <br/>
		data2 : ${sessionScope.data2} <br/>
		data1 + data2 = ${requestScope.data1 + sessionScope.data2}


<c:out> Tag

'<%= ... >' 와 같다. JSP의 표현식을 대체한다.

<c:out var="변수명" 

          default="기본값" 

          escapeXML="true / false" />

escapeXML 속성은 HTML 태그를 해석할지 결정한다.

true일 경우, 변수 값에 포함된 < > Q ' " 문자를 실제 문자로 출력한다. 생략 시 default로 true. 

		<c:out value="${sessionScope.data2}" /> <br/>
		<c:out value="${requestScope.data4}" escapeXml="true" />


<c:catch> Tag

body에서 실행되는 코드의 예외를 처리

<c:catch var="에러 메세지가 포함될 변수명" />

		<c:catch var="ex">
			<%= 1/0 %>
		</c:catch> <br/>
		Error Msg: ${ex} <br/>


<c:if> Tag

조건문에 대응

<c:if test="조건 판별식" 

       var="변수명" 

       scope="변수 공유 범위" />

		<c:if test="${requestScope.data1 == null}">
			data1 was removed....
		</c:if>


<c:choose> Tag

switch문과 동일

여러 개의 when 태그와 하나의 otherwise 태그를 가진다.

<c:chose>

    <c:when> .... </c:when>

    <c:when> .... </c:when>

    <c:otherwise> .... </c:otherwise>

</c:choose>


<c:when> Tag

choose 태그의 서브 태그

choose 태그 내에서 여러 번 사용할 수 있다

<c:when test="조건 판별식" />


<c:otherwise> Tag

choose 태그의 서브 태그

choose 태그 내에서 한 번만 사용할 수 있다

<c:otherwise> .... </c:otherwise>

		<c:choose>
			<c:when test="${data1 == 100}">
				data1의 데이터는 100 입니다.
			</c:when>
			
			<c:when test="${data1 == null}">
				data1의 데이터는 null 입니다.
			</c:when>
			
			<c:otherwise>
				data1의 데이터는 어느 값도 아닙니다.			
			</c:otherwise>
		</c:choose>


<c:forEach> Tag

객체 전체에 걸쳐 반복 실행에 사용

<c:forEach var="현재 아이템의 변수 명"

             items="반복 데이터가 있는 아이템 Collection 명"

                begin="시작 값. 기본 값은 0"

                end="종료 값"

                step="증가 값"

                varStatus="반복 상태 값을 지닌 변수" />

varStatus는 forEach의 상태를 알 수 있는 값이 들어 있다.

${변수.current} 현재의 인덱스

${변수.index} 0부터의 인덱스

${변수.count} 1부터의 인덱스

${변수.first} 현재 루프가 처음인지 확인 

${변수.last} 현재 루프가 마지막인지 확인

${변수.begin} forEach문의 시작 값

${변수.end} forEach문의 끝 값

${변수.step} forEach문의 증가 값

		<c:forEach var="i" begin="0" end="9">
			${i+1}  
		</c:forEach> <br/>
		
		<c:forEach var="i" items="${requestScope.data3}" begin="0" end="2" >
			${i}
		</c:forEach> <br/>
		
		<c:forEach var="i" items="${requestScope.data3}" begin="0" end="2" step="1" varStatus="status">
			--------------------------------- <br/>
			${i} <br/>
			--------------------------------- <br/>
			현재 인덱스			${status.current} <br/>
			0부터의 인덱스                   ${status.index} <br/>
			1부터의 인덱스                   ${status.count} <br/>
			현재 루프가 처음인지 확인    ${status.first} <br/>
			현재 루프가 마지막인지 확인 ${status.last} <br/>
			forEach문의 시작 값            ${status.begin} <br/>
			forEach문의 끝 값               ${status.end} <br/>
			forEach문의 증가 값            ${status.step} <br/>
			<br/>
		</c:forEach>


<c:forTokens> Tag

문자열을 구분자(delimiter)로 분할

<c:forTokens var="현재 아이템의 변수 명"

                items="반복 데이터가 있는 아이템 Collection 명"

                    delims="구분자. 여러 개 지정 가능"

                    begin="시작 값. 기본 값은 0"

                    end="종료 값"

                    step="증가 값"

                    varStatus="반복 상태 값을 지닌 변수" />

        <c:set var="data5" value="A, B. C, D. E, F" scope="request" />
        <c:forTokens var="ddd" items="${requestScope.data5}" delims=",.">
        	<c:out value="${ddd}" /><br>
        </c:forTokens>


<c:url> Tag

url 생성

<c:url var="생성한 URL이 저장될 변수 명"

         value="생성할 URL"

         scope="변수 공유 범위" />

		<a href="<c:url value='/TEST_EL_1.jsp'/>">
			View TEST_EL_1
		</a>


<c:param> Tag

url 생성 시 파라미터 추가

<c:param name="파라미터 명" 

              value="값"/>

		<c:url value="/TEST_EL_2.jsp" var="paramTest">
			<c:param name="data1" value="1000"/>
			<c:param name="data2" value="2000"/>
		</c:url>
		<a href="${paramTest}">
			View TEST_EL_2 with data1(1000), data2(2000)
		</a>


<c:import> Tag

페이지 첨부

<c:import url="첨부할 URL" />

import 태그 내에 param 태그도 사용할 수 있다.

var과 scope 속성도 있는데 var은 불러들인 페이지를 바로 출력하지 않고 String 형 변수에 넣어두기 위해 사용한다.

이때 이 변수의 scope를 지정할 수 있다.

		<c:import url="/TEST_EL_1.jsp"/> 
		
		<c:import url="/TEST_EL_2.jsp">
			<c:param name="data1" value="10000"/>
			<c:param name="data2" value="20000"/>
		</c:import> 


<c:redirect> Tag

respond.sendRedirect()와 동일

<c:redirect url="이동할 URL" />


예제) JSTL Core 태그 사용

JSTL_Test1.jsp

TEST_EL_1.jsp

TEST_EL_2.jsp


Posted by 후니아부지
:

JSTL (JavaServer Pages Standard Tag Library)


1. 다운로드

http://tomcat.apache.org/taglibs/standard/

여기에서는 Standard 1.1 을 사용할 것이다. 


바이너리를 클릭


1.1 의 마지막 버전을 다운로드 한다.

jakarta-taglibs-standard-1.1.2.zip



2. 설치

사용하려는 라이브러리는 lib 폴더 내의 jstl.jar 과 standard.jar 이다.

현재 프로젝트에서만 쓰려면 사용하고자 하는 프로젝트의 WebContent\WEB-INF\lib 에 넣어준다.

해당 WAS를 사용하는 모든 프로젝트에서 사용하려면 WAS의 lib 폴더에 넣으면 된다. (여기서는 Tomcat의 lib)


그리고 압축 푼 폴더에 있는 tld 파일을 사용하려는 프로젝트에 넣어줘야 한다.

해당 프로젝트의 WebContent\WEB-INF tld 폴더를 만들고 tld 파일 모두를 복사한다.


3. 사

사용하려는 페이지에 아래와 같이 써준다.

<%@ taglib prefix="태그" uri="Tag Library Descriptor 파일 경로 or URI %>

uri에는  Tag Library Descriptor 파일의 경로(파일 이름 포함)를 쓰거나 해당 tld 파일 내용 중 uri 값을 쓰면 된다.


c.tld 파일의 uri

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 


또는 Tag Library Descriptor 파일의 경로

<%-- @ taglib prefix="c" uri="WEB-INF/tld/c.tld" --%> 


4. 자주 사용하는 태그




Posted by 후니아부지
:

자바 애플릿 테스트 시 웹 브라우저에서 아래와 같은 오류가 나타나는 경우가 있다.


자바 제어판을 다음과 같은 방법으로 불러낸다.

                    or                      


보안 탭에서 보안 레벨을 중간으로 바꾸고 적용한다.


웹 브라우저를 재시작하여 다시 테스트 해본다. 그러면 아래와 같은 메시지를 볼 수 있다.

실행 버튼을 클릭하면 자바 애플릿이 실행되는 것을 볼 수 있다.

 

Posted by 후니아부지
:

JSP Action - plugin

자바로 만든 애플릿이나 빈을 현재 페이지에 추가하는 용도로 사용한다.

 속성

 값

 설명

 type

 applet 또는 bean 

 추가할 컴포넌트의 형식

 필수

 codebase

 url

 파일 경로 지정 

 code

 filename

 applet 이나 bean으로 지정할 파일 이름.확장자

 width

 pixel

 화면에 표시할 컴포넌트의 폭 

 필요 

 height

 pixel

 화면에 표시할 컴포넌트의 높이

 name

 unique name

 동일 페이지에서 구분할 이름

 기타

 align

 left, right, top, middle, bottom

 화면에 표시할 컴포넌트의 상대 위치 

 archive

 archive filename

 리소스(클래스, 이미지 등)을 압축한 파일. 확장자는 JAR

 hspace

 pixel

 컴포넌트의 가로 방향(왼쪽, 오른쪽) 공백을 지정

 vspace

 pixel

 컴포넌트의 세로 방향(위, 아래) 공백을 지정

 ieplugin

 url

 인터넷 익스플로러에서 실행할 때 해당 플러그인을 받는 위치 지정

 nsplugin

 url

 넷스케이프에서 실행할 때 해당 플러그인을 받는 위치 지정

 jreversion

 version

 이 컴포넌트를 실행할 JRE 버전을 지정


JSP Action - params, param

plugin, include, forward 액션과 함께 다른 컴포넌트나 다른 페이지와 연계하여 매개 변수를 전달하는 용도로 사용한다.

다음과 같은 형태로 사용한다.

        <jsp:params>
          <jsp:param name="값" value="값" ... />
          <jsp:param name="값" value="값" ... />
        </jsp:params> 


name은 매개 변수의 이름을 지정하고,

value는 매개 변수의 값을 지정한다.

하나의 속성마다 <jsp:param> 을 사용한다.

여러 개의 <param> 태그를 묶어야 할 때 <jsp:params> 태그를 사용한다.

※ 그러나 <params> 태그는 plugin 액션에서만 사용해야 한다.

    include, forward 액션에서는 2개 이상을 <param> 태그를 사용하더라도 <params> 태그로 묶어서는 안된다.


예제) 애플릿을 포함하는 페이지를 만들어보자. 애플릿은 매개 변수 2개를 받도록 생성한다.

MyApplet.java


viewApplet.jsp


확인~


※ '보안 설정으로 차단된 응용 프로그램' 이라는 오류가 발생할 수 있다. [해결방법]

Posted by 후니아부지
:

[JSP] 자바빈 (JavaBeans)

앎/web 2014. 3. 18. 15:38 |

자바빈(JavaBeans)이란 데이터를 표현하는 것을 목적으로 하는 자바 클래스를 말한다.

자바빈 규약을 따르는 클래스를 자바빈이라 부르며, MVC 구조에서 모델(Model)에 해당된다.


자바빈 규약

  • 클래스는 반드시 파라미터가 없는 기본 생성자를 가진다.
  • 클래스는 직열화(Serializable)되어야 한다.
  • 프로퍼티는 get, set 메서드를 통해 읽고 쓸 수 있어야 한다.
  • 프로터티 마다 Getter, Setter가 있어야 한다.
  • Getter는 파라미터가 없어야 한다.
  • Setter는 하나 이상의 파라미터를 가진다.
  • 프로퍼티가 Boolean 일 경우 get 대신 is를 사용한다.
  • 프로퍼티의 접근 제어자는 Private, Getter/Setter은 public, 클래스는 public로 정의해야 한다.

자바빈 규약을 만족하는 클래스를 작성해보자.

PersonBean.java 


TestPersonBean.java


다음과 같이 확인할 수 있을 것이다.


※ 참고: http://en.wikipedia.org/wiki/JavaBeans

Posted by 후니아부지
:

JSP 규약은 JSP 페이지에서 빈번히 사용되는 자바빈 객체를 위한 액션 태그를 제공한다.

이 액션 태그를 사용하여 자바빈 객체을 생성하거나, 자바빈의 프로퍼티를 출력하거나 값을 변경할 수 있다.

 

JSP가 기본적으로 제공하는 표준 태그사용자 태그로 나뉜다.

형식은 다음과 같다.

<접두어:태그이름 속성="값" 속성="값" .... />


표준 태그jsp라는 접두어를 사용한다.

<jsp:태그이름 속성="값" 속성="값" .... />


JSP Action : useBean

자바 클래스의 객체를 생성해서 JSP 내의 원하는 데이터 저장 영역에 배치되게 해주는 액션이다.

    <jsp:useBean id="..." class="..." scope="...">
    ....
    </jsp:useBean>

 속성 

 설명 

 id

 생성하려는 객체의 이름

 class

 자바 클래스 (패키지명을 포함)

 scope

 객체의 유효 범위. (page, request, session, application). 기본 값은 page.

이는 자바에서 객체를 생성하는 방법과 동일하다.

클래스 인스턴스명 = new 클래스();

 

JSP Action : setProperty / getProperty

객체에 property 를 Get 또는 Set 하기 위해 사용한다. (Getter / Setter 라고 보면 된다.)

<jsp:setProperty name="..." property="..." value="..." />

 속성

 설명

 name

 객체 이름

 property

 property 이름

 value

 property에 저장할 값


<jsp:setProperty name="..." property="..." param="..." />

 속성

 설명

 param

 넘어오는 객체의 parameter 이름


<jsp:setProperty name="..." property="..." />

※ 저장할 property와 가져올 param이 같다면 property 만 쓴다.

 

<jsp:setProperty name="..." property="*" />

property의 값을 * 로 설정하면 폼에서 넘어오는 모든 parameter를 각각 property로 저장한다.
이는 넘어오는 parameter의 이름과 개수가 해당 객체의 property의 이름과 개수가 같아야한다.

 

<jsp:getProperty name="..." property="..." />

name 객체의 property 값을 가져온다.


예제) 입력 폼에서 넘어온 데이터를 DTO 객체에 담아 뷰 페이지로 전달한다. 일반적인 방법과 액션을 사용한 방법 모두 확인 해본다.

 

inputPage.htm

입력한 데이터를 처리하는 jsp 파일을 두 가지 방법으로 테스트 해본다.


 

 

DataDTO.java

String 타입의 데이터를 3개 관리할 수 있는 DTO 클래스를 생성한다.


 

 

inputProcess.jsp

넘어온 데이터를 DTO 객체에 담아 세션에 넣고 뷰 페이지로 이동한다.


 

 

viewPage.jsp

 

 

위 파일 중 JSP 파일을 JSP 액션을 사용하도록 수정해보자.

inputProcess_useBean.jsp



 

viewPage_useBean.jsp

 

 

동일한 기능을 하면서도 더 간략해진 코드를 볼 수 있다.

inputProcess 비교

 

viewPage 비교

 

Posted by 후니아부지
:

웹에서 이벤트가 사용되는 경우는 다음과 같다.

  • 세션의 생성, 소멸
  • 속성 변경
  • 컨텍스트 초기화


web.xml 에 <listener>에 등록해주면 웹 서버가 자동으로 이벤트를 감지하여 지정한 클래스 메서드를 실행시켜 준다.

<listener> 태그는 최상위에 넣는다.

  <listener>
    <display-name>이벤트 리스너 명</display-name>
    <listener-class>리스너클래스</listener-class>
  </listener>
  
  <filter>
    ....
  </filter>
  
  <filter-mapping>
    ....
  </filter-mapping>
  
  <servlet>
    ....
  </servlet>
  
  <servlet-mapping>
    ....
  </servlet-mapping>


설정할 수 있는 이벤트는 다음과 같다.

 이벤트

 ServletContextListener 

 발생시점 

 ServletContext 객체의 초기화 또는 소멸 시 발생

 메서드

 contextInitialized() 

 contextDestroyed()

 이벤트

 ServletContextAttributeListener

 발생시점

 ServletContext 객체에 속성이 추가, 삭제, 수정될 때 발생

 메서드

 attributeAdded()

 attributeRemoved()

 attributeReplaced()

 이벤트

 HttpSessionListener

 발생시점

 HttpSession 객체가 생성되거나 소멸될 때 발생

 메서드

 sessionCreated()

 sessionDestroyed()

 이벤트

 HttpSessionAttributeListener

 발생시점

 HttpSession 객체에 속성이 추가, 삭제, 수정될 때 발생

 메서드

 attributeAdded()

 attributeRemoved()

 attributeReplaced()

 이벤트

 ServletRequestListener

 발생시점

 ServletRequest 객체의 초기화 또는 소멸 시 발생 

 메서드

 requestInitialized()

 requestDestroyed()

 이벤트

 ServletRequestAttributeListener

 발생시점

 ServletRequest 객체에 속성이 추가, 삭제, 수정될 때 발생

 메서드

 attributeAdded()

 attributeRemoved()

 attributeReplaced()


앞서 작성한 서블릿 필터의 예제 소스에 추가해서 테스트한다.

예제) 세션에 속성 추가 시 이벤트 발생을 확인한다.

web.xml

<servlet> 태그보다 앞에 추가한다.

  ....
  <listener>
    <display-name>SessionListener</display-name>
    <listener-class>com.study.SessionListener</listener-class>
  </listener>
  ....


SessionListener.java

리스너 클래스를 생성한다.

package com.study;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class SessionListener implements HttpSessionAttributeListener {
  public void attributeAdded(HttpSessionBindingEvent _evt) {
    System.out.println("Event (attributeAdded)");
    System.out.println("  => Name: " + _evt.getName());
    System.out.println("  => Value: " + _evt.getValue());
  }
  
  public void attributeRemoved(HttpSessionBindingEvent _evt) {
  }

  public void attributeReplaced(HttpSessionBindingEvent _evt) {
  }
}


확인~


Posted by 후니아부지
:

서블릿 필터

웹 상에서 사용자 요청 페이지가 실행하기 전이나 후에 동작이나 데이터를 가로채서 어떠한 작업을 해주고 해당 페이지로 넘어갈 수 있도록, 혹은 넘어갈 수 없도록 막는 등의 작업을 할 때 사용한다.

예를 들면 이벤트나 공지 등의 팝업을 추가하거나 전달 받은 데이터를 인코딩하는 경우, 세션 데이터를 인증하는 등의 작업에 사용될 수 있다.


Filter 인터페이스를 구현하는 클래스 작성 후

class 클래스명 implements Filter {
    public void init(FilterConfig fc) throws ServletExeption {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
              throws IOEXception, ServletException {
        // 필터 작업
        
        chain.doFilter(request, response); // '가던 길로 가세요~' 라는 의미 :)
    }

    public void destroy() {
    }
}

web.xml에 등록하여 사용한다. (서블릿 보다 위에 작성한다.)

<filter>
  <filter-name>필터명</filter-name>
  <filter-class>필터클래스</filter-class>
  <init-param>
    <param-name>매개변수명</param-name>
    <param-value>값</param-value>
  </init-param> 
</filter>

<filter-mapping>
  <filter-name>필터명</filter-name>
  <url-pattern>필터패턴</url-pattern>
</filter-mapping>


예제) 로그인 페이지에서 로그인 후 메인 페이지로 이동

login.htm


LoginProcessServlet.java

 

web.xml


MainServlet.java


이때 문제가 되는 것이, 로그인 후 메인 페이지의 주소를 복사한 후 서버 재시작 후 복사한 주소를 넣고 이동하면 메인 페이지로 바로 갈 수 있다. 로그인 과정을 거치지도 않았는데도 메인 페이지를 볼 수 있다는 것이다.

이를 방지하기 위해 필터를 사용해본다.

 

Filter 클래스를 생성하고 web.xml에 등록해준다.

 

web.xml

<servlet> 태그 보다 위에 작성해야 한다. '.do'로 서블릿을 호출할 때 LoginFilter 필터가 적용되도록 설정한다. 

 

LoginFilter.java

세션에 ID가 있는지 확인해서 없다면 로그인 화면으로 가도록 한다.

LoginProcessServlet 에서 세션에 ID를 저장하도록 할 것이므로 필터 처리에 예외가 되도록 한다. LoginProcessServlet 를 거치지 않고서는 ID가 세션에 없으므로 무조건 로그인 화면으로 가버리게 되기 때문이다.

 

LoginProcessServlet.java

로그인 처리 서블릿에서는 세션에 ID를 저장하고 Main.do를 호출한다.


 

MainServlet.java



로그인 후 세션이 생성되었을 때의 주소를 복사 후, 서버를 재시작하고 앞에 복사한 주소로 직접 접근해본다.

이제는 Main.do 로 접근 시 필터에 걸려서 (세션에 ID가 없으므로) 로그인 화면으로 이동될 것이다.

 

Posted by 후니아부지
: