아.. 진작에 이렇게 할것을...ㅜㅜ

 

downloadmanager-context.xml

  1.  
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.        xsi:schemaLocation="
  6.                 http://www.springframework.org/schema/beans
  7.                 http://www.springframework.org/schema/beans/spring-beans.xsd">

  8.     <bean id="ftpDownloader" class="com.apress.prospring2.ch03.dm.FtpDownloader"/>
  9.     <bean id="httpDownloader" class="com.apress.prospring2.ch03.dm.HttpDownloader"/>
  10.     <bean id="sftpDownaloader" class="com.apress.prospring2.ch03.dm.SftpDownloader"/>
  11.     <bean id="downloadManager" class="com.apress.prospring2.ch03.dm.DownloadManager">
  12.         <property name="downloaders">
  13.             <map>
  14.                 <entry key="ftp" value-ref="ftpDownloader"/>
  15.                 <entry key="http" value-ref="httpDownloader"/>
  16.                 <entry key="sftp" value-ref="sftpDownaloader"/>
  17.             </map>
  18.         </property>
  19.     </bean>


  20. </beans>

 

Test Class : DownloadManager.java

  1.  
  2. package com.apress.prospring2.ch03.dm;

  3. import org.springframework.beans.factory.xml.XmlBeanFactory;
  4. import org.springframework.core.io.ClassPathResource;

  5. import java.io.BufferedReader;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.util.Map;
  9. import java.util.regex.Matcher;
  10. import java.util.regex.Pattern;

  11. /**
  12.  * @author janm
  13.  */
  14. public class DownloadManager {
  15. private static final Pattern URI_PATTERN = Pattern.compile("^([^:]*):/(.*)$");
  16. private Map<String, Downloader> downloaders;

  17. public static void main(String[] args) throws IOException {
  18. XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource(
  19. "/META-INF/spring/downloadmanager-context.xml"));
  20. DownloadManager dm = (DownloadManager) xbf.getBean("downloadManager");
  21. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  22. while (true) {
  23. String uri = reader.readLine();
  24. if (uri.length() == 0)
  25. break;
  26. dm.download(uri);
  27. }
  28. }

  29. private void download(String uri) {
  30. Matcher matcher = URI_PATTERN.matcher(uri);
  31. if (matcher.matches()) {
  32. String scheme = matcher.group(1); //reg Exp 를 이용하여 1번그룹 추출(http, ftp, sftp)
  33. System.out.println(scheme);
  34. String path = matcher.group(2);
  35. Downloader downloader = this.downloaders.get(scheme); // downloaderManager bean의 Map에서 스키마를 꺼낸다
  36. if (downloader != null) {
  37. downloader.download(path);
  38. }
  39. }
  40. }
  41. public void setDownloaders(Map<String, Downloader> downloaders) {
  42. this.downloaders = downloaders;
  43. }
  44. }

 

Interface Downloader.java

  1.  
  2. package com.apress.prospring2.ch03.dm;
  3. public interface Downloader {
        byte[] download(final String uri);
  4. }

 

구현체 FtpDownloader.java , HttpDownloader.java , sFtpDownLoader.java

  1. package com.apress.prospring2.ch03.dm;
  2. import org.springframework.stereotype.Component;
  3. @Component
  4. public class FtpDownloader implements Downloader {
  5.     public byte[] download(String uri) {
  6.         System.out.println("FTP Downloading " + uri);
  7.         return new byte[0];
  8.     }
  9. }

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,

 

You might want to limit the size of file to be uploaded on your website as it eats up some of the bandwidth and this can cause problem to rest of the users of your site. Most of the time we do processing on files when they are uploaded on server and content validations has limitations on client side as you can not read files using javascript on client side (i.e. web browser). 

Limit on upload size makes more sense for specific purposes on your website when you know about expected size of file beforehand like image upload websites etc.

