ajax与servlet交互问题,请高手来指点一下菜鸟!

时间:2021-05-09 21:09:51
JS代码如下:

<script type="text/javascript">
var request;
function createRequest(){
if(window.ActiveXObject){   
            request = new ActiveXObject("Microsoft.XMLHTTP");   
        }else{
            request = new XMLHttpRequest();
        }   
}
function checkID(){
var id = $("#id").val();
var url = "servlet/CheckID?id=" + id;
createRequest();
request.open("post", url, true);
request.onreadystatechange = processResponse;
request.send(null);
}
function processResponse(){
var res = request.responstText;
if(request.readyState == 4){
if(request.status == 200){
if(res == "success"){
alert("ID已经存在!");
}
}
}else{
alert("请求出现异常!");
}
}
$("#regist").click(function(){
alert("注册");
});
$("#submits").click(function(){
$("#loginForm")[0].submit();
});
  </script>

为测试,servlet的dopost方法中只写了一条输出语句。如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter pw = response.getWriter();
System.out.println(request.getParameter("id"));
pw.print("success");
return;
}


但实际测试时,始终提示“请求出来异常”,我想问问,是我哪里没有配置对吗?

32 个解决方案

#1


你那样子判读,总是提示“请求出来异常”是正常的。因为"request.readyState "这里有四个状态。
第一次if(1==4),不成立,所以就执行else里面的.第二次......同样!
还有"var res = request.responstText”获取请求的返回值,一般是request.status == 200请求成功时候才得到的.

#2


楼上正解,不过,如果始终没有执行到
“alert("ID已经存在!");”

的话,那可能url或其它什么地方也出问题了

#3


我现在就是想知道,为什么会请求不成功呢?

#4


var url = "servlet/CheckID?id=" + id;


先直接在浏览器写上url试试可以输出语句不

#5


你判断的地方放错了,即使成功也总是提示‘请求出现异常’.

 function processResponse(){   
        if(request.readyState == 4){
            if(request.status == 200){
               var res = request.responseText;              
                if(res == "success"){
                    alert("ID已经存在!");
                }else{
                 alert("ID可以用");
                }
            }else{
             alert('请求失败');
            }
        }
    }

红色那段你放在最上面,IE8是有问题的。
其他你确定一下你的servlet是否能执行到.

#6


引用楼主 ydsxi1314 的回复:
    function processResponse(){
        var res = request.responstText;
        if(request.readyState == 4){
            if(request.status == 200){
                if(res == "success"){
                    alert("ID已经存在!");
                }
            }
        }else{
            alert("请求出现异常!");
        }
    }

    function processResponse(){
        if(request.readyState == 4){
            var res = request. responseText;
            if(request.status == 200){
                if(res == "success"){
                    alert("ID已经存在!");
                }
            }else{
                alert("请求出现异常!");
            }
        }
    }

#7


var url = "servlet/CheckID?id=" + id;这里有问题把,加上contextpath

#8


...楼主啊,调试有很多方法,你设置断点,打印看是否访问到你的serverlet,还有alert你的返回值,都是方法,一步一步,随便怎么样都能够解决你的问题,这个跟其他没有多少关系,照样能够找到问题所在。

#9


可能是路径问题
var url = "<%=request.getContextPath()%>/servlet/CheckID?id=" + id;
我这样写了下不行。

#10


因为你返回的success 并不是你看到的这个词 周遍还有别的符号所以
if(res == "success")
这个判断永远不会成功!!!

#11


var res = request.responseText;改成
var res = request.responseText.replace(/(^\s*)|(\s*$)/g,"");

#12


按楼上哥们所说,应该是执行到

if(res == "success"){
alert("ID已经存在!");
}

这个判断了,但目前是没有进到这个判断中,直接弹出alert("请求出现异常!");

#13


方法已经修改,如下:

function processResponse(){
if(request.readyState == 4){
var res = request.responstText;
if(request.status == 200){
if(res == "success"){
alert("ID已经存在!");
}
}else{
alert("请求出现异常!");
}
}
}

#14


function processResponse(){
        if(request.readyState == 4&&request.status == 200){
            var res = request.responstText.replace(/(^\s*)|(\s*$)/g,"");
            if(res == "success"){
                alert("ID已经存在!");
            }else{
                alert("请求出现异常!");
            }
        }
    }

#15


引用 12 楼 ydsxi1314 的回复:
按楼上哥们所说,应该是执行到

JScript code

if(res == "success"){
                    alert("ID已经存在!");
                }


这个判断了,但目前是没有进到这个判断中,直接弹出alert("请求出现异常!");


我已经说了 因为你返回的“success” 并不是你看到的这个词--"success" 这个"success"边上还有别的你看不到的

#16


仍然是“请求出现异常”
if(request.status == 200){

}else{
    alert("请求出现异常!");
}
现在是执行if(request.status == 200)的否则情况,楼上的兄弟,明白了吗?

#17


引用 16 楼 ydsxi1314 的回复:
仍然是“请求出现异常”
if(request.status == 200){

}else{
  alert("请求出现异常!");
}
现在是执行if(request.status == 200)的否则情况,楼上的兄弟,明白了吗?


var res = request.responstText.replace(/(^\s*)|(\s*$)/g,"");

request.responstText 后面 我加了 replace(/(^\s*)|(\s*$)/g,"") 你知道是什么意思么。 

#18


引用 13 楼 ydsxi1314 的回复:
方法已经修改,如下:
JScript code


            var res = request.responstText;
 

还不改?
responseText,不是你那个...
其他没大问题,除开像5楼所说,应该注意Servlet是否有输出,以判断Servlet是否被正常访问。

#19


我也是等待

#20


帖一下servlet的dopost代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
    response.setHeader("Cache-Control", "no-cache");
PrintWriter pw = response.getWriter();
System.out.println(request.getParameter("id"));
pw.print("success");
}

只为测试交互,没有实现任何功能!

#21



function checkID(){
var id = $("#id").val();
var url = "/servlet/CheckID?id=" + id;
alert(url);
createRequest();
request.open("post", url, true);
request.onreadystatechange = processResponse;
request.send(null);
}
function processResponse(){
if(request.readyState == 4){
if(request.status == 200){
var res = request.responseText.replace(/(^\s*)|(\s*$)/g,"");
if(res == "success"){
alert("ID已经存在!");
}else{
alert("可以注册!");
}
}else if(request.status == 404){
alert("url不存在!");
}else{
alert("请求出现异常!");
}
}
}


url不存在,我这样写url不可以吗?我加上<%=request.getContextPath()%>也不行!

#22


试试返回整数1,是否能判断成功!

#23


引用 20 楼 ydsxi1314 的回复:
帖一下servlet的dopost代码:
Java code

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text……


你 pw.print("success");
这句代码 返回到 请求页的时候并不是 success 这6个字母!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

所以你 那个判断永远都是 false!

to 18楼
那是我打错了 

#24


察看Servlet路径的方式:
最保险的做法:web.xml中url-mapping
简便的做法:在Eclipse中Servlet类结点上右击鼠标运行之,浏览器URL栏能看到,为了能看到直接访问的效果,在doGet中调用doPost

#25


引用 24 楼 magong 的回复:
察看Servlet路径的方式:
最保险的做法:web.xml中url-mapping
简便的做法:在Eclipse中Servlet类结点上右击鼠标运行之,浏览器URL栏能看到,为了能看到直接访问的效果,在doGet中调用doPost


不是这个原因,他都说了  System.out.println(request.getParameter("id"));
可以打印出来的 那就说明SERVLET肯定没问题了
PS:其实我已经说的很清楚了,还不明白我也没办法了。

#26


我不明白23楼的哥们zhuchao_ko:你为什么一直强调返回“success”这个问题,
现在request.status == 404你明白吗?根本都没有执行到if(res == "success")这个判断上,
也许你说的对,返回值确实不只success这7个字母,但是,但是现在还没有走到这一步呢啊!
你是不是没看清楚大括号的配对?再次帖代码:

function checkID(){
        var id = $("#id").val();
        var url = "/servlet/CheckID?id=" + id;
        alert(url);
        createRequest();
        request.open("post", url, true);
        request.onreadystatechange = processResponse;
        request.send(null);
    }
    function processResponse(){
        if(request.readyState == 4){
            if(request.status == 200){
                var res = request.responseText.replace(/(^\s*)|(\s*$)/g,"");
                if(res == "success"){
                    alert("ID已经存在!");
                }else{
                    alert("可以注册!");
                }
            }else if(request.status == 404){
                alert("url不存在!");
            }else{
                alert("请求出现异常!");
            }
        }
    }


