如果您对UFuncTypeError:ufunc'matmul'不包含具有签名匹配类型(dtype('dtype('感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解UFuncTypeError:
如果您对UFuncTypeError: ufunc 'matmul' 不包含具有签名匹配类型 (dtype('
- UFuncTypeError: ufunc 'matmul' 不包含具有签名匹配类型 (dtype('
dtype(' - AJAX - $.post(url,data,function,type)-(参数为value-type-string)
- AJAX - $.post(url,data,function,type)-2(参数为key:value(type-json))
- AJAX - $.post(url,data,function,type)-3(参数形式value-type-json)
- C语言中定义函数 type function(type * &s)中的* &的功能?
UFuncTypeError: ufunc 'matmul' 不包含具有签名匹配类型 (dtype(' dtype('
如何解决UFuncTypeError: ufunc ''matmul'' 不包含具有签名匹配类型 (dtype(''<U32''), dtype(''<U32'')) -> dtype(''<U32'') 的循环?
我是 Streamlit 和 Web API 的新手。我正在尝试在 ML 解决方案上构建 Web API 并收到此错误。这是完整的错误声明:
UFuncTypeError: ufunc ''matmul'' 不包含具有签名匹配类型 (dtype('' dtype(''
文件“/home/kavish/Downloads/Ineuron_class/Internship/Fraud_ecommerce/stream_app.py”,第 133 行,在
主要的()
文件“/home/kavish/Downloads/Ineuron_class/Internship/Fraud_ecommerce/stream_app.py”,第124行,主
结果 = predict_fraud(purchase_value,age,sign_month,purchase_month,month_dif,Direct,SEO,Gender,FireFox,IE,Opera,Safari,days,date_purchase,date_sign)
文件“/home/kavish/Downloads/Ineuron_class/Internship/Fraud_ecommerce/stream_app.py”,第87行,在predict_fraud
预测=分类器.预测([[购买价值,年龄,符号月份,购买月份,月份差异,
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/Metaestimators.py”,第119行,在
out = lambda *args,**kwargs: self.fn(obj,*args,**kwargs)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第459行,在预测中
y_pred = super().predict(X,**predict_params)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/Metaestimators.py”,第119行,在
out = lambda *args,**kwargs)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第245行,在预测中
self.transform(X),**predict_params
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第517行,转换中
返回 self._transform(X)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第214行,在_transform
预测 = [
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第215行,在
getattr(est,meth)(X)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/linear_model/_logistic.py”,第1468行,在predict_proba
返回 super()._predict_proba_lr(X)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/linear_model/_base.py”,第321行,_predict_proba_lr
概率 = self.decision_function(X)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/linear_model/base.py”,第289行,在decision_function
分数 = safe_sparse_dot(X,self.coef.T,文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/validation.py”,第72行,在inner_f
返回 f(**kwargs)
文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/extmath.py”,第153行,在safe_sparse_dot中
ret = a @ b
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)

AJAX - $.post(url,data,function,type)-(参数为value-type-string)
$.post()
方法通过 HTTP POST 方式向服务器发送请求并获取返回的数据。是 $.ajax()
的简化版。
参数讲解:
url:必需。请求地址
data:可选。需要传递到服务器端的参数。 参数形式为“键/值”。
function:可选。发送请求成功后的回调函数,在请求完成时被调用。该函数参数依次为响应体和状态。(只有当Response的返回状态是success才是调用该方法)
type:可选。返回数据的类型。可以是:string或json、xml等类型。
【jsp页面】
|——————————————————
注意,本篇传到后台的参数形式为username=yanshi02&password=123456
|——————————————————
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<% 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 'post.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"> -->
<script type="text/javascript" src="./scripts/jquery-1.7.2.js"></script>
<script type="text/javascript"> var url =""; var queryString = ""; $(function(){ $("input[type='button']").click(function(){ url = $("#editform").attr("action"); //这里需注意,不是serializeArray queryString = $('#editform').serialize(); $.post(url,queryString,function(data){ alert(typeof data+",返回的内容为 "+data); //alert(data.username+","+data.password); //var jsonReturn = this.data; //var jsonReturn = eval("("+data+")"); //var jsonReturn = $.parseJSON(data); var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象 alert(typeof jsonReturn+" 转换后内容 "+jsonReturn); // 解析JSON对象 alert(jsonReturn.username+","+jsonReturn.password); },"json"); }); }); </script>
</head>
<body>
This is my JSP page. <br>
<form id="editform" action="postServlet2" method="post">
<input type="text" name="username" value=""/>
<input type="password" name="password" value=""/>
</form>
<input name="post" type="button" value="提交"/>
</body>
</html>
【后台接收servlet1】
思路:
通过request.getReader
获取一个BufferedReader;
写入到一个StringBulider,转换为String;
……..
返回一个json。
package com.atgui.ajax.app.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.servlet.servletexception;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.map.ObjectMapper;
public class PostServlet extends HttpServlet {
/** * Destruction of the servlet. <br> */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("postServlet destroy() ......");
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws servletexception,IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request,IOException {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
//拿到$("#editform").serialize();
String jsonString =getStringFromreq(request) ;
System.out.println("jsonString..."+jsonString);
//通过拿到的querystring转换为map
HashMap<String,Object> map = getMapFromQueryString(jsonString);
//将转换得到的map转换为json并返回
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeValueAsstring(map);
//此处直接返回JSON object对象,JSP可直接使用data.key
System.out.println("resultJson ..."+resultJson);
// resultJson = resultJson.replace("\"","\\\"");
// resultJson = "\""+resultJson+"\"";
//此处返回JSON 字符串 string对象;JSP需要解析才能使用data.key
// System.out.println("resultJson ..."+resultJson);
out.print(resultJson);
out.flush();
out.close();
}
public void init() throws servletexception {
// Put your code here
System.out.println("postServlet init().......");
}
public String getStringFromreq(HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = request.getReader();
char[]buff = new char[1024];
int len;
while((len = reader.read(buff)) != -1) {
sb.append(buff,0,len);
}
}catch (IOException e) {
e.printstacktrace();
}
String resultString = sb.toString();
return resultString;
}
public HashMap<String,Object> getMapFromQueryString(String queryString) {
HashMap map = new HashMap<String,String>();
String[] qStrings = queryString.split("&");
for (String string : qStrings) {
String[] qStrings2 = string.split("=");
map.put(qStrings2[0],qStrings2[1]);
}
return map;
}
}
postServlet init().......
jsonString...username=admin&password=123456
resultJson ...{"username":"admin","password":"123456"}
resultJson ..."{\"username\":\"admin\",\"password\":\"123456\"}"
下图标明:
响应内容类型为json;
请求类型为默认值;
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
会将参数以 "a=1"&"b=2";的形式进行编码。
如:username=yanshi02&password=123456
表单数据在Form Data域;
【特别提醒】
- ①若使用以下方式返回,不用解析为JSON object 可以直接使用data.key 获取属性
//将转换得到的map转换为json并返回
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeValueAsstring(map);
//此处直接返回JSON object对象,JSP可直接使用data.key
System.out.println("resultJson ..."+resultJson);
- 拿到返回的data
- 获取json属性
- ②若使用以下方式返回,必须解析为JSON object 才可以使用data.key 获取属性
//将转换得到的map转换为json并返回
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeValueAsstring(map);
//此处直接返回JSON object对象,JSP可直接使用data.key
System.out.println("resultJson ..."+resultJson);
// resultJson = resultJson.replace("\"","\\\"");
// resultJson = "\""+resultJson+"\"";
//此处返回JSON 字符串 string对象;JSP需要解析才能使用data.key
// System.out.println("resultJson ..."+resultJson);
- 拿到返回的数据【string形式】
- 解析为json object
- 获取json属性
【后台接收servlet2】
思路:
通过Map<String,String[]> map=request.getParameterMap();
得到参数;
…….
返回json。
package com.atgui.ajax.app.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.servletexception;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.map.ObjectMapper;
public class PostServlet2 extends HttpServlet {
/** * request.getParameterMap(); */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("postServlet2 destroy() ......");
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws servletexception,response);
}
public void doPost(HttpServletRequest request,IOException {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
Map<String,String[]> map = request.getParameterMap();
HashMap<String,Object> map2 = new HashMap<String,Object>();
for(String key : map.keySet()){
// System.out.println("key :"+key+",value : "+map.get(key)[0]);
// if (map.get(key).length>1) {
// System.out.println("key :"+key+",value :"+map.get(key)[1]);
// }
for (int i = 0; i < map.get(key).length; i++) {
System.out.println("key :"+key+","+i+","+map.get(key)[i]);
}
map2.put(key,map.get(key)[0]);
}
//拿到$("#editform").serialize();
// String jsonString =getStringFromreq(request) ;
// System.out.println("jsonString..."+jsonString);
//通过拿到的querystring转换为map
// HashMap<String,Object> map = getMapFromQueryString(jsonString);
//将转换得到的map转换为json并返回
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeValueAsstring(map2);
System.out.println("resultJson1: "+resultJson);
//如下,进行手动拼接!!!如果不拼接,JSP可以直接使用data.key获取json属性
resultJson = resultJson.replace("\"","\\\"");
resultJson = "\""+resultJson+"\"";
System.out.println("resultJson ..."+resultJson);
// "{\"username\":\"admin\",\"password\":\"123456\"}"
out.print(resultJson);
out.flush();
out.close();
}
public void init() throws servletexception {
// Put your code here
System.out.println("postServlet2 init().......");
}
}
result as follows:
postServlet2 init().......
key :username,admin
key :password,123456
resultJson1: {"username":"admin",\"password\":\"123456\"}"
【这里讲述一下手动拼接后JSP解析过程,如果没有手动拼接,那么为上述特别提醒中第二种方式】
- JSP 拿到后台传回的data
- 进行解析为JSON 对象
- 获取JSON属性
【后台接收Servlet3】
思路:
直接使用request.getParameter();
获取字符串;
手动拼接为JSON字符串直接返回。
package com.atgui.ajax.app.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.servlet.servletexception;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.map.ObjectMapper;
public class PostServlet5 extends HttpServlet {
/** * queryString = $('#editform').serialize(); 使用request.getParameter() */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("postServlet destroy() ......");
}
public void doGet(HttpServletRequest request,IOException {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
String name = request.getParameter("username");
String password = request.getParameter("password");
String jsonString ="{\"username\":"+'"'+name+'"'+",\"password\":"+'"'+password+'"'+"}";
//手动拼接JSON如上形式,可直接返回,此时json为string非object;如果再次使用ObjectMapper转换,JSP 将最终按其字符数组对象进行单个字符遍历!!!
System.out.println("jsonString..."+jsonString);
//{"username":"admin","password":"123456"}
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeValueAsstring(jsonString);
System.out.println("resultJson ..."+resultJson);
//"{\"username\":\"admin\",\"password\":\"123456\"}"
response.reset();
out.println(jsonString );
out.flush();
out.close();
}
public void init() throws servletexception {
// Put your code here
System.out.println("postServlet5 init().......");
}
}
此时String jsonString 返回的 json type 为string ,需要进行解析为object 才能使用 data.key 获取json属性。。。过程参考上面。
一定要分清,虽然JS里面一切皆为对象,但是 typeof :string 与 typeof :object 不是一回事!!!
但是如果你使用 instance of object,那么 string 或者object 都会返回true!
点击查看JS中对象的前生今世
题外话1:
如果以以下形式传值呢?
$.post(url+"querystring="+queryString,function(data){});
一部分参数在URL后面,一部分为form data。
【如果为 get 请求,无论传输形式怎样,数据都在Query String Parameters 里面!】点击查看Get 请求
F12看控制台:
(1) 请求URL:
Request URL:http://localhost:8080/AJAX/postServlet2?querystring=username=yanshi02&password=123456
(2) URL后面的参数放在了Query String Parameters里面。
而且,分成的两部分:
querystring:username=yanshi02
password:123456
//默认以 & 分割 !!!
(3) 另外正常传的queryString放在了Form Data里面。
其中,接收方法思路有三种。
① 使用request.getParameterMap
;
getParameterMap 会把键值对参数,解析为对应map 的key:value !
修改部分代码:
Map<String,map.get(key)[0]);
}
result as follows :
postServlet2 init().......
key :querystring,username=yanshi02
key :username,yanshi02
key :password,123456
key :password,1,123456
resultJson ...{"username":"yanshi02","querystring":"username=yanshi02","password":"123456"}
//可见 key为password的数组:"password":["123456","123456"]
② 使用request.getReader ;
只能获取 Form Data,不能获取Query String Data。
同理,该方法不适用 $.get() 。
③ 使用request.getQueryString
;
只能获取Query String Data,不能获取Form Data 。
题外话2
如果请求形式为:
queryString = $('#editform').serialize();
$.post(url,{mydata:queryString},function(data){});
首先看大图:
数据传输形式为:
mydata:username=yanshi02&password=123456
那么除了上述前两种思路外。
还有第三种思路!
使用request.getParameter("mydata")
String jsonStr = request.getParameter("mydata");
System.out.println(jsonStr);
只要获得拼接的string,就可以返回json!
综上:
默认ContentType下,数据会以username=yanshi02&password=123456
形式进行编码。
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
如果是以{key : value} 形式传输的,有三种接收思路:
如$.post(url,function(data){});
① 使用request.getReader
;
② 使用request.getParameterMap
;
③ 使用request.getParameter("key")
;
如果是以 value形式传输的,则可以使用前两种思路。
如$.post(url,function(data){});
如果使用第三种思路,则需要将获取得到的string手动拼接为json string
注意 :此时的queryString取值!
queryString = $('#editform').serialize();
至于queryString取如下值(JSON形式),请看下一篇queryString为json形式
【http://www.jb51.cc/article/p-eplduxhq-bpe.html】
queryString = $('#editform').serializeArray();//object
queryString = JSON.stringify(queryString);//string

AJAX - $.post(url,data,function,type)-2(参数为key:value(type-json))
上一篇【http://www.jb51.cc/article/p-omnjnxei-bpe.html】的讲解传到后台的参数形式为username=yanshi02&password=123456
字符串。
那么如果传到后台的格式是JSON呢?【可能有人会问,如果参数形式为{mydata:username=yanshi02&password=123456}呢?我实在不理解,如果传字符串过来 ,你为何还要使用这种形式?字符串那么好解析!】
queryString = $('#editform').serializeArray();//object
queryString = JSON.stringify(queryString);//string
形式如下:
[{"name":"username","value":"admin"},{"name":"password","value":"123456"}]
$.post(url,{mydata:queryString},function(data){});
【JSP页面】
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<% 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 'post.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"> -->
<script type="text/javascript" src="./scripts/jquery-1.7.2.js"></script>
<script type="text/javascript"> var url =""; var queryString = ""; $(function(){ $("input[type='button']").click(function(){ url = $("#editform").attr("action"); //alert(url); //queryString = $('#editform').serialize(); queryString = $('#editform').serializeArray(); queryString = JSON.stringify(queryString);//string alert(queryString); //[{"name":"username","value":"yanshi02"},{"name":"password","value":"123456"}] $.post(url,function(data){ alert(typeof data+",返回的内容为 "+data); //var jsonReturn = this.data; //var jsonReturn = eval("("+data+")"); //var jsonReturn = $.parseJSON(data); var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象 alert(typeof jsonReturn+" 转换后内容 "+jsonReturn); // 第一种json数组遍历方式 for(var i=0;i<jsonReturn.length;i++){ for(var key in jsonReturn[i]){ alert(key+':'+jsonReturn[i][key]); $("#content").append(jsonReturn[i][key]); } } } </script>
</head>
<body>
This is my JSP page. <br>
<form id="editform" action="postServlet3" method="post">
<input type="text" name="username" value=""/>
<input type="password" name="password" value=""/>
</form>
<input name="post" type="button" value="提交"/>
</body>
</html>
【后台接收】
package com.atgui.ajax.app.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.servletexception;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.map.ObjectMapper;
public class PostServlet3 extends HttpServlet {
/** * Destruction of the servlet. <br> */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws servletexception if an error occurred * @throws IOException if an error occurred */
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws servletexception,IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request,IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String jsonStr = request.getParameter("mydata");
System.out.println(jsonStr);
ObjectMapper mapper = new ObjectMapper();
String resultJson = mapper.writeValueAsstring(jsonStr);
System.out.println("resultJson ..."+resultJson);
out.print(resultJson);
out.flush();
out.close();
}
/** * Initialization of the servlet. <br> * * @throws servletexception if an error occurs */
public void init() throws servletexception {
// Put your code here
}
}
result as follows :
//获取的参数
[{"name":"username","value":"yanshi02"},"value":"123456"}]
//转换的JSON
resultJson ..."[{\"name\":\"username\",\"value\":\"yanshi02\"},{\"name\":\"password\",\"value\":\"123456\"}]"
题外话:
① 若不进行转换,直接返回out.println(jsonStr)
,那么页面可以正常解析data为[object object,object,object]—JSON数组对象;
- 拿到返回的data【此时拿到的为json string】
- 将字符串数组对象解析为JSON数组对象【解析为json object】
- 正常遍历JSON数组对象!
② 若进行转换,返回out.println(resultJson)
,则不能正常解析为JSON数组对象进行遍历:
- 拿到返回的data,type为string
- 尝试进行JSON解析【失败,还是string】
- 按照string字符串数组进行遍历!
Tips: 该文使用的是jackjson进行操作。无论前端页面或者后台,在接收或者解析json的时候注意 typeof json,究竟是字符串还是json object 或者是json 数组对象!!!!

AJAX - $.post(url,data,function,type)-3(参数形式value-type-json)
上一篇http://www.jb51.cc/article/p-eplduxhq-bpe.html讲解到如果传到后台的参数为:
queryString = $('#editform').serializeArray();//JSON Object
queryString = JSON.stringify(queryString);//JSON string
$.post(url,{mydata:queryString},function(data){ });
即,参数形式为 {mydata:json}
如果形式为
queryString = $('#editform').serializeArray();//JSON Object
queryString = JSON.stringify(queryString);//JSON string
$.post(url,queryString,function(data){ });
即,参数形式为 : json
此时后台如何接收?
就像第一篇所讲解的那样,使用request.getReader
。。。从而获取String!
【后台接收方法】
package com.atgui.ajax.app.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.servlet.servletexception;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codehaus.jackson.map.ObjectMapper;
public class PostServlet4 extends HttpServlet {
/** * queryString = $('#editform').serializeArray(); queryString = JSON.stringify(queryString);//string */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("postServlet destroy() ......");
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws servletexception,IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request,IOException {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
//queryString = $('#editform').serializeArray();//object
//queryString = JSON.stringify(queryString);//string
String jsonString =getStringFromreq(request) ;
System.out.println("jsonString..."+jsonString);
ObjectMapper objectMapper = new ObjectMapper();
String resultJson = objectMapper.writeValueAsstring(jsonString);
System.out.println("resultJson ..."+resultJson);
out.print(resultJson);
out.flush();
out.close();
}
public void init() throws servletexception {
// Put your code here
System.out.println("postServlet init().......");
}
public String getStringFromreq(HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = request.getReader();
char[]buff = new char[1024];
int len;
while((len = reader.read(buff)) != -1) {
sb.append(buff,0,len);
}
}catch (IOException e) {
e.printstacktrace();
}
String resultString = sb.toString();
return resultString;
}
}
result as follows :
//初始化servlet
postServlet init().......
//读取到的string
jsonString...[{"name":"username","value":"yanshi02"},{"name":"password","value":"123456"}]
//返回json
resultJson ..."[{\"name\":\"username\",\"value\":\"yanshi02\"},{\"name\":\"password\",\"value\":\"123456\"}]"
【特别提醒】
① 若直接返回 jsonString,那么JSP页面可以正常解析并遍历JSON数组;
【就像系列-2所描述的那样,此时的jsonString type 为string;所以JSP使用data的时候一定要判断一下 typeof data,如果为object,那么可以试着直接作为json object使用。如果为string,必须进行转换解析!】
- 转换为JSON数组对象
- 进行解析遍历
② 若使用objectMapper再次转换,则JSP页面不可以正常解析为JSON对象,不可正常遍历JSON数组对象,而是以字符串数组对象遍历!
- 拿到返回数据
- 进行转换
- 遍历!【以字符数组的形式遍历了】
题外话:
为什么不使用request.getParameterMap
?
因为这里传输的为JSON数组字符串,没有username=yanshi02&password=123456
的形式!不能拆解为 key :value !!!
如下所示为使用 request.getParameterMap
key :[{"name":"username","value":"123456"}]
value:
如果不进行第二步转换,直接传参
queryString = $('#editform').serializeArray();//JSON数组对象
那么,返回来的是字符串拼接的形式:
jsonString...username=admin&password=123456
resultJson ..."username=admin&password=123456"
//...
out.println(resultJson);
//这里返回的是经过objectMapper转换后的resultJson
//如果返回jsonString,JSP可以拿到data,但是解析出错!
- 提交数组对象到后台
- 拿到返回数据
- 尝试解析为JSON对象 【失败,仍旧为string】
- 遍历!【以字符数组遍历】
【JSP】页面:
- 表单页面
<body>
This is my JSP page. <br>
<form id="editform" action="postServlet4" method="post">
<input type="text" name="username" value=""/>
<input type="password" name="password" value=""/>
</form>
<input name="post" type="button" value="提交"/>
<div id="content"></div>
</body>
- JSON解析:
$.post(url,function(data){
alert(typeof data+",返回的内容为 "+data);
//var jsonReturn = this.data;
//var jsonReturn = eval("("+data+")");
//var jsonReturn = $.parseJSON(data);
var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象
alert(typeof jsonReturn+" 转换后内容 "+jsonReturn);
// 第一种json数组遍历方式
for(var i=0;i<jsonReturn.length;i++){
for(var key in jsonReturn[i]){
alert(key+':'+jsonReturn[i][key]);
$("#content").append(jsonReturn[i][key]);
}
}
}
总结 :
经过几篇各种形式的传参–后台解析–返回json,总结分析如下:
① 如果你后台的jsonString 现在为string 非object。那么不要再使用objectMapper进行转换!!!
② 如果你获得最终json是用objectMapper从其他数据,比如map,转换得到,那么这个json很可能为object,jsp页面可以直接使用data.key !

C语言中定义函数 type function(type * &s)中的* &的功能?
请问网友C语言中定义函数 type function(type * &s)中的* &的功能?与 type function(type *s)及 type function(type &s)有和区别?3Q关于UFuncTypeError: ufunc 'matmul' 不包含具有签名匹配类型 (dtype(' dtype('的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于AJAX - $.post(url,data,function,type)-(参数为value-type-string)、AJAX - $.post(url,data,function,type)-2(参数为key:value(type-json))、AJAX - $.post(url,data,function,type)-3(参数形式value-type-json)、C语言中定义函数 type function(type * &s)中的* &的功能?等相关内容,可以在本站寻找。
本文标签:
如何解决UFuncTypeError: ufunc ''matmul'' 不包含具有签名匹配类型 (dtype(''<U32''), dtype(''<U32'')) -> dtype(''<U32'') 的循环?
我是 Streamlit 和 Web API 的新手。我正在尝试在 ML 解决方案上构建 Web API 并收到此错误。这是完整的错误声明:
UFuncTypeError: ufunc ''matmul'' 不包含具有签名匹配类型 (dtype(''
文件“/home/kavish/Downloads/Ineuron_class/Internship/Fraud_ecommerce/stream_app.py”,第 133 行,在 主要的() 文件“/home/kavish/Downloads/Ineuron_class/Internship/Fraud_ecommerce/stream_app.py”,第124行,主 结果 = predict_fraud(purchase_value,age,sign_month,purchase_month,month_dif,Direct,SEO,Gender,FireFox,IE,Opera,Safari,days,date_purchase,date_sign) 文件“/home/kavish/Downloads/Ineuron_class/Internship/Fraud_ecommerce/stream_app.py”,第87行,在predict_fraud 预测=分类器.预测([[购买价值,年龄,符号月份,购买月份,月份差异, 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/Metaestimators.py”,第119行,在 out = lambda *args,**kwargs: self.fn(obj,*args,**kwargs) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第459行,在预测中 y_pred = super().predict(X,**predict_params) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/Metaestimators.py”,第119行,在 out = lambda *args,**kwargs) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第245行,在预测中 self.transform(X),**predict_params 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第517行,转换中 返回 self._transform(X) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第214行,在_transform 预测 = [ 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/ensemble/_stacking.py”,第215行,在 getattr(est,meth)(X) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/linear_model/_logistic.py”,第1468行,在predict_proba 返回 super()._predict_proba_lr(X) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/linear_model/_base.py”,第321行,_predict_proba_lr 概率 = self.decision_function(X) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/linear_model/base.py”,第289行,在decision_function 分数 = safe_sparse_dot(X,self.coef.T,文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/validation.py”,第72行,在inner_f 返回 f(**kwargs) 文件“/home/kavish/anaconda3/envs/fraud/lib/python3.8/site-packages/sklearn/utils/extmath.py”,第153行,在safe_sparse_dot中 ret = a @ b
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
AJAX - $.post(url,data,function,type)-(参数为value-type-string)
$.post()
方法通过 HTTP POST 方式向服务器发送请求并获取返回的数据。是 $.ajax()
的简化版。
参数讲解:
url:必需。请求地址
data:可选。需要传递到服务器端的参数。 参数形式为“键/值”。
function:可选。发送请求成功后的回调函数,在请求完成时被调用。该函数参数依次为响应体和状态。(只有当Response的返回状态是success才是调用该方法)
type:可选。返回数据的类型。可以是:string或json、xml等类型。
【jsp页面】
|——————————————————
注意,本篇传到后台的参数形式为username=yanshi02&password=123456
|——————————————————
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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 'post.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"> --> <script type="text/javascript" src="./scripts/jquery-1.7.2.js"></script> <script type="text/javascript"> var url =""; var queryString = ""; $(function(){ $("input[type='button']").click(function(){ url = $("#editform").attr("action"); //这里需注意,不是serializeArray queryString = $('#editform').serialize(); $.post(url,queryString,function(data){ alert(typeof data+",返回的内容为 "+data); //alert(data.username+","+data.password); //var jsonReturn = this.data; //var jsonReturn = eval("("+data+")"); //var jsonReturn = $.parseJSON(data); var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象 alert(typeof jsonReturn+" 转换后内容 "+jsonReturn); // 解析JSON对象 alert(jsonReturn.username+","+jsonReturn.password); },"json"); }); }); </script> </head> <body> This is my JSP page. <br> <form id="editform" action="postServlet2" method="post"> <input type="text" name="username" value=""/> <input type="password" name="password" value=""/> </form> <input name="post" type="button" value="提交"/> </body> </html>
【后台接收servlet1】
思路:
通过request.getReader
获取一个BufferedReader;
写入到一个StringBulider,转换为String;
……..
返回一个json。
package com.atgui.ajax.app.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import javax.servlet.servletexception; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; public class PostServlet extends HttpServlet { /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here System.out.println("postServlet destroy() ......"); } public void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException { doPost(request,response); } public void doPost(HttpServletRequest request,IOException { response.setContentType("application/json"); PrintWriter out = response.getWriter(); //拿到$("#editform").serialize(); String jsonString =getStringFromreq(request) ; System.out.println("jsonString..."+jsonString); //通过拿到的querystring转换为map HashMap<String,Object> map = getMapFromQueryString(jsonString); //将转换得到的map转换为json并返回 ObjectMapper objectMapper = new ObjectMapper(); String resultJson = objectMapper.writeValueAsstring(map); //此处直接返回JSON object对象,JSP可直接使用data.key System.out.println("resultJson ..."+resultJson); // resultJson = resultJson.replace("\"","\\\""); // resultJson = "\""+resultJson+"\""; //此处返回JSON 字符串 string对象;JSP需要解析才能使用data.key // System.out.println("resultJson ..."+resultJson); out.print(resultJson); out.flush(); out.close(); } public void init() throws servletexception { // Put your code here System.out.println("postServlet init()......."); } public String getStringFromreq(HttpServletRequest request) { StringBuilder sb = new StringBuilder(); try { BufferedReader reader = request.getReader(); char[]buff = new char[1024]; int len; while((len = reader.read(buff)) != -1) { sb.append(buff,0,len); } }catch (IOException e) { e.printstacktrace(); } String resultString = sb.toString(); return resultString; } public HashMap<String,Object> getMapFromQueryString(String queryString) { HashMap map = new HashMap<String,String>(); String[] qStrings = queryString.split("&"); for (String string : qStrings) { String[] qStrings2 = string.split("="); map.put(qStrings2[0],qStrings2[1]); } return map; } }
postServlet init()....... jsonString...username=admin&password=123456 resultJson ...{"username":"admin","password":"123456"} resultJson ..."{\"username\":\"admin\",\"password\":\"123456\"}"
下图标明:
响应内容类型为json;
请求类型为默认值;
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 会将参数以 "a=1"&"b=2";的形式进行编码。 如:username=yanshi02&password=123456
表单数据在Form Data域;
【特别提醒】
- ①若使用以下方式返回,不用解析为JSON object 可以直接使用data.key 获取属性
//将转换得到的map转换为json并返回 ObjectMapper objectMapper = new ObjectMapper(); String resultJson = objectMapper.writeValueAsstring(map); //此处直接返回JSON object对象,JSP可直接使用data.key System.out.println("resultJson ..."+resultJson);
- 拿到返回的data
- 获取json属性
- ②若使用以下方式返回,必须解析为JSON object 才可以使用data.key 获取属性
//将转换得到的map转换为json并返回 ObjectMapper objectMapper = new ObjectMapper(); String resultJson = objectMapper.writeValueAsstring(map); //此处直接返回JSON object对象,JSP可直接使用data.key System.out.println("resultJson ..."+resultJson); // resultJson = resultJson.replace("\"","\\\""); // resultJson = "\""+resultJson+"\""; //此处返回JSON 字符串 string对象;JSP需要解析才能使用data.key // System.out.println("resultJson ..."+resultJson);
- 拿到返回的数据【string形式】
- 解析为json object
- 获取json属性
【后台接收servlet2】
思路:
通过Map<String,String[]> map=request.getParameterMap();
得到参数;
…….
返回json。
package com.atgui.ajax.app.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.servletexception; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; public class PostServlet2 extends HttpServlet { /** * request.getParameterMap(); */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here System.out.println("postServlet2 destroy() ......"); } public void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,response); } public void doPost(HttpServletRequest request,IOException { response.setContentType("application/json"); PrintWriter out = response.getWriter(); Map<String,String[]> map = request.getParameterMap(); HashMap<String,Object> map2 = new HashMap<String,Object>(); for(String key : map.keySet()){ // System.out.println("key :"+key+",value : "+map.get(key)[0]); // if (map.get(key).length>1) { // System.out.println("key :"+key+",value :"+map.get(key)[1]); // } for (int i = 0; i < map.get(key).length; i++) { System.out.println("key :"+key+","+i+","+map.get(key)[i]); } map2.put(key,map.get(key)[0]); } //拿到$("#editform").serialize(); // String jsonString =getStringFromreq(request) ; // System.out.println("jsonString..."+jsonString); //通过拿到的querystring转换为map // HashMap<String,Object> map = getMapFromQueryString(jsonString); //将转换得到的map转换为json并返回 ObjectMapper objectMapper = new ObjectMapper(); String resultJson = objectMapper.writeValueAsstring(map2); System.out.println("resultJson1: "+resultJson); //如下,进行手动拼接!!!如果不拼接,JSP可以直接使用data.key获取json属性 resultJson = resultJson.replace("\"","\\\""); resultJson = "\""+resultJson+"\""; System.out.println("resultJson ..."+resultJson); // "{\"username\":\"admin\",\"password\":\"123456\"}" out.print(resultJson); out.flush(); out.close(); } public void init() throws servletexception { // Put your code here System.out.println("postServlet2 init()......."); } }
result as follows:
postServlet2 init()....... key :username,admin key :password,123456 resultJson1: {"username":"admin",\"password\":\"123456\"}"
【这里讲述一下手动拼接后JSP解析过程,如果没有手动拼接,那么为上述特别提醒中第二种方式】
- JSP 拿到后台传回的data
- 进行解析为JSON 对象
- 获取JSON属性
【后台接收Servlet3】
思路:
直接使用request.getParameter();
获取字符串;
手动拼接为JSON字符串直接返回。
package com.atgui.ajax.app.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import javax.servlet.servletexception; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; public class PostServlet5 extends HttpServlet { /** * queryString = $('#editform').serialize(); 使用request.getParameter() */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here System.out.println("postServlet destroy() ......"); } public void doGet(HttpServletRequest request,IOException { response.setContentType("application/json"); PrintWriter out = response.getWriter(); String name = request.getParameter("username"); String password = request.getParameter("password"); String jsonString ="{\"username\":"+'"'+name+'"'+",\"password\":"+'"'+password+'"'+"}"; //手动拼接JSON如上形式,可直接返回,此时json为string非object;如果再次使用ObjectMapper转换,JSP 将最终按其字符数组对象进行单个字符遍历!!! System.out.println("jsonString..."+jsonString); //{"username":"admin","password":"123456"} ObjectMapper objectMapper = new ObjectMapper(); String resultJson = objectMapper.writeValueAsstring(jsonString); System.out.println("resultJson ..."+resultJson); //"{\"username\":\"admin\",\"password\":\"123456\"}" response.reset(); out.println(jsonString ); out.flush(); out.close(); } public void init() throws servletexception { // Put your code here System.out.println("postServlet5 init()......."); } }
此时String jsonString 返回的 json type 为string ,需要进行解析为object 才能使用 data.key 获取json属性。。。过程参考上面。
一定要分清,虽然JS里面一切皆为对象,但是 typeof :string 与 typeof :object 不是一回事!!!
但是如果你使用 instance of object,那么 string 或者object 都会返回true!
点击查看JS中对象的前生今世
题外话1:
如果以以下形式传值呢?
$.post(url+"querystring="+queryString,function(data){});
一部分参数在URL后面,一部分为form data。
【如果为 get 请求,无论传输形式怎样,数据都在Query String Parameters 里面!】点击查看Get 请求
F12看控制台:
(1) 请求URL:
Request URL:http://localhost:8080/AJAX/postServlet2?querystring=username=yanshi02&password=123456
(2) URL后面的参数放在了Query String Parameters里面。
而且,分成的两部分:
querystring:username=yanshi02 password:123456 //默认以 & 分割 !!!
(3) 另外正常传的queryString放在了Form Data里面。
其中,接收方法思路有三种。
① 使用request.getParameterMap
;
getParameterMap 会把键值对参数,解析为对应map 的key:value !
修改部分代码:
Map<String,map.get(key)[0]); }
result as follows :
postServlet2 init()....... key :querystring,username=yanshi02 key :username,yanshi02 key :password,123456 key :password,1,123456 resultJson ...{"username":"yanshi02","querystring":"username=yanshi02","password":"123456"} //可见 key为password的数组:"password":["123456","123456"]
② 使用request.getReader ;
只能获取 Form Data,不能获取Query String Data。
同理,该方法不适用 $.get() 。
③ 使用request.getQueryString
;
只能获取Query String Data,不能获取Form Data 。
题外话2
如果请求形式为: queryString = $('#editform').serialize(); $.post(url,{mydata:queryString},function(data){});
首先看大图:
数据传输形式为:
mydata:username=yanshi02&password=123456
那么除了上述前两种思路外。
还有第三种思路!
使用request.getParameter("mydata")
String jsonStr = request.getParameter("mydata"); System.out.println(jsonStr);
只要获得拼接的string,就可以返回json!
综上:
默认ContentType下,数据会以username=yanshi02&password=123456
形式进行编码。
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
如果是以{key : value} 形式传输的,有三种接收思路:
如$.post(url,function(data){});
① 使用request.getReader
;
② 使用request.getParameterMap
;
③ 使用request.getParameter("key")
;
如果是以 value形式传输的,则可以使用前两种思路。
如$.post(url,function(data){});
如果使用第三种思路,则需要将获取得到的string手动拼接为json string
注意 :此时的queryString取值!
queryString = $('#editform').serialize();
至于queryString取如下值(JSON形式),请看下一篇queryString为json形式
【http://www.jb51.cc/article/p-eplduxhq-bpe.html】
queryString = $('#editform').serializeArray();//object queryString = JSON.stringify(queryString);//string
AJAX - $.post(url,data,function,type)-2(参数为key:value(type-json))
上一篇【http://www.jb51.cc/article/p-omnjnxei-bpe.html】的讲解传到后台的参数形式为username=yanshi02&password=123456
字符串。
那么如果传到后台的格式是JSON呢?【可能有人会问,如果参数形式为{mydata:username=yanshi02&password=123456}呢?我实在不理解,如果传字符串过来 ,你为何还要使用这种形式?字符串那么好解析!】
queryString = $('#editform').serializeArray();//object queryString = JSON.stringify(queryString);//string 形式如下: [{"name":"username","value":"admin"},{"name":"password","value":"123456"}] $.post(url,{mydata:queryString},function(data){});
【JSP页面】
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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 'post.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"> --> <script type="text/javascript" src="./scripts/jquery-1.7.2.js"></script> <script type="text/javascript"> var url =""; var queryString = ""; $(function(){ $("input[type='button']").click(function(){ url = $("#editform").attr("action"); //alert(url); //queryString = $('#editform').serialize(); queryString = $('#editform').serializeArray(); queryString = JSON.stringify(queryString);//string alert(queryString); //[{"name":"username","value":"yanshi02"},{"name":"password","value":"123456"}] $.post(url,function(data){ alert(typeof data+",返回的内容为 "+data); //var jsonReturn = this.data; //var jsonReturn = eval("("+data+")"); //var jsonReturn = $.parseJSON(data); var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象 alert(typeof jsonReturn+" 转换后内容 "+jsonReturn); // 第一种json数组遍历方式 for(var i=0;i<jsonReturn.length;i++){ for(var key in jsonReturn[i]){ alert(key+':'+jsonReturn[i][key]); $("#content").append(jsonReturn[i][key]); } } } </script> </head> <body> This is my JSP page. <br> <form id="editform" action="postServlet3" method="post"> <input type="text" name="username" value=""/> <input type="password" name="password" value=""/> </form> <input name="post" type="button" value="提交"/> </body> </html>
【后台接收】
package com.atgui.ajax.app.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.servletexception; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; public class PostServlet3 extends HttpServlet { /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws servletexception if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException { doPost(request,response); } public void doPost(HttpServletRequest request,IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String jsonStr = request.getParameter("mydata"); System.out.println(jsonStr); ObjectMapper mapper = new ObjectMapper(); String resultJson = mapper.writeValueAsstring(jsonStr); System.out.println("resultJson ..."+resultJson); out.print(resultJson); out.flush(); out.close(); } /** * Initialization of the servlet. <br> * * @throws servletexception if an error occurs */ public void init() throws servletexception { // Put your code here } }
result as follows :
//获取的参数 [{"name":"username","value":"yanshi02"},"value":"123456"}] //转换的JSON resultJson ..."[{\"name\":\"username\",\"value\":\"yanshi02\"},{\"name\":\"password\",\"value\":\"123456\"}]"
题外话:
① 若不进行转换,直接返回out.println(jsonStr)
,那么页面可以正常解析data为[object object,object,object]—JSON数组对象;
- 拿到返回的data【此时拿到的为json string】
- 将字符串数组对象解析为JSON数组对象【解析为json object】
- 正常遍历JSON数组对象!
② 若进行转换,返回out.println(resultJson)
,则不能正常解析为JSON数组对象进行遍历:
- 拿到返回的data,type为string
- 尝试进行JSON解析【失败,还是string】
- 按照string字符串数组进行遍历!
Tips: 该文使用的是jackjson进行操作。无论前端页面或者后台,在接收或者解析json的时候注意 typeof json,究竟是字符串还是json object 或者是json 数组对象!!!!
AJAX - $.post(url,data,function,type)-3(参数形式value-type-json)
上一篇http://www.jb51.cc/article/p-eplduxhq-bpe.html讲解到如果传到后台的参数为:
queryString = $('#editform').serializeArray();//JSON Object queryString = JSON.stringify(queryString);//JSON string $.post(url,{mydata:queryString},function(data){ }); 即,参数形式为 {mydata:json}
如果形式为
queryString = $('#editform').serializeArray();//JSON Object queryString = JSON.stringify(queryString);//JSON string $.post(url,queryString,function(data){ }); 即,参数形式为 : json
此时后台如何接收?
就像第一篇所讲解的那样,使用request.getReader
。。。从而获取String!
【后台接收方法】
package com.atgui.ajax.app.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import javax.servlet.servletexception; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.codehaus.jackson.map.ObjectMapper; public class PostServlet4 extends HttpServlet { /** * queryString = $('#editform').serializeArray(); queryString = JSON.stringify(queryString);//string */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here System.out.println("postServlet destroy() ......"); } public void doGet(HttpServletRequest request,HttpServletResponse response) throws servletexception,IOException { doPost(request,response); } public void doPost(HttpServletRequest request,IOException { response.setContentType("application/json"); PrintWriter out = response.getWriter(); //queryString = $('#editform').serializeArray();//object //queryString = JSON.stringify(queryString);//string String jsonString =getStringFromreq(request) ; System.out.println("jsonString..."+jsonString); ObjectMapper objectMapper = new ObjectMapper(); String resultJson = objectMapper.writeValueAsstring(jsonString); System.out.println("resultJson ..."+resultJson); out.print(resultJson); out.flush(); out.close(); } public void init() throws servletexception { // Put your code here System.out.println("postServlet init()......."); } public String getStringFromreq(HttpServletRequest request) { StringBuilder sb = new StringBuilder(); try { BufferedReader reader = request.getReader(); char[]buff = new char[1024]; int len; while((len = reader.read(buff)) != -1) { sb.append(buff,0,len); } }catch (IOException e) { e.printstacktrace(); } String resultString = sb.toString(); return resultString; } }
result as follows :
//初始化servlet postServlet init()....... //读取到的string jsonString...[{"name":"username","value":"yanshi02"},{"name":"password","value":"123456"}] //返回json resultJson ..."[{\"name\":\"username\",\"value\":\"yanshi02\"},{\"name\":\"password\",\"value\":\"123456\"}]"
【特别提醒】
① 若直接返回 jsonString,那么JSP页面可以正常解析并遍历JSON数组;
【就像系列-2所描述的那样,此时的jsonString type 为string;所以JSP使用data的时候一定要判断一下 typeof data,如果为object,那么可以试着直接作为json object使用。如果为string,必须进行转换解析!】
- 转换为JSON数组对象
- 进行解析遍历
② 若使用objectMapper再次转换,则JSP页面不可以正常解析为JSON对象,不可正常遍历JSON数组对象,而是以字符串数组对象遍历!
- 拿到返回数据
- 进行转换
- 遍历!【以字符数组的形式遍历了】
题外话:
为什么不使用request.getParameterMap
?
因为这里传输的为JSON数组字符串,没有username=yanshi02&password=123456
的形式!不能拆解为 key :value !!!
如下所示为使用 request.getParameterMap
key :[{"name":"username","value":"123456"}] value:
如果不进行第二步转换,直接传参
queryString = $('#editform').serializeArray();//JSON数组对象
那么,返回来的是字符串拼接的形式:
jsonString...username=admin&password=123456 resultJson ..."username=admin&password=123456" //... out.println(resultJson); //这里返回的是经过objectMapper转换后的resultJson //如果返回jsonString,JSP可以拿到data,但是解析出错!
- 提交数组对象到后台
- 拿到返回数据
- 尝试解析为JSON对象 【失败,仍旧为string】
- 遍历!【以字符数组遍历】
【JSP】页面:
- 表单页面
<body> This is my JSP page. <br> <form id="editform" action="postServlet4" method="post"> <input type="text" name="username" value=""/> <input type="password" name="password" value=""/> </form> <input name="post" type="button" value="提交"/> <div id="content"></div> </body>
- JSON解析:
$.post(url,function(data){ alert(typeof data+",返回的内容为 "+data); //var jsonReturn = this.data; //var jsonReturn = eval("("+data+")"); //var jsonReturn = $.parseJSON(data); var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象 alert(typeof jsonReturn+" 转换后内容 "+jsonReturn); // 第一种json数组遍历方式 for(var i=0;i<jsonReturn.length;i++){ for(var key in jsonReturn[i]){ alert(key+':'+jsonReturn[i][key]); $("#content").append(jsonReturn[i][key]); } } }
总结 :
经过几篇各种形式的传参–后台解析–返回json,总结分析如下:
① 如果你后台的jsonString 现在为string 非object。那么不要再使用objectMapper进行转换!!!
② 如果你获得最终json是用objectMapper从其他数据,比如map,转换得到,那么这个json很可能为object,jsp页面可以直接使用data.key !
C语言中定义函数 type function(type * &s)中的* &的功能?
请问网友C语言中定义函数 type function(type * &s)中的* &的功能?与 type function(type *s)及 type function(type &s)有和区别?3Q关于UFuncTypeError: ufunc 'matmul' 不包含具有签名匹配类型 (dtype('
本文标签: