1
resposta

Tela master/detail

Alex tudo bem ? Estou tentando criar uma tela onde eu possa inserir vários detalhes e persistir tudo de uma única vez. Por exemplo, inserir tenho uma pessoa e gostaria de inserir 5 telefones e quando for gravar os dados da pessoa gravar todos os 5 telefones. segue um exemplo disso

https://prnt.sc/pfdmu3

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Master Detail com Spring</title>
<link
    href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
    rel="stylesheet"></link>
<script
    src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
    <div class="container-fluid">
        <h2>Mestre / Detalhe - Cadastro</h2>
        <hr>
        <form class="form-horizontal" th:object="${capa}" th:action="salvar"
            method="post">
            <div th:if="${#fields.hasAnyErrors()}" class="alert alert-danger"
                role="alert">
                <p th:each="err : ${#fields.allErrors()}" th:text="${err}">erros</p>
            </div>
            <div class="row">
                <div class="form-group">
                    <label for="txtObservacao" class="col-sm-2 control-label">Observações</label>
                    <div class="col-sm-10">
                        <input type="text" class="form-control" th:field="*{nome}"
                            id="txtObservacao" placeholder="Observações">
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="form-group">
                    <div class="col-sm-10">
                        <select class="form-control" id="txtItems">
                            <option th:each="it : ${items}" th:text="${it.nome}"
                                th:value="${it}"></option>
                        </select>
                    </div>
                    <div class="col-sm-2">
                        <button class="btn btn-info">Adiciona</button>
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="container-fluid">
                    <table class="table table-bordered table-striped">
                        <caption>Items da Capa</caption>
                        <thead>
                            <tr>
                                <th>Id</th>
                                <th>Item</th>
                                <th>Ações</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr th:each="det : ${detalhes}">
                                <th th:text="${det.item.id}">Id</th>
                                <th th:text="${det.item.nome}">Item</th>
                                <th>Ações</th>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
            <button class="btn btn-success" type="submit">Salvar</button>
        </form>
    </div>
</body>
</html>

Controller

package br.com.tcc.cee.controller;

@Controller
public class HomeController {

    @Autowired
    private ItemDao itemDao;
    @Autowired
    private CapaDao capaDao;
    @Autowired
    private DetalheDao detalheDao;

    @GetMapping
    public ModelAndView home() {
        ModelAndView mv = new ModelAndView("home");
        mv.addObject("capas", capaDao.findAll());
        return mv;
    }

    @PostMapping
    public ModelAndView salvar(@Valid @ModelAttribute("capa") Capa capa, BindingResult result, RedirectAttributes atts) {
        if (result.hasErrors()) {
            ModelAndView mv = new ModelAndView("form");
            return mv;            
        }
        capaDao.save(capa);
        ModelAndView mv = new ModelAndView("redirect:/");
        atts.addFlashAttribute("mensagem", "Registro salvo com sucesso...");
        return mv;
    }

    @ModelAttribute("items")
    public List<Item> getItems(){
        return itemDao.findAll(); 
    }

    @GetMapping("form")
    public ModelAndView form() {
        ModelAndView mv = new ModelAndView("form");
        mv.addObject("capa", new Capa());
        mv.addObject("detalhe", new Detalhe());
        return mv;
    }

    @PostMapping("adicionaDetalhe")
    public ModelAndView adicionaDetalhe(@ModelAttribute("capa") Capa capa, @ModelAttribute("detalhe") Detalhe detalhe) {
        ModelAndView mv = new ModelAndView("redirect:form");
        capa.getDetalhes().add(detalhe);
        return mv;
    }
}
1 resposta

No seu controller você poderia receber, por exemplo, um ContactForm, que dentro dele há uma lista de telefones:


    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public ModelAndView save(@ModelAttribute("contactForm") ContactForm contactForm) {
        System.out.println(contactForm);
        System.out.println(contactForm.getContacts());
        List<Contact> contacts = contactForm.getContacts();

        if(null != contacts && contacts.size() > 0) {
            for (Contact contact : contacts) {
                System.out.printf(contact.getFirstname());
            }
        }

        return new ModelAndView("showContact", "contactForm", contactForm);
    }