Bom dia prezados,
Meu problema é o seguinte:
Segue a página para melhor visualização:
Preciso abrir uma janela popup com um XML quando clicar no botão Ver.
Para isso crio um popup assim:
function newPopup(){
newpopupWindow = window.open ('', "_blank", "scrollbars=1,resizable=1,height=600,width=600");
newpopupWindow.document.write();
}
Em newpopupWindow.document.write(); deve receber meu XML de retorno, esse XML ira vir de uma consulta de um webService, da mesma forma que o botão download, porem o botão download funciona, mas a chamada é diferente, preciso trazer por JSON para não precisar recarregar a página, então estou tentando assim:
function ver(XMLtipo, idUnico){
$.ajax({
url : "DashboardServlet/verXML.do",
//url : "DashboardServlet?operacao=verXML",
type : "POST",
contentType : "application/json; charset=utf-8", //define o myme type da requisição
dataType : "json", //define o tipo de dado retornado pela requisição
data : {
XMLEnvio : XMLtipo,
idUnicoEnvio : idUnico
},
success: function(ResponseXML){
alert(ResponseXML.retorno)
},
error: function(e){
alert(e.retorno);
}
});
}
Porem não consigo devolver o a String com XML de jeito nenhum, sempre cai no error, tenho certeza que chama a função pois devolve cod 200 Ok:
Os outros metodos eu chamo diferente, passo assim:
function download(XML, idUnico, CorrerID){
var location='DashboardServlet?operacao=xmlDownload&XML='+XML+'&idUnico='+idUnico+'&CorrerID='+CorrerID;
redirect(location);
}
function redirect(param){
window.location.href = param;
}
Na servlet eu comparo qual é a operação e mando para o metodo correto, assim:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Verificar a operação a ser realizada
String oper = req.getParameter("operacao");
oper = oper != null ? oper : "loadPagina";
switch (oper) {
case "itensQueueFila": itensQueue(req, resp); break;
case "zeraSessao" : zeraSessao(req, resp); break;
case "consultaFilas": consultaFilas(req, resp); break;
case "xmlDownload" : xmlDownload(req, resp); break;
//case "verXML" : verXML(req, resp); break;
default: loadPagina(req, resp); break;
}
}
No caso do download a servlet está assim:
private void xmlDownload(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ConsultaXMLQueueResponse XML = null;
String nomeColuna = req.getParameter("XML");
String idUnicoXML = req.getParameter("idUnico");
String CorrerIDxml = req.getParameter("CorrerID");
try{
XML = LoadPagina.getXML(nomeColuna, Integer.parseInt(idUnicoXML));
File file = new File(nomeColuna+"_"+CorrerIDxml+".xml");
try (PrintStream ps = new PrintStream(file)) {
ps.println(XML.getXML());
}
resp.setContentType("application/octet-stream");
resp.setContentLength((int) file.length());
resp.setHeader( "Content-Disposition",
String.format("attachment; filename=\"%s\"", file.getName()));
OutputStream out = resp.getOutputStream();
try (FileInputStream in = new FileInputStream(file)) {
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
}
out.flush();
}catch(Exception e){
e.getStackTrace();
}
}
Ela me devolve o download sem recarregar a página, não compreendi muito bem o por que, mas os outros metodos recarregam a página, por exemplo outro metodo:
private void loadPagina(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
req.getSession().removeAttribute("QueuePagina");
req.setAttribute("queues", LoadPagina.getFilasLoadPagina());
//enviaEmail(req, resp);
} catch (Exception e) {
//req.setAttribute("queues", Collections.emptyList());
e.printStackTrace();
}
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/home.jsp");
dispatcher.forward(req, resp);
}
Mas para esses não tem problema recarregar a página, mas para o download e botão ver teria.
Então tento mandar um Ajax para o botão ver, para não recarregar a página e poder abrir quantos popup quiser sem precisar dar reload.
Como estão mandando Ajax então estou chamando direto o metodo sem precisar passar pela comparação da operação.
Minha ultima tentativa foi assim:
private void verXML(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ConsultaXMLQueueResponse XML = null;
String nomeColuna = req.getParameter("XMLEnvio");
String idUnicoXML = req.getParameter("idUnicoEnvio");
try {
XML = LoadPagina.getXML(nomeColuna, Integer.parseInt(idUnicoXML));
resp.setCharacterEncoding("UTF-8");
resp.setContentType("application/json");
// Get the printwriter object from response to write the required json object to the output stream
PrintWriter out = resp.getWriter();
//out.println(XML.getXML());
JSONObject json = new JSONObject();
json.put("retorno", XML.getXML());
out.print(json);
out.flush();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Mas nada funciona, estou a quase dois dias e nada. alguém pode me ajudar??