Boa Noite pessoal, continuando com meus estudos com vraptor fiz um crud com ajax simulando uma navegação por estados, faço o crud todo sem dar refresh na página mas como não tenho muita prática com jquery+ vraptor pergunto aos companheiros se a abordagem que utilizei no exemplo é uma boa abordagem ou não, e se utilizar ajax dessa forma que utilizei é correto e se posso ter problemas de performance ou segurança com tal abordagem, fiz o exemplo utilizando esse exemplo aqui em php: http://www.codeofaninja.com/2013/05/crud-with-php-jquery.html
Vamos ao exemplo: utilizei hibernate com apenas 1 entidade,o fornecedor
@Entity
public class Fornecedor implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String nome;
private String descricao;
private String cpfCnpj;
@Column(name="cpf_cnpj")
public String getCpfCnpj() {
return cpfCnpj;
}
public void setCpfCnpj(String cpfCnpj) {
this.cpfCnpj = cpfCnpj;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
}
Meu controller
@Resource
public class FornecedorController {
Result result;
public FornecedorController(Result result){
this.result = result;
}
@Path("/lista")
public void lista(){
}
public void adiciona(Fornecedor fornecedor){
Session s = (Session) HibernateUtil.openSession();
Transaction t = s.beginTransaction();
s.persist(fornecedor);
t.commit();
s.close();
result.use(Results.http()).setStatusCode(200);
}
public void altera(Fornecedor fornecedor){
Session s = (Session) HibernateUtil.openSession();
Transaction t = s.beginTransaction();
s.update(fornecedor);
t.commit();
s.close();
result.use(Results.http()).setStatusCode(200);
}
public void lista2(){
Session s = (Session) HibernateUtil.openSession();
Criteria c= s.createCriteria(Fornecedor.class);
List<Fornecedor> fornecedores = c.list();
s.close();
result.include("fornecedorList",fornecedores);
}
public void edita(Long id){
Session s = (Session) HibernateUtil.openSession();
Fornecedor f = (Fornecedor)s.get(Fornecedor.class,id);
s.close();
result.include("fornecedor",f);
}
public void delete(Long id){
Session s = (Session) HibernateUtil.openSession();
Transaction t = s.beginTransaction();
Fornecedor f = (Fornecedor) s.get(Fornecedor.class, id);
s.delete(f);
t.commit();
s.close();
result.use(Results.http()).setStatusCode(200);
}
public void novo(){
Fornecedor f = new Fornecedor();
result.include("fornecedor",f);
}
}
minha jsp principal: lista.jsp que contem as funções ajax
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/style2.css">
</head>
<body>
<div>
<div id="visualizarFornecedores" class='customBtn'>Visualizar Fornecedores</div>
<div id="adicionarFornecedor" class='customBtn'>+ Adicionar Fornecedor</div>
<div id='loaderImage'><img src='img/ajax_loader.gif' /></div>
</div>
<div id='pageContent'>
</div>
<script type="text/javascript">
$(document).ready(function(){
$("#loaderImage").show();
mostrarFornecedores();
$('#visualizarFornecedores').click(function(){
$('#loaderImage').show();
mostrarFornecedores();
});
$('#adicionarFornecedor').click(function(){
showCreateNewFornecedor();
});
$(document).on('submit',"#createFornecedor",function(){
$.post("/vraptor-blank-project/fornecedor/adiciona",$("#createFornecedor").serialize()).done(function(data) {
mostrarFornecedores();
});
return false;
});
$(document).on('click', '.deleteBtn', function(){
if(confirm('está certo disso?')){
var id = $(this).closest('td').find('.fornecedorId').text();
$.post("/vraptor-blank-project/fornecedor/delete", { id: id })
.done(function(data) {
$('#loaderImage').show();
mostrarFornecedores();
});
}
});
$(document).on('click', '.editBtn', function(){
var id = $(this).closest('td').find('.fornecedorId').text();
$('#loaderImage').show();
setTimeout("$('#pageContent').load('/vraptor-blank-project/fornecedor/edita?id=" + id + "', function(){ $('#loaderImage').hide(); });",1000);
});
$(document).on('submit', '#updateFornecedorForm', function() {
$('#loaderImage').show();
$.post("/vraptor-blank-project/fornecedor/altera", $("#updateFornecedorForm").serialize())
.done(function(data) {
mostrarFornecedores();
});
return false;
});
});
function mostrarFornecedores(){
$("#pageContent").load("/vraptor-blank-project/fornecedor/lista2");
$('#loaderImage').hide();
}
function showCreateNewFornecedor(){
$("#pageContent").load("/vraptor-blank-project/fornecedor/novo");
$('#loaderImage').hide();
}
</script>
</body>
</html>
a página de listagem: lista2.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
</head>
<body>
<table id='tfhover' class='tftable' border='1'>
<tr>
<th>id</th>
<th>Nome</th>
<th>CNPJ</th>
<th style='text-align:center;'>Ações</th>
<c:forEach items="${fornecedorList}" var="f" >
<tr>
<td><c:out value="${f.id}"/></td>
<td><c:out value="${f.nome}"/></td>
<td><c:out value="${f.descricao}"/></td>
<td>
<div class='fornecedorId'>${f.id}</div>
<div class='editBtn customBtn'>[Editar]</div>
<div class='deleteBtn customBtn'>[Delete]</div>
</td>
</tr>
</c:forEach>
</tr>
</table>
</body>
</html>
o formulário de inclusão: novo.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form id="createFornecedor" method="post" action="#">
<table>
<tr>
<td>Nome</td>
<td><input type="text" id="nome" name="fornecedor.nome" value="${fornecedor.nome}"></td>
</tr>
<tr>
<td>Cnpj</td>
<td><input type="text" id="nome" name="fornecedor.cpfCnpj" value="${fornecedor.cpfCnpj}"></td>
</tr>
<tr>
<td>Descrição</td>
<td><input type="text" id="nome" name="fornecedor.descricao" value="${fornecedor.descricao}"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Salvar" class='customBtn'/>
<input type="reset" value="Resetar" class='customBtn'/>
</td>
</tr>
</table>
</form>
</body>
</html>
e o formulario de alteração: edita.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form id="updateFornecedorForm" method="post" action="#">
<table>
<tr>
<td>Nome</td>
<td><input type="text" id="nome" name="fornecedor.nome" value="${fornecedor.nome}"></td>
</tr>
<tr>
<td>Cnpj</td>
<td><input type="text" id="cnpj" name="fornecedor.cpfCnpj" value="${fornecedor.cpfCnpj}"></td>
</tr>
<tr>
<td>Descrição</td>
<td><input type="text" id="desc" name="fornecedor.descricao" value="${fornecedor.descricao}"></td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="fornecedor.id" value="${fornecedor.id}" />
<input type="submit" value="Salvar" class='customBtn'/>
<input type="reset" value="Resetar" class='customBtn'/>
</td>
</tr>
</table>
</form>
</body>
</html>
pra terminar o css: style2.css
body{
font: normal normal 110% Arial, Serif;
}
.customBtn {
cursor:pointer;
margin:0 .3em 0 0;
-moz-box-shadow:inset 0px 1px 0px 0px #caefab;
-webkit-box-shadow:inset 0px 1px 0px 0px #caefab;
box-shadow:inset 0px 1px 0px 0px #caefab;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #77d42a), color-stop(1, #5cb811) );
background:-moz-linear-gradient( center top, #77d42a 5%, #5cb811 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#77d42a', endColorstr='#5cb811');
background-color:#77d42a;
-moz-border-radius:6px;
-webkit-border-radius:6px;
border-radius:6px;
border:1px solid #268a16;
display:inline-block;
color:#ffffff;
font-family:arial;
font-size:15px;
font-weight:bold;
padding:6px 24px;
text-decoration:none;
/*text-shadow:1px 1px 0px #f1f1f1;*/
}
.customBtn:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #5cb811), color-stop(1, #77d42a) );
background:-moz-linear-gradient( center top, #5cb811 5%, #77d42a 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5cb811', endColorstr='#77d42a');
background-color:#5cb811;
}
.customBtn:active {
position:relative;
top:1px;
}
input[type=text],
input[type=password]{
padding:.5em;
}
table.tftable {font-size:12px;color:#333333;width:50%;border-width: 1px;border-color: #a9a9a9;border-collapse: collapse;}
table.tftable th {font-size:12px;background-color:#b8b8b8;border-width: 1px;padding: 8px;border-style: solid;border-color: #a9a9a9;text-align:left;}
table.tftable tr {background-color:#ffffff;}
table.tftable td {font-size:12px;border-width: 1px;padding: 8px;border-style: solid;border-color: #a9a9a9;}
.userId{
display:none;
}
#viewUsers,
#addUser{
float:left;
}
#loaderImage{
float:left;
line-height:32px;
}
Vocês costumam fazer navegação com ajax dessa forma ou existe uma forma mais apropriada?