Spring MVC + Hibernate - 从表单更新一些属性

时间:2013-12-27 02:06:01

标签: java spring hibernate spring-mvc

我有这个控制器:

@RequestMapping(value="admins", method=RequestMethod.POST, params="editar")
public String editarAdmin(@ModelAttribute("cadastroform") Usuario usuario){
    usuarioService.atualizaUsuario(usuario); //do the update
    return "redirect:/admin/admins?listar";
}

正如您所看到的,我正在接收Usuario对象并对其进行更新,但是,为此,我需要在我的jsp上使用此表单:

<sf:form id="formCadastrarAdmin" method="post" modelAttribute="cadastroform">
<label for="tfNome">Nome*: </label>
<sf:input path="nome" type="text" id="tfNome" name="nome" placeholder="Digite o nome do novo administrador"/>
<label for="tfEmail">E-mail*: </label>
<sf:input path="email" type="text" id="tfEmail" name="email" placeholder="Digite o email do novo administrador"/>

<c:choose>
    <c:when test="${!empty param.editar}">
        <sf:input path="login" type="hidden" id="tfLogin" name="login" placeholder="Digite o login do novo administrador"/>
        <sf:input path="senha" type="hidden" name="senha" placeholder="Digitar senha de acesso"/>
    </c:when>
    <c:otherwise>
        <label for="tfLogin">Login*:  </label>
        <sf:input path="login" type="text" id="tfLogin" name="login" placeholder="Digite o login do novo administrador"/>
        <label for="tfSenha">Senha*: </label>
        <sf:input path="senha" type="password" id="tfSenha" name="senha" placeholder="Digitar senha de acesso"/>
        <label for="tfSenhaRepeat">Confirmação de senha*: </label>
        <input type="password" id="tfSenhaRepeat" name="senhaRepeat" placeholder="Redigitar senha de acesso"/>
    </c:otherwise>
</c:choose>

<label for="sfTipo">Autoridades*: </label>

<div id="autoridades">
    <sf:checkboxes items="${listaAutoridades}" delimiter="</br>" path="authorities" cssClass="box_autoridade"
                   itemValue="authority" itemLabel="descricao"></sf:checkboxes>
</div>

<sf:input type="hidden" path="foto" value="default"/>  
<sf:input type="hidden" path="tipo" value="default"/>  
<sf:input type="hidden" path="id"/>
<sf:input type="hidden" path="dataCadastro"/>

<br/>
<button type="submit" id="btEnviar" onclick="return false">Cadastrar</button>
<button type="reset" id="btLimpar">Limpar</button>    

所以,我有很多隐藏字段,以填充我不想改变的Usuario对象的所有属性。我可以省略所有这些隐藏的字段并从我的控制器中的数据库中检索对象,但我认为这是不正确的。

我的问题是:隐藏的字段方法是否正确?如果不是,那么从表单更新对象的最佳推荐方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:2)

我认为,最好的方法取决于您的应用程序需要什么。安全? - 向客户端发送不必要的数据可能是一个坏主意。可扩展性? - 您的方法可能是最具扩展性的。性能? - 您可以考虑将您的usuario对象存储在控制器调用之间的会话属性中,而不是从数据库中检索其数据。

如果您决定将Usuario表单支持对象存储为控制器调用之间的会话属性,则Spring MVC具有@SessionAttribute注释。 Here是其使用示例。

答案 1 :(得分:2)

大多数情况下,如果我的表单与持久化对象不完全匹配,我最终会创建一个表示该特定数据的新类。您还可以将域对象重构为几个类,这些类将单独匹配表单。这种方法的主要好处是可以轻松验证每个实例,如果您在提交表单时期望完整(在这种情况下)User对象包含部分数据,那么这将很难。

此示例仅用于说明。通常,最好创建单独的表/实体而不是一个大表/实体。

@Entity
class User extends UserDetails {
    @Id
    private Long id;
}


@MappedSuperclass
class User extends UserDetails {
    @NotNull
    @NotBlank
    private String username;
    private String password;
}


@MappedSuperclass
class UserProfile {
    private String name;
    private String address;
    @Email
    private String email;
}