FreeMarker рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕

Apache FreeMarker рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдВрдЬрди рд╣реИ: рдЯреЗрдХреНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (HTML рдкреЗрдЬ, xml, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕, рд╕реЛрд░реНрд╕ рдХреЛрдб рдЖрджрд┐) рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, html рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлреНрд░реАрдбрдорд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрдмрд╛рджреА рд╡рд╛рд▓рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдорд┐рд▓рддрд╛ рд╣реИред

рдЫрд╡рд┐

FreeMarker рд▓реЗрдЦ рдореЗрдВ
рд╡рд╕рдВрдд рдХрд╛ рдмреВрдЯ
рдореИрдХреНрд░реЛ
рдЕрдиреНрдп рдПрдкреАрдЖрдИ

рдпрд╛рдиреА рдлреНрд░реАрдорд╛рд░реНрдХрд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ $ {name} рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣реИ, рднрд╛рд╡ рдЧрдгрдирд╛, рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди, рд╕реНрдерд┐рддрд┐рдпреЛрдВ, рдЫреЛрд░реЛрдВ, рд╕реВрдЪрд┐рдпреЛрдВ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ, рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг html рдПрдХреНрд╕рдкреНрд░реЗрд╢рди $ {name} (рдЯреЗрдореНрдкрд▓реЗрдЯ test.ftl) рдХреЗ рд╕рд╛рде:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>${name}!</title> </head> <body> <h2>Hello ${name}!</h2> </body> </html> 

рдпрджрд┐ рдЖрдк рдЕрдм рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:

 import freemarker.template.Configuration; import freemarker.template.Template; ... //  Configuration cfg = new Configuration(Configuration.VERSION_2_3_27); //   Map<String, Object> root = new HashMap<>(); root.put("name", "Freemarker"); //  Template temp = cfg.getTemplate("test.ftl"); //      Writer out = new OutputStreamWriter(System.out); //    temp.process(root, out); 

рддрдм рд╣рдореЗрдВ рднрд░реЗ рд╣реБрдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдорд┐рд▓рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рд╕реВрдЪреА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ # рд╕реВрдЪреА рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП HTML рд╕реВрдЪреА:

 <ul> <#list father as item> <li>${item}</li> </#list> </ul> 

рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЖрдк рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 Map<String, Object> root = new HashMap<>(); .... root.put("father", Arrays.asList("Alexander", "Petrov", 47)); 

рдЪрд▓рд┐рдП рд╡рд╕рдВрдд рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ


рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдореЗрдВ рдлреНрд░реАрдбрдорд░ рд╕рдкреЛрд░реНрдЯ рд╣реИред SPRING INITIALIZR рд╕рд╛рдЗрдЯ рдкрд░ рдЖрдк pom рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреЛрдо рдлрд╛рдЗрд▓
 <?xml version="1.0" encoding="UTF-8"?> <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>com.example</groupId> <artifactId>demoFreeMarker</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demoFreeMarker</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 


рдХреНрд▓рд╛рд╕ рдбреЗрдореЛрдлреНрд░реАрдореИрдХрд░ рдПрдкреЗрд▓реЗрд╢рди
 @SpringBootApplication public class DemoFreeMarkerApplication { public static void main(String[] args) { SpringApplication.run(DemoFreeMarkerApplication.class, args); } } 


рд╕реНрдкреНрд░рд┐рдВрдЧ рдореЗрдВ рдлрд╝реНрд░реАрдорд╛рд░реНрдХрд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдШрдЯрдХ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди (рдХрдорд╛рдВрдбрд▓рд╛рдЗрдирд░рдирд░) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реВрдВрдЧрд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд ftl рдЯреЗрдореНрдкрд▓реЗрдЯ (hello_test.ftl) рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛:

рд╣реИрд▓реЛ_рд╕реНрдЯреЗрд╕реНрдЯ.рдлреНрд▓реИрдЯрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ
 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello ${name}!</title> </head> <body> <input type="text" placeholder="${name}"> <table> <#list persons as row> <tr> <#list row as field> <td>${field}</td> </#list> </tr> </#list> </table> </body> </html> 


Hello_test.ftl рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЛрдб:

рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рдХреНрд▓рд╛рд╕ рдФрд░ рдбреЗрдЯрд╛ рдореЙрдбрд▓
 @Component public class CommandLine implements CommandLineRunner { @Autowired private Configuration configuration; public void run(String... args) { Map<String, Object> root = new HashMap<>(); //  ${name} root.put("name", "Fremarker"); //  <#list persons List<List> persons = new ArrayList<>(); persons.add(Arrays.asList("Alexander", "Petrov", 47)); persons.add(Arrays.asList("Slava", "Petrov", 13)); root.put("persons", persons); try { Template template = configuration.getTemplate("hello_test.ftl"); Writer out = new OutputStreamWriter(System.out); try { template.process(root, out); } catch (TemplateException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } } 


рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдПрдХ HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЖрдЙрдЯрдкреБрдЯ HTML
 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello Fremarker!</title> </head> <body> <input type="text" placeholder="Fremarker"> <table> <tr> <td>Alexander</td> <td>Petrov</td> <td>47</td> </tr> <tr> <td>Slava</td> <td>Petrov</td> <td>13</td> </tr> </table> </body> 


рдореИрдХреНрд░реЛ


рдлреНрд░реАрдореЙрдХрд░ рдХреЗ рдкрд╛рд╕ рдореИрдХреНрд░реЛ рд╕рдорд░реНрдерди рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдордЬрдмреВрдд рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:

 <#macro textInput id value=""> <input type="text" id="${id}" value="${value}"> </#macro> 

рдпрд╣ textInput рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрдИрдбреА (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ) рдФрд░ рдорд╛рди (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╣реИ) рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдХреНрд░реЛ рд╣реИред рдЕрдЧрд▓рд╛ рдЙрд╕рдХрд╛ рд╢рд░реАрд░ рдФрд░ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, рдореИрдХреНрд░реЛ рдлрд╝рд╛рдЗрд▓ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 <#import "ui.ftl" as ui/> 

рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ, рдореИрдХреНрд░реЛ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 <@ui.textInput id="name" value="${name}"/> 

рдХрд╣рд╛рдВ ui рд╡рд╣ рдЙрдкрдирд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, $ {name} рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдЪрд░ рд╣реИ, рдлрд┐рд░ рдЙрдкрдирд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдореИрдХреНрд░реЛ рдирд╛рдо textInput рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХрдо рд╕реЗ рдХрдо рдЕрдирд┐рд╡рд╛рд░реНрдпред рдореИрдВ html рдЗрдирдкреБрдЯ рдФрд░ рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдореИрдХреНрд░реЛ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛:

ui.ftl рдореИрдХреНрд░реЛ рдлрд╝рд╛рдЗрд▓
 <#-- textInput macro for html input --> <#macro textInput id placeholder="" value=""> <input type="text" id="${id}" placeholder="${placeholder}" value="${value}"> </#macro> <#-- table macro for html table --> <#macro table id rows> <table id="${id}"> <#list rows as row> <tr> <td>${row?index + 1}</td> <#list row as field> <td>${field}</td> </#list> </tr> </#list> </table> </#macro> 


$ {рдкрдВрдХреНрддрд┐; рд╕реВрдЪрдХрд╛рдВрдХ + 1} рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИ; рдпрджрд┐ рд╣рдо рдЕрдм рдкрд┐рдЫрд▓реЗ рдореБрдЦреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдФрд░ рдЯреЗрдмрд▓ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдорд┐рд▓рддреЗ рд╣реИрдВ:

рд╣реЗрд▓реНрд▓реЛ.рдлрдЯрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ
 <#import "ui.ftl" as ui/> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello ${name}!</title> </head> <body> <@ui.textInput id="name" placeholder="Enter name" value="${name}"/> <@ui.table id="table1" rows=persons/> </body> </html> 


рдмрд╛рдХреА


рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореЙрдбрд▓ рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдореИрдВ рдкреЛрдо рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:

  <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 

рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝реЗрдВ:

DemoController.java
 @Controller public class DemoController { @Autowired private RepositoryService repositoryService; @GetMapping("/") public String index() { return "persons"; } @RequestMapping(value = "/search", method = RequestMethod.POST) public String hello(Model model, @RequestParam(defaultValue = "") String searchName) { List<List<String>> persons = repositoryService.getRepository(); List<List<String>> filterList = persons.stream() .filter(p -> p.get(0).contains(searchName)) .collect(Collectors.toList()); model.addAttribute("persons", filterList); model.addAttribute("lastSearch", searchName); return "persons"; } @RequestMapping(value = "/save", method = RequestMethod.POST) public String save(Model model, @ModelAttribute("person") Person person) { List<List<String>> persons = repositoryService.addPerson(person); model.addAttribute("persons", persons); return "persons"; } } 


рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рднрдВрдбрд╛рд░:

RepositoryService.java
 @Service public class RepositoryService { private static List<List<String>> repository = new ArrayList<>(); public List<List<String>> getRepository() { return repository; } public List<List<String>> addPerson(Person person) { repository.add(Arrays.asList(person.getFirstName(), person.getAge().toString())); return repository; } } 


рдЪреЗрд╣рд░рд╛ рд╡рд░реНрдЧ:

Person.java
 public class Person { public Person(String firstName, Integer age) { this.firstName = firstName; this.age = age; } private String firstName; private Integer age; public String getFirstName() { return firstName; } public Integer getAge() { return age; } } 


рдореИрдХреНрд░реЛ рдЯреЗрдореНрдкрд▓реЗрдЯ:

ui.ftl
 <#macro formInput id name label type="text" value=""> <label for="${id}">${label}</label> <input type="${type}" id="${id}" name="${name}" value="${value}"> </#macro> <#macro table id rows> <table id="${id}" border="1px" cellspacing="2" border="1" cellpadding="5"> <#list rows as row> <tr> <td>${row?index + 1}</td> <#list row as field> <td>${field}</td> </#list> </tr> </#list> </table> </#macro> 


рдореБрдЦреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ:

persons.ftl
 <#import "ui.ftl" as ui/> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Person</title> <link href="style/my.css" rel="stylesheet"> </head> <body> <div> <fieldset> <legend> </legend> <form name="person" action="save" method="POST"> <@ui.formInput id="t1" name="firstName" label=""/> <br/> <@ui.formInput id="t2" name="age" label=""/> <br/> <input type="submit" value="Save" /> </form> </fieldset> </div> <div> <fieldset> <legend></legend> <form name="searchForm" action="search" method="POST"> <@ui.formInput id="t3" name="searchName" label=""/> <br/> <input type="submit" value="Search" /> </form> </fieldset> </div> <p><#if lastSearch??> : ${lastSearch}<#else></#if></p> <@ui.table id="table1" rows=persons![]/> </body> </html> 


рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛:

рдЫрд╡рд┐

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреЛ рдХрдорд╛рдВрдб "рд╕реЗрд╡" рдХрд░реЗрдЧрд╛ рдФрд░ рдЪреЗрд╣рд░реЗ рдХреА "рдЦреЛрдЬ" (рдирд┐рдпрдВрддреНрд░рдХ рджреЗрдЦреЗрдВ)ред рд╕реНрдкреНрд░рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (рдорд╛рдирдЪрд┐рддреНрд░рдг) рдкрд░ рд╕рднреА рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред

 <#if lastSearch??> : ${lastSearch}<#else></#if> 

рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ "" рдЦреЛрдЬреЗрдВ: .. "рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ:

 <@ui.table id="table1" rows=persons![]/> 

рдпрд╣рд╛рдВ рднреА, рдПрдХ рдЪреЗрдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдореМрдЬреВрдж рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЦрд╛рд▓реА рд╣реИред рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдкреГрд╖реНрда рдЦреЛрд▓рддреЗ рд╣реИрдВ рддреЛ рдпреЗ рдЪреЗрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ (), рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЖрд╡реЗрджрди рдХрд╛ рдХрд╛рдо

рдЫрд╡рд┐

рд╕рд╛рдордЧреНрд░реА:

тЖТ рдЕрдкрд╛рдЪреЗ рдлреНрд░реАрдордХрд░ рдореИрдиреБрдЕрд▓

Source: https://habr.com/ru/post/hi420549/


All Articles