差了很多博客了,慢慢补。

苑昊老师博客:http://www.cnblogs.com/yuanchenqi/articles/7429279.html

Django-3

知识预览

  • Ajax前戏:json
  • Ajax简介
  • jquery实现的ajax
  • JS实现的ajax
回到顶部

Ajax前戏:json

什么是json?

定义:

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

讲json对象,不得不提到JS对象:

合格的json对象:

["one", "two", "three"]

{ "one": 1, "two": 2, "three": 3 }

{"names": ["张三", "李四"] }

[ { "name": "张三"}, {"name": "李四"} ]

不合格的json对象:

{ name: "张三", 'age': 32 } // 属性名必须使用双引号

[32, 64, 128, 0xFFF] // 不能使用十六进制值

{ "name": "张三", "age": undefined } // 不能使用undefined

{ "name": "张三",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function() {return this.name;} // 不能使用函数和日期对象
}

stringify与parse方法

JSON.parse():     用于将一个 JSON 字符串转换为 JavaScript 对象 
eg:
console.log(JSON.parse('{"name":"Yuan"}'));
console.log(JSON.parse('{name:"Yuan"}')) ;   // 错误
console.log(JSON.parse('[12,undefined]')) ;   // 错误JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。 
eg:  console.log(JSON.stringify({'name':"egon"})) ; 

和XML的比较

JSON 格式于2001年由 Douglas Crockford 提出,目的就是取代繁琐笨重的 XML 格式。

JSON 格式有两个显著的优点:书写简单,一目了然;符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。所以,JSON迅速被接受,已经成为各大网站交换数据的标准格式,并被写入ECMAScript 5,成为标准的一部分。

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

用XML表示中国部分省市数据如下:

<?xml version="1.0" encoding="utf-8"?>

<country>
    <name>中国</name>
    <province>
        <name>黑龙江</name>
        <cities>
            <city>哈尔滨</city>
            <city>大庆</city>
        </cities>
    </province>
    <province>
        <name>广东</name>
        <cities>
            <city>广州</city>
            <city>深圳</city>
            <city>珠海</city>
        </cities>
    </province>
    <province>
        <name>台湾</name>
        <cities>
            <city>台北</city>
            <city>高雄</city>
        </cities>
    </province>
    <province>
        <name>新疆</name>
        <cities>
            <city>乌鲁木齐</city>
        </cities>
    </province>
</country>

用JSON表示如下:

{
    "name""中国",
    "province": [{
        "name""黑龙江",
        "cities": {
            "city": ["哈尔滨""大庆"]
        }
    }, {
        "name""广东",
        "cities": {
            "city": ["广州""深圳""珠海"]
        }
    }, {
        "name""台湾",
        "cities": {
            "city": ["台北""高雄"]
        }
    }, {
        "name""新疆",
        "cities": {
            "city": ["乌鲁木齐"]
        }
    }]
}

  可以看到,JSON 简单的语法格式和清晰的层次结构明显要比 XML 容易阅读,并且在数据交换方面,由于 JSON 所使用的字符要比 XML 少得多,可以大大得节约传输数据所占用得带宽。

注意:

JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中。
但是国人的一款在线工具 BeJson 、SoJson在线工具让众多程序员、新接触JSON格式的程序员更快的了解JSON的结构,更快的精确定位JSON格式错误。

数据交换

def login(request):obj={'name':"alex111"}return render(request,'index.html',{"objs":json.dumps(obj)})
#----------------------------------<script>var temp={{ objs|safe }}alert(temp.name);alert(temp['name'])</script>

如果要通过js或者jquery给后端发送数据,那么就要用到我们下面的Ajax啦

回到顶部

Ajax简介

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

js实现的局部刷新:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>

<style>
.error{
color:red
}
</style>
</head>
<body>

<form class="Form">

<p>姓名&nbsp;&nbsp;<input class="v1" type="text" name="username" mark="用户名"></p>
<p>密码&nbsp;&nbsp;<input class="v1" type="text" name="email" mark="邮箱"></p>
<p><input type="submit" value="submit"></p>

</form>

<script src="jquery-3.1.1.js"></script>

<script>

$(".Form :submit").click(function(){

flag=true;

$("Form .v1").each(function(){

var value=$(this).val();
if (value.trim().length==0){
var mark=$(this).attr("mark");
var $span=$("<span>");
$span.html(mark+"不能为空!");
$span.prop("class","error");
$(this).after($span);

setTimeout(function(){
$span.remove();
},800);

flag=false;
return flag;

}
});
return flag
});

