Apache Velocity 소개

1. 개요

Velocity는 Java 기반 템플릿 엔진입니다.

MVC 아키텍처에서보기 구성 요소로 사용하도록 설계된 오픈 소스 웹 프레임 워크이며 JSP와 같은 기존 기술에 대한 대안을 제공합니다.

Velocity는 XML 파일, SQL, PostScript 및 대부분의 기타 텍스트 기반 형식을 생성하는 데 사용할 수 있습니다.

이 기사에서는 동적 웹 페이지를 만드는 데 사용할 수있는 방법을 살펴 봅니다.

2. Velocity의 작동 원리

속도의 핵심 클래스는이다 VelocityEngine .

데이터 모델 및 속도 템플릿을 사용하여 콘텐츠를 읽고, 구문 분석하고, 생성하는 전체 프로세스를 조정합니다.

간단히 말해서, 일반적인 속도 애플리케이션을 위해 따라야 할 단계는 다음과 같습니다.

  • 속도 엔진 초기화
  • 템플릿 읽기
  • 컨텍스트 개체에 데이터 모델 배치
  • 템플릿을 컨텍스트 데이터와 병합하고 뷰 렌더링

다음과 같은 간단한 단계에 따라 예제를 살펴 보겠습니다 .

VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.init(); Template t = velocityEngine.getTemplate("index.vm"); VelocityContext context = new VelocityContext(); context.put("name", "World"); StringWriter writer = new StringWriter(); t.merge( context, writer );

3. Maven 종속성

Velocity로 작업하려면 Maven 프로젝트에 다음 종속성을 추가해야합니다.

 org.apache.velocity velocity 1.7   org.apache.velocity velocity-tools 2.0 

이 두 종속성의 최신 버전은 속도 및 속도 도구입니다.

4. 속도 템플릿 언어

VTL (Velocity Template Language)은 VTL 참조를 사용하여 웹 페이지에 동적 콘텐츠를 통합하는 가장 간단하고 깔끔한 방법을 제공합니다.

속도 템플릿의 VTL 참조는 $로 시작 하며 해당 참조와 관련된 값을 가져 오는 데 사용됩니다. VTL은 Java 코드의 출력을 조작하는 데 사용할 수있는 지시문 세트도 제공합니다. 이러한 지시문은 #으로 시작 합니다.

4.1. 참고 문헌

Velocity, 변수, 속성 및 메서드에는 세 가지 유형의 참조가 있습니다.

  • 변수#set 지시문 또는 Java 객체의 필드에서 반환 된 값을 사용하여 페이지 내에서 정의됩니다 .
    #set ($message="Hello World")
  • 속성 – 개체 내의 필드를 참조합니다. 속성 의 getter 메서드를 참조 할 수도 있습니다.
    $customer.name
  • 메소드 – Java 객체의 메소드 참조 :
    $customer.getName()

모든 참조에서 생성 된 최종 값은 최종 출력으로 렌더링 될 때 문자열로 변환됩니다.

4.2. 지시어

VTL은 다양한 지시문을 제공합니다.

  • set – 참조 값을 설정하는 데 사용할 수 있습니다. 이 값은 변수 또는 속성 참조에 할당 할 수 있습니다.
    #set ($message = "Hello World") #set ($customer.name = "Brian Mcdonald")
  • 조건부#if, #elseif#else 지시문은 조건부 검사를 기반으로 콘텐츠를 생성하는 방법을 제공합니다.
    #if($employee.designation == "Manager") 

    Manager

    #elseif($employee.designation == "Senior Developer")

    Senior Software Engineer

    #else

    Trainee

    #end
  • loops#foreach 지시문은 개체 컬렉션에 대한 반복을 허용합니다.
    
          
      #foreach($product in $productList)
    • $product
    • #end
  • include#include 요소는 파일을 템플릿으로 가져 오는 기능을 제공합니다.
    #include("one.gif","two.txt","three.html"...)
  • parse#parse 문을 사용하면 템플릿 디자이너가 VTL이 포함 된 다른 로컬 파일을 가져올 수 있습니다. 그러면 Velocity는 콘텐츠를 구문 분석하고 렌더링합니다.
    #parse (Template)
  • evaluate#evaluate directive can be used to evaluate VTL dynamically; this allows the template to evaluate a String at render time, for example to internationalise the template:
    #set($firstName = "David") #set($lastName = "Johnson") #set($dynamicsource = "$firstName$lastName") #evaluate($dynamicsource)
  • break#break directive stops any further rendering of current execution scope (i.e. #foreach, #parse)
  • stop#stop directive stops any further rendering and execution of the template.
  • velocimacros#macro directive allows the template designer to define a repeated segment of VTL:
    #macro(tablerows)  #end

    This macro now can be put in any place in the template as #tablerows():

    #macro(tablerows $color $productList) #foreach($product in $productList) $product.name #end #end

