GVKun编程网logo

[ASP.NET AJAX]Function对象及Type类的方法介绍(ajaxcontenttype类型)

26

在本文中,我们将给您介绍关于[ASP.NETAJAX]Function对象及Type类的方法介绍的详细内容,并且为您解答ajaxcontenttype类型的相关问题,此外,我们还将为您提供关于AJAX

在本文中,我们将给您介绍关于[ASP.NET AJAX]Function对象及Type类的方法介绍的详细内容,并且为您解答ajaxcontenttype类型的相关问题,此外,我们还将为您提供关于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)、asp.net – DbFunctions.TruncateTime在ASP .NET CORE中的LINQ等价物的知识。

本文目录一览:

[ASP.NET AJAX]Function对象及Type类的方法介绍(ajaxcontenttype类型)

[ASP.NET AJAX]Function对象及Type类的方法介绍(ajaxcontenttype类型)

上一回我们从总体上认识了JavaScript Microsoft AJAX Library由于临时有事,没有加入事例显得有点抽象,这一回一定会通过一些事例更加直观的来会一会Asp.NET Ajax脚本库中一个很是重要的类Type。这个类提供了一些扩展面向对象编程的一些反射方法,通过这个类我们可以注册类似.NET中的一些(如:命名空间,类,枚举等等)基本类型。这个Type类继承自window是一个Global类型,不属于任何命名空间。下面我们来看看Type中的一些基本方法以及是怎样实一些方法的实现方式...

在认识Type类之前,我们首先要来看一看一个很重要的对象,那就是Function对象。Function对象是JavaScript的内部对象,例如:日期对象(Date),数组对象(Array),字符对象(String)以及(Object,RegExp,Math,Error等)都属于这种,可以通过new来实例化一个对象。除了我们常见的JavaScript申明的函数,我们也可以用以下的方法构建我们的函数对象:var myFunction=new Function(arguments,statement)。由于我对脚本不是很熟悉,对prototype(不过听说是通过给出一个原型对象来指明所要创建的对象的类型,然后用这个原型对象的方法创建出更多同类型的对象,原始模型模式属于对象的创建模式)也不是很了解,不过经过我简单的测试了一下,如果对Function进行prototype扩展可以通过new来申明对象后再引用他,也可以直接调用Function.(方法或函数)。如果直接运用Function.uName来扩展这个uName就只能通过Function.uName调用,这让我想起了.NET中的静态方法(C#:static;VB:share),有了这些我们来看看Asp.NET Ajax中对Function扩展的几个对象:
复制代码 代码如下:

 Function.__typeName="Function"; 
 Function.createCallback=function(b,a){ 
   return function(){ 
    var e=arguments.length; 
    if(e>0){ 
      var d=[]; 
      for(var c=0;c<e;c++) 
        d[c]=arguments[c]; 
      d[e]=a; 
      return b.apply(this,d) 
     } 
     return b.call(this,a) 
   } 
 }; 
  Function.createDelegate=function(a,b){ 
    return function(){ 
      return b.apply(a,arguments) 
    } 
 }; 
 Function.emptyFunction=Function.emptyMethod=function(){}; 

从上面我们可以看出Function扩展了一个属性(__typeName)和几个方法(我们可以把它看成.NET中的静态对象来调用,如果用new Function();再来调用就会得到"undefined";可能这是JavaScript最基本的东西,但是我以前没有用过这种对象来写过脚本,也没有系统的学过JavaScript,所以不要笑话我哦:)正在学习中...),在上面我还发现了一个比较少见的call/apply;网上搜了一下发现在<<全面理解javascript的caller,callee,call,apply概念>>有比较详细的介绍。如果我没猜错的话:Function.createCallback("callback method","callback argument")和回调有关;Function.createDelegate("object通常用this","执行的方法"),即通过Function.createDelegate创建的代理方法继承了b方法,从而来完成整个代理的过程(不知道是否正确!);Function.emptyFunction/Function.emptyMethod应该是为了接口和虚函数而准备的。

Type对象继承了Function对象,由Function对象进一步延伸,在这里我们就不讨论Type地实现过程,我们今天主要来看看Type中的一些重要的方法。Type中总共有22个方法,下面我们将逐个进行介绍:

.[prototype]Type.callBaseMethod(instance,name,baseArguments)
说明:
   这个函数主要调用基函数中的方法,相当于C#中的base;这个函数只有在继承函数时才会用到。
参数:
   instance:将要被调用的基函数的当前实例,通常用this;
   name:将要被调用的基函数的名称,用字符串表示;
   baseArguments:将要被调用的基函数的参数。

.[prototype]Type.getBaseMethod(instance,name)
说明:
   引用基函数的方法实例,如果你要通过Function.call函数来调用一个方法,这将是你的选择;不过我觉得和上一个函数的差别不是特别大,糊涂了。
参数:
   instance:在这个函数中好像没有被调用,上一个函数的实现是通过这个函数来获取函数的,可能这个参数是为1中的instance参数预留的,我也搞不懂他们为什么这样干,高手自由高手的道理吧!
   name:当然是所要引用的方法的名称。

.[prototype]Type.getBaseType()
说明:
    其实就是返回"typeof this.__baseType"的值,如果是"undefined"则返回null。

.[prototype]Type.getInterfaces()
说明:
    通过这个可以获取当前实例所实现的接口对象数组,为一个Array对象。

