Перейти к основному содержимому

Краткое руководство по Spring MVC с помощью Velocity

· 4 мин. чтения

1. Введение

Velocity — это механизм шаблонов от Apache Software Foundation, который может работать с обычными текстовыми файлами, кодом SQL, XML, Java и многими другими типами.

В этой статье мы сосредоточимся на использовании Velocity с типичным веб-приложением Spring MVC.

2. Зависимости Maven

Начнем с включения поддержки Velocity со следующими зависимостями:

<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>

<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>

Новейшие версии обоих можно найти здесь: Velocity и Velocity-tools .

3. Конфигурация

3.1. Веб-конфигурация

Если мы не хотим использовать web.xml , давайте настроим наш веб-проект, используя Java и инициализатор :

public class MainWebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
root.register(WebConfig.class);

sc.addListener(new ContextLoaderListener(root));

ServletRegistration.Dynamic appServlet =
sc.addServlet("mvc", new DispatcherServlet(new GenericWebApplicationContext()));
appServlet.setLoadOnStartup(1);
}
}

В качестве альтернативы мы можем, конечно, использовать традиционный web.xml :

<web-app ...>
<display-name>Spring MVC Velocity</display-name>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>

Обратите внимание, что мы сопоставили наш сервлет с путем «/*».

3.2. Весенняя конфигурация

Давайте теперь рассмотрим простую конфигурацию Spring — опять же, начиная с Java:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages= {
"com.foreach.mvc.velocity.controller",
"com.foreach.mvc.velocity.service" })
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

@Bean
public ViewResolver viewResolver() {
VelocityLayoutViewResolver bean = new VelocityLayoutViewResolver();
bean.setCache(true);
bean.setPrefix("/WEB-INF/views/");
bean.setLayoutUrl("/WEB-INF/layouts/layout.vm");
bean.setSuffix(".vm");
return bean;
}

@Bean
public VelocityConfigurer velocityConfig() {
VelocityConfigurer velocityConfigurer = new VelocityConfigurer();
velocityConfigurer.setResourceLoaderPath("/");
return velocityConfigurer;
}
}

А также давайте быстро взглянем на XML-версию конфигурации:

<beans ...>
<context:component-scan base-package="com.foreach.mvc.velocity.*" />
<context:annotation-config />
<bean id="velocityConfig"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath">
<value>/</value>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="layoutUrl" value="/WEB-INF/layouts/layout.vm" />
<property name="suffix" value=".vm" />
</bean>
</beans>

Здесь мы сообщаем Spring, где искать аннотированные определения bean-компонентов:

<context:component-scan base-package="com.foreach.mvc.velocity.*" />

Мы указываем, что собираемся использовать конфигурацию на основе аннотаций в нашем проекте со следующей строкой:

<context:annotation-config />

Создавая bean-компоненты « velocityConfig » и « viewResolver », мы сообщаем VelocityConfigurer , где искать шаблоны, и VelocityLayoutViewResolver , где искать представления и макеты.

4. Шаблоны скорости

Наконец, давайте создадим наши шаблоны, начиная с общего заголовка:

<div style="...">
<div style="float: left">
<h1>Our tutorials</h1>
</div>
</div>

и нижний колонтитул:

<div style="...">
@Copyright foreach.com
</div>

И давайте определим общий макет для нашего сайта, где мы собираемся использовать вышеуказанные фрагменты с разбором в следующем коде:

<html>
<head>
<title>Spring & Velocity</title>
</head>
<body>
<div>
#parse("/WEB-INF/fragments/header.vm")
</div>
<div>
<!-- View index.vm is inserted here -->
$screen_content
</div>
<div>
#parse("/WEB-INF/fragments/footer.vm")
</div>
</body>
</html>

Вы можете проверить, что переменная $screen_content содержит содержимое страниц.

Наконец, мы создадим шаблон для основного контента:

<h1>Index</h1>

<h2>Tutorials list</h2>
<table border="1">
<tr>
<th>Tutorial Id</th>
<th>Tutorial Title</th>
<th>Tutorial Description</th>
<th>Tutorial Author</th>
</tr>
#foreach($tut in $tutorials)
<tr>
<td>$tut.tutId</td>
<td>$tut.title</td>
<td>$tut.description</td>
<td>$tut.author</td>
</tr>
#end
</table>

5. Сторона контроллера

Мы создали простой контроллер, который возвращает список руководств в качестве содержимого для заполнения нашего макета:

@Controller
@RequestMapping("/")
public class MainController {

@Autowired
private ITutorialsService tutService;

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

@RequestMapping(value ="/list", method = RequestMethod.GET)
public String listTutorialsPage(Model model) {
List<Tutorial> list = tutService.listTutorials();
model.addAttribute("tutorials", list);
return "index";
}
}

Наконец, мы можем получить доступ к этому простому примеру локально — например, по адресу: localhost:8080/spring-mvc-velocity/.

6. Заключение

В этом простом руководстве мы настроили веб-приложение Spring MVC с механизмом шаблонов Velocity .

Полный пример кода для этого руководства можно найти в нашем репозитории GitHub .