Problema acceso servlet

Pues de nuevo me he encontrado con un obstáculo, parece ser que después de arreglar los fallos que tenía para que me funcionara la función muestra() encontré que aunque entro en la función y voy avanzando linea por linea obteniendo los valores que quiero cuando llego a la linea:
obj.open("GET","opera?opcion="+elegida,true); //elegida tiene el valor esperado
Parece ser que no entro en el servlet Opera, puse un alert después de esta linea y me lo ejecuta pero usé el depurador de netbeans para poner un break point en el servlet y no entró al servlet...
¿Tienes idea de porque pudo pasar esto?
Te pongo abajo el servlet Opera, solo he programado el método doGet porque supongo que usa ese para obtener los datos y por si las moscas también programé el método service de la misma forma puesto que vi algunos ejemplos y usaban ese método pero en él la función getParameter me da error...
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.sql.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name="Opera", urlPatterns={"/Opera"})
public class Opera extends HttpServlet {
    protected void service(HttpServlet request, HttpServletResponse response) throws ServletException, IOException{
        response.setContentType("text/xml;charset=UTF-8");
        PrintWriter out= response.getWriter();
        String elegida = request.getParameter("opcion");//aqui me subraya en rojo getparameter y no sé porque..
        StringBuilder tXML = new StringBuilder("<?xml version = '1.0'?>");
        tXML.append("<datos>");
        tXML.append("<opcion>");
        tXML.append(elegida);
        tXML.append("</opcion>");
        tXML.append("</datos>");
        out.println(tXML.toString());
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
        response.setContentType("text/xml;charset=UTF-8");
        PrintWriter out= response.getWriter();
        String elegida = request.getParameter("opcion");
        StringBuilder tXML = new StringBuilder("<?xml version = '1.0'?>");
        tXML.append("<datos>");
        tXML.append("<opcion>");
        tXML.append(elegida);
        tXML.append("</opcion>");
        tXML.append("</datos>");
        out.println(tXML.toString());
    }
}
Respuesta
1
Para temas de ajax te recomiendo que no te compliques la vida y usa jquery:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>

Luego, si quieres cargar el resultado de "opera" en un div que se llame por ejemplo "divOperaContent", no tienes más que hacer:
$('#divOperaContent').load('opera?opcion=' + elegida);
Eso por un lado. Por otro lado: estás llamando directamente al servlet "opera". ¿lo tienes bien mapeado en el web.xml?
Y otra cosa... ¿no estabas usando Struts? ¿Por qué llamas a un servlet y no a un action?
En principio tengo que hacer un proyecto usando struts pero por en medio tengo que usar algo de AJAX, lo malo es que de AJAX solo tengo ejemplos donde llamo a un servlet como he hecho yo, no pensé en hacerlo con un action porque supongo que tendría que cambiar mi html select e iba algo apurado y por no ponerme a pensar pues lo dejé sin mirar más...
¿Supongo qué si uso un action tendría que ser algo así no?
<html:form action="opciones.do" method="post">
<html:select styleId="seccion" property="seccion" onchange="muestra();" value="0">
<html:option value="0">
                Selecciona una sección:
</html:option>
<html:optionsCollection name="listasec"/>
</html:select>
</html:form>
No sé como mezclar el envío de datos con el hecho de que los envíe en cuando elija una opción... donde poner el onchange, ¿el method=post o get en el form? ¿Tendría qué cambiar mucho en la función muestra?
Ya ves que no controlo mucho de esto y me lio mucho.
Por otra parte si sigo en la linea en la que estoy... ¿a qué te refieres con mapear el opera en web.xml? No sabia que tuviera que estar ahí, pensaba que solo era para los action...
Tampoco sé de que va el jquery... :( lo tengo complicado...
¿Me puedes aconsejar como seguir? ¿O cómo arreglar el problema en el que estoy?
Actualización:
Después de darle vueltas al código me he dado cuenta que el servlet opera me crea el mensaje xml que quiero. Al final solo sobreescribo el método doGet y este me crea el mensaje en formato xml, el problema es que en la función mostrardatos en la linea:
var raiz= obj.responseXML; donde debería obtener el mensaje xml...
Raíz me devuelve null... No sé porque, comprobé que el servlet crea el mensaje xml, que en el encabezado de la respuesta del servlet va text/xml, no sé que más puede ser para que me devuelva null...
¿Tienes alguna idea?
Muchas gracias por la ayuda!
Si usas Struts deberías invocar siempre a Actions y no a Servlets. Si usas actions, deberás declararlos en el fichero struts.xml.
Para invocar al action de Struts se haría básicamente como lo has puesto, solo que deberías forzar un submit del formulario dentro de la función "muestra()", para que se invoque al action cada vez que cambie el select. Eso sí, de esta manera no se usaría AJAX. Para usar AJAX, te recomiendo nuevamente que uses jQuery, con un plugin adicional para trabajar con formularios donde quieres que el resultado del submit se cargue con ajax. El código quedaría más o menos así:

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
<script src="http://jquery.malsup.com/form/jquery.form.js"></script>
<script>
$(document).ready(function(){
// Se preparan las opciones
var options = {
target:     '#contenidoXML', 
success:    function() { 
alert('Contenido actualizado!'); //puedes borrar esta línea si no te interesa 

}; 
// Se configura el formulario con las opciones
$('#formularioOpciones').ajaxForm(options);
});
function muestra(){
$('#formularioOpciones').submit();
}
</script>
</head>
<body>
<html:form id="formularioOpciones" action="opciones.do" method="post">
<html:select styleId="seccion" property="seccion" onchange="muestra();" value="0">
<html:option value="0">
Selecciona una seccion:
</html:option>
<html:optionsCollection name="listasec"/>
</html:select>
</html:form>
<div id="contenidoXML">aqui se cargará el resultado del action cuando se seleccione una opción</div>
</body>
</html>

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas