In the previous post, I showed you how to integrating Spring MVC and Thymeleaf. In this chapter I will show you step by step to create Simple CRUD using Spring MVC and Thymeleaf
Our Goal is :

Spring MVC form list

Spring MVC form Add
Create Domain Class Faq.java
package com.hidupbersahaja.domain;
public class Faq {
private Long id;
private String name;
private String description;
private boolean publish;
public Faq(){}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean isPublish() {
return publish;
}
public void setPublish(boolean publish) {
this.publish = publish;
}
@Override
public boolean equals(Object o) {
if (null == o)
return false;
if (!(o instanceof Faq))
return false;
Faq oo = (Faq) o;
if (this.getId() == null) {
return oo.getId() == null;
} else
return this.getId().equals(oo.getId());
}
}
Service Layer FaqService.java and FaqServiceImpl.java
FaqService.java
package com.hidupbersahaja.service;
import java.util.List;
import com.hidupbersahaja.domain.Faq;
public interface FaqService {
public List<Faq> findAllFAQ();
public void save(Faq faq);
public Faq findByPrimaryKey(Long id);
}
FaqServiceImpl.java
package com.hidupbersahaja.service;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.springframework.stereotype.Service;
import com.hidupbersahaja.domain.Faq;
@Service
public class FaqServiceImpl implements FaqService{
private Set<Faq> list = new LinkedHashSet<Faq>();
public List<Faq> findAllFAQ(){
List<Faq> faqs = new LinkedList<Faq>();
for(Faq f : list){
faqs.add(f);
}
return faqs;
}
public void save(Faq faq){
Long id = 1L;
if(faq.getId() == null && list.size() > 0) {
id = list.size() + 1L;
}
faq.setId(id);
list.add(faq);
}
public Faq findByPrimaryKey(Long id){
for(Faq faq : list){
if(faq.getId().equals(id)) {
return faq;
}
}
return null;
}
}
Controller side FAQController.java
package com.hidupbersahaja.controller;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.hidupbersahaja.data.util.DataConstants;
import com.hidupbersahaja.domain.Faq;
import com.hidupbersahaja.service.FaqService;
@Controller
@RequestMapping("/faq")
public class FAQController {
@Autowired
private FaqService faqService;
/**
* default handler showing faq widget page
*
* @return faq.jsp
*/
@RequestMapping(method = RequestMethod.GET)
public String defaultHandler(Model model) {
try {
model.addAttribute("faqs", faqService.findAllFAQ());
} catch (Exception e) {
e.printStackTrace();
}
return "faq/faq_list";
}
/**
* Add FAQ
* @param model
* @return
*/
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String doAdd(Model model){
try {
model.addAttribute("faq", new Faq());
} catch (Exception e) {
e.printStackTrace();
}
return "faq/faq_add";
}
/**
* Edit FAQ
* @param id
* @param model
* @return
*/
@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
public String doEdit(@PathVariable Long id, Model model) {
Faq faq = faqService.findByPrimaryKey(id);
model.addAttribute("faq", faq);
return "faq/faq_add";
}
/**
* Save FAQ
* @param faq
* @param model
* @return
*/
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String doSave(@ModelAttribute Faq faq, Model model) {
faqService.save(faq);
return "redirect:/faq";
}
}
create faq_list.html and faq_add.html inside /WEB-INF/templates/faq directory
faq_list.html
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<h2>Frequently Asked Question</h2>
<a href="/learn/faq/add">Add FAQ</a>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Description</th>
<th>Published</th>
<th></th>
</tr>
</thead>
<tbody>
<tr th:each="faq : ${faqs}">
<td th:text="${faq.id}"></td>
<td th:text="${faq.name}"></td>
<td th:text="${faq.description}"></td>
<td th:text="${faq.publish}"></td>
<td>
<a th:href="@{'/faq/edit/'+${faq.id}}"><span>Edit</span></a>
</td>
</tr>
</tbody>
</table>
</body>
</html>
faq_add.html
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<h2>Add FAQ</h2>
<form action="#" th:action="@{/faq/save}" th:object="${faq}" method="post">
<input type="hidden" th:field="*{id}" />
<table>
<tr>
<td>Name</td>
<td> : </td>
<td><input type="text" th:field="*{name}" /></td>
</tr>
<tr>
<td>Description</td>
<td> : </td>
<td><input type="text" th:field="*{description}" /></td>
</tr>
<tr>
<td>is Publish ?</td>
<td> : </td>
<td><input type="checkbox" th:field="*{publish}"/></td>
</tr>
<tr>
<td colspan="3" align="center">
<button type="submit" value="Submit">Submit</button>
</td>
</tr>
</table>
</form>
</body>
</html>