2009년 9월 12일 토요일

[freemarker]주요 BI

freemarker reference : http://freemarker.sourceforge.net/docs/index.html
Built-in Reference : http://freemarker.sourceforge.net/docs/ref_builtins.html

레퍼런스 문서 정말 잘 되있다.
필요한건 위의 링크 타고 보면 되고 그외
필요하고 자주 쓰는 것만 따로 뽑았다.

list 관련

_index
- for문(<#list ..>) 돌리다 보면 이게 몇번째인지 궁금할 수 있다.
  한 row에 4개씩 보여 줘야 한다든지 할때 alias로 할당된 변수에 "_index"붙이면
  sequence를 구할 수 있다.  
- 예 :
   <#list array as output>
        ${output_index}
   </#list>

_has_next
- 배열값 중에 다음 값이 존재하는지 여부를 반환한다.
- 예 :
   <#list array as output>
        ${output_index}
        <#if output_has_next></tr></#if>
   </#list>


문자열 관련 

[x...y]
- 문자열의 일정 범위를 자를때 사용하는 함수
- 예 :
-----------------------------
  ${hello}<br>
  ${hello[1..4]}<br>
  ${hello?substring(1,4)}<br>
-----------------------------
null님 안녕하세요
ull님
ull
-----------------------------
substring과는 조금 다른 결과를 확인할 수 있다.


null 처리 관련

?has_content
- 배열값이 null이 아니고 1개 이상인지 체크하는 함수
  ?exists와 ?size>0 두가지 기능을 포함한다.
- 예 :
 <#if array?has_content>
    ... 처리
 </#if>

?exists
- null 체크
- 예 :
 <#if user?exists>
    ... 처리
 </#if>

?default
- 오브젝트의 값이 null인 경우 입력된 사용자값을 반환한다.
- 예 :
  ${user?default("")}


!"대체값"
- 만약 값이 없다면 ! 값 뒤에 정의된 값이 할당된다.
- 예 :
${hello!'안녕하세요'}
이렇게 하면 값이 없으면 "안녕하세요"가 찍힌다.

??
- null 여부에 따라 true, false 반환
- 예 :
<#if user??>${user}<#else>사용자</#if>
${user!"사용자"} 이것과 동일한 결과를 반환한다.

[freemarker]boolean 값 처리


    @RequestMapping("/test/test1.gs")
    public ModelAndView test1(@ModelAttribute("kkaok") TestDto testDto, Test2Dto test2Dto, BindingResult errors) throws Exception {
        ModelAndView mav = new ModelAndView("/test/test1");
        boolean testBoolean = true;
        mav.addObject("testBoolean", testBoolean);
        return mav;
    }

서버단에서 아래처럼 값을 내려 준다고 할때

${testBoolean}

이렇게 하면 에러가 난다.

${testBoolean?string}


이런식이어야 하는데 조건에 따라 다른 값을 보여 줘야 한다면?

${testBoolean?string("니가 맞아^^","내가 틀릴줄 알았다!!!")}


굳이 조건문이 들어 갈 필요가 없다.


그외
$(booleaValue?string) 이렇게 하면 기본 값은 true, false이다. 두개의 값은 comma로 구분되며
이 기본 값을 바꿀 수도 있다.
<#setting boolean_format = "good,bad">

이렇게 상단에 설정을 해 주고
${testBoolean?string} 이렇게 하면 화면에 보이는 결과는 good이 찍히게 된다.
전체 페이지에 필요하다면 공통으로 뽑아서 include하면된다.
전체에 쓰는데 굳이 include하고 싶지 않다면 시스템 설정에 추가해주면된다.

 <!-- freemarker config -->
 <bean
  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/templates" />
  <property name="freemarkerSettings">
   <props>
    <prop key="number_format">###.###</prop>
    <prop key="date_format">yyyy-MM-dd</prop>
    <prop key="boolean_format">yes,no</prop>
      </props>
  </property>
 </bean>

[freemarker] null처리

ftl파일에 아래 같은 내용을 코딩한다.

${hello}

hello에 값이 있다면 그 값을 뿌려준다. ^^
정상~~~

에러상황 : hello 자체를 서버단에서 내려 주지 않았거나 값이 null이라면?
 
freemarker에서는 request에 담긴 값을 map에 담아서 내려주는데 값이 없으면 아예 담지를 않는다.
따라서 key가 없으니 에러가 날 수 밖에 없다.

The problematic instruction:
----------
==> ${x} [on line 6, column 1 in test/test1.ftl]
----------

이때는 아래처럼 처리하면 된다.

${hello!'안녕하세요'}

이렇게 하면 값이 없으면 "안녕하세요"가 찍힌다.

그외 추가

<#if user??><h1>Welcome ${user}!</h1><#else>사용자</#if>
${user!"사용자"}

두개의 결과물은 같다 ^^

[spring] 파일업로드 크기 제한.

스프링에서 파일 업로드시 업로드되는 파일을 크기를 appilicationContext.xml 설정파일로서 제한 할 수가 있다.

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <property name="maxUploadSize"> <value>5242880</value> </property> <property name="defaultEncoding"> <value>EUC-KR</value> </property> </bean>

  위와 같이 maxUploadSize 를 설정하므로서 제한이 가능하며, 이 제한을 넘어가면 org.springframework.web.multipart.MaxUploadSizeExceededException 이 발생된다. 이때의 문제는 해당에러가 스프링단에서 발생되므로 해당 내용이 Controller까지 전달되지 못하며, 그로인해 Exception을 제어 할 수 없게 된다.

  이 문제는 아래와 같이 exceptionResolver를 설정해주므로서 제어 가능하다.

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException"> /error/imgUploadErr </prop> </props> </property> </bean>

  위 경우엔 MaxUploadSizeExceededException 이 발생하면 /error/ 경로의 imgUploadErr라는 view 페이지로 forward 된다는 의미이다. 이 페이지를 통해 적절한 에러 메시지를 노출시켜주므로서 파일업로드시 용량제한으로 발생되는 Exception을 제어 할 수 있게 된다.

[freemaker] jsp freemaker tag

freemarker 설명 및 기본 예제

# 이 문서는 오라클클럽에서 작성하였습니다.
# 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
# 출처 : http://wiki.oracleclub.com/pages/viewpage.action?pageId=1343682&



1 FreeMarker 란?

  • 프리마커는 자바 서블릿을 위한 오픈소스 HTML 템플릿 엔진이다.
  • 프리마커에서는 HTML을 템플릿으로 저장하는데 이들은 결국 템플릿 객체로 컴파일 된다.
  • 이 템플릿 객체들은 서블리셍서 제공하는 데이터들을 이용하여 HTML을 동적으로 생성한다.
  • 프리마커 객체들은 서블릿에서 제공하는 데이터들을 이용하여 HTML을 동적으로 생성한다.
    [*.java]Servlet \+Template[*.ftl] = [*.html]Output

2 FreeMarker 구조

  • FreeMarker는 표현의 결과물을 HTML(템플릿)로 관리하고 여기에 자바 객체를 연결하여 최종적인 결과를 만들어낸다.

3 FreeMarker 셋팅

3.1 다운로드

3.2 설치

  • freemarker.jar 파일을 WEB-INF/lib 안에 넣는다.
  • ecilpse에서는 프로젝트 마다 lib안에 import 시킨다.

3.3 Java 코딩시

import freemarker.template.*;
  • FreemarkerServlet를 extends 한 후 Java coding 해주면 된다.

4 FreeMaker 문법

  • FreeMarker의 메뉴얼 : http://www.freemarker.org/docs/
    FTL tag 
    <# > 
    
    
    주석 
    <#--주석달기--> 
    
    
    반복문 
    1. 
    <#list [Object code에서 key값 ]  as  [별칭할 값]> 
     
    2. for(int i=0;i<10;i++)
    <#list  1..10  as i > 
          ${i}
       <#assign i=i+1?int>
     
    3. 사이즈를 알고 싶을때.. Key 값이 list 인 경우
     
    <#assign size=list?size>
     
    4. 다른 변수로 정의하고 싶을때에는 
    <#setting [새로]=[기존]>
    
     
    5. 변수선언 
    
    <#assign x=0>   <#--x에 0를 할당해 준것이다. --> 
    x값을 출력하고자 할때 --> ${x} 
    
    
    6. <#macro green> 
    "<@green>"이런식으로 쓴다. 
    주로 변하지 않는 변수를 이렇게 선언해서 쓴다. 
     
    7. 조건문 
    <#if> 
     
    8. int형으로 선언해 주고 싶은때에는
    <#assign x=0 ? int>
    
    

5 FreeMarker 예제

5.1 TLD 파일

  • fmtag.tld (WEB-INF 아래 위치)
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE taglib
          PUBLIC "-Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
          "http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">
    <taglib>
      <tlibversion>2.0<.tlibversion>
      <jspversion>1.1</jspversion>
      <shortname>FreeMarker JSP Support</shortname>
    
      <tag>
       <name>template</name>
       <tagclass>freemarker.ext.jsp.FreemarkerTag</tagclass>
       <bodycontent>tagdependent</bodycontent>
       <info>Allow evaluation of FreeMarker templates inside JSP</info>
       <attribute>
        <name>cashing</name>
        <required>false</required>
       </attribute>
      </tag>
    </taglib>
    

5.2 java 파일

  • SimpleBean.java (WEB-INF/classes/freemarker/examples/jsp)
  • Custom Tag 수행을 위한 Tag Handler Class
    package freemarker.examples.jsp;
    
    public class SimpleBean
    {
      private static String[] arr = {"a","b","c","d"};
      private String theString = "Hello from " + toString();
    
      public void setString(String foo)
      {
        theString = foo;
      }
    
      public String getString()
      {
        return theString;
      }
    
      public String[] getArray()
      {
        return arr;
      }
    }
    

5.3 jsp 파일

  • freemarker2.jsp (View 파일)
    <%@ page contentType="text/html; charset=euc-kr" %>
    <%@ taglib uri="/WEB-INF/fmtag.tld" prefix="fm" %>
    
    <jsp:useBean id="mybean" class="freemarker.examples.jsp.SimpleBean"/>
    <jsp:useBean id="mybeanreq" class="freemarker.examples.jsp.SimpleBean" scope="request" />
    
    <fm:template>
    <html>
    <body>
     <h1>FreeMarker JSP example</h1>
     <hr>
     <p>JSP 페이지</p>
    
     <#assign mybean = page.mybean>
     <#assign mybeanreq = request.mybeanreq>
    
     <p>page : ${mybean.string}
     <#list mybean.array as item>
      <br>${item}
     </#list>
    
     <p><b>Note:</b>
    </body>
    </html>
    </fm.template>
    


Freemaker를 쓰다가 잘 생기는 오류...[펌글]


태생이 JSP 개발자라 그런지 원치는 않았지만 Spring Framework + Sitemesh + Freemaker 를 이용한 프로젝트에 참여후 SM 일을 보고 있습니다.

JSP때도 오류(버그)는 발생하는 일이지만 Freemaker의 경우 좀 더 자주 발생하는 듯 합니다.

Freemaker를 쓰며 자주 발생하는 에러를 모아봤습니다.

1. Null 체크를 하지 않는 경우

특정 객체에 담긴 값을 꺼내 쓰는 경우, 주로 DTO에 담긴 값을 꺼내 쓰는 경우가 많습니다., Null값을 체크하지 않는 경우가 많습니다. JSP 개발시엔 그래도 많은 사람들이 경험을 통해 객체의 Null 여부를 체크하는 경우가 많지만 Freemaker를 쓰면서는 이걸 빼먹는 경우가 많습니다.

객체의 담긴 값을 쓸때는 다음의 Null 값 체크를 꼭 하셔야 합니다.

<#if myObject.value?exists>
    //.... 뭔가를 수행 ....
</#if>

2. int 또는 long 등의 Number 타입의 값을 사용하는 경우

제가 Freemaker 전문은 아니라 이게 Default인지 설정인지는 모르겠으나, 찾아봐야겠네요. 이번기회에..., Number 타입의 값이 1000을 넘어서면 자동으로 콤마(,)가 찍힙니다. 1,000 이런식으로 말이죠. 이때 테이블이나 id값등을 숫자로 사용하는 경우 해당 값에 콤마가 찍힌채로 넘어가게 되어 NumberFormatException 등이 발생하거나 테이블 SELECT 시 값이 나오지 않는 경우가 발생합니다.

차라리 에러라도 나면 찾으련만 단순히 SELECT 값이 나오지 않는 경우 처음엔 원인을 찾느라 시간을 많이 허비했습니다.(요즘은 딱 보면... 감이 오긴 합니다.)

이때는 ${myObject.value?string("##0")} 혹은 ${myObject.value?string.number} 등으로 콤마를 표시하지 않을 수 있습니다.

확인 해봐야 겠지만 설정으로 한번에 고칠 수 있다면 편하겠죠. 하지만 장점도 있습니다. 쇼핑몰 같은 경우 빈번한 가격표시를 해야할때 Number 타입의 값을 콤마를 찍지 않고도 간편히 표시할 수 있다는 점이죠.


약 2-3달여 SM 업무를 하며 많이 발생한 오류가 저 두가지 인듯 합니다. 특히 10여명이 넘는 많은 인원들이 빠른시간내에 개발해야하는 IT 프로젝트 특성상 한두개 테스트 하는 경우엔 값이 나오니 빼놓는 경우가 많은 듯 합니다. 

2009년 9월 6일 일요일

[Struts] SSL Extention

内部でSessionを使う場合があるようだ。getSessionで検索。

などに含まれる。


リダイレクト時の条件判定に気になるコメントが。

// Must also check ports, because of IE multiple redirect problem
if (!desiredScheme.equals(usingScheme) || !desiredPort.equals(usingPort))

IE multiple redirect problemって何だろう? コードを見た感じ、IEスキームが正しく設定されない場合がある?CVSを見ると最初からこのコードがある。