Javascript 到 java Servlet 的纯 Javascript fetch() 方法,我如何获取和传递数据?
Pure Javascript fetch() method to java Servlet, how do i get and pass data?
我在尝试从 Servlet 获取数据时遇到问题。
当我通过以下方式调用 servlet 时:
function urlFetchRequest(str, body = null, RequestType = 'GET'){
try
{
asyncRequest = new XMLHttpRequest();
asyncRequest.addEventListener("readystatechange", stateChange, false);
asyncRequest.open(RequestType, str, true); // /Test is url to Servlet!
asyncRequest.send(body);
}
catch(exception)
{
alert("Request failed");
}
}
我从 Servlet 取回了我需要的信息,并且可以通过以下方式使用它:
jsonRes = JSON.parse(asyncRequest.responseText)
这是工作。我的问题是当我需要将数据传递给 servlet 时。所以我尝试用 fetch() 来做,因为我读过我可以使用 JSON 对象到 servlet(同样,我不能使用任何 javascript 库,例如 jquery)并且我不能使用 servlet returns 的数据。它变得 "undefined".
我使用的javascript范围:
function newFetch(url, options){
fetch(url, options).then(async (res) => {
if(res.ok){
jsonRes = res.
if(theSurvey === null) {
surveyLength = Object.keys(jsonRes).length;
theSurvey = jsonRes;
}
}
});
}
我从这里调用它:
returnedObject.SurveyLoader = async () => {
//urlFetchRequest("/SurveyServlet");
//await SurveyResults();
newFetch("/SurveyServlet", {
method: "GET",
headers: headers,
})
}
我的 servlet 是:
@WebServlet(name = "SurveyServlet", urlPatterns = {"/SurveyServlet"} )
public class SurveyServlet extends HttpServlet {
public static final Logger LOGGER = Logger.getLogger("SurveyServlet");
private BufferedReader m_reader;
private String m_line;
public String convertWithStream(Map<String, String> map) {
String mapAsString = map.keySet().stream()
.map(key -> '\"' + key + '\"' + ":" + '\"' + map.get(key) + '\"')
.collect(Collectors.joining(", ", "{", "}"));
return mapAsString;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> SurveyObj = new LinkedHashMap<>();
m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
m_line = m_reader.readLine();
SurveyObj.put(Integer.toString(0), m_line);
int id = 1;
while((m_line = m_reader.readLine())!=null) {
SurveyObj.put(Integer.toString(id), m_line);
++id;
}
String str = convertWithStream(SurveyObj);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
//request.setAttribute("ArraySize", id);
// getServletContext().getRequestDispatcher("ResultServlet").forward(request,response);
PrintWriter out = response.getWriter();
out.write(str);
out.flush();
out.close();
}
}
我的问题是关于获取方法。我知道它从 REST API 获取对象。我如何使用它从 servlet 传递和获取数据?我如何使用发送到 servlet 的数据?
如果不可能,我该如何使用 XMLHttpRequest 将数据传递给 servlet? (不使用 $)
谢谢。
它没有完全回答我的问题,但大部分是:
我成功地找到了一种方法来向我的 ajax 客户发送 JSON object。
我在客户端使用了它(url 是我的 servlet 名称,选项仅包含 headers(内容类型等):
function newFetch(url, options){
fetch(url, options).then(res => res.json()
).then((resp) => {
jsonRes = resp;
if (theSurvey === null) {
surveyLength = Object.keys(jsonRes).length;
theSurvey = jsonRes;
SurveyResults();
}
});
}
而在 servlet 中,我使用 javax 库来使用 JSON object 方法,这样:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> SurveyObj = new LinkedHashMap<>();
m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
m_line = m_reader.readLine();
SurveyObj.put(Integer.toString(0), m_line);
int id = 1;
while((m_line = m_reader.readLine())!=null) {
SurveyObj.put(Integer.toString(id), m_line);
++id;
}
JsonObjectBuilder builder = Json.createObjectBuilder();
SurveyObj.forEach(builder::add);
JsonObject obj = builder.build();
// String str = convertWithStream(SurveyObj);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
try (OutputStream out = response.getOutputStream()) {
JsonWriter jsonW = Json.createWriter(out);
jsonW.write(obj);
jsonW.close();
}
}
我希望它能对以后的人有所帮助。无论如何,我仍然面临将 JSON object 发送到 servlet 并通过我的请求访问它的问题。如果有人可以提供帮助-那将是完美的。如果我能找到答案,我会编辑 post.
谢谢。
编辑:经过大量搜索和尝试,我找到了我认为将数据传递给 servlet 的最佳方法:
1. 将此注释添加到您的 servlet:@MultipartConfig
2. 在你的 client-side 中,使用 "FormData",并且可以通过请求中的 fetch 发送它 body:
let formData = new FormData();
formData.append("size", surveyLength.toString());
newFetch('ServletResults', {
method: "POST",
//headers: headers,
body: formData
并且由于@MultipartConfig 的注释,servlet 知道如何通过"request.getParameter"
访问参数
我希望这对以后的人有所帮助。谢谢大家。
我在尝试从 Servlet 获取数据时遇到问题。 当我通过以下方式调用 servlet 时:
function urlFetchRequest(str, body = null, RequestType = 'GET'){
try
{
asyncRequest = new XMLHttpRequest();
asyncRequest.addEventListener("readystatechange", stateChange, false);
asyncRequest.open(RequestType, str, true); // /Test is url to Servlet!
asyncRequest.send(body);
}
catch(exception)
{
alert("Request failed");
}
}
我从 Servlet 取回了我需要的信息,并且可以通过以下方式使用它:
jsonRes = JSON.parse(asyncRequest.responseText)
这是工作。我的问题是当我需要将数据传递给 servlet 时。所以我尝试用 fetch() 来做,因为我读过我可以使用 JSON 对象到 servlet(同样,我不能使用任何 javascript 库,例如 jquery)并且我不能使用 servlet returns 的数据。它变得 "undefined".
我使用的javascript范围:
function newFetch(url, options){
fetch(url, options).then(async (res) => {
if(res.ok){
jsonRes = res.
if(theSurvey === null) {
surveyLength = Object.keys(jsonRes).length;
theSurvey = jsonRes;
}
}
});
}
我从这里调用它:
returnedObject.SurveyLoader = async () => {
//urlFetchRequest("/SurveyServlet");
//await SurveyResults();
newFetch("/SurveyServlet", {
method: "GET",
headers: headers,
})
}
我的 servlet 是:
@WebServlet(name = "SurveyServlet", urlPatterns = {"/SurveyServlet"} )
public class SurveyServlet extends HttpServlet {
public static final Logger LOGGER = Logger.getLogger("SurveyServlet");
private BufferedReader m_reader;
private String m_line;
public String convertWithStream(Map<String, String> map) {
String mapAsString = map.keySet().stream()
.map(key -> '\"' + key + '\"' + ":" + '\"' + map.get(key) + '\"')
.collect(Collectors.joining(", ", "{", "}"));
return mapAsString;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> SurveyObj = new LinkedHashMap<>();
m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
m_line = m_reader.readLine();
SurveyObj.put(Integer.toString(0), m_line);
int id = 1;
while((m_line = m_reader.readLine())!=null) {
SurveyObj.put(Integer.toString(id), m_line);
++id;
}
String str = convertWithStream(SurveyObj);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
//request.setAttribute("ArraySize", id);
// getServletContext().getRequestDispatcher("ResultServlet").forward(request,response);
PrintWriter out = response.getWriter();
out.write(str);
out.flush();
out.close();
}
}
我的问题是关于获取方法。我知道它从 REST API 获取对象。我如何使用它从 servlet 传递和获取数据?我如何使用发送到 servlet 的数据? 如果不可能,我该如何使用 XMLHttpRequest 将数据传递给 servlet? (不使用 $)
谢谢。
它没有完全回答我的问题,但大部分是: 我成功地找到了一种方法来向我的 ajax 客户发送 JSON object。
我在客户端使用了它(url 是我的 servlet 名称,选项仅包含 headers(内容类型等):
function newFetch(url, options){
fetch(url, options).then(res => res.json()
).then((resp) => {
jsonRes = resp;
if (theSurvey === null) {
surveyLength = Object.keys(jsonRes).length;
theSurvey = jsonRes;
SurveyResults();
}
});
}
而在 servlet 中,我使用 javax 库来使用 JSON object 方法,这样:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> SurveyObj = new LinkedHashMap<>();
m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
m_line = m_reader.readLine();
SurveyObj.put(Integer.toString(0), m_line);
int id = 1;
while((m_line = m_reader.readLine())!=null) {
SurveyObj.put(Integer.toString(id), m_line);
++id;
}
JsonObjectBuilder builder = Json.createObjectBuilder();
SurveyObj.forEach(builder::add);
JsonObject obj = builder.build();
// String str = convertWithStream(SurveyObj);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
try (OutputStream out = response.getOutputStream()) {
JsonWriter jsonW = Json.createWriter(out);
jsonW.write(obj);
jsonW.close();
}
}
我希望它能对以后的人有所帮助。无论如何,我仍然面临将 JSON object 发送到 servlet 并通过我的请求访问它的问题。如果有人可以提供帮助-那将是完美的。如果我能找到答案,我会编辑 post.
谢谢。
编辑:经过大量搜索和尝试,我找到了我认为将数据传递给 servlet 的最佳方法: 1. 将此注释添加到您的 servlet:@MultipartConfig 2. 在你的 client-side 中,使用 "FormData",并且可以通过请求中的 fetch 发送它 body:
let formData = new FormData();
formData.append("size", surveyLength.toString());
newFetch('ServletResults', {
method: "POST",
//headers: headers,
body: formData
并且由于@MultipartConfig 的注释,servlet 知道如何通过"request.getParameter"
访问参数我希望这对以后的人有所帮助。谢谢大家。