Imprimir valor de um Servlet via Ajax

9 respostas
jeovane.reges

Olá a todos, boa tarde.
Pessoal estou com o seguinte problema.
Tenho um Servlet no qual desejo imprimir em um textarea via ajax apenas o valor de uma variável que passo no request.setAttribute().
No entanto, da maneira na qual se encontra o meu, servlet ele estar imprimindo toda uma página que é passada no request.getRequestDispatcher().

O Código do meu Servlet se encontra da seguinte maneira.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    String[] menu = request.getParameterValues("menu[]");
    String[] subMenu = request.getParameterValues("subMenu[]");
    String domainOntology = request.getParameter("domainOntology");

    // O código ta resumido pra não ocupar muito espaço

     // O valor que eu desejo imprimir em meu textarea é esse aqui: "query"
     request.setAttribute("query", query);

    RequestDispatcher rd = request.getRequestDispatcher("/page-loaded-ontology.jsp");
    rd.forward(request, response);
}
Meu código em Ajax se encontra da seguinte maneira
$.ajax({
    url: "assembles-query",
    type: "POST",
    data: {
        "menu": menu,
        "subMenu":subMenu,
        "domainOntology":domainOntology
    },
    error:function(){
        alert("ERRO MENU")
    },
    success:function(data){
        $("textarea[id=assembleQuery]").val(data);
    }
});
Alguém sabe me dizer o que posso fazer para contornar esse meu problema? Desde de já obrigado pela ajuda de todos.

9 Respostas

E

crie outro template jsp somente com o valor e boa…

jeovane.reges

Tentei fazer isso, no entanto dar erro.
Pois, o valores das minhas variáveis menu e subMenu, encontram-se na minha página na qual a passo no request.getRequestDispatcher("/page-loaded-ontology.jsp");

Se houvesse uma maneira de pegar apenas o valor do textarea em vez do data todo, acredito que daria certo.

E

tem sim e nisso eu posso te ajudar xD
to aprendendo java mas so pró no js

$.ajax({  
    url: "assembles-query",  
    type: "POST",  
    data: {  
        "domainOntology": $("#idDoElemento").val(); //altere aqui para o id do textarea
    },  
    error:function(){  
        alert("ERRO MENU")  
    },  
    success:function(data){  
        $("textarea[id=assembleQuery]").val(data);  
    }  
});
jeovane.reges

Olá ericrf, da maneira que você falou dar certo pra passar os valores corretamente.

"menu[]" : $("input[id=menu]").val(), "subMenu[]" : $("input[id=subMenu]").val(), "domainOntology" : $("input[id=addressDom]").val()
No entanto, em meu textarea continua imprimindo toda a página e não apenas o valor da minha variável query definida em meu servlet :confused:

E

bom. o servlet reenderiza toda a pág jsp contida em

“/page-loaded-ontology.jsp”

vc teria q alterar a saída do JSP para retornar somente oque você quer… bota o jsp ae pra gente

