原生Ajax与Bootstrap
一、原生Ajax应用
Ajax:异步的JS与XML的组合;用途,应用场景等方面,和昨天的jquery的Ajax一致
写法上的区别:
原生Ajax需要在JS中使用XML的请求对象发请求到服务器
从服务器取数据
<!-- 客户端: -->
<div id="myDiv"><h2>使用 AJAX 修改该文本内容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改内容</button>
<script type="text/javascript">
function loadXMLDoc(){
//原生Ajax操作:
var xmlHttp = new XMLHttpRequest(); //实例化xml的请求对象
//xml请求对象发请求:参数1:请求类型 参数2:路径 参数3:异步true 同步false
xmlHttp.open("get","load.jsp",true); //数据填充
xmlHttp.send(); //发送请求
//回调函数
xmlHttp.onreadystatechange=function(){
//readyState=4:服务器已处理完数据,响应已就绪 响应状态为200表示成功的响应
if(xmlHttp.readyState==4&&xmlHttp.status==200){
//responseText:获取服务器中返回的文本内容
document.getElementById("myDiv").innerHTML=xmlHttp.responseText;
}
}
}
</script>
//服务器:
<%
response.getWriter().write("返回数据到客户端~~");
%>
传参到服务器
<!-- 客户端: -->
<div id="myDiv"><h2>使用 AJAX 修改该文本内容</h2></div>
<button type="button" onclick="loadXMLDoc()">修改内容</button>
<script type="text/javascript">
function loadXMLDoc(){
//原生Ajax操作:
var xmlHttp = new XMLHttpRequest(); //实例化xml的请求对象
//xml请求对象发请求:参数1:请求类型 参数2:路径 参数3:异步true 同步false
//传参格式:?name=value&name2=value2
xmlHttp.open("get","load2.jsp?name=zs&age=30",true); //数据填充
xmlHttp.send(); //发送请求
//回调函数
xmlHttp.onreadystatechange=function(){
//readyState=4:服务器已处理完数据,响应已就绪 响应状态为200表示成功的响应
if(xmlHttp.readyState==4&&xmlHttp.status==200){
//responseText:获取服务器中返回的文本内容
document.getElementById("myDiv").innerHTML=xmlHttp.responseText;
}
}
}
</script>
//服务器:
<%
String name = request.getParameter("name");
String age = request.getParameter("age");
response.getWriter().write("返回数据-name="+name+";age="+age);
%>
二、Ajax细节
get清除缓存
缓存在Java中很重要,且有很多种缓存,例如,浏览器有缓存,服务器有缓存,数据库也有缓存; 每个地方的缓存所代表的含义都是类似的,都是提高查询效率; 但有些场景需要清除缓存,例如,获取验证码,如果有缓存,则每次发同样链接,返回同样的验证码;则有安全隐患,这种场景需要清除缓存。
//原生Ajax操作:
var xmlHttp = new XMLHttpRequest(); //实例化xml的请求对象
//date=日期;每毫秒值都不同,意味着每次发的请求都是不同的,意味着每
//次都会取服务器获取新的新资源;相当于清除了缓存
xmlHttp.open("get","load.jsp?date="+new Date(),true); //数据填充
xmlHttp.send(); //发送请求
post异步请求
//post请求:post不带参数,和get不带参一样
//xmlHttp.open("post","load.jsp",true);
//xmlHttp.send();
//post带参数: 需要在send中传参数,且需要设置请求头
xmlHttp.open("post","load2.jsp",true);
//由于post传参数,可以传文本和二进制数据(上传图片);所以需要指定请求头类型
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send("name=zsf&age=99");
响应状态码
描述:当客户端发送请求后,服务器是否接收,或响应是否成功都会给客户端一个响应状态,最典型的是200或404;200表示成功状态,404则是未找到服务器;以下需要记住的状态码:
200:服务器能够接收客户端请求,且服务器处理无异常,响应回来的成功的状态码
302:重定向;也就是客户端访问服务器后;服务器中指定客户端再发一次请求到另一个页面或服务器
404:客户端未发现服务器路径;往往是路径写错了
500:客户端找到了服务器,但是服务器中代码出现异常了
回调XML数据
回调xml数据,意味着,可以将xml文件当成服务器数据;获取这些xml数据后,只需要解析出来想要的数据即可。
var xmlHttp = new XMLHttpRequest(); //实例化xml的请求对象
xmlHttp.open("get","student.xml",true); //数据填充
xmlHttp.send(); //发送请求
xmlHttp.onreadystatechange=function(){
if(xmlHttp.readyState==4&&xmlHttp.status==200){
var doc = xmlHttp.responseXML; //获取文档对象,类似js的DOM(不常用)
//从xml文档对象中获取name的标签
var names = doc.getElementsByTagName("name");
var txt = "";
//标签有多个,所以需要循环
for(var i=0;i<names.length;i++){
//names[i]取到下标个数的指定标签
//childNodes[0]:拿到第0个子节点;nodeValue取出值-张三丰或张无忌
txt=txt + names[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("myDiv").innerHTML=txt;
}
}
<!--student.xml-->
<students> <!-- xml格式类似html,都有根标签,里面包含多个子标签及属性 -->
<student>
<name>张三丰</name> <!-- ajax访问后,目的是解析基本值 -->
<age>99</age>
</student>
<student>
<name>张无忌</name>
<age>22</age>
</student>
</students>
三、校验插件
概述
validate校验插件,主要用于表单中提交时,做的提示校验规则;也就是不满足规则条件时,会给我们提供规则提示,意味着不能提交了,直到满足了规则条件才能提交。
特点
引入插件后,校验规则会给我们做一些统一的内置提示
同时,我们也可以自己来指定规则提示,体现了校验插件的灵活性
应用
先导校验包,且需要引入jquery.js,因为插件中需要使用到;且需要放到最前面;还需要导入中文识别包
<!-- 引入包:jquery放前面 -->
<script type="text/javascript" src="../js/jquery-1.11.js" ></script>
<script type="text/javascript" src="../js/validate.min.js" ></script>
<script type="text/javascript" src="../js/messages_zh.js" ></script>
<script>
$(function(){
$("form").validate({ //校验规则,往往用在表单中
rules:{ //写规则
//里面的key对应这HTML标签中的name的属性
username:"required",
password:{required:true,digits:true},
repassword:{equalTo:"[name='password']"},
zxz:{min:3,required:true},
shuzhiqujian:{range:[5,10],required:true}
},messages:{ //提示信息
username:"用户名不能为空",
password:{required:"密码不能为空",digits:"太笨了,写数字啊"},
repassword:{equalTo:"密码和确认密码不一致"},
zxz:{min:"最小值为{0}"},
shuzhiqujian:{range:"数值范围为:{0}-{1}"}
}
})
})
</script>
<form>
用户名:<input type="text" name="username" /><br />
密码:<input type="text" name="password" /><br />
确认密码:<input type="text" name="repassword" /><br />
最小值:<input type="number" name="zxz" /><br />
数值区间:<input type="number" name="shuzhiqujian" /><br />
<input type="submit" value="提交" />
</form>
四、Bootstrap应用
概述:Bootstrap集成了前端的CSS,JS的前端框架,通过CSS的class属性的引入,可以使标签控件效果更美化(关键);通过JS可以生成控件的触发效果(不常用)
特点:可以完成响应式布局效果
响应式布局: 根据屏幕尺寸,自适应不同的平台和设备中
栅格系统
把页面的行,分为了12等分,根据不同的尺寸,适配不同的设备 例如:col-lg-2 大屏幕 col-md-3 中屏幕
<!-- 导入依赖包 -->
<script type="text/javascript" src="../js/jquery-1.11.js" ></script>
<script type="text/javascript" src="../js/bootstrap.min.js" ></script>
<link rel="stylesheet" type="text/css" href="../css/bootstrap.min.css"/>
<style>
.a{background-color: red;}
.b{background-color: green;}
.c{background-color: blue;}
.d{background-color: yellow;}
.e{background-color: gray;}
</style>
<!-- container-fluid:占满屏幕(默认) container:两边有间隔 -->
<div class="container">
<div class="row"> <!-- 屏幕放大则显示md的尺寸 屏幕变小,则显示xs的尺寸 -->
<div class="col-xs-12 col-md-8 a">.col-xs-12 .col-md-8</div>
<div class="col-xs-6 col-md-4 b">.col-xs-6 .col-md-4</div>
</div>
<div class="row">
<div class="col-xs-6 col-md-4 c">.col-xs-6 .col-md-4</div>
<div class="col-xs-6 col-md-4 d">.col-xs-6 .col-md-4</div>
<div class="col-xs-6 col-md-4 e">.col-xs-6 .col-md-4</div>
</div>
<div class="row">
<div class="col-xs-6">.col-xs-6</div>
<div class="col-xs-6">.col-xs-6</div>
</div>
</div>
排版
<h1>我是h1</h1>我是跟随者
<!-- 要写成行内快-->
<span class="h1">我是h1</span>我是跟随者
<p class="text-left">Left aligned text.</p>
<p class="text-center">Center aligned text.</p>
<p class="text-right">Right aligned text.</p>
<!--不要让内容自动换行-->
<p class="text-nowrap">No wrap text.</p>
<!-- 转大写 -->
<p class="text-uppercase">Uppercased text.</p>
表格
<div class="container">
<!-- table效果 table-striped;隔行换色 table-hover悬停 -->
<table class="table table-striped table-hover">
<tr>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<tr>
<td>张三丰</td>
<td class="active">99</td>
<td>男</td>
<td><a href="#">删除</a></td>
</tr>
<tr>
<td>周伯通</td>
<td>89</td>
<td>男</td>
<td><a href="#">删除</a></td>
</tr>
<tr>
<td class="info">郭靖</td>
<td>56</td>
<td>男</td>
<td><a href="#">删除</a></td>
</tr>
<!-- class="danger" 该记录危险效果 -->
<tr class="danger">
<td>小龙女</td>
<td>35</td>
<td>女</td>
<td><a href="#">删除</a></td>
</tr>
</table>
</div>
五、表单
提交表单加一些class效果,排版结构更好
普通表单
<form>
<!-- form-group:说明里面的子控件是上下结构排列
form-control:当前控件独占一整行
-->
<div class="form-group">
<label >Email address</label>
<input type="email" class="form-control" placeholder="Email">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" id="exampleInputFile">
<p class="help-block">Example block-level help text here.</p>
</div>
<div class="checkbox">
<label><input type="checkbox"> Check me out</label>
</div>
<button type="submit" class="btn btn-danger">Submit</button>
</form>
内联表单
<form class="form-inline"> <!-- 内联表单:表示在一行里面显示表单子控件 -->
<div class="form-group"> <!-- 里面的子控件的class都失效了,没有上下排列的结构 -->
<label>Name</label>
<input type="text" class="form-control" placeholder="Jane Doe">
</div>
<div class="form-group">
<label for="exampleInputEmail2">Email</label>
<input type="email" class="form-control" id="exampleInputEmail2" placeholder="[email protected]">
</div>
<button type="submit" class="btn btn-default">Send invitation</button>
</form>
水平表单
<form class="form-horizontal"> <!-- 水平表单 -->
<div class="form-group"> <!-- 设置了水平表单后,form-group控件会转换为一行里面的显示,类似与.row的效果 -->
<label for="inputEmail3" class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="inputEmail3" placeholder="Email">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword3" placeholder="Password">
</div>
</div>
<div class="form-group">
<!-- 偏移了2等份,复选框占10等分 -->
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox"> Remember me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form>
六、总结与作业
总结
1.原生Ajax应用(重点)
从服务器中获取数据、 传参到服务器并获取服务器数据
关键是将原生ajax的操作步骤写熟练
2.ajax细节
get清除缓存: 参数+日期
post异步请求:在send中传参数,且加入请求头(重点)
响应状态码:200,302,404,500(重点)
回调xml数据;从xml中获取数据,并解析xml的标签内容
3.校验插件
概述-表单中校验规则、特点-内置规则提示,也可以自定义
应用:编写表单标签,应用校验插件
4.bootstrap应用
概述-集成css,js的框架集; 响应式布局
栅格系统,排版,表格
5.表单(重点)
普通表单:form-group,form-control的用法
内标表单:在一行中显示子控件
水平表单:每组控件,在一行中显示; 结合栅格系统使用
作业
1. 将课堂案例中的注册功能,使用原生ajax完成
2. 文本框中输入内容,点击按钮,任选一种ajax异步请求,发送数据,并从jsp中返回该数据到下拉列表中