Ajax和Servlet交互,报错HTTP Status 405 – Method Not Allowed HTTP method GET is not supported by this URL
程序员文章站
2022-06-01 14:11:23
...
学习慕课网的Ajax + Servlet实现搜索框智能提示的时候(https://www.imooc.com/learn/678)
自己打的代码Servlet类可以获取到客户端通过Ajax异步发送过来的数据,但是客户端怎么都无法获取到服务端Servlet回传的数据。
一直 xmlhttp.status = 405
怎么都找不到原因。
js代码
/* 获取xmlhttp对象的函数 */
function createXmlHttp() {
var xmlhttp;
if(window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else if(window.ActiveXObject) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp;
}
/* ajax从服务器文本文件获取信息 */
function change() {
/*
ajax 技术使用js来获取服务器的数据,达到局部更新的效果
*/
var xmlhttp = createXmlHttp();
// state change 0-4
xmlhttp.onreadystatechange = function() {
// judge ok
if(xmlhttp.status == 200 && xmlhttp.readyState == 4) {
// refresh the part message
document.getElementById("hello").innerHTML = xmlhttp.responseText;
}
};
xmlhttp.open("GET", "../file/ajax_info.txt", true);
xmlhttp.send();
}
/*
输入提示
*/
function getMoreContents() {
// 获取搜索框内容
var content = document.getElementById("search");
if(content.value == "")
return;
// alert(content.value);
var xmlhttp = createXmlHttp();
// 发送数据
var url = "search?keyword=" + escape(content.value);
xmlhttp.open("GET", url, true);
xmlhttp.send("");
// alert("test1");
// 写回调方法
xmlhttp.onreadystatechange = function() {
alert(xmlhttp.status); // 成了 405 ...不是 200
alert(xmlhttp.readyState);
if(xmlhttp.status == 200 && xmlhttp.readyState == 4) {
// 服务器servlet通过json格式发送数据给客户端
alert("....")
var result = xmlhttp.responseText;
var jsonobj = eval("(" + result + ")"); // 转化json数据为普通数据
setContent(jsonobj)
}
};
}
/* 设置关联数据展示函数 */
function setContent(contents) { //函数的参数不带var声明,函数错了,整个js都错了,函数内部某个错误不影响整体
// 获取长度来生成相应数量的<tr><td>
alert("test")
var size = contents.length;
alert(size);
for(var i = 0; i < size; ++i) {
var nextNode = contents[i]; // 代表的是json数据转js的数据第contents[i]
alert(nextNode);
// 生成<tr> <td>
var tr = document.createElement("tr");
var td = document.createElement("td");
// 设置<td>属性
td.setAttribute("border", 0);
td.setAttribute("bgcolor", "#FFFAFA");
// 设置触碰效果
td.onmouseover = function() {
this.ClassName = 'mouseOver';
};
td.onmouseout = function() {
this.ClassName = 'mouseOut';
};
// 实现鼠标点击一个提示时,提示会自动填入搜索框
td.onclick = function() {
//
};
// 显示 . 从内到外添加
var text = document.createTextNode(nextNode);
td.appendChild(text);
tr.appendChild(td);
document.getElementById("content_table_body").appendChild(tr);
}
}
//////////// js函数没有顺序关系 /////////
Servlet (完整代码: https://github.com/chgl16/Ajax-Servlet-search-prompt)
package top.chgl16.services;
/* servlet和json没有自带,需要下载依赖 */
import jdk.nashorn.internal.runtime.JSONListAdapter;
import net.sf.json.JSONArray;
import netscape.javascript.JSObject;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
/**
* @Lin
* ajax 后台代码
* 1. 获取ajax发送过来的keyword
* 2. 找到合适的数据返回
*/
public class SearchServlet extends HttpServlet {
// 数据集
static List<String> datas = new ArrayList<String>();
static {
datas.add("ajax");
datas.add("ajax post");
datas.add("ajax get");
datas.add("ajax servlet");
datas.add("chen guanlin");
datas.add("jsp servlet");
datas.add("mysql");
datas.add("json");
datas.add("chgl16");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// super.doGet(request, response); //////////// 必须注解掉,不然405错误
// 设置请求和响应编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
System.out.println("服务器servlet:");
// 获取客户端传送的keyword
String keyword = request.getParameter("keyword");
if(keyword == null) {
keyword = "";
}
// 输出获取到的关键词
System.out.println("keyword " + keyword);
// 获得关键字后处理,得到关联数据
List<String> listData = new ArrayList<String>();
listData = getData(keyword);
// 给客户端放回关联数据的json格式
System.out.println("关联数据json格式: " + JSONArray.fromObject(listData));
// 将数据传回客户端
response.getWriter().write(JSONArray.fromObject(listData).toString()); // json格式在write()函数里面要装换成String类型
System.out.println("----------------------------------------------------------------------------------------------");
}
public List<String> getData(String keyword) {
List<String> list = new ArrayList<String>();
for(String s : datas) {
if(s.contains(keyword)) {
list.add(s);
}
}
return list;
}
}
一直网上搜原因,都是指向Servlet问题,就是doPost()/doGet()方法(你使用那个)没有重写,默认调用了父类的造成的。自己已经重写,但是一直错。直到看到一行代码
super.doGet(request, response);
没有删掉啊。还是直接调用了父类的先,虽然也调用重写的。但是还是405了。注释掉就行。