If you are using Spring framework for your project/product you can do this using latest version of commons-fileupload which lets you write your own ProgressListener using which you can limit file upload size and monitor the upload process as well. We are using Ajax in our project and for file upload we are using ajaxfileupload (see more in detail)

Following things need to be done for achieving the goal:

1. Implement the ProgressListener for your application like below by implementing org.apache.commons.fileupload.progresslistener

 
package com.listener;
 
import javax.servlet.http.HttpSession;
import net.sf.json.JSONObject;
import org.apache.commons.fileupload.ProgressListener;
 
public class AjaxProgressListener implements ProgressListener {
 
    public static final String STATUS_UPLOADING = "UPLOADING";
    public static final String STATUS_FAILED = "FAILED";
    public static final String STATUS_DONE = "DONE";
    public static final String STATUS_MAX_SIZE_EXCEEDS = "MAX_SIZE_EXCEEDS";
 
    private HttpSession session;
 
    public void setSession(HttpSession session){
        this.session = session;
    }
 
    public void updateStatus(String status){
        session.setAttribute("progressStatus", status);
    }
 
    public void update(long bytesRead, long contentLength, int item) {
        JSONObject progressMap = new JSONObject();
        progressMap.set("bytesRead", bytesRead);
        progressMap.set("contentLength", contentLength);
        progressMap.set("item", item);
        session.setAttribute("progressMap", progressMap);
 
        if(bytesRead == contentLength) {
                session.setAttribute("progressStatus", STATUS_DONE);
        }
    }
}
 

Progress Listener will read the status of file upload using http request and will set a parameter map in session object so that it can be used for monitoring.


2. Extend the CommonsMultipartResolver provided by Spring framework and use the ProgressListener implemented to check the size of upload.

 
package com.resolver;
 
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 
import com.listener.AjaxProgressListener;
 
 
public class AjaxMultipartResolver extends CommonsMultipartResolver {
    private AjaxProgressListener progressListener;
    private HttpServletRequest httpServletRequest;
 
    public void setProgressListener(AjaxProgressListener progressListener) {
        this.progressListener = progressListener;
    }
 
    public AjaxProgressListener getProgressListener() {
        return progressListener;
    }
 
    public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
        try {
            this.httpServletRequest = request;
 
            return super.resolveMultipart(request);
        } catch(MaxUploadSizeExceededException ex) {
                 this.progressListener.updateStatus(AjaxProgressListener.STATUS_MAX_SIZE_EXCEEDS);
             throw new MultipartException(ex.getMessage());
        } catch (Exception ex) {
            //exception is typically thrown when user hits stop or cancel
            //button halfway through upload
            this.progressListener.updateStatus(AjaxProgressListener.STATUS_FAILED);
            throw new MultipartException(ex.getMessage());
        }
    }
}
 
 



3. Update your application-beans.xml for your custom MultipartResolver written in step 2 and re-start the server.

 
<bean id="multipartResolver" class="com.resolver.AjaxMultipartResolver">
        <property name="maxInMemorySize">
                <!-- Max in memory 10kbytes -->
                <value>10240</value>
        </property>
        <property name="maxUploadSize">
                <!--  10 MB Max upload size -->
                <value>1024000000</value>
        </property>
        <!--
        <property name="uploadTempDir">
                <value>/tmp</value>
        </property>
        -->
        <property name="progressListener">
                <ref bean="progressListener" />
        </property>
</bean>
 
<bean id="progressListener" class="com.listener.AjaxProgressListener"/>
 



These values will be used for checking the file upload size and will automatically be set in AjaxMultipartResolver at the time of server start. Change these values according to your need. 

 

 

 

  1. package com.mcw.sns.listener;

  2. import javax.servlet.http.HttpSession;

  3. import net.sf.json.JSONObject;

  4. import org.apache.commons.fileupload.ProgressListener;

  5. public class AjaxProgressListener implements ProgressListener {

  6. public static final String STATUS_UPLOADING = "UPLOADING";
  7. public static final String STATUS_FAILED = "FAILED";
  8. public static final String STATUS_DONE = "DONE";
  9. public static final String STATUS_MAX_SIZE_EXCEEDS = "MAX_SIZE_EXCEEDS";

  10. private HttpSession session;

  11. public void setSession(HttpSession session) {
  12. this.session = session;
  13. }

  14. public void updateStatus(String status) {
  15. session.setAttribute("progressStatus", status);
  16. }

  17. public void update(long bytesRead, long contentLength, int item) {
  18. JSONObject progressMap = new JSONObject();
  19. progressMap.put("bytesRead", bytesRead);
  20. progressMap.put("contentLength", contentLength);
  21. progressMap.put("item", item);
  22. session.setAttribute("progressMap", progressMap);

  23. if (bytesRead == contentLength) {
  24. session.setAttribute("progressStatus", STATUS_DONE);
  25. }
  26. }

  27. }

 

 

  1. package com.mcw.sns.resolver;

  2. import javax.servlet.http.HttpServletRequest;

  3. import org.springframework.web.multipart.MaxUploadSizeExceededException;
  4. import org.springframework.web.multipart.MultipartException;
  5. import org.springframework.web.multipart.MultipartHttpServletRequest;
  6. import org.springframework.web.multipart.commons.CommonsMultipartResolver;

  7. import com.mcw.sns.listener.AjaxProgressListener;
  8.  
  9. public class AjaxMultipartResolver extends CommonsMultipartResolver {
  10.     private AjaxProgressListener progressListener;
  11.     private HttpServletRequest httpServletRequest;
  12.  
  13.     public void setProgressListener(AjaxProgressListener progressListener) {
  14.         this.progressListener = progressListener;
  15.     }
  16.  
  17.     public AjaxProgressListener getProgressListener() {
  18.         return progressListener;
  19.     }
  20.  
  21.     public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
  22.         try {
  23.             this.httpServletRequest = request;
  24.  
  25.             return super.resolveMultipart(request);
  26.         } catch(MaxUploadSizeExceededException ex) {
  27.          this.progressListener.updateStatus(AjaxProgressListener.STATUS_MAX_SIZE_EXCEEDS);
  28.              throw new MultipartException(ex.getMessage());
  29.         } catch (Exception ex) {
  30.             //exception is typically thrown when user hits stop or cancel
  31.             //button halfway through upload
  32.             this.progressListener.updateStatus(AjaxProgressListener.STATUS_FAILED);
  33.             throw new MultipartException(ex.getMessage());
  34.         }
  35.     }
  36. }

 

  1. <bean id="multipartResolver" class="com.mcw.sns.resolver.AjaxMultipartResolver">
  2. <property name="maxInMemorySize">
  3. <!-- Max in memory 10kbytes -->
  4. <value>10240</value>
  5. </property>
  6. <property name="maxUploadSize">
  7. <!--  10 MB Max upload size -->
  8. <value>1024000000</value>
  9. </property>
  10.         
  11.         <property name="uploadTempDir">
  12. <value>D:/Temp/</value>
  13. </property>
  14. <property name="progressListener">
  15. <ref bean="progressListener" />
  16. </property>
  17. </bean>
  18.  
  19. <bean id="progressListener" class="com.mcw.sns.listener.AjaxProgressListener"/>

 

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,

jstl

Program Language/Frmaework 2009. 12. 21. 15:26

 

개요

JSTL(JSP Standard Tag Library)설명한다.

목차

1. 개요.. 3

2. 설정.. 3<?xml:namespace prefix = o /><?xml:namespace prefix = o />

3. JSTL사용.. 4

4. Expression Language. 5

(1) Expression Language 개요.. 5

(2) Expression Language 기본객체.. 6

(3) 객체사용.. 6

(4) 연산자.. 9

5. core. 10

(1) c:out10

(2) c:set11

(3) c:remove. 11

(4) c:if11

(5) c:choose, c:when, c:otherwise. 12

(6) c:forEach. 12

(7) c:forTokens14

(8) c:url, c:param. 14

(9) c:import15

(10) c:redirect16

(11) c:catch. 16

6. 참고자료.. 16

 

1.
개요

JSTL(JSP Standard Tag Library)설명한다. 프레임워크에서는 JSTL구성하는 4개의태그라이브러리중에서 core 태그라이브러리만을사용한다.

종류

설명

prefix

uri

core

데이터출력, 제어문, URL 처리기본기능

c

http://java.sun.com/jstl/core (1.3)

http://java.sun.com/jsp/jstl/core (1.4)

format

I18N 데이터포멧기능

fmt

http://java.sun.com/jstl/fmt (1.3)

http://java.sun.com/jsp/jstl/fmt (1.4)

xml

XML 문서에대한처리

x

http://java.sun.com/jstl/xml (1.3)

http://java.sun.com/jsp/jstl/xml (1.4)

sql

JDBC 작업수행

sql

http://java.sun.com/jstl/sql (1.3)

http://java.sun.com/jsp/jstl/sql (1.4)


표 1.
JSTL 태그라이브러리

2.
설정

JSTL사용하려면아래파일이어플리케이션디렉토리에위치해야한다.

파일

설명

WEB-INF/lib/jstl.jar

JSTL API 라이브러리

WEB-INF/lib/standard.jar

JSTL 구현라이브러리

WEB-INF/tld/c.tld

JSTL core TLD 파일


표 2.
JSTL 설정을위한파일

J2EE 1.3에서는 JSTL 1.0 라이브러리를, J2EE 1.4에서는 JSTL 1.1 라이브러리를사용한다. 라이브러리는다음(http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html)에서다운로드한다.

그리고 web.xml 파일에태그라이브러리를설정한다. 아래는 J2EE 1.3사용하는경우의설정이다.

 

web.xml

 

<taglib>

<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>

<taglib-location>/WEB-INF/c.tld</taglib-location>

</taglib>

 

그리고아래는 J2EE 1.4사용하는경우의설정이다.

 

web.xml

 

<jsp-config>

<taglib>

<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>

<taglib-location>/WEB-INF/c.tld</taglib-location>

</taglib>

</jsp-config>

 

3.
JSTL
사용

JSTL사용하는모든 JSP 파일상단에아래내용을추가한다.

 

Example.jsp

 

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

 

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

 

그런데 J2EE 1.3 J2EE 1.4따라서 uri 속성의값이다르다. 이에따른수정영향을최소화하기위해서 BaseJsp.jsp 파일을사용한다.

 

Example.jsp

 

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

 

<%@ include file="/BaseJsp.jsp" %>

 

BaseJsp.jsp내용은아래와같다. 프레임워크가제공하는태그라이브러리설정도포함한다.

 

BaseJsp.jsp

 

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

<%@ taglib prefix="framework" uri="http://www.naver.com/ctl/framework" %>

<%@ taglib prefix="ui" uri="http://www.naver.com/ctl/ui" %>

 

4.
Expression Language

(1)
Expression Language
개요

JSTL Expression Language(이하 EL)사용한다. EL데이터혹은객체를표현하는데사용하는스크립트언어로 ${} 안에서사용한다.

 

// 동적인표현작업수행

${Some Expression}

 

EL아래의작업을수행한다.

 
JSP 저장영역(page, request, session, application)대한접근

 
java.util.Collection, java.util.Map, 배열등의객체처리

 
POJO 유형의객체처리

 
수치, 비교, 논리연산자적용

 

J2EE 1.3에서는 EL JSTL 태그의속성값에서만사용할있다. 그러나 J2EE 1.4에서는 EL JSP JSTL 모두에서사용할있다.

(2)
Expression Language
기본객체

EL에서사용가능한주요 JSP API대한 Alias아래와같다.

종류

기본객체

예제

JSP

저장영역

pageScope - PageContext 속성

requestScope - HttpServletRequest 속성

sessionScope - HttpSession 속성

applicationScope - ServletContext 속성

${requestScope.name}

HTTP

요청

파라미터

param - HttpServletRequest 파라미터

paramValues - 동일파라미터이름에값이 2이상존재하는경우

${param.name}

JSP

객체

pageContext - PageContext

cookie - 이름을키로, Cookie값으로하는 java.util.Map

header - 해더이름을키로, 해더값을값으로하는 java.util.Map

headerValues - 동일해더이름에값이 2이상존재하는경우

initParam - JSP 초기변수

${cookie.JSESSIONID.name}

${headerValues['HOST'][0]}"


표 3.
EL 기본객체

(3)
객체
사용

기본데이터타입(Boolean, Integer, Long, String )아래처럼사용한다.

 

request.setAttribute("name", "성선임");

 

// 성선임을출력한다.

${requestScope.name}

 

// 성선임을출력한다. 영역을지정하지않으면 page, request, session, application

// 으로검색한다.

${name}

 

// null출력하지않고아무것도출력하지않는다.

${password}

 

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><?xml:namespace prefix = st1 /><?xml:namespace prefix = st1 /><?xml:namespace prefix = st1 />POJO 객체의경우에는파라미터가없는 get으로시작하는메소드에서 get제외한나머지메소드이름의첫번째단어를소문자로해서사용한다.

 

Book.java

 

public class Book {

 

private String isbn;

 

public Book(String isbn) {

this.isbn = isbn;

 

public void getIsbn() {

return this.isbn;

}

 

public void setIsbn(String isbn) {

this.isbn = isbn;

}

 

public String toString() {

return "book-object";

}

 

}

 

 

Example.jsp

 

Book book = new Book("100");

request.setAttribute("favoriteBook", book);

 

// toString 메소드가반환하는값을출력한다. book-object출력한다.

${favoriteBook}

 

// . 연산자를사용해서 getIsbn 메소드가반환하는값을출력한다. 100출력한다.

${favoriteBook.isbn}

 

// [] 연산자를사용해도결과는동일하다.

${favoriteBook['isbn']}

 

// 값이없는경우에 NullPointerException발생하지않는다.

${nullBook.isbn}

 

// 해당하는메소드가없는경우에는예외가발생한다.

${book.title}

 

배열객체는아래처럼사용한다.

 

Book[] books = new Book[2];

 

books[0] = new Book("100");

books[1] = new Book("200");

 

request.setAttribute("books", books);

 

// 100출력한다.

${books[0].isbn}

 

// 200출력한다.

${books[1].isbn}

 

java.util.Map 객체는아래처럼사용한다. 키의유형은항상 java.lang.String이어야한다.

 

Map map = new HashMap();

map.put("one", new Integer(1));

map.put("sub.one", new Integer(2));

 

request.setAttribute("numbers", map);

 

// . [] 연산자를모두사용할있다. 1출력한다.

${number.one}

${number['one']}

 

// 키가 . 등의문자를포함하면 [] 연산자를사용한다. 2출력한다.

${number['sub.one']}

 

// java.util.Map키가존재하지않아도예외가발생하지않는다.

${number.two}

 

(4)
연산자

EL에서아래의수치연산자를사용할있다.

연산자

설명

예제

결과

+

더하기

${10 + 2}

12

-

빼기

${10 - 2}

8

*

곱하기

${10 * 2}

20

/ 또는 div

나누기

${10 / 2} 또는 ${10 div 2}

5

% 또는 mod

나머지

${10 % 3} 또는 ${10 mod 3}

1


표 4.
EL 수치연산자

숫자형이아니면숫자형으로자동전환을후에연산을수행한다.

 

// 101아닌 11출력한다.

${"10" + 1}

 

// null 0으로처리한다. 1출력한다.

${null + 1}

 

// 숫자가아니면예외가발생한다.

${"" + 10}

 

EL제공하는비교논리연산자는아래와같다. >, < XML 태그와혼동할우려가있는연산자는문자열연산자(gt, lt)표현하는것을권장한다.

연산자

예제

결과

== 또는 eq

${5 == 5} 또는 ${5 eq 5}

true

!= 또는 ne

${5 != 5} 또는 ${5 ne 5}

false

< 또는 lt

${5 < 7} 또는 ${5 lt 7}

true

> 또는 gt

${5 > 7} 또는 ${5 gt 7}

false

<= 또는 le

${5 <= 5} 또는 ${5 le 5}

true

>= 또는 ge

${5 >= 6} 또는 ${5 ge 6}

false

&& 또는 and

${true && false} 또는 ${true and false}

false

|| 또는 or

${true || false} 또는 ${true or false}

true

! 또는 not

${!true} 또는 ${not true}

false

empty

${empty name}

name null이거나문자열이면 true

not empty

${not empty name}

name null아니고문자열도아니면 true


표 5.
EL 비교논리연산자

5.
core

(1)
c:out

객체를화면에출력한다.

 

// out.println(request.getAttribute("name"));

<c:out value="${name}"/>

 

// 값이없는경우에기본값을출력하려면 default 속성을이용한다.

<c:out value="${age}" default="값이없습니다."/>

 

// 기본적으로 XML 문자를 escape한다. Escape 하지않으려면 escapeXml false한다.

<c:out value="${name}" escapeXml="false"/>

 

(2)
c:set

저장영역에객체를저장한다.

 

// request.setAttribute("name", "<?xml:namespace prefix = st2 ns = "urn:schemas:contacts" /><?xml:namespace prefix = st2 /><?xml:namespace prefix = st2 /><?xml:namespace prefix = st2 />태섭");

// scope 속성으로는 page(기본), request, session, application사용.

<c:set scope="request" var="name" value="송태섭"/>

 

// Book book = (Book) request.getAttribute("book");

// book.setIsbn("300");

<c:set scope="request" target="book" property="isbn" value="300"/>

 

(3)
c:remove

저장영역에서객체를삭제한다.

 

// request.removeAttribute("name");

<c:remove scope="request" var="name"/>

 

(4)
c:if

조건문을제어한다.

 

// test 속성의값이 true c:if 태그의 body 내용을수행한다.

<c:if test="${not empty flag}">

flag존재하면영역을수행한다.

</c:if>

 

(5)
c:choose, c:when, c:otherwise

복합조건문을제어한다.

 

// c:choose 태그는 1이상의 c:when 태그와 0 또는 1개의 c:otherwise 태그로구성

<c:choose>

<c:when test="${flag == 1}">

flag 1이면영역을수행한다.

</c:when>

<c:when test="${flag == 2}">

flag 2이면영역을수행한다.

</c:when>

<c:otherwise>

flag 1 2아니면영역을수행한다.

</c:otherwise>

</c:choose>

 

(6)
c:forEach

반복문을수행한다.

 

<%

for (int i = 0; i < 10; i++) {

out.println(i);

}

%>

 

// 0 1 2 3 4 5 6 7 8 9출력한다.

<c:forEach begin="0" end="9" var="i">

<c:out value="${i}"/>

</c:forEach>

 

step 속성으로간격을조정한다.

 

<%

for (int i = 0; i < 10; i += 2) {

out.println(i);

}

%>

 

// 0 2 4 6 8출력한다.

<c:forEach begin="0" end="9" step="2" var="i">

<c:out value="${i}"/>

</c:forEach>

 

java.util.Collection 객체나배열에대해서는아래처럼한다.

 

<%

Collection books = (Collection) request.getAttribute("books");

for (Iterator all = books.iterator(); all.hasNext();) {

Book each = (Book) all.next();

out.println(each.getIsbn());

}

%>

 

<c:forEach items="${books}" var="book">

<c:out value="${book.isbn}"/>

</c:forEach>

 

items 속성값으로기본타입의배열, java.util.Collection, java.util.Map, java.util.Iterator, java.util.Enumeration, java.lang.Object 배열, 콤마로이루어진 java.lang.String 등의객체를사용할있다.

java.util.Map 객체는아래처럼사용한다.

 

<%

Map books = new HashMap();

books.put("one", new Book("100"));

books.put("two", new Book("200"));

request.setAttribute("books", books);

%>

 

// one 100 two 200출력한다. (순서는정확하지않다.)

<c:forEach items="${books}" var="book">

<c:out value="${book.key}"/>

<c:out value="${book.value.isbn}"/>

</c:forEach>

 

(7)
c:forTokens

구분자로반복문을수행한다.

 

//1 2 3 4출력한다.

<c:forTokens delims="," items="1,2,3,4" var="i">

<c:out value="${i}"/>

</c:forTokens>

 

begin, end, step 속성으로시작위치, 종료위치, 간격을조정한다.

(8)
c:
url, c:param

URL처리한다.

 

// UserForm.jsp출력한다.

<c:url value="UserForm.jsp"/>

 

// value 속성값이 /시작하면컨텍스트를포함한다.

// 컨텍스트를 web으로가정하면 /web/UserForm.jsp출력한다.

<c:url value="/UserForm.jsp"/>

 

// 다른컨텍스트를사용하려면 context 속성을사용한다.

// 때는 value context 속성의값이모두 /시작해야한다.

// /other/UserForm.jsp출력한다.

<c:url value="/UserForm.jsp" context="/other"/>

 

 

scope var 속성을이용해서 URL화면에출력하지않고 JSP 영역에저장할있다.

c:param 태그를이용해서 Query String URL추가한다.

 

// 파라미터값을 escape한다. 따라서

// UserForm.jsp?name=%EC%A0%95%EB%8C%80%EB%A7%8C출력한다.

<c:url value="UserForm.jsp">

<c:param name="name" value="성선임"/>

</c:url>

 

c:param 태그는 c:import c:redirect 태그에서도동일한방법으로사용한다.

(9)
c:import

특정 JSP내용을화면에포함해서출력한다.

 

// UserForm.jsp내용을화면에포함하여출력한다.

<c:import url="UserForm.jsp"/>

 

데이터인코딩에문제가있으면 charEncoding 속성을사용한다.

<c:import url="UserForm.jsp" charEncoding="UTF-8"/>

 

// context 속성을이용하면다른어플리케이션의 JSP포함할있다.

<c:import url="/UserForm.jsp" charEncoding="UTF-8" context="/other"/>

 

var varReader 속성을이용하면내용을화면에출력하지않고변수에저장할있다.

(10)
c:redirect

다른경로로이동한다.

 

// 앞에데이터를브라우저에전송하는코드가없어야한다.

<c:redirect url="http://www.naver.com"/>

 

(11)
c:catch

예외를처리한다.

 

// var 속성값으로발생한예외객체를 page 영역에저장한다.

<c:catch var="e">

<%

if (true) throw new RuntimeException();

%>

</c:catch>

 

<c:out value="${e}"/>

 

6.
참고
자료

 
The J2EE 1.3 Tutorialhttp://java.sun.com/j2ee/1.3/docs/tutorial/doc/index.html

 
The J2EE 1.4 Tutorialhttp://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html

 
JSTL in Action

 
JSTL 1.0 Specificationhttp://jcp.org/aboutJava/communityprocess/final/jsr052

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,

Auto Wire...


스프링은 네 가지 자동 연결 모드를 제공한다. byName, byType, constructor, autodetect가 있다

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="
  5.                 http://www.springframework.org/schema/beans
  6.                 http://www.springframework.org/schema/beans/spring-beans.xsd">

