Form mit POST übermitteln und upload mit XmlHttpRequest mit GET analysieren

du-it

Grünschnabel
Form mit POST übermitteln und Upload-Status mit XmlHttpRequest GET abfragen

Hallo.

Ich möchte gerne eine Datei zu einem Servlet mittels Formular method="POST" und action="TestServlet" hochladen. Diese Datei soll dann in doPost(...) validiert werden, was einige Zeit in Anspruch nehmen kann.
Deshalb dachte ich daran, dass VOR der tatsächlichen Übermittlung an das Servlet ein JavaScript ausgeführt wird, dass ein XmlHttpRequest Objekt erzeugt, dass mit open("GET", "TestServlet", true) immer wieder den Status abfragt und (statt eines Progressbars) die bislang ermittelten Fehler in der JSP anzeigt. URL für POST und GET sind jeweils das selbe Servlet.

Code:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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">
	<script type="text/javascript">
	//<!--
	var xhrInterval = false;
	var xhrTimeout  = false;
	function submitForm()
	{
	    var xhr = false;
	    try {  xhr = new ActiveXObject('Msxml2.XMLHTTP');   }
	    catch (e) 
	    {
	        try {   xhr = new ActiveXObject('Microsoft.XMLHTTP');    }
	        catch (e2) 
	        {
	          try {  xhr = new XMLHttpRequest();     }
	          catch (e3) {  xhr = false;   }
	        }
	     }
	    xhr.onreadystatechange  = function()
	    {
			if (xhr.readyState == 4) {
				if (xhr.status == 200) {
			    	alert("Fertig!");
					var errs = xhr.responseXml.getElementsByTagName("ERRORS")[0];
					document.ajax.dyn.value = "Received:" + errs;
				} else {
					document.ajax.dyn = "Error code " + xhr.status;
				}
				clearInterval(xhrInterval);
				//clearTimeout(xhrTimeout);
			}
		};

		xhr.open("GET", "TestServlet", true);
		xhr.send("null");
	}
	
	function go() {
		submitForm();
		xhrInterval = setInterval("submitForm();", 1000);
	}
	//-->
</script>
	<title>Insert title here</title>
</head>
<body>
	<form method="post" name="ajax" action="TestServlet">
         <INPUT type="button" value="Click" onclick="go();" /> 
         <!-- <INPUT type="button" value="Click" onclick="submitForm(); return false;" /> -->
         <INPUT type="text" name="dyn" value="" />
         <INPUT type="submit" value="Submit" onclick="submitForm(); return true;" /> 
    </form>
	
</body>
</html>

Hier noch das minimalistische Servlet, das zunächst nur auf der Konsole ausgeben soll, welche der Methoden doPost(...) oder doGet(...) aufgerufen wurde:

Code:
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Say Hello GET.");
		String sent = request.getParameter("sent");
        System.out.println(sent); 
//		PrintWriter out = response.getWriter();
//		response.setContentType("text/xml");
//		HttpSession session = request.getSession();
//		Integer errCount = (Integer)session.getAttribute("ERRORS");
//		errCount = new Integer(5);
//		session.setAttribute("ERRORS", new Integer(-1));
//		StringBuffer buffy = new StringBuffer("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
//		buffy.append("<response>");
//		buffy.append("<errors>");
//		buffy.append(errCount);
//		buffy.append("</errors>");
//		buffy.append("</response>\n");
//		if(out != null) {
//			out.println(buffy.toString());
//			out.flush(); 
//			out.close();
//    	}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Say Hello POST.");
		String sent = request.getParameter("sent");
        System.out.println(sent); 
		HttpSession session = request.getSession();
		int errs = 123;
		session.removeAttribute("ERRORS");
		session.setAttribute("ERRORS", new Integer(errs));
		System.out.println(session.getAttribute("ERRORS") + " Fehler in Session gespeichert. Attributname: ERRORS");
	}

}

TestServlet.doPost(...) wird aufgerufen, TestServlet.doGet(...) aber leider nicht. Jedenfalls erfolgen die Konsolenausgaben nicht. Weshalb nicht?

Vielen Dank.
 
Zuletzt bearbeitet:
Zurück