目前执行后,弹出“url不存在”

#27


System.out.println(request.getParameter("id"));这句没有打印

#28


现在错误很明确,没有执行到servlet,但servlet路径的各种写法我都试过了!

#29


引用 27 楼 ydsxi1314 的回复:
System.out.println(request.getParameter("id"));这句没有打印

Servlet访问问题。
请如我24楼所说,先实现doGet,再找出该Servlet准确的URL,然后我们再一起看那JS中url应该怎么写。

#30


有可能根本没有进入servlet吧

#31


<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  
  <body>
   <script type="text/javascript">
function createRequest()
{
if(window.XMLHttpRequest)
    {
        return new XMLHttpRequest();//mozilla浏览器
    }
    else if(window.ActiveXObject)
    {
        try
        {
            return new ActiveXObject("Msxml2.XMLHTTP");//IE老版本
        }
        catch(e)
        {}
        try
        {
            return new ActiveXObject("Microsoft.XMLHTTP");//IE新版本
        }
        catch(e)
        {}
        if(!xmlHttpRequest)
        {
            return false;
        }
    }
}
var xmlHttpRequest;
function checkID()
{
var id=document.getElementById("id").value;
var url = "/Test/servlet/TestServlet?id="+id;
xmlHttpRequest=createRequest();
xmlHttpRequest.onreadystatechange=processResponse;
xmlHttpRequest.open("POST",url,true);
xmlHttpRequest.send(url);
}
function processResponse()
{
if(xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200)
{
var res=xmlHttpRequest.responseText;
if(res=="success")
{
alert("ID已存在");
}

}
}
    $("#regist").click(function(){
        alert("注册");    
    });
    $("#submits").click(function(){
        $("#loginForm")[0].submit();
    });
  </script>
<form action="">
<input id="id" type="text" name="id">
<button onclick="javascript:checkID()">
测试
</button>
</form>
  </body>
</html>
Servlet 里跟你的一样;名字叫TestServlet
Test是我的项目名字 可以运行成功,你看看吧。

#32


问题找到了,原来是因为我在我配置struts2时
<filter-mapping>
     <filter-name>struts2</filter-name>
     <url-pattern>*.*</url-pattern>
</filter-mapping>
<url-pattern>写成了*.*,这样导致在进入servlet时,struts2过滤器将自动将自动拦截进入servlet的操作,所以无论我怎样访问servlet都是无法找到。
现在将原<url-pattern>*.*</url-pattern>改成<url-pattern>*.jsp</url-pattern>问题得以解决。
同时非常感谢大家的热心帮忙,结帖了!

#1


你那样子判读,总是提示“请求出来异常”是正常的。因为"request.readyState "这里有四个状态。
第一次if(1==4),不成立,所以就执行else里面的.第二次......同样!
还有"var res = request.responstText”获取请求的返回值,一般是request.status == 200请求成功时候才得到的.

#2


楼上正解,不过,如果始终没有执行到
“alert("ID已经存在!");”

的话,那可能url或其它什么地方也出问题了

#3


我现在就是想知道,为什么会请求不成功呢?

#4


var url = "servlet/CheckID?id=" + id;


先直接在浏览器写上url试试可以输出语句不

#5


你判断的地方放错了,即使成功也总是提示‘请求出现异常’.

 function processResponse(){   
        if(request.readyState == 4){
            if(request.status == 200){
               var res = request.responseText;              
                if(res == "success"){
                    alert("ID已经存在!");
                }else{
                 alert("ID可以用");
                }
            }else{
             alert('请求失败');
            }
        }
    }

红色那段你放在最上面,IE8是有问题的。
其他你确定一下你的servlet是否能执行到.

#6


引用楼主 ydsxi1314 的回复:
    function processResponse(){
        var res = request.responstText;
        if(request.readyState == 4){
            if(request.status == 200){
                if(res == "success"){
                    alert("ID已经存在!");
                }
            }
        }else{
            alert("请求出现异常!");
        }
    }

    function processResponse(){
        if(request.readyState == 4){
            var res = request. responseText;
            if(request.status == 200){
                if(res == "success"){
                    alert("ID已经存在!");
                }
            }else{
                alert("请求出现异常!");
            }
        }
    }