  7. <bean id="foo" class="com.apress.prospring2.ch03.autowiring.Foo" />
  8. <bean id="bar" class="com.apress.prospring2.ch03.autowiring.Bar" />

  9. <bean id="byName" autowire="byName"class="com.apress.prospring2.ch03.autowiring.Target" />
  10. <bean id="byType" autowire="byType"class="com.apress.prospring2.ch03.autowiring.Target" />
  11. <bean id="constructor" autowire="constructor"class="com.apress.prospring2.ch03.autowiring.Target" />
  12. <bean id="autodetect" autowire="autodetect"class="com.apress.prospring2.ch03.autowiring.Target" />

  13. </beans>

 

1) byname연결을 사용하면 스프링은 각 속성과 같은 이름을 가진 빈과 연결을 시도한다. 그러므로 만약 타겟 빈이 foo 라는 속성을 가지고 있고 foo라는 빈이 빈팩토리에 정의되어 있다면 foo 빈은 타겟의 foo 속성에 할당된다.

( 즉 위의 xml처럼 foo,bar가 있고 byName bean이 byName 연결을 사용할경우 Target에 정의된 foo,bar에 할당된다 )

 

2) byType자동 연결을 사용하면 스프링은 빈팩토리에 내부에 타겟 빈의 각 속성의 타입과 같은 타입의 빈으로 연결을 시도한다. 따라서 만약 String 타입 속성을 가진 타겟 빈이 있고 해당 빈팩토리에String 타입 빈이 있다면 스프링은 String 빈을 타겟 빈의 String 타입 속성에 주입할 것이다. 만약 같은 빈팩토리 내부에 같은 타입의 빈이 둘 이상이라면 즉 이 경우에 String 타입 빈이 여러 개면, 스플링은 어떤 것을 자동으로 연결할지 판단할 수 없기 때문에 예외를 발생 시킨다

 

