2013-05-18 147 views
1

我需要将控制权重新检索回给Jsp,其中包含之前请求的响应。 但我面临的问题是我无法在jsp中获得响应。无法接收来自servlet的响应

我已经经历了几个帖子,并尝试了一些建议,但似乎没有为我工作。请指出我的错误在哪里。

下面是我的尝试:

protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     log.info("IN form doGet"); 
     request.setCharacterEncoding("utf-8"); 
     String selectedClass = request.getParameter("key"); 
     log.info(selectedClass); 
     String[] section = null; 
     DBHandler dbhandler = new DBHandler(); 
     dbhandler.makeConnection(); 
     if (true == dbhandler.verifyConnection()) { 
      section = dbhandler.getSection(selectedClass); 
     } 
     for (String str : section) { 
      log.info(str); 
     } 
     Logger log; 
     if (null != section) { 
      request.setAttribute(Appconstants.Section, section); 
     } 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.sendRedirect("/ReportFetcher/WebContent/FirstJSP.jsp"); 
//  RequestDispatcher view = request.getRequestDispatcher("/First.jsp"); 
//  view.forward(request, response); 
    } 

以下是JSP部分:

function funcOnChange() { 
    var index = document.detail.Class.selectedIndex; 
    var valueSelected = document.detail.Class.options[index].value; 
    var xhr = new XMLHttpRequest(); 

    xhr.onreadystatechange = function() 
    { 
     // Check to see if this state change was "request complete", and 
     // there was no server error (404 Not Found, 500 Server Error, etc) 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      var substring=xmlHttp.responseText; 
      alert("Alert Dialog! Gaurav"); 
     } 
     if (xmlhttp.readyState == 404){ 
      alert("404 error"); 
     } 
     if (xmlhttp.readyState == 500){ 
      alert("500 error"); 
     } 

    } 
    xhr.open('GET', 'http://localhost:8080/ReportFetcher/FormHandler?key='+encodeURIComponent(valueSelected), true); 
    xhr.send(null); 
    return false; 
} 
+0

目前还不清楚你想要达到什么样的问题,但是在servlet中,从数据库中检索信息并将其存储在请求属性中,如果你正在做的是发送一个请求重定向到另一个位置? –

+0

实际上我需要做两个下拉菜单,第二个下拉菜单依赖于第一个下拉选择。这就是为什么我需要执行DB操作来获取元素。所以,我在这里发送第一个下拉列表的onChange请求并执行数据库操作并将结果返回。现在我想要的是将这个结果发回给我的jsp并激活第二个。但我无法发送结果。 –

+0

重定向到FirstJSP.jsp会告诉浏览器向FirstJSP.jsp发送一个新请求。因此,当第二个请求由JSP处理时,您存储在第一个请求的属性中的所有内容都将丢失。你想要一个转发,而不是一个重定向。 –

回答

1

我认为你做的一切都是正确的,并且如上面所建议的,你也应该转发请求而不是重定向请求。

点你要去哪里错了是你做了XMLHttpRequest对象,并通过使用可变xhr引用它同时使请求的,但是当你正在那个时候,你正在检查变量xmlhttp的状态响应的照顾,所以你需要做的是用xhr替换变量xmlhttp

如果您遇到任何问题,请随时询问。

0

我想你可能误会response.sendDirect方法的意义。该方法将

设置适当的标头和内容正文以将客户端重定向到不同的URL。

参见SRV.5.4。

所以当你涉及这个方法时,响应就会被解决,当客户端(浏览器)收到响应时,它将重定向到你设置的URL。而jsp将会收到来自浏览器的新的新请求。

1

你的第一个下拉列表的Onchange会向你的db发出ajax请求,这就是你已经完成的操作。 所以现在你需要写在你的jsp中收到的响应,所以它实际上会填充第二个下拉列表。

要让servlet回应,您需要使用响应对象并使用打印方法来编写响应。

继承人线索如何生成一个降下来的选项动态

使用的document.getElementById(yourselecttagid); 而上述返回标签使用appendChild方法将选项添加到它..

好了,现在这个servlet返回响应使用scriplet 像使用responseText的,并显示它。无论您wantto ......在你的JSP此

1

使用RequestDispatcher包含或转发您的响应和请求。这将很容易处理。