.[prototype]Type.getName()
说明:
    返回当前对象的名称,包括命名空间和类名称,如果为"undefined"返回""。

.[prototype]Type.implementsInterface(interfaceType)
说明:
    如果当前类已经实现了interfaceType接口中的所有定义,则返回true,否则返回false。这也就可以实现在.NET中继承借口必须实现所有方法或属性的诺言:)

.[prototype]Type.inheritsFrom(parentType)
说明:
    调用此方法可以判断当前实例是否继承自parentType类,如:var isInherited=ClassA.inheritsFrom(ClassB);如果当前实例继承自parentType则返回true,否则返回false。

.[prototype]Type.initializeBase(instance, baseArguments)
说明:
    这是一个相当重要的函数,通过这个函数来初始化基函数的构造函数,也可以将自己注册为一个基函数。其中instance是初始化基类的对象,通常用this;baseArguments为基函数构造函数的参数,可以为空。

.[prototype]Type.isImplementedBy(typeInstance)
说明:
    这个和6中正好相反,用来判断typeInstance是否实现了接口中的所有定义,如果是实现返回true,否则返回false。

.[prototype]Type.isInstanceOfType(instance)
说明:
    判断类是否为instance的当前实例,主要用于要判断类是否为继承自他的类(子类)的实例。返回true/false。

.[prototype]Type.registerClass(typeName, baseType, interfaceTypes)
说明:
    这个一看就知道是注册一个类的,baseType和interfaceTypes都是可选的,同时和.NET的一样,baseType最多一个,而接口就无所谓了。这个方法用在定一个类以后初始化之前,如果有baseType须在第一行通过Type.initializeBase来实例化基函数的构造函数。

.[prototype]Type.registerInterface(typeName)
说明:
    将一个类注册为接口,接口中部包含任何的处理函数。

.[prototype]Type.resolveInheritance()
说明:
    这个方法很好玩,拷贝基类的属性,来对当前类进行prototype扩展,可也就是扩展面向对象编程中的反射。

.Type.getRootNamespaces()
说明:
    静态函数(我不知道别人怎么叫,我就叫他静态函数就好了:),通过这个方法可以获取所有命名空间的Array数组(即返回一个数组,包含所有命名空间)。

.Type.isClass(type)
.Type.isInterface(type)
.Type.isNamespace(type)

.Type.parse(typeName,ns)
说明:
    厉害了,通过这个可以创建一个对象,即.NET中的利用Type.GetType("type,ns");和Invoke();来反射实例化一个类。ns命名空间可选项。如果类没有位于一个命名空间中(如:Type类),typeName可以为null。

.Type.registerNamespace(namespacePath)
说明:
    注册一个命名空间。

.[prototype]Type.registerEnum(name,flag)
说明:
    注册为枚举类型,flag判断是否为bit类型,可选。

.Type.isEnum(type)
.Type.isFlags(type)

写着写着胡了,例子还是没有加上,而且原来的理解好像很模糊,为了让人能更直观的理解,我把有些例子放在这里(html文件):


如果要测试Enum要用<ScriptManager/>空间引用脚本,提供例子里的脚本没有Number类的扩展,所以不能测试Enum,哎,几个小时就这样过去了,不过也掌握了不少,在我写这篇文章是越来越觉得很模糊,如果有什么错误的地方请大家指出,允许Bill Gate先富起来,然后带动我们富裕,最后实现大家共同富裕吗:)

AJAX - $.post(url,data,function,type)-(参数为value-type-string)

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))

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)

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 !

asp.net – DbFunctions.TruncateTime在ASP .NET CORE中的LINQ等价物

asp.net – DbFunctions.TruncateTime在ASP .NET CORE中的LINQ等价物

我的.net应用程序中有以下功能LINQ

public ActionResult Index()
    {
        Dictionary<DateTime?,List<Event>> result;
        result = (from events in db.Events.Include("Activity")
                      where events.IsActive
                      group events by DbFunctions.TruncateTime(events.DateTimeFrom) into dateGroup
                      select new { EventDate = dateGroup.Key,Events = dateGroup.ToList() }).ToDictionary(x => x.EventDate,x => x.Events);

        return View(result);
    }

当我在ASP .NET CORE中使用它时,我不能使用DbFunctions.我如何重写它以使其在Microsoft.EntityFrameworkCore中工作?我正在使用sqlite,如果这有所作为.

解决方法

在EF6中使用DbFunctions.TruncateTime而不是DateTime.Date属性,因为由于某种原因,后者不受支持.

在EF Core中,不需要前者,因为现在可以正确识别和翻译DateTime.Date.

group events by events.DateTimeFrom.Date into dateGroup

遗憾的是,还没有支持的文档,所以作为一般的经验法则,总是尝试相应的CLR方法/属性(如果有的话)并检查它是否转换为sql以及如何.

关于[ASP.NET AJAX]Function对象及Type类的方法介绍ajaxcontenttype类型的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于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)、asp.net – DbFunctions.TruncateTime在ASP .NET CORE中的LINQ等价物的相关知识,请在本站寻找。

本文标签:

上一篇AJAX客户端说明,XMLHttpRequest对象(ajax和xmlhttp)

下一篇Javascript基础教程之JavaScript语法(javascript基本语法)