</script>

</body>
</html>

AJAX常见应用情景

当我们在百度中输入一个“老”字后,会马上出现一个下拉列表!列表中显示的是包含“传”字的4个关键字。

其实这里就使用了AJAX技术!当文件框发生了输入变化时,浏览器会使用AJAX技术向服务器发送一个请求,查询包含“传”字的前10个关键字,然后服务器会把查询到的结果响应给浏览器,最后浏览器把这4个关键字显示在下拉列表中。

  • 整个过程中页面没有刷新,只是刷新页面中的局部位置而已!
  • 当请求发出后,浏览器还可以进行其他操作,无需等待服务器的响应!

当输入用户名后,把光标移动到其他表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为zhangSan的用户是否存在,最终服务器返回true表示名为lemontree7777777的用户已经存在了,浏览器在得到结果后显示“用户名已被注册!”。

  • 整个过程中页面没有刷新,只是局部刷新了;
  • 在请求发出后,浏览器不用等待服务器响应结果就可以进行其他操作;

AJAX的优缺点

优点:

  • AJAX使用Javascript技术向服务器发送异步请求;
  • AJAX无须刷新整个页面;
  • 因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高;

缺点:

  • AJAX并不适合所有场景,很多时候还是要使用同步交互;
  • AJAX虽然提高了用户体验,但无形中向服务器发送的请求次数增多了,导致服务器压力增大;
  • 因为AJAX是在浏览器中使用Javascript技术完成的,所以还需要处理浏览器兼容性问题;

一言以蔽之:不会Ajax,搞什么web,玩什么爬虫!

回到顶部

jquery实现的ajax

{% load staticfiles %}<!DOCTYPE html><html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="{% static 'JS/jquery-3.1.1.js' %}"></script>
</head>
<body><button class="send_Ajax">send_Ajax</button><script>//$.ajax的两种使用方式://$.ajax(settings);//$.ajax(url,[settings]);$(".send_Ajax").click(function(){$.ajax({url:"/handle_Ajax/",type:"POST",data:{username:"Yuan",password:123},success:function(data){alert(data)},//=================== error============error: function (jqXHR, textStatus, err) {// jqXHR: jQuery增强的xhr// textStatus: 请求完成状态// err: 底层通过throw抛出的异常对象,值与错误类型有关console.log(arguments);},//=================== complete============complete: function (jqXHR, textStatus) {// jqXHR: jQuery增强的xhr// textStatus: 请求完成状态 success | errorconsole.log('statusCode: %d, statusText: %s', jqXHR.status, jqXHR.statusText);console.log('textStatus: %s', textStatus);},//=================== statusCode============statusCode: {'403': function (jqXHR, textStatus, err) {console.log(arguments);  //注意:后端模拟errror方式:HttpResponse.status_code=500},'400': function () {}}})})</script>
</body>
</html>

import json

def index(request):

return render(request,"index.html")

def handle_Ajax(request):

username=request.POST.get("username")
password=request.POST.get("password")

print(username,password)

return HttpResponse(json.dumps("Error Data!"))

views

$.ajax参数

请求参数

######################------------data---------################data: 当前ajax请求要携带的数据,是一个json的object对象,ajax方法就会默认地把它编码成某种格式(urlencoded:?a=1&b=2)发送给服务端;此外,ajax默认以get方式发送请求。function testData() {$.ajax("/test",{     //此时的data是一个json形式的对象data:{a:1,b:2}});                   //?a=1&b=2
######################------------processData---------################processData:声明当前的data数据是否进行转码或预处理,默认为true,即预处理;if为false,那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString(),最后得到一个[object,Object]形式的结果。######################------------contentType---------################contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。用来指明当前请求的数据编码格式;urlencoded:?a=1&b=2;如果想以其他方式提交数据,比如contentType:"application/json",即向服务器发送一个json字符串:$.ajax("/ajax_get",{data:JSON.stringify({a:22,b:33}),contentType:"application/json",type:"POST",});                          //{a: 22, b: 33}注意:contentType:"application/json"一旦设定,data必须是json字符串,不能是json对象######################------------traditional---------################traditional:一般是我们的data数据有数组时会用到 :data:{a:22,b:33,c:["x","y"]},traditional为false会对数据进行深层次迭代;  

响应参数

