Terminei, não do jeito que eu queria, mas deu certo. Como eu to fazendo esse esquema pra estudar o que aprendi no curso de java web, resolvi não me aprofundar ainda nesse negócio de Jquery, Ajax… Vou deixar isso pra depois. Não achei que internacionalizar no servidor e cliente, principalmente no cliente fosse me custar tanto tempo, huahaua.
Ainda tem uma coisa que não entendo me incomodando no JSP. A minha validação no cliente está funcionando certinho quando insiro o JS dessa maneira:
Mas quando baixo os arquivos JS, coloco no WebContent e insiro da seguinte forma:
depois de carregada a página, a primeira vez que clico no botão de inserir, ele não mostra a mensagem de validação, só à partir do segundo clique. Muiii Éxtranho!!!
Além disso, inseri o response.setContentType(?text/html; charset=ISO-8859-1″); no Controller de Validação no Cliente e não funcionou. Ainda não exibe minhas mensagens Javascript com acentuação.
Segue meus códigos prontos para compartilhar:
CARACTERÍSTICAS
VRAPTOR3
Validação servidor/cliente
Internacionalização (messages.properties)
Formulário com dois submits
Lista e formulário no mesmo JSP
Cada linha da lista com um botão para salvar alterações e outro pra deletar (como se cada linha fosse um formulário).
Javascript / Jquery / Json
SELECIONAR IDIOMA
JSP (quebra galho)
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<a href="http://localhost:8080/bc/language/change/pt_BR">Brasil</a>
<a href="http://localhost:8080/bc/language/change/en_US">USA</a>
<a href="http://localhost:8080/bc/projeto/list"><fmt:message key="projeto.titulo"/></a>
</html>
CONTROLLER
@Resource
public class LanguageController {
private Result result;
private HttpServletRequest request;
public LanguageController(Result result, HttpServletRequest request)throws Exception{
this.result = result;
this.request = request;
}
@Path("/language/change/{lingua}")
public void change(){
String language = request.getParameter("lingua");
String[] splitlang = language.split("_");
Locale locale = new Locale(splitlang[0],splitlang[1]);
Config.set(request.getSession(), Config.FMT_LOCALE, locale);
Config.set(request.getSession(), Config.FMT_FALLBACK_LOCALE, locale);
result.use(Results.page()).forward("/index.jsp");
}
}
PROJETOS
CONTROLLER (Insert, Delete e Validação no Servidor)
@Resource
public class ProjetoController {
private Result result;
private ProjetoDao dao = new ProjetoDao();
private Validator validator;
public ProjetoController(Result result, Validator validator){
this.result = result;
this.validator = validator;
}
@Path("/projetos")
@Post
public void insert(Projeto projeto){
//Validação
if(projeto.getNome().equals("")){
validator.add(new ValidationMessage("projeto.valida.nome","projeto.nome"));
}
validator.onErrorUse(Results.logic()).forwardTo(getClass()).list();
//Inserção e redirecionamento de página
dao.insert(projeto);
result.use(Results.logic()).redirectTo(getClass()).list();
}
@Path("/projetos")
@Delete
public void delete(Projeto projeto){
dao.delete(projeto);
result.use(Results.logic()).redirectTo(getClass()).list();
}
public void list(){
result.include("projetoList", new ProjetoDao().list());
//return new ProjetoDao().list();
}
}
CONTROLLER DE VALIDAÇÃO NO CLIENTE
/*http://celodemelo.wordpress.com/2007/11/05/internacionalizacao-de-mensagens-no-javascript/
Recupera as mensagens de acordo com o locale do usuário e as transforma num JSON
*/
/*MAIS SOBRE JSON
http://guj.com.br/posts/list/142493.java#768230
www.json.org/java
*/
@Resource
public class I18nController {
private Result result;
private final PrintWriter writer;
private final Locale locale;
private HttpServletResponse response;
public I18nController(Result result, HttpServletRequest request,HttpServletResponse response)
throws Exception{
this.result = result;
locale = (Locale)Config.get(request.getSession(), Config.FMT_LOCALE);
writer = response.getWriter();
this.response = response;
this.response.setContentType("application/json"); // jquery exige que o content-type seja json
}
@Path("/i18n")
public void getJsonMensagens(){
ResourceBundle mensagens = ResourceBundle.getBundle("messages", locale);
StringBuilder json = new StringBuilder();
json.append("[");
Set<String> keys = mensagens.keySet();
for (String key : keys) {
json.append("{key:'" + key + "', value:'" + mensagens.getString(key) + "'},");
}
int i = json.lastIndexOf(",");
json.replace(i, i + 1, "");
json.append("]");
writer.print(json.toString());
result.use(Results.nothing()); // vai para lugar algum
}
}
LIST.JSP
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<HTML>
<?xml version="1.0" encoding="UTF-8"?>
<HEAD>
<!-- VALIDAÇÃO NO CLIENTE -->
<script src="jquery-latest.js"></script>
<script type="text/javascript" src="jquery.validate.js"></script>
<script>
var bundle = new ResourceBundle();
$.get('<c:url value="/i18n"/>',function(data){
bundle.initialize(data);
});
function ResourceBundle(){
this.messages = [];
};
ResourceBundle.prototype.initialize = function(json){
var objs = eval(json);
for(var i = 0; i < objs.length;i++){
var obj = objs[i];
this.messages[obj.key] = obj.value;
}
};
ResourceBundle.prototype.get = function(pKey){
return this.messages[pKey];
};
function validaForm(){
if (document.getElementById("projeto_nome").value == ""){
alert(bundle.get("projeto.valida.nome"));
document.projeto.nome.focus();
return false;
}
return true;
}
</script>
<BODY>
<FONT FACE="Verdana" COLOR="DarkBlue">
<c:import url="/WEB-INF/cabecalho.html"/>
<FONT SIZE=-4><h1 ALIGN=CENTER><fmt:message key="projeto.titulo"/></h1></FONT>
<table border="1" width="100%" cellpadding="10">
<tr>
<!-- FORMULÁRIO -->
<td width="30%" valign="top">
<form id="projetoForm"
action="<c:url value="/projetos"/>">
<fmt:message key="projeto.campo.nome"/><br>
<input name="projeto.nome" id="projeto_nome"/><br>
<noscript><small><FONT COLOR="Red">
<c:if test="${not empty errors[0].message}">
<fmt:message key="${errors[0].message}"/>
</c:if>
</FONT></small></noscript>
<button type="submit" name="_method" value="POST" onClick="validaForm()"><fmt:message key="projeto.botao.salvar"/></button>
<button type="submit" name="_method" value="DELETE"><fmt:message key="projeto.botao.deletar"/></button><br>
</form>
</td>
<!-- LISTAR -->
<td width="70%" valign="top">
<table border="0" align="center" width="100%" cellspacing="0">
<tr><th><fmt:message key="projeto.lista.nome"/></th></tr>
<c:forEach var="projeto" items="${projetoList}">
<tr>
<td width="80%" valign="top">
<form action="<c:url value="/projetos"/>"/>
<input name="projeto.nome" value="${projeto.nome}" size="120" style="background-color: orange; color: darkblue; font-weight: bold"/>
</td>
<td width="10%" valign="top">
<button type="submit" name="_method" value="POST" style="background-color: darkblue; color: white; font-weight: bold">
<fmt:message key="projeto.botao.salvar"/></button>
</td>
<td width="10%" valign="top">
<button type="submit" name="_method" value="DELETE" style="background-color: darkblue; color: white; font-weight: bold">
<fmt:message key="projeto.botao.deletar"/></button>
</td>
</form>
</tr>
</c:forEach>
</table>
</td>
</tr>
</table>
</FONT>
</BODY>
</HEAD>
</HTML>