7
respostas

Checkbox

Boa tarde, gostaria de saber como é utilizado a tag importada da seguinte maneira


<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

porque no meu projeto acaba sendo lançado um Bad Request, toda vez que utilizo os checkboxs.

Aqui está o codigo JSP, Controller e Model:

JSP

<form:form action="${s.mvcUrl('AC#formCadastra').build() }" commandName="usuario" method="POST">

            <table class="table-bordered">
                <tr>
                    <td>User:</td>
                    <td><form:input type='text' path='username'/></td>
                </tr>

                <tr>
                    <td>Password:</td>
                    <td><form:input type='password' path ='password' /></td>
                </tr>


                <tr>
                    <td>Nome:</td>
                    <td><form:input type='text' path='nome' /></td>
                </tr>

                <tr>
                    <td>Restrição</td>
                    <td>
                        <form:checkboxes items="${usuario.authorities}" itemLabel="nome" path="authorities" delimiter="<br/>"/>
                    </td>
                <tr>

                    <td colspan='2'><input name="submit" type="submit"    value="Enviar" /></td>
                </tr>
            </table>

        </form:form>
Controller 

    @RequestMapping(value = "/cadastra", method = RequestMethod.GET)
    public ModelAndView cadastra() {
        ModelAndView modelAndView = new ModelAndView();
        Usuario usuario = new Usuario();
        List<Role> roles = new ArrayList<>();
        for(RolesEnum role: RolesEnum.values()){
            Role modelo = new Role();
            modelo.setNome(role.name());
            roles.add(modelo);
        }
        usuario.setAuthorities(roles);

        modelAndView.addObject("usuario", usuario);
        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView formCadastra(Usuario usuario){
        //Imprime no console todas as infos do Usuario
        System.out.println(usuario.getNome());
        System.out.println(usuario.getUsername());
        System.out.println(usuario.getPassword());
        for(Role role:usuario.getAuthorities()){
            System.out.println(role);
        }

        ModelAndView modelAndView = new ModelAndView("redirect:/");

        for(Role role:usuario.getAuthorities()){
            role.setUsuario(usuario);
        }

        usuario.setPassword(bCryptPasswordEnconder.encode(usuario.getPassword()));

        usuarioDao.cadastra(usuario);

        return modelAndView;

    }
Model

public class Usuario implements UserDetails{

    private static final long serialVersionUID = 7659681460734527479L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_usuario")
    private long id;



    @OneToMany(fetch=FetchType.EAGER,mappedBy="usuario")
    private List<Role> authorities;

    private String username;

    private String password;

    private String nome;




    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }


    public List<Role> getAuthorities() {
        return authorities;
    }

    public void setAuthorities(List<Role> authorithies) {
        this.authorities = authorithies;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
7 respostas

não se interessa mas o form data na plataforma de desenvolvedor do chrome está assim:

username=teste&password=teste&nome=Lucas+Monteiro+Sim%F5es&authorities=org.followup.models.Role%40741b56a8&authorities=org.followup.models.Role%405a4b1868&authorities=org.followup.models.Role%4074cbbb9f&authorities=org.followup.models.Role%401c3f6d9e&authorities=org.followup.models.Role%4013ea2860&_authorities=on&submit=Enviar&_csrf=bb1b089c-c682-467d-b80f-69fe2ed7814d

Acho que faltou vc definir o itemValue do checkbox.. se olhar os valores que estão sendo enviados, vai perceber que é o o retorno do toString de cada uma das suas roles.

o problema é exatamente esse, eu quero mandar uma List ja dentro do usuario, e até ai está dando tudo certo, tenho uma lista com todos os Roles que mandei, mas quando tento enviar pelo método Post, imagino que ele esteja enviando List e não uma List, como faço pra contornar esse problema, outro erro é que meu css e js pararam de carregar do nada, dando erro 405, method not allowed

descobri o problema do css e js, era um dos @RequestMapping que não estava com value= configurado, e utilizava o método POST dando conflito, agora só queria saber como faço pra cadastrar um usuario selecionando suas roles, porque isso ta me quebrando a cabeça a alguns dias

Você não passa uma lista de roles, o máximo que você pode fazer é passar uma lista de ids de roles, ou nomes.. como te falei, use o itemValue, crie uma classe que tem um atributo usuário e outro chamado List ou List(depende do que vc passar...). Aí você vai montar o objeto usuário bonitão com a lista de roles criada a partir dos parâmetros.

como faço binding no form de usuario na parte de List com o nome se ele vai retornar um Array de Strings como o binding é feito??

Você vai ter que criar uma classe nova para receber os argumentos desse formulário...