/*dataType:  预期服务器返回的数据类型,服务器端返回的数据会根据这个值解析后,传递给回调函数。默认不需要显性指定这个属性,ajax会根据服务器返回的content Type来进行转换;比如我们的服务器响应的content Type为json格式,这时ajax方法就会对响应的内容进行一个json格式的转换,if转换成功,我们在success的回调函数里就会得到一个json格式的对象;转换失败就会触发error这个回调函数。如果我们明确地指定目标类型,就可以使用data Type。dataType的可用值:html|xml|json|text|script见下dataType实例*/

示例:

from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.

import json

def login(request):

return render(request,'Ajax.html')

def ajax_get(request):

l=['alex','little alex']
dic={"name":"alex","pwd":123}

#return HttpResponse(l) #元素直接转成字符串alexlittle alex
#return HttpResponse(dic) #字典的键直接转成字符串namepwd
return HttpResponse(json.dumps(l))
return HttpResponse(json.dumps(dic))# 传到前端的是json字符串,要想使用,需要JSON.parse(data)

//---------------------------------------------------
function testData() {

$.ajax('ajax_get', {
success: function (data) {
console.log(data);
console.log(typeof(data));
//console.log(data.name);
//JSON.parse(data);
//console.log(data.name);
},
//dataType:"json",
}
)}

注解:Response Headers的content Type为text/html,所以返回的是String;但如果我们想要一个json对象
设定dataType:"json"即可,相当于告诉ajax方法把服务器返回的数据转成json对象发送到前端.结果为object
当然,
return HttpResponse(json.dumps(a),content_type="application/json")

这样就不需要设定dataType:"json"了。
content_type="application/json"和content_type="json"是一样的!

csrf跨站请求伪造

1
2
3
$.ajaxSetup({
    data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});

回到顶部

JS实现的ajax

AJAX核心(XMLHttpRequest

其实AJAX就是在Javascript中多添加了一个对象:XMLHttpRequest对象。所有的异步交互都是使用XMLHttpServlet对象完成的。也就是说,我们只需要学习一个Javascript的新对象即可。

1
var xmlHttp = new XMLHttpRequest();(大多数浏览器都支持DOM2规范)

注意,各个浏览器对XMLHttpRequest的支持也是不同的!为了处理浏览器兼容问题,给出下面方法来创建XMLHttpRequest对象:

function createXMLHttpRequest() {
var xmlHttp;
// 适用于大多数浏览器,以及IE7和IE更高版本
try{
xmlHttp = new XMLHttpRequest();
} catch (e) {
// 适用于IE6
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
// 适用于IE5.5,以及IE更早版本
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e){}
}
}
return xmlHttp;
}

使用流程

步骤1:  打开与服务器的连接(open方法)

当得到XMLHttpRequest对象后,就可以调用该对象的open()方法打开与服务器的连接了。open()方法的参数如下:

open(method, url, async):

  • method:请求方式,通常为GET或POST;
  • url:请求的服务器地址,例如:/ajaxdemo1/AServlet,若为GET请求,还可以在URL后追加参数;
  • async:这个参数可以不给,默认值为true,表示异步请求;
1
2
var xmlHttp = createXMLHttpRequest();
xmlHttp.open("GET""/ajax_get/"true); 

步骤2:  发送请求

当使用open打开连接后,就可以调用XMLHttpRequest对象的send()方法发送请求了。send()方法的参数为POST请求参数,即对应HTTP协议的请求体内容,若是GET请求,需要在URL后连接参数。

注意:若没有参数,需要给出null为参数!若不给出null为参数,可能会导致FireFox浏览器不能正常发送请求!

1
xmlHttp.send(null);

步骤3:  接收服务器响应

当请求发送出去后,服务器端Servlet就开始执行了,但服务器端的响应还没有接收到。接下来我们来接收服务器的响应。

XMLHttpRequest对象有一个onreadystatechange事件,它会在XMLHttpRequest对象的状态发生变化时被调用。下面介绍一下XMLHttpRequest对象的5种状态:

  • 0:初始化未完成状态,只是创建了XMLHttpRequest对象,还未调用open()方法;
  • 1:请求已开始,open()方法已调用,但还没调用send()方法;
  • 2:请求发送完成状态,send()方法已调用;
  • 3:开始读取服务器响应;
  • 4:读取服务器响应结束。

onreadystatechange事件会在状态为1、2、3、4时引发。

  下面代码会被执行四次!对应XMLHttpRequest的四种状态!

xmlHttp.onreadystatechange = function() {alert('hello');};

但通常我们只关心最后一种状态,即读取服务器响应结束时,客户端才会做出改变。我们可以通过XMLHttpRequest对象的readyState属性来得到XMLHttpRequest对象的状态。

xmlHttp.onreadystatechange = function() {if(xmlHttp.readyState == 4) {alert('hello');    }};

其实我们还要关心服务器响应的状态码是否为200,其服务器响应为404,或500,那么就表示请求失败了。我们可以通过XMLHttpRequest对象的status属性得到服务器的状态码。

最后,我们还需要获取到服务器响应的内容,可以通过XMLHttpRequest对象的responseText得到服务器响应内容。

xmlHttp.onreadystatechange = function() {if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {alert(xmlHttp.responseText);    }};

if 发送POST请求

<1>需要设置请求头:xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);

注意 :form表单会默认这个键值对;不设定,Web服务器会忽略请求体的内容。

<2>在发送时可以指定请求体了:xmlHttp.send(“username=yuan&password=123”)

JS实现ajax小结

/*创建XMLHttpRequest对象;调用open()方法打开与服务器的连接;调用send()方法发送请求;为XMLHttpRequest对象指定onreadystatechange事件函数,这个函数会在XMLHttpRequest的1、2、3、4,四种状态时被调用;XMLHttpRequest对象的5种状态,通常我们只关心4状态。XMLHttpRequest对象的status属性表示服务器状态码,它只有在readyState为4时才能获取到。XMLHttpRequest对象的responseText属性表示服务器响应内容,它只有在readyState为4时才能获取到!*/

测试代码:

<h1>AJAX</h1>
<button οnclick="send()">测试</button>
<div id="div1"></div>

<script>
function createXMLHttpRequest() {
try {
return new XMLHttpRequest();//大多数浏览器
} catch (e) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
}

function send() {
var xmlHttp = createXMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
var div = document.getElementById("div1");
div.innerText = xmlHttp.responseText;
div.textContent = xmlHttp.responseText;
}
};

xmlHttp.open("POST", "/ajax_post/", true);
//post: xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send(null); //post: xmlHttp.send("b=B");
}

</script>

#--------------------------------views.py
from django.views.decorators.csrf import csrf_exempt

def login(request):
print('hello ajax')
return render(request,'index.html')

@csrf_exempt #csrf防御
def ajax_post(request):
print('ok')
return HttpResponse('helloyuanhao')

实例(用户名是否已被注册)

7.1 功能介绍

在注册表单中,当用户填写了用户名后,把光标移开后,会自动向服务器发送异步请求。服务器返回true或false,返回true表示这个用户名已经被注册过,返回false表示没有注册过。

客户端得到服务器返回的结果后,确定是否在用户名文本框后显示“用户名已被注册”的错误信息!

7.2 案例分析

  • 页面中给出注册表单;
  • 在username表单字段中添加onblur事件,调用send()方法;
  • send()方法获取username表单字段的内容,向服务器发送异步请求,参数为username;
  • django 的视图函数:获取username参数,判断是否为“yuan”,如果是响应true,否则响应false

参考代码:

 1 <script type="text/javascript">
 2         function createXMLHttpRequest() {
 3             try {
 4                 return new XMLHttpRequest();
 5             } catch (e) {
 6                 try {
 7                     return new ActiveXObject("Msxml2.XMLHTTP");
 8                 } catch (e) {
 9                     return new ActiveXObject("Microsoft.XMLHTTP");
10                 }
11             }
12         }
13
14         function send() {
15             var xmlHttp = createXMLHttpRequest();
16             xmlHttp.onreadystatechange = function() {
17                 if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
18                     if(xmlHttp.responseText == "true") {
19                         document.getElementById("error").innerText = "用户名已被注册!";
20                         document.getElementById("error").textContent = "用户名已被注册!";
21                     } else {
22                         document.getElementById("error").innerText = "";
23                         document.getElementById("error").textContent = "";
24                     }
25                 }
26             };
27             xmlHttp.open("POST", "/ajax_check/", true, "json");
28             xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
29             var username = document.getElementById("username").value;
30             xmlHttp.send("username=" + username);
31         }
32 </script>
33
34 //--------------------------------------------------index.html
35
36 <h1>注册</h1>
37 <form action="" method="post">
38 用户名:<input id="username" type="text" name="username" onblur="send()"/><span id="error"></span><br/>
39 密 码:<input type="text" name="password"/><br/>
40 <input type="submit" value="注册"/>
41 </form>
42
43
44 //--------------------------------------------------views.py
45 from django.views.decorators.csrf import csrf_exempt
46
47 def login(request):
48     print('hello ajax')
49     return render(request,'index.html')
50     # return HttpResponse('helloyuanhao')
51
52 @csrf_exempt
53 def ajax_check(request):
54     print('ok')
55
56     username=request.POST.get('username',None)
57     if username=='yuan':
58         return HttpResponse('true')
59     return HttpResponse('false')

