Руководство Spring MVC и FreeMarker
View more Tutorials:
-
1- Что такое FreeMarker?
-
FreeMarker это технология на уровне View. Используется для отображения данных. FreeMarker можно использовать для отображения данных вместо Jsp. FreeMarker на самом деле является текстовым документом.
-
FreeMarker engine
-
FreeMarker Engine комбинирует данные из уровня Model и шаблоны FreeMarker (FreeMarker template) чтобы создать данные HTML.
-
-
Смотреть пример:
-
-
See more:
-
2- Создать Maven Web App Project
-
Создайте пустой Maven Web App Project в Eclipse с названием "SpringMVCFreeMarker".
-
-
3- Конфигурация web.xml & pom.xml
-
Используем WebApp >= 3.
-
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>SpringMVCFreeMarker</display-name> </web-app>
-
Объявить использующиеся библиотеки
-
pom.xml
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.o7planning</groupId> <artifactId>SpringMVCFreeMarker</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>SpringMVCFreeMarker Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Servlet Library --> <!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- Spring dependencies --> <!-- http://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!-- http://mvnrepository.com/artifact/org.springframework/spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.3.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> </dependencies> <build> <finalName>SpringMVCFreeMarker</finalName> <plugins> <!-- Config: Maven Tomcat Plugin --> <!-- http://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <!-- Config: contextPath and Port (Default: /SpringMVCFreeMarker : 8080) --> <!-- <configuration> <path>/</path> <port>8899</port> </configuration> --> </plugin> </plugins> </build> </project>
-
4- Конфигурация Spring MVC
-
-
SpringWebAppInitializer.java
package org.o7planning.springmvcfreemarker.config; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.DispatcherServlet; public class SpringWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext(); appContext.register(ApplicationContextConfig.class); // Dispatcher Servlet ServletRegistration.Dynamic dispatcher = servletContext.addServlet("SpringDispatcher", new DispatcherServlet(appContext)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); dispatcher.setInitParameter("contextClass", appContext.getClass().getName()); servletContext.addListener(new ContextLoaderListener(appContext)); // UTF8 Charactor Filter. FilterRegistration.Dynamic fr = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class); fr.setInitParameter("encoding", "UTF-8"); fr.setInitParameter("forceEncoding", "true"); fr.addMappingForUrlPatterns(null, true, "/*"); } }
-
WebMvcConfig.java
package org.o7planning.springmvcfreemarker.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // Default. } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
-
В классе ApplicationContextConfig вм нужно объявить 2 Spring Bean - viewResolver & freemarkerConfig.
-
ApplicationContextConfig.java
package org.o7planning.springmvcfreemarker.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; @Configuration @ComponentScan("org.o7planning.springmvcfreemarker.*") public class ApplicationContextConfig { @Bean(name = "viewResolver") public ViewResolver getViewResolver() { FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); System.out.println("Create Bean viewResolver"); viewResolver.setCache(true); viewResolver.setPrefix(""); viewResolver.setSuffix(".ftl"); return viewResolver; } @Bean(name = "freemarkerConfig") public FreeMarkerConfigurer getFreemarkerConfig() { FreeMarkerConfigurer config = new FreeMarkerConfigurer(); // Folder containing FreeMarker templates. config.setTemplateLoaderPath("/WEB-INF/views/"); return config; } }
-
5- Model, Form, Controller
-
-
Person.java
package org.o7planning.springmvcfreemarker.model; public class Person { private String firstName; private String lastName; public Person() { } public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
-
PersonForm.java
package org.o7planning.springmvcfreemarker.form; public class PersonForm { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
-
Controller:
-
MainController.java
package org.o7planning.springmvcfreemarker.controller; import java.util.ArrayList; import java.util.List; import org.o7planning.springmvcfreemarker.form.PersonForm; import org.o7planning.springmvcfreemarker.model.Person; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class MainController { private static List<Person> persons = new ArrayList<Person>(); static { persons.add(new Person("Bill", "Gates")); persons.add(new Person("Steve", "Jobs")); } @RequestMapping(value = { "/", "/index" }, method = RequestMethod.GET) public String index(Model model) { model.addAttribute("persons", persons); return "index"; } @RequestMapping(value = { "/addPerson" }, method = RequestMethod.GET) public String addPersonForm(Model model) { PersonForm personForm = new PersonForm(); model.addAttribute("personForm", personForm); return "addPerson"; } @RequestMapping(value = { "/addPerson" }, method = RequestMethod.POST) public String addPersonSave(Model model, // @ModelAttribute("personForm") PersonForm personForm) { String firstName = personForm.getFirstName(); String lastName = personForm.getLastName(); if (firstName != null && firstName.length() > 0 // && lastName != null && lastName.length() > 0) { Person newPerson = new Person(firstName, lastName); persons.add(newPerson); return "redirect:/index"; } String error = "First Name & Last Name is required!"; model.addAttribute("errorMessage", error); return "addPerson"; } }
-
6- FreeMarker Views
-
-
/WEB-INF/views/index.ftl
<html> <head> <title>Person List</title> </head> <body> <h3>Person List</h3> <a href="addPerson">Add Person</a> <br><br> <div> <table border="1"> <tr> <th>First Name</th> <th>Last Name</th> </tr> <#list persons as person> <tr> <td>${person.firstName}</td> <td>${person.lastName}</td> </tr> </#list> </table> </div> </body> </html>
-
/WEB-INF/views/addPerson.ftl
<!-- freemarker macros have to be imported into a namespace. We strongly recommend sticking to 'spring' --> <#import "/spring.ftl" as spring/> <html> <head> <title>Add Person</title> </head> <body> <#if errorMessage??> <div style="color:red;font-style:italic;"> ${errorMessage} </div> </#if> <div> <fieldset> <legend>Add Person</legend> <form name="person" action="" method="POST"> First Name: <@spring.formInput "personForm.firstName" "" "text"/> <br/> Last Name: <@spring.formInput "personForm.lastName" "" "text"/> <br/> <input type="submit" value="Create" /> </form> </fieldset> </div> </body> </html>
-
7- Запуск примера
-
-
-
- Name: Run SpringMVCFreeMarker
- Base directory: ${workspace_loc:/SpringMVCFreeMarker}
- Goals: tomcat7:run
-
-
-