3) constructor연결 모드는 byType 연결과 비슷하지만 주입을 할 때 세터가 아닌 생성자를 사용한다.스프링은 인자 수가 가장 많은 생성자에 대응을 시도한다. 따라서 만약 두 개의 생성자가 있는 데 하나는 String 타입 하나를 받고 다른 하나는 StringInteger를 받고 빈팩토리에 StringInteger 타입의 빈이 스프링은 두 개의 인자를 가지고 있는 생성자를 사용할 것이다.

 

4) autodetect는 스프링이 constructorbyType 모드를 자동으로 선택하게 한다. 만약 빈이 (인자가 없는)기본 생성자를 가지고 있다면 스프링은 byType을 사용하고 그렇지 않으면 constructor 방식을 사용한다

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,

아이폰을 산지 4일.. 주말을 이용해서 엄청나게 쪼물락댔더랬습니다....

아무리 가지고 놀아도… 역시 아이폰..(좀 쩔어주시네요..)


 

누구나 그렇지만.. 가장 큰 문제에 봉착했습니다..

탈옥(JailBreak)…. 참을 수 없는 유혹…. 탈옥.. 그거슨 진리인가..

다른건 몰라도.. 가장 끌리는건 테마와.. 크랙 어플..-_-;

탈옥의 많은 장단점을 찾아본결과… 많~은 좋은점과

몇 개 안되는 나쁜점이 있으니.. 비율로 따지자면 하는게 좋지만..

나쁜점이 큰 비중을 차지한다는…ㅆㅂ.. 꺼지면 컴터없이 못키는..

탈옥에 실패할경우 캐고생할수도..

 

아이폰 탈옥은 아직 불완전하니.. 좀더 기다려보라는 얘기가 많다..

풍부해지는 어플(+@ 기타기능), 뽠타스틱한 테마 Vs 초귀차니즘 부팅, No 인터넷뱅킹

아……. 고민이로세….

그나저나.. 그나마 끄적여보는 보스팅..ㅋㅋ 최근 나영님, Non님 블록을 눈팅하며

구색만 갖춰봤는뎀… 재미는 있네..ㅎㅎ 글솜씨가 없어서 나원….-_-;;

Posted by 이버리
,

보험합의요령

기타등등 2009. 12. 17. 16:32

보험합의요령.jpg

 

보험합의요령2.jpg

 

 

보험합의요령(1).jpg

보험합의요령2(1).jpg

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 이버리
,

캬하하하하하~~~~~~

Posted by 이버리
,