4.3. Other Features

  • math – a handful built-in mathematical functions, which can be used in templates:
    #set($percent = $number / 100) #set($remainder = $dividend % $divisor)
  • range operator – that can be used in conjunction with #set and #foreach:
    #set($array = [0..10]) #foreach($elem in $arr) $elem #end

5. Velocity Servlet

The primary job of the Velocity Engine is to generate content based on a template.

The Engine doesn't contain any web related functionalities in itself. To implement a web application, we need to use a servlet or servlet-based framework.

Velocity provides one out of the box implementation VelocityViewServlet, which is a part of the velocity-tools subproject.

To make use of the built-in functionality provided by VelocityViewServlet, we can extend our servlet from VelocityViewServlet and override the handleRequest() method:

public class ProductServlet extends VelocityViewServlet { ProductService service = new ProductService(); @Override public Template handleRequest( HttpServletRequest request, HttpServletResponse response, Context context) throws Exception { List products = service.getProducts(); context.put("products", products); return getTemplate("index.vm"); } }

6. Configuration

6.1. Web Configuration

Let's now see how to configure the VelocityViewServlet in the web.xml.

We need to specify the optional initialization parameters which include velocity.properties and toolbox.xml:

 apache-velocity //...  velocity org.apache.velocity.tools.view.VelocityViewServlet  org.apache.velocity.properties /WEB-INF/velocity.properties   //...  

We also need to specify the mapping for this servlet. All the requests for velocity templates (*.vm) need to be served by the velocity servlet:

 velocityLayout *.vm 

6.2. Resource Loader

Velocity provides flexible resource loader system. It allows one or more resource loader to be in operation at the same time:

  • FileResourceLoader
  • JarResourceLoader
  • ClassPathResourceLoader
  • URLResourceLoader
  • DataSourceResourceLoader
  • WebappResourceLoader

These resource loaders are configured in velocity.properties:

resource.loader=webapp webapp.resource.loader.class=org.apache.velocity.tools.view.WebappResourceLoader webapp.resource.loader.path = webapp.resource.loader.cache = true

7. Velocity Template

Velocity template is the place where all the view generation logic is written. These pages are written using Velocity Template Language (VTL):

 ...   ... 

$products.size() Products on Sale!

We are proud to offer these fine products at these amazing prices. ... #set( $count = 1 )

#foreach( $product in $products ) #set( $count = $count + 1 ) #end
Serial # Product Name Price
$count) $product.getName() $product.getPrice()

8. Managing the Page Layout

Velocity provides a simple layout control and customizable error screens for Velocity Tool based application.

VelocityLayoutServlet encapsulates this capability to render the specified layouts. VelocityLayoutServlet is an extension to VelocityViewServlet.

8.1. Web Configuration

Let's see how to configure the VelocityLayoutServlet. The servlet is defined for intercepting the requests for velocity template pages and the layout specific properties are defined in velocity.properties file:

 // ...  velocityLayout org.apache.velocity.tools.view.VelocityLayoutServlet  org.apache.velocity.properties /WEB-INF/velocity.properties   // ...  velocityLayout *.vm  // ... 

8.2. Layout Templates

Layout template defines the typical structure of a velocity page. By default, the VelocityLayoutServlet searches for Default.vm under the layout folder. Overriding few properties can change this location:

tools.view.servlet.layout.directory = layout/ tools.view.servlet.layout.default.template = Default.vm 

The layout file consists of header template, footer template, and a velocity variable $screen_content which renders the contents of requested velocity page:

  Velocity #parse("/fragments/header.vm") $screen_content #parse("/fragments/footer.vm") 

8.3. Layout Specification in the Requested Screen

Layout for a particular screen can be defined as a velocity variable at the beginning of a page. That is done by putting this line in the page:

#set($layout = "MyOtherLayout.vm")

8.4. Layout Specification in the Request Parameter

We can add a request parameter in the query string layout=MyOtherLayout.vm and VLS will find it and render the screen within that layout instead of searching for default layout.

8.5. Error Screens

Customized error screen can be implemented using velocity layout. VelocityLayoutServlet provides two variables $error_cause and $stack_trace to present the exception details.

Error page can be configured in velocity.properties file:

tools.view.servlet.error.template = Error.vm

9. Conclusion

이 기사에서는 Velocity가 어떻게 동적 웹 페이지를 렌더링하는 데 유용한 도구인지 배웠습니다. 또한 속도 제공 서블릿을 사용하는 다양한 방법을 보았습니다.

또한 여기 Baeldung에서 Spring MVC를 사용한 Velocity 구성에 초점을 맞춘 기사가 있습니다.

이 자습서의 전체 코드는 GitHub에서 사용할 수 있습니다.