jeovane.reges
O JSP que é retornado é o seguinte.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Prototipo de Uso</title>
        <style>
            @import url(css/layoutGeral.css);
        </style>
        <script type="text/javascript" src="./js/jquery-1.4.2.min.js"></script> 
        <script type="text/javascript" src="./js/underscore.js"></script>
        <script type="text/javascript" src="./js/funcoes-basicas.js"></script>
        <!-- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script> -->
    </head>
    <body>        
        <div id="LayoutGeral">
            <div class="topoLayout">
                <div class="logoTopo">
                    <a href="/ontology-browser">HOME</a>
                </div>
  
        <div class="topoAddress">
                    <div class="campoForm">
                        <label for="address"><h2>Domain Ontology</h2></label>
                        <div class="campoForm">
                            <input type="text" name="addressDom" id="addressDom" value="" class="inputStyle" style="width:912px;" />
                        </div>
                    </div>
                </div>
            </div>
            <form name="valueArrays" id="valueArrays" action="assembles-query" method="post">
                <input type="hidden" id="menu" name="menu[]" value="" />
                <input type="hidden" id="subMenu" name="subMenu[]" value="" />
                <!-- <input type="submit" name="submitValuesMenu" id="submitValuesMenu" value="Gravar" /> -->
            </form>
            <div class="menuLeft">
                <h2>Classes</h2>
                <ul class="menuClasses">
                    
                </ul>
            </div>

        <div class="layoutContent">
            <form name="assemblesQuery" id="assemblesQuery" method="get" target="">
                <h2>Sources e Filters</h2>
                <div class="contentSouces">
                    <input type="checkbox" name="source" id="source" />
                    <label for="source">Sources</label>
                    <input type="checkbox" name="filters" id="filters" /> 
                    <label for="filters">Filters</label>
                </div>
                <h4 class="h4ContentQuery">Query</h4>
                <div class="contentQuery">
                    // O QUE EU QUERO É ISSO AQUI TA DENTRO DO MEU TEXTAREA
                    <textarea id="assembleQuery" name="assembleQuery">
			  PREFIX dailymed: <http://www4.wiwiss.fu-berlin.de/dailymed/resource/dailymed/>
			  PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>
			  PREFIX sider: <http://www4.wiwiss.fu-berlin.de/sider/resource/sider/>

			  SELECT ?Disease_name ?Drug_name ?Ingredient_name 
			  WHERE { 
			    ?Disease ddg:name ?Disease_name. 
			    ?Disease ddg:possibleDrug ?Drug_Disease. 
			    ?Drug_Disease ddg:activeIngredient ?Ingredient_Drug. 
			    ?Drug_Disease ddg:name ?Drug_name. 
			    ?Ingredient_Drug ddg:name ?Ingredient_name. 
			  }
		   </textarea>
                </div>
                <div style="text-align:right;">
                    <input type="reset" name="submitClear" id="submitClear" value="Clear Query" class="botaoForm" />
                    <input type="submit" name="submitRun" id="submitRun" value="Run Query" class="botaoForm" />
                </div>
            </form>
        </div>

            <div class="clear"></div>
            <div id="RodaPe"></div>
        </div>
    </body>
</html>
E

bom oque seu código está fazendo é jogar toda essa pág dentro do textarea

vc teria que criar outro JSP e nele escrever somente os dados de retorno para sua função ajax… q pode ser um simples texto, um xml ou um json.

não sei como faz isso em JAVA. mas vc teria q verificar a chamada se é do tipo XHR (XML HTTP REQUEST)
e mandar reenderizar outro JSP

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {  
    String[] menu = request.getParameterValues("menu[]");  
    String[] subMenu = request.getParameterValues("subMenu[]");  
    String domainOntology = request.getParameter("domainOntology");  
  
    // O código ta resumido pra não ocupar muito espaço  
  
     // O valor que eu desejo imprimir em meu textarea é esse aqui: "query"  
     request.setAttribute("query", query);  
    //verificação de tipo de requisição  
    String url = null;
    if(request.isXHR()) url = "/page-ajax-ontology.jsp"; //isso aqui ta errado mas seria algo desse tipo...
    else url = "/page-loaded-ontology.jsp";

    //dispara saída 
    RequestDispatcher rd = request.getRequestDispatcher(url);  
    rd.forward(request, response);  
}

você também pode útilizar o load do jQuery que faz a requisição de apenas um elemento da pág.
mas não tenho certeza se o método load é capaz de enviar dados

ref.: http://api.jquery.com/load/

o correto seria verificar o tipo de requisição no seu método JAVA e se for uma requisição do tipo XHR ele retornar somente um texto,xml ou json

jeovane.reges

Obrigado ericrf pela ajuda.
Irei pesquisar um pouco mais e qualquer novidade posto aqui.

jeovane.reges

Conseguir resolver o meu problema.
Para resolver alterei algumas linhas de códigos, segue abaixo as modificações.
Ajax

// Alterei o success deixando da seguinte maneira abaixo success:function(responseText){ $("textarea[id=assembleQuery]").text(responseText); }
Servlet

// Removi o request.getRequestDispatcher() e utilizei o response para enviar os dados de minha variável "query" response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(query);
Obrigado pela ajuda pessoal.
Até a próxima.

Criado 22 de janeiro de 2013
Ultima resposta 22 de jan. de 2013
Respostas 9
Participantes 2