#7


var url = "servlet/CheckID?id=" + id;这里有问题把,加上contextpath

#8


...楼主啊,调试有很多方法,你设置断点,打印看是否访问到你的serverlet,还有alert你的返回值,都是方法,一步一步,随便怎么样都能够解决你的问题,这个跟其他没有多少关系,照样能够找到问题所在。

#9


可能是路径问题
var url = "<%=request.getContextPath()%>/servlet/CheckID?id=" + id;
我这样写了下不行。

#10


因为你返回的success 并不是你看到的这个词 周遍还有别的符号所以
if(res == "success")
这个判断永远不会成功!!!

#11


var res = request.responseText;改成
var res = request.responseText.replace(/(^\s*)|(\s*$)/g,"");

#12


按楼上哥们所说,应该是执行到

if(res == "success"){
alert("ID已经存在!");
}

这个判断了,但目前是没有进到这个判断中,直接弹出alert("请求出现异常!");

#13


方法已经修改,如下:

function processResponse(){
if(request.readyState == 4){
var res = request.responstText;
if(request.status == 200){
if(res == "success"){
alert("ID已经存在!");
}
}else{
alert("请求出现异常!");
}
}
}

#14


function processResponse(){
        if(request.readyState == 4&&request.status == 200){
            var res = request.responstText.replace(/(^\s*)|(\s*$)/g,"");
            if(res == "success"){
                alert("ID已经存在!");
            }else{
                alert("请求出现异常!");
            }
        }
    }

#15


引用 12 楼 ydsxi1314 的回复:
按楼上哥们所说,应该是执行到

JScript code

if(res == "success"){
                    alert("ID已经存在!");
                }


这个判断了,但目前是没有进到这个判断中,直接弹出alert("请求出现异常!");


我已经说了 因为你返回的“success” 并不是你看到的这个词--"success" 这个"success"边上还有别的你看不到的

#16


仍然是“请求出现异常”
if(request.status == 200){

}else{
    alert("请求出现异常!");
}
现在是执行if(request.status == 200)的否则情况,楼上的兄弟,明白了吗?

#17


引用 16 楼 ydsxi1314 的回复:
仍然是“请求出现异常”
if(request.status == 200){

}else{
  alert("请求出现异常!");
}
现在是执行if(request.status == 200)的否则情况,楼上的兄弟,明白了吗?


var res = request.responstText.replace(/(^\s*)|(\s*$)/g,"");

request.responstText 后面 我加了 replace(/(^\s*)|(\s*$)/g,"") 你知道是什么意思么。 

#18


引用 13 楼 ydsxi1314 的回复:
方法已经修改,如下:
JScript code


            var res = request.responstText;
 

还不改?
responseText,不是你那个...
其他没大问题,除开像5楼所说,应该注意Servlet是否有输出,以判断Servlet是否被正常访问。

#19


我也是等待

#20


帖一下servlet的dopost代码:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
    response.setHeader("Cache-Control", "no-cache");
PrintWriter pw = response.getWriter();
System.out.println(request.getParameter("id"));
pw.print("success");
}

只为测试交互,没有实现任何功能!

#21



function checkID(){
var id = $("#id").val();
var url = "/servlet/CheckID?id=" + id;
alert(url);
createRequest();
request.open("post", url, true);
request.onreadystatechange = processResponse;
request.send(null);
}
function processResponse(){
if(request.readyState == 4){
if(request.status == 200){
var res = request.responseText.replace(/(^\s*)|(\s*$)/g,"");
if(res == "success"){
alert("ID已经存在!");
}else{
alert("可以注册!");
}
}else if(request.status == 404){
alert("url不存在!");
}else{
alert("请求出现异常!");
}
}
}


url不存在,我这样写url不可以吗?我加上<%=request.getContextPath()%>也不行!

#22


试试返回整数1,是否能判断成功!

#23


引用 20 楼 ydsxi1314 的回复:
帖一下servlet的dopost代码:
Java code

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text……


你 pw.print("success");
这句代码 返回到 请求页的时候并不是 success 这6个字母!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

所以你 那个判断永远都是 false!

to 18楼
那是我打错了 

#24


