STACKJAVA

Spring MVC – Phần 12: Apache Tiles là gì? Ví dụ Spring MVC Tiles

Spring MVC – Phần 12: Apache Tiles là gì? Ví dụ Spring MVC Tiles

1. Apache Tiles là gì?

Apache Tiles là một framework/engine thực hiện việc tạo template.

Apache Tiles là một mã nguồn mở phát triển bởi apache, được xây dựng để đơn giản hóa việc phát triển các ứng dụng web, đặc biệt là với mô hình MVC.

Apache Tiles dựa trên Design Pattern: Composite Pattern.

Apache Tiles sẽ tách nhỏ các phần, và sử dụng lại chúng, ví dụ:

Xem lại: Apache Tiles là gì? Code Ví dụ với JSP Servlet

2. Spring MVC Tiles

Thư viện sử dụng:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>SpringMVCTiles</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-extras</artifactId>
      <version>3.0.8</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>javax.servlet.jsp.jstl-api</artifactId>
      <version>1.2.1</version>
    </dependency>

  </dependencies>
</project>

File cấu hình spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

  <context:component-scan base-package="stackjava.com.springmvctiles" />

  <!-- <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
      <value>/WEB-INF/views/jsp/</value>
    </property>
    <property name="suffix">
      <value>.jsp</value>
    </property>
  </bean> -->

  <!-- mapping các template tiles -->
  <bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
      value="org.springframework.web.servlet.view.tiles3.TilesView" />
  </bean>

  <bean id="tilesConfigurer"
    class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
      <list>
        <!-- khai báo các file định nghĩa layout -->
        <value>/WEB-INF/tiles.xml</value>
      </list>
    </property>
  </bean>

</beans>

Khác với việc sử dụng apache tiles với JSP Servlet thuần, khi sử dụng Spring MVC ta chỉ cần cấu hình tiles trong file spring config.

Chúng ta thay thế view resolver mặc định bằng view resolver của tiles:

Thay thế:

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
      <value>/WEB-INF/views/jsp/</value>
    </property>
    <property name="suffix">
      <value>.jsp</value>
    </property>
 </bean>

Bằng:

<!-- mapping các template tiles -->
<bean id="viewResolver"
  class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass"
    value="org.springframework.web.servlet.view.tiles3.TilesView" />
</bean>

<bean id="tilesConfigurer"
  class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
  <property name="definitions">
    <list>
      <!-- khai báo các file định nghĩa layout -->
      <value>/WEB-INF/tiles.xml</value>
    </list>
  </property>
</bean>

Ở đây mình khai báo file cấu hình các template của tiles sẽ là file /WEB-INF/tiles.xml (các bạn có thể đổi file khác, tên khác theo ý mình)

File định nghĩa các template của tiles:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>

  <definition name="index" template="/WEB-INF/views/layout/layout.jsp">
    <put-attribute name="title" value="index" />
    <put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
    <put-attribute name="menu" value="/WEB-INF/views/layout/menu.jsp" />
    <put-attribute name="body" value="/WEB-INF/views/jsp/index.jsp" />
    <put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>
  <definition name="hello" extends="index">
    <put-attribute name="title" value="hello" />
    <put-attribute name="body" value="/WEB-INF/views/jsp/hello.jsp" />
  </definition>
</tiles-definitions>

Các file view:

<div style="width: 400px; height: 50px; border: 1px solid red; display: inline-block">Body</div>
<div style="width: 500px; height: 50px; border: 1px solid black">Footer</div>
<div style="width: 500px; height: 50px; border: 1px solid blue">Header</div>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<html>
<head>
  <title><tiles:getAsString name="title" /></title>
</head>
<body>
  <tiles:insertAttribute name="header" />
  <br/>
  <div style="display:inline">
    <tiles:insertAttribute name="menu" />
    <tiles:insertAttribute name="body" />
  </div>
  <br/>
  <br/>
  <tiles:insertAttribute name="footer" />
</body>
</html>
<div style="width: 100px; height: 300px; border: 1px solid green;display: inline-block; float:left">Menu</div>
<div style="width: 400px; height: 300px; border: 1px solid red; display: inline-block">
  <h1>Spring MVC Tiles!</h1>
  <a href="hello">hello</a>
  
</div>
<div style="width: 400px; height: 300px; border: 1px solid red; display: inline-block">Hello</div>

File Controller:

package stackjava.com.springmvctiles.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {

  @RequestMapping("/")
  public String index() {
    return "index";
  }

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public String hello() {
    return "hello";
  }

}

Demo:

Okay, Done!

Download code ví dụ trên tại đây

Spring MVC – Phần 12: Apache Tiles là gì? Ví dụ Spring MVC Tiles

References:

https://tiles.apache.org/framework/