转载于:https://www.cnblogs.com/jinxj/p/7449888.html

day18--django3之Ajax相关推荐

  1. Django3(一)

    第一部分初步认识django,第二部分具体介绍django的配置信息,第三部分一个小案例 目录 一.第一个Django项目 (一)Django的简介 (二)安装 (三)创建Django项目 (四)模型 ...

  2. Django3(三)FBV视图和CBV视图

    一.FBV视图 视图函数处理HTTTP请求,在视图里定义函数为FBV. 设置响应方式 HTTP协议分为HTTP请求和HTTP响应. HTTP响应方式称为HTTP状态码,分5种状态:消息.成功.重定向. ...

  3. html+spring boot简单的ajax数据传输实现

    本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...

  4. form表单提交前进行ajax或js验证,校验不通过不提交

    在使用form表单进行提交数据前,需要进行数据的校验->表单的校验(如:两次密码输入是否相同)+后台数据的校验(如:账号是否存在),这个时候,如果哪步校验不通过,表单将停止提交,同时避免后台主键 ...

  5. 使用ajax不刷新页面获取、操作数据

    在使用jsp或html时,利用ajax达到不刷新页面就可以获取.操作数据. 首先上代码 (html+js) 在此处需要引入jquery插件 <!-- 这是页面部分 html--> < ...

  6. Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常

    我的servlet代码是 try{ //something response.setStatus(201); out.print("Data successfully saved" ...

  7. 【AJAX】JavaScript的面向对象

    Ajax中后端数据返回后需要前端通过JavaScript来实现动态数据更新的问题.所以,在Ajax中加深了一遍JavaScript面向对象的印象. 基础部分: JavaScript中创建对象并简单对象 ...

  8. 【AJAX】Ajax学习总结

    AJAX是什么: 是Asynchronous(异步).JavaScript.And.Xml 的缩写 主要就是说: 通过JavaScript融合了Web开发标准表示技术,DOM动态显示和交互,XML和X ...

  9. SpringMVC——通俗易懂讲讲Ajax~

    聊聊Ajax 一.什么是Ajax 二.iframe标签简单伪造Ajax 三.Ajax的实现 1. 基本概念的了解 Ajax的核心是什么? XMLHttpRequest是什么? Ajax数据传输的数据格 ...

最新文章

  1. 独家 | 贝叶斯信念网络初探(附链接)
  2. 条形压电陶瓷执行器件和高压驱动器
  3. Java设计模式 创建模式-单态模式(Singleton)
  4. 更改vsftp端口号
  5. 1.8(学习笔记)监听器(Listener)
  6. IT人必去的几大网站,国内外知名IT网站罗列!
  7. 苹果地图副总裁_苹果地图表现糟糕 iOS副总裁福斯特难辞其咎
  8. 自学python哪个书好-学习Python编程的最好的几本书
  9. 3dContactPointAnnotationTool开发日志(八)
  10. 在windows平台上编写的python程序无法在_【判断题】在Windows平台上编写的Python程序无法在Unix平台运行。...
  11. 查找数组中特定元素_Leetcode 540 题 有序数组中的单一元素
  12. 如何实现:GridView 控件中显示的文本不自动换行,隐藏超出宽度部分wj-wangjun
  13. 暂时解决Xmarks无法同步
  14. 【机器学习】AI去马赛克工具(图像修复)
  15. 光刻机巨头ASML爆料:芯片太缺,都开始拆洗衣机了!
  16. 「紫禁之巅」四大图神经网络架构
  17. 2022-04-11 阿里CTO线 Java开发实习生 一面面经
  18. SDH、MSTP、OTN和PTN的关系
  19. 「功守道」软件供应链安全大赛·C源代码赛季启示录
  20. oracle 多行数据合并成一行数据

热门文章

  1. 微服务设计、拆分原则
  2. tomcat配置https,单方验证,并自动将http请求转成https
  3. bootstrap源码分析之form、navbar
  4. 用汇编写改进的冒泡排序
  5. (十)如何查找端口被那个程序占用
  6. 虽然有索引,但没有用上
  7. 很是迷茫 ERP和HIS哪个更有发展前途?
  8. 获取一段html的内容简介
  9. Hadoop集群中添加硬盘
  10. __doPostBack用法 【csdn】