各位大神好,我又回来了,一个很紧急的问题,可能我基础太差,想了一下午没想出来,现在真心求助。
是这样,我写了一个servlet处理数据库查询结果,再将url指向我的主页面,在主页面中获取servlet参数,同时主页面有一个ajax,可以提交内容到另一个页面进行数据库的储存。相当于一个A-B-C的过程。但是我的ajax在添加servlet代码之前是正常的,加了以后,一直报404错误,不知道为啥。servlet页面主要代码如下:protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
String url="jdbc:mysql://localhost:3306/s.a.v.e?characterEncoding=utf8&useSSL=false";
String username="root";
String password="123456";
Connection conn=DriverManager.getConnection(url,username,password);//连接数据库
Statement state=conn.createStatement();
String sql="select * from blog ORDER BY date ASC";
ResultSet rs=state.executeQuery(sql);
List<Content> list=new ArrayList<Content>();
while(rs.next()) {
Content content=new Content();//实例化
content.setTitle(rs.getString("title"));
content.setContent(rs.getString("content"));
content.setDate(rs.getString("date"));
content.setFusername(rs.getString("fusername"));
list.add(content);
}
request.setAttribute("list", list);//将内容对象放置于集合中
}catch(Exception e) {
e.printStackTrace();
}
String username=request.getParameter("username");
request.getRequestDispatcher("/xiaochuangchangtan/windowrest.jsp?username="+username).forward(request, response);
}
这个servlet指向我的主页面并传递一个参数username。我的主页面部分代码如下:
<script type="text/javascript">
/**
 * Ajax
 */
 function createRequest(url) {
http_request = false;
if (window.XMLHttpRequest) { // 非IE浏览器
http_request = new XMLHttpRequest(); //创建XMLHttpRequest对象
} else if (window.ActiveXObject) { // IE浏览器
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP"); //创建XMLHttpRequest对象
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP"); //创建XMLHttpRequest对象
} catch (e) {
}
}
}
if (!http_request) {
alert("不能创建XMLHttpRequest对象实例!");
return false;
}
http_request.onreadystatechange = getResult; //调用返回结果处理函数
http_request.open('GET', url, true); //创建与服务器的连接
http_request.send(null); //向服务器发送请求
} function getResult() {
if (http_request.readyState == 4) { // 判断请求状态
if (http_request.status == 200) { // 请求成功,开始处理返回结果
alert(http_request.responseText); //设置提示内容
} else { // 请求页面有错误
alert("您所请求的页面有错误!"+http_request.readyState+http_request.status);
}
}
}
/**
 * 获取url参数中的username
 */
function d() {
   var url = location.search; //获取url中"?"符后的字串
   if (url.indexOf("?") != -1) {    //判断是否有参数
      var str = url.substr(1); //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串
      strs = str.split("=");   //用等号进行分隔 (因为知道只有一个参数 所以直接用等号进分隔 如果有多个参数 要用&号分隔 再用等号进行分隔)
      strs[1];          //直接弹出第一个参数 (如果有多个参数 还要进行循环的)
   }
   return strs[1];
}

/**
 * 发表功能函数
 */
function addDiv(){
var username=d();
//创建div
var articlediv = document.createElement('div');
//获取值
var title=document.getElementById("title").value;
var content=document.getElementById("aticle").value;
if(title=="" || content==""){
alert("请输入标题或内容");
}else{
    //发表到后台
     createRequest(encodeURI(encodeURI('AddContent.jsp?title='+title+'&aticle='+content)));  
   

}
 }
</script>
主函数是addDiv(),中间有个无用的获取url中username参数的方法,那个也无关紧要了。

解决方案 »

  1.   

    控制台是正常的,我原本是没有任何报错显示,只是功能失效,后来我加入了 alert("您所请求的页面有错误!"+http_request.readyState+http_request.status);这段代码,也就是说如果功能失败,显示报错弹框,状态分别是4 和 404 ,也就是找不到页面,但是这个报错也没有参考价值的。
      

  2.   

    encodeURI两次是什么意思?
      

  3.   

    既然是404,那至少吧项目资源路径截个图发一下吧。尤其是  /xiaochuangchangtan/windowrest.jsp  附近的
      

  4.   

     request.getRequestDispatcher("/xiaochuangchangtan/windowrest.jsp?username="+username)
    dispatcher 并不能把参数传过去。
    你只能
    request.setAttribute("username", username).forward(request, response);
     request.getRequestDispatcher("/xiaochuangchangtan/windowrest.jsp").forward(request, response);function addDiv(){
        var username="<%=request.getAttribute("username")%>";
        //创建div
        var articlediv = document.createElement('div');
        //获取值
        var title=document.getElementById("title").value;
        var content=document.getElementById("aticle").value;
        if(title=="" || content==""){
            alert("请输入标题或内容");
        }else{
        //发表到后台
         createRequest(encodeURI(encodeURI('AddContent.jsp?title='+title+'&aticle='+content)));  
        
         
        }
     }
      

  5.   

    request.setAttribute("username", username).forward(request, response);
    这里写错了, setAttribute后不跟 forward
      

  6.   

    你要搞清楚请求转发,和重定向的区别,否则你数据过不去的。
    参考下这个:https://blog.csdn.net/u012877472/article/details/50804568
    楼上,君当如狼说对了,首先你参数要传过去。
      

  7.   

    那个我不会回复各位大神,但是数据(username)其实是过去的了,我能取到,能输出来。window.jsp也能打开,404只是我在用ajax发表数据到后台点击按钮的那个功能时报的错,并不是打不开或者找不到Window.jsp这个页面。我是servlet与ajax功能毫无干扰,servlet是操作数据库显示查询结果输出到jsp,ajax是发表文字到另一个数据库表中。双方本有username这个字段是交集,后来我删除username这个字段,还是不行,那就一点一点交集没有了。
      

  8.   

    'AddContent.jsp?title=........'
    ==>
    '<%=request.getContextPath()%>/xiaochuangchangtan/AddContent.jsp?title=........'
      

  9.   

    forward 后有 username 参数值是你原来servlet的request中,刚好有这个参数