察看Servlet路径的方式:
最保险的做法:web.xml中url-mapping
简便的做法:在Eclipse中Servlet类结点上右击鼠标运行之,浏览器URL栏能看到,为了能看到直接访问的效果,在doGet中调用doPost

#25


引用 24 楼 magong 的回复:
察看Servlet路径的方式:
最保险的做法:web.xml中url-mapping
简便的做法:在Eclipse中Servlet类结点上右击鼠标运行之,浏览器URL栏能看到,为了能看到直接访问的效果,在doGet中调用doPost


不是这个原因,他都说了  System.out.println(request.getParameter("id"));
可以打印出来的 那就说明SERVLET肯定没问题了
PS:其实我已经说的很清楚了,还不明白我也没办法了。

#26


我不明白23楼的哥们zhuchao_ko:你为什么一直强调返回“success”这个问题,
现在request.status == 404你明白吗?根本都没有执行到if(res == "success")这个判断上,
也许你说的对,返回值确实不只success这7个字母,但是,但是现在还没有走到这一步呢啊!
你是不是没看清楚大括号的配对?再次帖代码:

function checkID(){
        var id = $("#id").val();
        var url = "/servlet/CheckID?id=" + id;
        alert(url);
        createRequest();
        request.open("post", url, true);
        request.onreadystatechange = processResponse;
        request.send(null);
    }
    function processResponse(){
        if(request.readyState == 4){
            if(request.status == 200){
                var res = request.responseText.replace(/(^\s*)|(\s*$)/g,"");
                if(res == "success"){
                    alert("ID已经存在!");
                }else{
                    alert("可以注册!");
                }
            }else if(request.status == 404){
                alert("url不存在!");
            }else{
                alert("请求出现异常!");
            }
        }
    }


目前执行后,弹出“url不存在”

#27


System.out.println(request.getParameter("id"));这句没有打印

#28


现在错误很明确,没有执行到servlet,但servlet路径的各种写法我都试过了!

#29


引用 27 楼 ydsxi1314 的回复:
System.out.println(request.getParameter("id"));这句没有打印

Servlet访问问题。
请如我24楼所说,先实现doGet,再找出该Servlet准确的URL,然后我们再一起看那JS中url应该怎么写。

#30


有可能根本没有进入servlet吧

#31


<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
  </head>
  
  <body>
   <script type="text/javascript">
function createRequest()
{
if(window.XMLHttpRequest)
    {
        return new XMLHttpRequest();//mozilla浏览器
    }
    else if(window.ActiveXObject)
    {
        try
        {
            return new ActiveXObject("Msxml2.XMLHTTP");//IE老版本
        }
        catch(e)
        {}
        try
        {
            return new ActiveXObject("Microsoft.XMLHTTP");//IE新版本
        }
        catch(e)
        {}
        if(!xmlHttpRequest)
        {
            return false;
        }
    }
}
var xmlHttpRequest;
function checkID()
{
var id=document.getElementById("id").value;
var url = "/Test/servlet/TestServlet?id="+id;
xmlHttpRequest=createRequest();
xmlHttpRequest.onreadystatechange=processResponse;
xmlHttpRequest.open("POST",url,true);
xmlHttpRequest.send(url);
}
function processResponse()
{
if(xmlHttpRequest.readyState==4 && xmlHttpRequest.status==200)
{
var res=xmlHttpRequest.responseText;
if(res=="success")
{
alert("ID已存在");
}

}
}
    $("#regist").click(function(){
        alert("注册");    
    });
    $("#submits").click(function(){
        $("#loginForm")[0].submit();
    });
  </script>
<form action="">
<input id="id" type="text" name="id">
<button onclick="javascript:checkID()">
测试
</button>
</form>
  </body>
</html>
Servlet 里跟你的一样;名字叫TestServlet
Test是我的项目名字 可以运行成功,你看看吧。

#32


问题找到了,原来是因为我在我配置struts2时
<filter-mapping>
     <filter-name>struts2</filter-name>
     <url-pattern>*.*</url-pattern>
</filter-mapping>
<url-pattern>写成了*.*,这样导致在进入servlet时,struts2过滤器将自动将自动拦截进入servlet的操作,所以无论我怎样访问servlet都是无法找到。
现在将原<url-pattern>*.*</url-pattern>改成<url-pattern>*.jsp</url-pattern>问题得以解决。
同时非常感谢大家的热心帮忙,结帖了!