在本文中,我们将给您介绍关于没有指定dataType的自定义ajaxTransport函数没有触发(全部!)的详细内容,并且为您解答没有指定f参数的相关问题,此外,我们还将为您提供关于AJAX-$.p
在本文中,我们将给您介绍关于没有指定dataType的自定义ajaxTransport函数没有触发(全部!)的详细内容,并且为您解答没有指定f参数的相关问题,此外,我们还将为您提供关于AJAX - $.post(url,data,function,type)-(参数为value-type-string)、Ajax DataType:JSON响应是:可以,但是没有输出?、ajax 请求中 contentType 与 dataType 区别、ajax 里面的 dataType 和服务端 setContentType的知识。
本文目录一览:- 没有指定dataType的自定义ajaxTransport函数没有触发(全部!)(没有指定f参数)
- AJAX - $.post(url,data,function,type)-(参数为value-type-string)
- Ajax DataType:JSON响应是:可以,但是没有输出?
- ajax 请求中 contentType 与 dataType 区别
- ajax 里面的 dataType 和服务端 setContentType
没有指定dataType的自定义ajaxTransport函数没有触发(全部!)(没有指定f参数)
测试了多个版本的jQuery:
> 1.5.2
> 1.6.4
> 1.7.2
> 1.8.0
使用多个浏览器进行测试:
> Firefox 15
> Chrome 21
> iOS 5网页浏览量
…
他们都没有工作.
Jsfiddle测试用例:http://jsfiddle.net/PVYut/
…
如果我添加一个dataType来缩小它,那么它工作正常.
Jsfiddle测试用例:http://jsfiddle.net/PVYut/1/
…
我只是做错了吗?我很高兴被告知,只要我能让这个工作! -_-
解决方法
$.ajaxTransport("+*",function(options,originalOptions,jqXHR,headers,completeCallback ) { console.log("Executing ajaxTransport"); return { send: function( headers,completeCallback ) { completeCallback(404,"error",{}); },abort: function() { /* abort code */ } } }); $.ajax("?jqTrans=" + (+(new Date()))) .done(function() { console.log("ERROR: Should not have been successful!"); }) .fail(function() { console.log("SUCCESS: Should have Failed."); });
这是jsFiddle
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 DataType:JSON响应是:可以,但是没有输出?
好的,这是我的问题。我有一个简单的jQuery Ajax请求,当我将DataType设置为“ JSON”时我无法工作。
var form_data = { "id": msg, "token": token }; $.ajax({ type: ''POST'', url: "ajax.php", data: form_data, dataType: ''json'', beforeSend:function(){ // this is where we append a loading image }, success: function(data) { var thing = JSON.parse(data); $(''.body-item'').html(thing.b); }, error: function() { alert(''error''); } });
这实际上是我的ajax文件。该ajax.php
如下所示:
$arr = array(''a'' => 1, ''b'' => 2, ''c'' => 3, ''d'' => 4, ''e'' => 5); $foo = json_encode($arr); echo $foo;
当我运行jQuery脚本时,我收到了Firebug的200:OK响应,而当我查看响应时,得到了以下内容:{"a":1,"b":2,"c":3,"d":4,"e":5}
但是,在.body-item div中没有显示任何内容,也没有尝试使用alert()。
另外,如果我运行相同的代码而没有:: dataType: ''json''
部分,那么我将正确输出所有内容。
这可能是什么问题?
答案1
小编典典使用dataType:''json''
时jQuery调用JSON.parse()
并将结果放入data
。您不应该自己调用它,因为data
它不是JSON字符串,而是已解析的对象。所以做:
$(''body-item'').html(data.b);
从文档中:
“ json”:将响应评估为JSON并返回一个JavaScript对象。
ajax 请求中 contentType 与 dataType 区别
contentType: 告诉服务器,我要发什么类型的数据
dataType:告诉服务器,我要想什么类型的数据,如果没有指定,那么会自动推断是返回 XML,还是 JSON,还是 script,还是 String。
ajax 里面的 dataType 和服务端 setContentType
ajax 里面的 dataType 和服务端 setContentType,这两个是不是重复了,为什么有时服务端设置 text/plain,dataType 设置了 “json”, 就会报错?
我看了网上说:
1、服务端不返回 response content-type:application/json, 前端 dataType 指定 json, 解码 http 响应内容,data 类型是 Object
2、服务端返回 response content-type:application/json, 前端 dataType 不指定 json, 解码 http 响应内容,data 类型是 Object
, 先问解码 http 啥意思,json 等不是数据类型吗,解码不是什么 iso-8859-1,utf-8 之类的么,这怎么扯到一起了。然后为什么这两个都可以解码,返回 Object, 难道 dataType 和服务端只要设置一个就可以,两者功能是一样的么?
我们今天的关于没有指定dataType的自定义ajaxTransport函数没有触发(全部!)和没有指定f参数的分享已经告一段落,感谢您的关注,如果您想了解更多关于AJAX - $.post(url,data,function,type)-(参数为value-type-string)、Ajax DataType:JSON响应是:可以,但是没有输出?、ajax 请求中 contentType 与 dataType 区别、ajax 里面的 dataType 和服务端 setContentType的相关信息,请在本站查询。
本文标签: