大家好,又见面了,我是你们的朋友全栈君。
byte short int long float double char boolean ExecutorService executorService = Executors.newCachedThreadPool(); 可缓存线程池
ExecutorService executorService= Executors.newFixedThreadPool(3); 定长线程池
ScheduledExecutorService ses= Executors.newScheduledThreadPool(3); 定时线程池
ExecutorService executor = Executors.newSingleThreadExecutor(); 单例线程池ThreadPoolExecutor tpe = new ThreadPoolExecutor(
1,2,5,TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(3));
/**
* 第一个参数: 核心线程数
* 第二个参数: 最大线程数
* 第三个参数: 线程执行完任务后,多长时间销毁
* 第四个参数: 时间单位
* 第五个参数: 阻塞队列长度
*/List | ArrayList | linkedlist | vector |
|---|---|---|---|
有序可重复 | 可变长度数组 | 双向链表 | 效率低弃用 |
Set | hashset | treeSet |
|---|---|---|
无序不可重复 | 哈希表 | 实现comparable自然排序 |
数组+ 重写compareTo方法 链表+ 实现comparetor定制排序 二叉树 集合:Map:键值对
TreeMap 、 HashMap 、 HashTable
Map.enrtySet 查询map中所有元素隔离级别: 设置事物隔离级别:
set global transaction isolation level repeatable-read;查看:
select @@global.tx_isolation;四种隔离级别:
read-uncommitted ----- 读未提交 问题:脏读 解决: ->
read-committed ----- 读已提交 问题:不可重复读 解决: ->
repeatable-Read ----- 可重复读 问题:幻读 解决: ->
(锁了事物B读取事物的时间点)
Serializable ----- 串行化 问题:效率低
(锁住了整张表)ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )(3)读写分离:数据库常用的引擎有两种,一种是Innodb,一种是Myisam. Innodb支持事物,但是事物只收到增删改影响,所以增删改时候,用引擎为Innodb的,查询的时候用MyIsam.
四大作用域
page
request
session
applicationreq.setCharacterEncoding(“utf-8”);
resp.setCharacetEncoding(“utf-8”);
resp.setContentType(“text/html;charset=utf-8”);简洁,但是不能解决get请求乱码问题. 方式二:
new String(xxx.getBytes(“Iso-8859-1”),”utf-8”);方式复杂; 方式三:字符编码过滤器(最好)
<!-- 字符编码过滤器 -->
<filter>
<filter-name>encoding</filter-name> <filter-class>
org.springframework.web.filter. CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>第四种:在server.xml配置URIEncoding=utf-8.但是开发中,一定不会用第四种,因为你把服务器编码变了会影响其他人的编码格式.
Id: #div的 id {
}
Class: .div的class{
}
Div{
}//id选择器 var inp=$("#uname");
//标签选择器 var inps=$("input");
//类选择器 var inps=$(".common");
//组合选择器:
function testAll(){
var eles=$("h3,input");
alert(eles.length);
}
//测试子选择器
function testChild(){
var inps=$("#showdiv>input");
alert(inps.length);
}
//测试层级选择器
function testCj(){
var inp=$("input:first");
alert(inp.val());
}jQuery操作元素属性
//获取元素对象
var uname=$("#uname");
//获取
alert(uname.attr("type")+":"+uname.attr("value")+":"+uname.val());
//jQuery操作元素内容
//获取元素对象
var showdiv=$("#showdiv");
//获取元素的内容
alert(showdiv.html());
//修改元素内容
showdiv.html(showdiv.html()+
"<i>今天天气真好,适合抓鬼子</i>");
//获取元素内容
alert(showdiv.text());
//修改元素内容
showdiv.text("<i>今天天气真好,
适合抓鬼子</i>");
jQuery操作表单:
//全选
$(function(){
$("#btn1").click(function(){
});
})
//反选
$(function(){
$("#btn3").click(function(){
$("input[type='checkbox']").each(function(){
$(this).prop("checked",!$(this).prop("checked"));
})
})
})$(function(){
$.ajax({
type: 请求方式,
url: 请求地址,
data: 发送数据,
async: 同步异步,
dataType: 返回数据类型,
jsonp:
Jsonpcallback:
success:function(data){
},
error:function(){
} }) })
$.getJSON("url", data:{ name: "John", time: "2pm" }, function(json){
alert("JSON Data: " + json.users[3].name);
});
$.get("url",data { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
},返回内容样式);
$.post("test.php", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
},返回内容样式);
$.getScript(url,data,success)JSON用JackSon转换.(fastJson,Gson,@responseboby)
EasyUIDataGrid easyUIDataGrid = tbItemServiceImpl.show(page, rows);
ObjectMapper mapper = new ObjectMapper();
String show = mapper.writeValueAsString(easyUIDataGrid);
return show;<constructor-arg index="0" name="id" type="int"value="123" /> (3)实例工厂
<bea id="factory"class="com.bjsxt.pojo.PeopleFactory"></bean>
<bean id="peo1" factory-bean="factoryfactory-method="newInstance"></bean>(4)静态工厂
<bean id="peo2" class="com.bjsxt.pojo.PeopleFactory"factory-method="newInstance"></bean>(5)基于注解 @Component —>然后用context命名空间去扫包
二.依赖注入 (1)通过property标签中的name和value (2)标签中的 value标签 (3)如果属性是List
<propertyname="list">
<list>
<value>1</value>
<value>2</value>
</list>
</property>同理属性是数组 strs 属性是map:
<property name=map>
<map>
<entry key="a" value="b" >
</entry><entry key="c" value="d" >
</entry>
</map>
</property>(1)在web.xml: 1.配置spring上下文参数contextConfigLocation —> classpath:applicationContex.xml 2.配置spring监听器 contextLoaderListener 3.配置dispatcherServlet前端控制器,配置cp下的:springmvc.xml 4.配置字符集编码过滤器 characterEncodingFilter (2)在applicationContext.xml中配置 1.注解扫描 context component-scan base-package= 2.加载属性文件context:property-placeholder location= 3.配置数据源驱动类,Druid —>数据库四个属性 4.配置sqlSessionFactoryBean —>引用dataSource数据源 5.配置MapperScannerConfigurer扫描器 6.配置事务管理器,声明式事务,aop
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" value="dataSource"></property>
</bean>
<!-- -->
<tx:advice id="advice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="ins*" propagation="REQUIRED" rollback-for="java.lang.Throwable" />
<tx:method name="del*"/>
<tx:method name="upd*"/>
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- aop -->
<aop:config>
<aop:pointcut expression="execution(* service.impl.*.*(..))" id="mypoint"/>
<aop:advisor advice-ref="advice" pointcut-ref="mypoint"/>
</aop:config>(3)在springmvc.xml中配置
<!-- 1.注解扫描 -->
<context:component-scanbase-package="controller">
<!-- 2.配置映射器与适配器 -->
<mvc:annotation-driven />
<!-- 3.放行静态资源 -->
<mvc:default-servlet-handler/>
<!-- 4.视图解析器 -->
<InternalResourceViewResolver ,MutipartResolver/>第二步,使用filezila上传linux系统下的redis安装包,上传完成后 解压,然后复制文件到/usr/local下,改名叫redis
第三步,然后cd redis 进入redis解压后的文件夹去用make指令编译,编译完后直接make install安装.
第四步,然后我们进入bin目录启动redis.后把redis.conf文件拷贝到安装目录的redis的bin中.
第五步,开启redis.conf的守护进程.把 daemonize 由 no 修改成 yes.然后:wq.
第六步,再次启动redis服务./redis-server redis.conf
第七步,进入./redis-cli,redis客户端进行操作.
集群: 和单击步骤差不多,如果是伪集群.部署在同一台服务器上的话,需要把redis.conf中的端口改一下,开启守护进行,写批量自启动文件授权,3主3备模式,减小down机率.
43.乐观锁 一、乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。 核心SQL代码: update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
CAS操作方式:即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。 一、悲观锁 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。
二. MySQL数据库
SELECT SUM(f_price) FROM fruits —- SUM 求和函数
SELECT AVG(f_price) FROM fruits —- AVG求均值函数
SELECT MAX(f_price) FROM fruits —- MAX求最大值函数
SELECT MIN(f_price) FROM fruits —- MIN求最小值函数
修改表名: alter table 表名 rename 新的表名
添加字段: alter table 表名 add 字段名 数据类型 属性
修改表字段名: alter table 表名 modify 字段名 数据类型 列属性
删除表的字段: alter table 表名 drop column 列名
查询工作地点在纽约的员工姓名,部门编号,奖金(也有not in) select e.ename,e.deptno,e.sal from emp e,dept d where e.deptno=d.deptno and d.loc in (‘new york’)
查询姓名中含有A的员工姓名,经理名 select e.ename,d.ename from emp e,emp d where e.mgr=d.empno and e.ename like ‘%A%’
查询员工奖金不为空的员工姓名,奖金 select ename,comm from emp where comm is not null
查询部门编号大于10的所有员工信息 select * from emp where deptno >any(select deptno from dept where deptno>10);
4.distinct去重复关键字 例:查询emp表中所有job类型数量 select count(distinct job) from emp
5.order by 默认升序,DESC表降序 例如:查询有奖金的员工姓名,工资,按工资的降序排列 select ename,sal from emp where comm is not null order by sal desc (多个列之间也可以排序,order by sal,hiredate,comm…等) 6.Limit (放在order by 后) 查询员工表前五条记录: select * from emp limit 0,5
求总的平均工资 select avg(sal) from emp
求每个部门工作类型和数量 select count(distinct job) from emp group by deptno
查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工 资总和,平均工资. select e.deptno,d.dname,count(e.empno),max(e.sal),min(e.sal) from emp e join dept d on e.deptno = d.deptno group by d.deptno
查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资. select e.deptno,d.dname,e.job,count(d.deptno),max(e.sal), min(e.sal),sum(e.sal),avg(e.sal) from emp e join dept d on e.deptno=d.deptno group by d.deptno
查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息.(左连接) select count(e.empno),m.empno,m.ename from emp e left join emp m on e.empno=m.empno group by e.mgr
10.having关键字排除分组结果 求每个组内最高薪水大约2900才输出. select max(sal) from emp group by deptno having max(sal)
2900
查询部门人数大于2的部门编号,部门名称,部门人数. select e.deptno,d.dname,count(e.empno) from emp e join dept d on e.deptno=d.deptno group by d.deptno having count(e.empno)>2
查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排序.(order by 放最后) select d.deptno,d.dname,count(e.empno),avg(e.sal) from emp e join dept d on e.deptno=d.deptno group by d.deptno having avg(e.sal)>2000 and count(e.empno)>2 order by d.deptno
(2)查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排列. select e.empno,e.ename,e.sal,s.grade,d.loc from emp e join dept d on e.deptno=d.deptno join grade s on e.sal between s.losal and s.hisal
三.JavaScript 43. Js和java不同 (1)Js可以声明同名变量,后面会覆盖前面的,不会报错. (2)Js中判断数据类型的关键字typeof,java里判断类型关键字instanceof. (3)Js中数据类型有6种,number|String|boolean|object|null|un Defined
var arr = new Array(length); //声明一个长度为length的数组
Js中不指定数组长度,数组长度不是固定的
赋值: 数组名[脚标]=值; //角标可以使任意正整数和0
取值: 数组名[角标] //返回当前脚标对应存储的值
遍历: (1) for( var i=0;i<arr.length;i++){ Alert(arr[i]); } (2)for-in: for(var i in arr){ alert(i); }
42.Js数组的常用操作 (1)数组的合并:arr.concat(b,c);
(2)数组的移除最后一个元素并返回:arr.pop();
(3)数组的追加:arr.push(“lol”);//追加元素也可以使一个数组
(4)数组移除第一个元素并返回:arr.shift();
(5)数组开始位置追加元素,并返回数组长度:arr.unshift(“又是要改bug了”);
(6)数组删除指定位置的元素:arr.splice(1,3,”a”); //把角标从1到3换成a
43.Js的函数的声明 (1)function test1(a1,a2){ alert(“函数声明一”); }
(2)var method = new function(“a1”,”a2”,”alert(‘函数声明方式二’)”);
(3)var test = function(a1,a2){ alert(“函数声明方式三”); }
44.函数返回值 var testReturn = function(){ alert(“函数返回值”); return “javascript”; } alert(testReturn());
46.Js中的常用对象和方法 (1)字符串大小写转换: var str = new String(“abc”); str.toUpperCase; //将字符串转换为大写 str.toLowerCase; //将字符串转为小写
(2)字符串切割: var str = “a,b,c”; str.spilt(“,”); //按照指定的字符切割字符串, 返回值类型为数组. (3)字符串的截取: var str = “abcdef”; alert(s.substr(1,3)); //从指定位置开始截取指定长度字符串: bcd alert(s.substring(1,3)); //从指定开始位置和指定结束位 置截取字符串,区间[); 结果:bc
(4)查找字符串第一次出现的角标: var str = “abcdefg”; alert(str.indexOf(“dd”)); //返回子字符串第一次出现的角标, 若未找到返回-1 结果:-1
47.Js中的Date对象 (1)创建Date对象 var date = new Date(); alert(date); (2)Date对象中的常用方法 alert(d.getYear()); //返回的是1900年开始距今的年分数 alert(d.getFullYear()); //返回的是当前的年份 alert(d.getMonth()+1); //返回的当前月份的角标值,需要+1 alert(d.getDate()); //返回的是当前的日期数 alert(d.getDay()); //返回的是当前的星期数,但是周天会返回值为0; alert(d.getHours()); //返回当前时间的小时数 alert(d.getMinutes()); //返回当前时间的分钟数 alert(d.getSeconds()); //返回当前时间的秒数
48.Js中的Math对象 Math.random(); //返回0到1之间的数字
Math.floor(); //向下取整
Math.ceil(); //向上取整
Math.round(12.15) //四舍五入 12
Math.round(12.56) //四舍五入 13
Math.min(1,2,3) //取最小: 1
Math.max(1,2,3) //取最大值: 3
49.Js中的事件 一.鼠标事件 (1)单击事件:onclick 鼠标单击的时候会触发
(2)双击事件:ondbclick 鼠标双击的时候会触发
(3)鼠标悬停在某个html元素上触发:onmouseover
(4)鼠标移出某个html元素后触发:onmouseout
(1)当键盘在某个html元素上弹起的时候触发onkeyup
(2)当键盘在某个html元素下压的时候触发onkeydown
三.焦点事件与页面加载事件
(1)当某个html元素获取焦点的时候触发:onfocus
(2)当某个html元素失去焦点的时候触发:onblur
(3)页面渲染完成后触发: onload
Js触发事件驱动的两种方法: 第一种:在html元素的属性标签上,加入事件名称,事件名称等于监听函数名称.一旦触发事件调用定义的函数. 第二种:通过DOM获取元素,然后对元素进行操作与事件绑定,触发函数.
50.BOM 浏览器对象模型 (1)浏览器对象模型:是规范浏览器对JS语言的支持.
BOM封装在window对象中.
Window关键字不需要new,也可以省略.
(2)window对象中的常用方法:
一.框体方法 1.alert(); 警告框 2.confirm(‘确认提交?’); 确定框 确定,返回true; 取消,返回false; 3.prompt(); 提示框 写完后输出写入的值
二.定时器方法
三.window对象的常用属性方法 1.window.open(‘子资源相对路径’,’打开方式’,’配置’);
function testOpen(){
window.open('son.html','newwindow',
'height=400, width=600, top=100px,left=320px, toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=no, status=yes');
}2.window.location.href=”www.baidu.com”;
跳转到百度
3.window.location.reload();
重新加载页面资源
4.window.history.forward();
跳转到历史页面
5.window.history.go(1);
跳转到刚才访问第一次的页面
6. 屏幕属性
var x=window.screen.width; //屏幕宽
var y=window.screen.height; //屏幕高window.navigator.userAgent;51.DOM 文档对象模型
(1)document对象的概念:
浏览器对外提供的支持js的用来操作HTML文档的一个对象,此对象封存的HTML文档的所有信息.
HTML文档的所有信息都封装在Document对象中.
(2) 使用document获取HTML元素
直接获取:
通过id , 通过name , 通过标签名(返回数组),通过class
1.id方式获取:var html = document.getElementById(元素id名);
alert(html); 结果是标签名称
2. name方式获取: — 返回是数组
var html =document.getElementsByName(元素name值);var html = document.getElementsByTagName(标签名);var html = document.getElementByClassName(元素class属性值);间接获取: 父子节点,兄弟节点,子父节点 1.通过父标签获取子节点标签
//获取父标签
var fbq =document.getElementById(父标签的名称);
//通过父标签获取父标签的子节点 --- 返回数组
var zjd = fbq.childNodes;
//输出子节点长度
alert(zjd.length);
//遍历子节点数组
for (var i in zjd){
alert(zjd[i].value);
}2.通过子节点标签获取父节点标签
//获取子节点标签
var child = document.getElementById(子节点id);
//通过子节点获取父标签
var parent = child.parentNode;
alert(parent); 3.通过兄弟节点获取
//获取子根节点
var brother = document.getElementById(子根节点);
//获取上一个节点
var top = brother.previousSubling;
//获取下一个节点
var after = brother.nextSubling;52.Js操作html元素属性. (1) 获取元素对象:
var uname =document,getElementById(“uname”);获取元素属性值:
uname.type ---- 获取元素类型
uname.name ---- 获取元素name属性值
uname.id ---- 获取元素id属性值
uname.value ---- 获取元素value属性值修改元素属性值:
uname.value= 123;
uname.type = “button”;(2)
<input type="text" name="username" id="uname" value="123" abc="嘿嘿"/>
获取元素对象:
var htmlInp = document.getElementById(“username”);
获取元素属性值:
htmlInp.getAttribute(“abc”);
修改元素属性值(自定义):
htmlInp.setAttribute(“abc”,”呵呵”);
获取标签属性值(非自定义):
htmlInp.getAttribute(“type”);
htmlInp.getAttribute(“value”);53.Js操作html元素内容 (1)
//获取元素 --- 对象!
var div = document.getElementById(“div01”);
//获取元素 --- 内容!
div.innerHTML ---- 输出元素内容包含html标签
div.innerText ---- 输出元素内容不包含html标签
//修改元素内容:
div.innerHTML=”<b>innerHTML内容修改</b>”
---- innerHTML 会解析html标签,字体加粗
//修改元素内容:
div.innerText=“<b>innerText内容修改</b>”
---- innerText不会解析html标签,把<b>标签直接输出54.Js操作元素样式 (1)获取元素对象
var showdiv = document.getElementById(“showdiv”);(2)添加元素样式
showdiv.style.backgroundColor="#FFA500";
//修改元素样式
showdiv.style.border="solid 2px red";
//删除元素样式
showdiv.style.border="";55.Js操作文档结构 (1)removeChild(子DIV名称)
function delInp(btn){
//获取父级div
var showdiv=document.getElementById("showdiv");
//获取要删除的子div
var cdiv=btn.parentNode;
//父div删除子div
showdiv.removeChild(cdiv);
}(2)appendChild(追加标签名称)
//获取元素对象
var showdiv=document.getElementById("showdiv");
//创建input标签
//创建input元素对象
var inp=document.createElement("input");
//给标签属性赋值
inp.type="file";
//创建按钮元素对象
var btn=document.createElement("input");
btn.type="button";
btn.value="删除";
btn.onclick=function(){
showdiv.removeChild(inp);
showdiv.removeChild(btn);
showdiv.removeChild(br);
}
//创建换行符
var br=document.createElement("br");
//将创建的元素对象存放到div中
showdiv.appendChild(inp);
showdiv.appendChild(btn);
showdiv.appendChild(br);
}56.Js操作form (1)获取form对象
var from = document.getElementById(表单id);(2)form常用方法
from.submit(); ---- 提交表单
form.reset(); ---- 重置表单(3) form.action=www.baidu.com ----操作form属性
(4) disabled=”disabled” ----不可操作,数据不提交
(5) readonly=”readonly” ----不可操作,数据可提交
57.Js操作全选,反选 (1)获取多选元素对象数组
var favs = document.getElementsByName(“fav”);
//遍历数组,如果被选中则alert
for(var i in favs){
if(favs[i].checked){
alert(i+favs[i].checked);
}
}
//全选
var fav = document.getElementsByName(“fav”);
for(var i in fav){
fav[i].checked = true;
}
//全不选
var fav = document.getElementsByName(“fav”);
for(var i in fav){
fav[i].checked = true;
}
//反选
var fav = document.getElementsByName(“fav”);
for(var i in fav){
fav[i].checked = ! fav[i].checked;
}58.Js操作下拉框
function testSel(){
//获取下拉框对象
var sel=document.getElementById("address");
//获取下拉框对象属性值
var os=sel.options;
for(var i=0;i<os.length;i++){
//判断是否被选中
if(os[i].selected){
alert(os[i].value+":"+os[i].text);
}
}
}59.Js校验表单
<script type="text/javascript">
//常见验证码
function createCode(){
//创建随机四位数字
var code=Math.floor(Math.random()*9000+1000);
//获取元素对象
var span=document.getElementById("codeSpan");
//将数字存放到span中
span.innerHTML=code;
}
//验证用户名
function checkUname(){
//获取用户的用户名信息
var uname=document.getElementById("uname").value;
//创建校验规则
var reg=/^[\u4e00-\u9fa5]{2,4}$/
//获取span对象
var span=document.getElementById("unameSpan");
//开始校验
if(uname=="" || uname==null){
//输出校验结果
span.instylenerHTML="用户名不能为空";
span.color="red";
return false;
}else if(reg.test(uname)){
//输出校验结果
span.innerHTML="用户名ok";
span.style.color="green";
return true;
}else{
//输出校验结果
span.innerHTML="用户名不符合规则";
span.style.color="red";
return false;
}
}
//验证密码
function checkPwd(){
//获取用户的密码信息
var pwd=document.getElementById("pwd").value;
//创建校验规则
var reg=/^[a-z]\w{5,7}$/;
//获取span对象
var span=document.getElementById("pwdSpan");
//开始校验
if(pwd=="" ||pwd==null){
//输出校验结果
span.innerHTML="*密码不能为空";
span.style.color="red";
return false;
}else if(reg.test(pwd)){
//输出校验结果
span.innerHTML="*密码ok";
span.style.color="green";
return true;
}else{
//输出校验结果
span.innerHTML="*密码格式不正确";
span.style.color="red";
return false;
}
checkPwd2();
}
//校验确认密码
function checkPwd2(){
//获取第一次密码
var pwd=document.getElementById("pwd").value;
//获取确认密码
var pwd2=document.getElementById("pwd2").value;
//获取span对象
var span=document.getElementById("pwd2Span");
//比较两次密码是否相同
if(pwd2==""||pwd2==null){
span.innerHTML="确认密码不能为空";
span.style.color="red";
return false;
}else if(pwd==pwd2){
span.innerHTML="确认密码ok";
span.style.color="green";
return true;
}else{
span.innerHTML="两次密码不一致";
span.style.color="red";
return false;
}
}
//校验手机号
function checkPhone(){
return checkField("phone",/^1[3,4,5,7,8]\d{9}$/);
}
//校验邮箱
function checkMail(){
return checkField("mail",/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+$/ )
}
}
//封装校验:相同的保留,不同的传参。
function checkField(id,reg){
//获取用户数据
var inp=document.getElementById(id);
var va=inp.value
var alt=inp.alt;
//创建校验规则
//获取span对象
var span=document.getElementById(id+"Span")
//开始校验
if(va=="" ||va==null){
//输出校验结果
span.innerHTML=alt+"不能为空";
span.style.color="red";
return false;
}else if(reg.test(va)){
//输出校验结果
span.innerHTML=alt+"ok";
span.style.color="green";
return true;
}
else{
//输出校验结果
span.innerHTML=alt+"不符合规则";
span.style.color="red";
return false;
}
}发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106513.html原文链接:https://javaforall.cn