SqlMapClientTemplate 의 내부

spring framework 2013.02.01 10:16 posted by dev.bistro


Source Link


public int delete(final String statementName, final Object parameterObject)

throws DataAccessException {


return execute(new SqlMapClientCallback<Integer>() {

public Integer doInSqlMapClient(SqlMapExecutor executor) throws SQLException {

return executor.delete(statementName, parameterObject);

}

});

}




1. 모든 처리를  public execute 메소드가 위임 받는다.

2. public execute 는SqlMapClientCallback<T> action 를 argument로 받는다.

3. delete, queryForObject 등의 위임을 하는 펑션들은 콜백 펑션을 선언해서 execute를 실행한다.

4. 실제적으로 executor 은 SqlMapClientTemplate에 DI된 sqpMapClient에서 가져와 쓰여진다.


이정도가.. 기본 로직인거고.

1. execute가 적절한 예외처리를 해줌으로서 Exception에 대한 부담이 줄어든다.

2. 적절한 공통코드를 알아서 처리해준다(close같은..)

SqlMapClientTemplate은 여러이유에서 SqlMapClient를 래핑한 Helper 클래스 이다.

템플릿 패턴의 모범적인 적용사례(?)

DefaultServletHttpRequestHandler

spring framework 2013.02.01 09:22 posted by dev.bistro


Source Link

anyframe document Link


* @author Jeremy Grelle 

* @author Juergen Hoeller 

* @since 3.0.4


public void handleRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {


RequestDispatcher rd = this.servletContext.getNamedDispatcher(this.defaultServletName);

if (rd == null) {

throw new IllegalStateException("A RequestDispatcher could not be located for the default servlet '" +

this.defaultServletName +"'");

}

rd.forward(request, response);

}


<mvc:default-servlet-handler/> 의 실제 구현체, DispatcherServlet이 제어하지 못하는 리소스를 만나면, 서버의 디폴트 서블릿으로 요청을 넘긴다. 



Play of Scala - import 의 위치

play framework 2013.01.30 16:10 posted by dev.bistro



package controllers
import play.api.mvc.{ Action, Controller }

object Barcodes extends Controller {
  val ImageResolution = 144
  def barcode(ean: Long) = Action {
    import java.lang.IllegalArgumentException
    val MimeType = "image/png"
    try {
      val imageData = ean13BarCode(ean, MimeType)
      Ok(imageData).as(MimeType)
    } catch {
      case e: IllegalArgumentException =>
        BadRequest("Couldn’t generate bar code. Error: " + e.getMessage)
    }
  }
  
  def ean13BarCode(ean: Long, mimeType: String): Array[Byte] = {
    import java.io.ByteArrayOutputStream
    import java.awt.image.BufferedImage
    import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider
    import org.krysalis.barcode4j.impl.upcean.EAN13Bean
    val output: ByteArrayOutputStream = new ByteArrayOutputStream
    val canvas: BitmapCanvasProvider =
      new BitmapCanvasProvider(output, mimeType, ImageResolution,
        BufferedImage.TYPE_BYTE_BINARY, false, 0)
    val barcode = new EAN13Bean()
    barcode.generateBarcode(canvas, String valueOf ean)
    canvas.finish
    output.toByteArray
  }
}


1. import 는 scope을 가진다.  - 펑션 ean13BarCode의 import를 다른 펑션에 위치하면 에러!

2. import 는 사용하기 이전에 선언되어야 한다. 펑션 ean13BarCode의 import를 아래쪽에 위치하면 에러!

3. import를 def '최하단 펑션밖에 선언해도 에러!' - 이건 자바랑 똑같네.

4. barcode의 IllegalArgumentException 는 예외가 발생안하면 import 없어도 no에러! (-_-?)


ps. 또 play하다 scala로 빠진다~ (전에도 ...)

TAG import, play


티스토리 툴바