Java学习日志Day40_Array内置对象(二)_javascript的DOM操作_js的事件编程_js的正则表达式_项目:修改和删除操作

本文详细介绍了JavaScript中Array对象的创建、动态/静态初始化方法,并展示了如何使用内置对象Array的join、reverse和自定义工具ArrayTool。此外,还涵盖了DOM操作的基础知识,如document对象的属性和事件编程
摘要由CSDN通过智能技术生成

一、Array内置对象

  1. js中如何创建Array对象
    (1). javascript:
    1)数组对象中是可以添加任何类型元素
    2)不存在角标越界,不断的可以给里面添加数据
    (2). 初始化:

       1). 动态初始化
         arrayObj = new Array() :不给定长度
         arrayObj = new Array([size]):给定数组长度5
             
       2). 静态初始化
         arrayObj = new Array([element0[, element1[, ...[, elementN]]]])
    

    (3).

     	方式1:创建Array对象 不给定长度        					
      			var arr = new Array() ;
     	        alert(arr.length) ;
     	        arr[0]  = true ;
     	        arr[1]  = 100 ;
     	        arr[2]  = 3.14 ;
     	        arr[3]  = "hello" ;
     	        arr[4]  = 'a' ;
     	        arr[5]  = new Object() ;
     	        alert(arr.length) ;
     	方式2:给定长度
     	        var arr = new Array(3) ;
     	        alert(arr.length) ;			
     	        arr[0] = 10 ;
     	        arr[1] = 20 ;
     	        arr[2] = 30 ;
     	        arr[3] = 40 ;
     	        alert(arr.length) ;
     	方式3:静态初始化
     	        arrayObj = new Array([element0[, element1[, ...[, elementN]]]])
     	        //简化格式
     	        var arr = [10,20,30,40] ;
     	        for(var i = 0 ; i < arr.length ; i++){
     	            alert(arr[i] ) ;
     	        }
    
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>内置对象Array</title>
    <script>
    	//内置对象Array常用的功能
        //join("连接符号"):将数组中的元素进行拼接----结果是一个String
        //reverse():将数组的元素顺序反转
        //创建数组对象
        var arr = ["JavaEE","Php","Python","C","golang"] ;
        document.write("反转前:") ;
        for(var i = 0 ; i < arr.length ; i ++){
            document.write(arr[i]+" ") ;
        }
        // var str = arr.join("-") ;
        //document.write(str) ;
        document.write("<hr/>") ;
        //反转
        arr = arr.reverse() ;
        document.write("反转后:") ;
        for(var i = 0 ; i < arr.length ; i ++){
            document.write(arr[i]+" ") ;
        }
        //或者for-in  for(var 变量名 in 对象){}
    </script>
</head>
<body>

</body>
</html>
  1. 定义工具对象:ArrayTool
    追加两个功能
    getMax(arr):参数名为需要从指定的数组对象中获取最大值
    search(arr,target):在指定的arr数组中查询指定的元素target,
    查询这个元素在数组中出现索引值!
举例:
//定义一个对象
function ArrayTool(){
    //追加功能
    //求最大值
    this.getMax=function(array){
        //将第一个作为参照物
        var max = array[0] ;

        //遍历元素
        for(var i = 1 ; i < array.length ; i ++){
            if(array[i] > max){
                max = array[i] ;
            }
        }
        return max ;
    }

    //追加search:查询指定元素在指定数组中的角标
    this.search = function(array,target){
        //假设法
        var index = -1 ;
        //遍历array数组
        for(var i = 0 ; i < array.length ; i++){
            if(array[i] == target){
                //查到了
                index = i ;
                break ;
            }
        }
        return index ;
    }
}
<!--
        设计js对象:
        定义工具对象:ArrayTool
        追加两个功能
            getMax(arr):参数名为需要从指定的数组对象中获取最大值
            search(arr,target):在指定的arr数组中查询指定的元素target,
            查询这个元素在数组中出现索引值!

            当前这个页面导入js文件,进行测试

    -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--导入-->
    <script src="ArrayTool.js"></script>
    <script>
        //创建数组对象
        var arr = [24,69,57,88,15] ;

        //创建ArrayTool对象
        var at = new ArrayTool() ;
        var max = at.getMax(arr) ;
        document.write("最大值是:"+max) ;
        document.write("<hr/>") ;

        var index = at.search(arr,57);
        document.write("角标是:"+index) ;
    </script>
</head>
<body>
</body>
</html>
  1. 刚才自定义对象ArrayTool
    给自定义对象中追加了两个方法
    getMax(arr):参数名为需要从指定的数组对象中获取最大值
    search(arr,target):在指定的arr数组中查询指定的元素target,
    查询这个元素在数组中出现索引值!
    现在不给自定义对追加方法,需要将两个方法追加:内置对象Array里面

       //Array---js提供的内置对象
     方案1:
             function  Array(){
    
                 this.join = function(){...}:将数组的元素进行拼接
                 this.reverse = function(){...}:将数组的元素逆序反转
    
                 错误的!
                 this.max = function(){}
                 this.search=fucntion(){}
    
             }
    
             没有办法改变js的原码:Array内置对象
    
    
       方式2:
          js引擎中:
    
          js中每一个内置对象都具备有原型属性:prototype 作用就是给内置对象中追加功能的!
    
          特点:
             只要你给原型属性中添加一个方法,它会自动将这个方法追加内置对象中
             原理:
                   //原型对象:Prototype
                   function Prototype(){
                         this.max = function(){}
                   }
                   数组对象
                   function  Array(){
                     var proptype = new Prototype() ;  //创建原型对象
    
                        this.max = function(){}  //自动追加
                   }
    
              书写格式
               内置对象.prototype
                         //直接方法即可
    
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原型属性</title>
    <script>
        //给内置对象Array
        //追加一个max方法
        this.Array.prototype.max = function(){
                    var max = this[0] ;
            //遍历元素
            for(var i = 1 ; i < this.length ; i ++){
                if(this[i] > max){
                    max = this[i] ;
                }
            }
            return max ;
        }

        //追加查询方法
        this.Array.prototype.search=function(target){
            //假设法
            var index = -1 ;
            //遍历array数组
            for(var i = 0 ; i < this.length ; i++){
                if(this[i] == target){
                    //查到了
                    index = i ;
                    break ;
                }
            }
            return index ;
        }
        // //创建数组对象
        var arr = [24,69,57,88,15] ;
        var max =  arr.max() ;
       document.write("最大值是:"+max) ;
       document.write("<hr/>") ;
       var index = arr.search(15) ;
        document.write("角标是:"+index) ;
    </script>
</head>
<body>

</body>
</html>

二、javascript的DOM操作

  1. 1). all属性:获取当前页面中的所有标签对象
    var nodeList = document.all ;
    2). links属性:获取的是当前页面所有的超链接标签对象(href属性)以及area域标签集合
    var nodeList = document.links; //获取所有a标签对象
    3). forms属性:获取的是当前页面中所有的form标签对象集合:返回节点列表
    var nodeList = document.forms ;
    4). images属性;获取所有的img标签对象
    var nodeList = document.images ;
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>document集合属性</title>
</head>
<body>
    <a href="#">超链接</a>
    <form>
            <img src="#"  />
    </form>
<a href="#">点我试试</a>
    		<img src="#"  />
</body>
<script>
var nodeList = document.images ;
    alert(nodeList.length) ;
    //遍历出来
    for(var i = 0 ; i < nodeList.length ; i ++){
        //每一个标签对象(节点对象)都有一个属性:nodeName:节点名称
        alert(nodeList[i].nodeName) ;
    }
</script>
</html>
  1. parentNode:父节点
    childNodes:子节点
    firstChild:第一个子节点
    lastChild:最后一个子节点
    nextSibling:下一个兄弟节点
    previousSibling:上一个兄弟节点
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
<body><a href="#">超链接</a><input type="button" value="按钮" /><!--html注释--><a href="#">链接</a><img src="#" />
<script>
    //要获取第一个a节点标签对象
    var aNode = document.links[0];
    alert(aNode.nodeName) ;
    //通过aNode获取它的父节点标签对象:
    var bodyNode = aNode.parentNode;
    alert(bodyNode.nodeName) ;
    //通过bodyNode获取它的所有的子节点
   /* var childNodes = bodyNode.childNodes;
    for (var i=0; i <childNodes.length; i ++){
        if(childNodes[i].nodeType ==1){
            //指向获取标签对象?不需要#text(空格以及换行)  #commont:html注释
            //每一个标签对象有属性:nodeName节点名称
            //nodeType:节点类型 :标签节点类型:1
            document.write(childNodes[i].nodeName+"----"+childNodes[i].nodeType+" ") ;
        }
    }*/

   //获取bodyNode节点的第一个标签对象
    var firNode = bodyNode.firstChild;
    alert(firNode.nodeName) ;

    //lastChild:最后一个子节点

    //firNode获取下一个兄弟节点
    var nextNode = firNode.nextSibling;
    alert(nextNode.nodeName) ;
    //nextNode获取上一个兄弟节点
    var previous = nextNode.previousSibling;
    alert(previous.nodeName) ;
</script>
</body>
</html>
  1. 1)通过getElementById(“id属性值”) ; (推荐)
    前提条件:同一个html标签上的id属性必须唯一,否则如果重名,获取不到标签对象!
    2)通过getElementsByClassName(“同一类的class属性值”)
    class属性值是可以重复,获取的是标签列表(节点列表)
    3)通过getElementsByName(“同名的name属性值”) :获取的标签列表对象
    4)通过标签名称获取标签对象:getElementsByTagName(“标签名称”):获取的标签列表对象
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>document对象的方法获取标签对象</title>
</head>
<body>
用户名:<input type="text"  onblur="getUsername()" /><!--<input type="button" value="点击获取" />-->
<script>
//通过失去焦点事件:获取用户输入的内容
    function getUsername(){
        //通过id="username"获取标签对象
       // var inputObj = document.getElementById("username");
        //var inputObj = document.getElementsByClassName("username_class")[0] ;
      //  var inputObj = document.getElementsByName("uname")[0] ;

        var inputObj = document.getElementsByTagName("input")[0] ;

        //获取输入的内容:value属性获取
        var username = inputObj.value;
        alert(username) ;
    }
</script>
</body>
</html>

三、js的事件编程: 了解事件编程三要素以及常用事件编程分类

  1. 事件编程三要素
    1)事件源 :就是在哪个html标签上的触发的事件
    2)编写事件监听器:编写一个函数,里面完成这个事件的业务逻辑
    3)绑定事件监听器:在事件源上通过onxxx属性来和编写的函数进行绑定
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件编程</title>
</head>
<body>
<!--html标签:input 就是事件源-->
<input type="button" value="点我试试" onclick="myClick()" /> <!--绑定事件监听器-->
<script>
	2)编写事件监听器
    function myClick(){
        alert("点你了...") ;
    }
</script>
</body>
</html>
  1. 事件分类
    1). 和鼠标点击相关的事件:
    点击点击 click事件
    双击点击 dbclick事件

         2). 和焦点相关的事件
                 获取焦点  focus
                 时期焦点  blur
         3). 和选项卡发生变化的事件(当某个内部被改变的时候)  change事件
         4). 和鼠标移上和鼠标移出实际:mouseover mouseout
         5). 页面载入事件:load
         6). 按键按下:keydown
         7). 给标签添加的事件属性onxxx   onclick  ondbclick
                                             onfocus  onblur
                                             onchange
                                             onmouseover
                                             onmouseout
                                             onload
                                             onkeydown
    
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件分类</title>
    <style>
        #mydiv{
            border:1px solid #000;
            background-color: red;
            width: 150px;
            height: 150px;
        }
    </style>


    <script>
        /* function testClick(){
             alert("单击点击事件触发") ;
         }
 */
        function testDbClick(){
            alert("触发双击点击事件") ;
        }


        function testFocus(){
            //获取id="username"所在的标签对象
            var inputObj = document.getElementById("username");
            //将它的value属性清空掉
            inputObj.value = "" ;
        }


        function testBlur(){
            //获取用户输入的内容
            var username = document.getElementById("username").value ;
            alert(username) ;
        }


        function testChange() {

            //通过id="jigugan"获取select标签对象
            //当选项内容变化了就会触发change事件
            var selectObj = document.getElementById("jiguan");
            //alert(selectObj.value) ;
            //获取选择选项的内容
            var jiguan = selectObj.value ;

            //选项变化之前:获取id="city"所在的select标签对象
            var selectCity =  document.getElementById("city") ;

            //选项发生变化之前:将之前的内容清空掉
            selectCity.innerHTML = "" ;
            if(jiguan =="陕西省"){
                //创建一个数组
                var arr = ["西安市","咸阳市","宝鸡市","渭南市"] ;
                //遍历数组获取到每一个
                for(var i = 0 ; i < arr.length ; i ++){
                    //<option value="城市">城市</option>
                    //设置selectCity标签对象的innerHTML属性
                    selectCity.innerHTML += "<option value='"+arr[i]+"'>"+arr[i]+"</option>" ;
                }
            }

            if(jiguan =="山西省"){
                //创建一个数组
                var arr = ["太原市","晋中市","运城市","大同市"] ;
                //遍历数组获取到每一个
                for(var i = 0 ; i < arr.length ; i ++){
                    //<option value="城市">城市</option>
                    //设置selectCity标签对象的innerHTML属性
                    selectCity.innerHTML += "<option value='"+arr[i]+"'>"+arr[i]+"</option>" ;
                }
            }

            if(jiguan =="广东省"){
                //创建一个数组
                var arr = ["深圳市","东莞市","惠州市","广州市"] ;
                //遍历数组获取到每一个
                for(var i = 0 ; i < arr.length ; i ++){
                    //<option value="城市">城市</option>
                    //设置selectCity标签对象的innerHTML属性
                    selectCity.innerHTML += "<option value='"+arr[i]+"'>"+arr[i]+"</option>" ;
                }
            }
        }


        function testMouseOver() {
            alert("mousrvoer事件触发了") ;
        }
        function testMouseOut() {
            alert("mouserOut事件触发了") ;
        }

        function testLoad() {
            alert("触发页面载入事件") ;
            //获取id="myClick"的标签对象
            //给对象添加点击事件
           var inputObj = document.getElementById("myClick");
           //设置一个属性:onclick
            inputObj.onclick = function(){ //匿名函数
                alert("触发点击事件") ;
            }
           // inputObj.click() ;*/
                                //类型       监听器
          //  inputObj.addEventListener("click","函数名称")
        }
    </script>
</head>
<!--load事件:一般用在body中
        将body内容加载完毕之后,触发这个事件
   -->
<body onload="testLoad()">
<input type="button" value="单击点击" id="myClick"  /><br/>
<input type="button" value="双击点击" ondblclick="testDbClick()" /><br/>

<!--获取焦点-->
<!--失去焦点-->
用户名:<input type="text" id="username" onblur="testBlur()" value="请输入用户名" onfocus="testFocus()" />
<br/>
籍贯
<select id="jiguan" onchange="testChange()">

    <option value="请选择">请选择</option>
    <option value="陕西省" selected>陕西省</option>
    <option value="山西省">山西省</option>
    <option value="广东省">广东省</option>
</select>
<select id="city">
    <!---->
</select>
<br/>
<!--鼠标移出和鼠标经过事件-->
<div id="mydiv" onmouseover="testMouseOver()" onmouseout="testMouseOut()">
</div>
</body>
</html>
  1. 正则规则:
    用户:8-14位的数字或者字母组成
    密码:6-10位的数字或者字母组成
    确认密码:和密码一致
    邮箱:符号邮箱
    919081924@qq.com
    zhangsan@163.com
    lisi@hsbc.com.cn(.net)…企业邮箱 .符号出现多次的
    submit事件:表单是否能够提交成功
    返回值true,提交成功
    否则,提交失败
举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-1.11.3.min.js"></script>
</head>
<body>
        <!--checked:选中状态-->
<!--<input type="checkbox" name="del" value="足球" checked="checked" />足球-->
<form action="servet.html" method="get" onsubmit="return checkAll() ">
    用户&nbsp;&ensp;:<input type="text" onblur="checkUserName()"  value="杨德财" id="username" /><span id="user_Tip"></span><br/>&ensp;&ensp;&nbsp;&ensp;<input type="password"  onblur="checkPassword()" id="password" /><span id="pwd_tip"></span><br/>
    确认密码:<input type="password"  id="repassword" onblur="checkRePassword()" /><span id="repwd_tip"></span><br/>&ensp;&ensp;&nbsp;<input type="text" onblur="checkEmail()"  id="email" /><span id="email_tip"></span><br/>
    <input type="submit" value="注册" />
    <input type="reset" value="重置" />
    <input type="button" value="返回" />
</form>
</body>
<script>


//页面载入事件
    /*$(function(){
        //获取用户名的内容:
        var username = $("#username").val();  //相等获取到id="username"所在的标签对象 document.getElementById("username")alert(username) ;
        alert(username) ;
    });*/
    //校验用户名
    function checkUserName(){
        //获取用户输入的内容
        var username = document.getElementById("username").value;
        //定义正则规则
        // 用户:8-14位的数字或者字母组成
        var reg = /^[A-Za-z0-9_]{8,14}$/ ;
        //获取id="user_Tip"的span标签对象
        var userTip = document.getElementById("user_Tip") ;
        //校验
        if(reg.test(username)){
            //一致
            //设置span标签对象的innerHTML属性
            userTip.innerHTML = "<strong>恭喜您,用户名可用</strong>".fontcolor("green") ;
            return true ;
        }else{
            userTip.innerHTML = "<strong>用户名太受欢迎了,请更换</strong>".fontcolor("deepinred") ;
            return false ;
        }
    }
    //密码
    function checkPassword(){
        //获取的内容
        var password = document.getElementById("password").value;
        //定义正则规则
        // 密码:6-10位的数字或者字母组成
        var reg = /^[A-Za-z0-9_]{6,10}$/ ;
        //获取id="pwd_tip"的span标签对象
        var pwdTip = document.getElementById("pwd_tip") ;
        //校验
        if(reg.test(password)){
            //一致
            //设置span标签对象的innerHTML属性
            pwdTip.innerHTML = "<strong>恭喜您,密码可用</strong>".fontcolor("green") ;
            return true ;
        }else{
            pwdTip.innerHTML = "<strong>对不起,不符合规则重写输入</strong>".fontcolor("deepinred") ;
            return false ;
        }
    }


    //确认密码和密码内容一致
    function checkRePassword(){
        //获取的内容
        var password = document.getElementById("password").value;
       //获取现在输入的密码
        var repassword = document.getElementById("repassword").value;
        //获取id="repwd_tip"的span标签对象
        var repwdTip = document.getElementById("repwd_tip") ;
        //校验
        if(password.valueOf()==repassword.valueOf()){
            //一致
            //设置span标签对象的innerHTML属性
            repwdTip.innerHTML = "<strong>密码一致</strong>".fontcolor("green") ;
            return true ;
        }else{
            repwdTip.innerHTML = "<strong>两次密码不一致</strong>".fontcolor("deepinred") ;
            return false ;
        }
    }

    function checkEmail(){
        //获取邮箱内容
        var email =  document.getElementById("email").value ;

        //获取id="email_tip"的标签对象
        var emailTip  = document.getElementById("email_tip");

        //正则规则:
        //数字或者字母@数字或者字母.com.cn(.net)...
        var reg = /^[A-Za-z0-9_]+@[A-Za-z0-9_]+(\.[A-Za-z]{2,3}){1,2}$/;
        //校验
        if(reg.test(email)){
            //一致
            emailTip.innerHTML = "<strong>邮箱可用</strong>".fontcolor("green") ;
            return true ;
        }else{
            emailTip.innerHTML = "<strong>邮箱不可用</strong>".fontcolor("red") ;
            return false ;
        }
    }


    //每一个表单项必须通过正则验证,才能提交,否则不能提交!
    function checkAll() {
            if(checkUserName() && checkPassword() && checkRePassword() && checkEmail()){
                return true ;
            }else{
                return false ;
            }
    }
</script>
</html>

四、js的正则表达式以及原生js表单校验

  1. Js的正则表达式:描述字符的文字模式;
    * \ 任意字符进行转移 \n \r

  2. 语法:
    基本正则语法:
    1). 匹配的数字字符[0-9] \d
    2). 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’ \w
    3). 邮箱中.符号:需要.转义
    数量词:
    X+: 匹配X字符出现一次或者多次
    X*:匹配X字符出现0次或者多次
    X?:匹配X字符出现0次或者1次
    基本邮箱:
    [A-Za-z0-9_]+@[A-Za-z0-9_]+.([a-z]{1,2})

  3. 范围:
    X{n}:匹配的X字符恰好出现n次
    X{n,}:匹配的X字符至少出现n次
    X{n,m}:匹配的X字符至少出现n次,但是不超过m次

  4. 定义正则表达式:
    var 正则对象 = /正则语法/ ;
    正则对象 内置的方法test(传入字符串内容) 返回值true:校验通过;false 匹配失败
    var 正则对象 = /正则语法/ ; 属于不精确匹配,主要用户输入的内容被正则语法包含在内
    就匹配成功!

  5. 为了像Java语言的这种精确匹配,必须加入边界匹配符号!
    ^:行的开头 以指定的xxx开头
    $:行的结尾 以指定的xxx结尾

举例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js正则表达式</title>
    <script>
    var str  = "abc12mn" ; //数字字符串
        //定义一个正则表达式
        var reg = /^[0-9]{2}$/  ;
        if(reg.test(str)){
            alert("条件成立") ;
        }else{
            alert("条件不成立") ;
        }
    </script>
</head>
<body>

</body>
</html>

五、项目中:修改和删除操作

  1. Maven项目导包:
在这里插入代码片
<!--导入依赖的jar包-->
  <dependencies>
  <!--alt+ins键-->

    <!--mysql驱动包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.17</version>
    </dependency>

    <!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>
    <!--dbutils工具类-->
    <dependency>
      <groupId>commons-dbutils</groupId>
      <artifactId>commons-dbutils</artifactId>
      <version>1.6</version>

    </dependency>


    <!--
        最终导入的servlet-api.jar
        jsp-api.jar
         仅仅作为  "提供者使用"
         以后maven项目通过tomcat部署
                  tomcat本身里面lib
                          servlet-api.jar
                          jsp-api.jar
    -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <!--

      依赖范围:仅仅作为编译前 提供给当前项目,这个jar包不参与部署,
        因为tomcat本身内置的有jar包

          scope:      大部分的jar包 默认值:compile   编译时使用

           servler和jsp      依赖范围:provided
           junit的jar包     仅仅是测试环境使用  依赖范围:test
      -->
      <scope>provided</scope>
    </dependency>
    
    <!--jsp的jar包-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>
    
    <!--junit单元测试的jar包-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.1</version>
      <!--依赖范围:测试环境使用-->
      <scope>test</scope>
    </dependency>
    
    <!--jsp的核心标签库-->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <!--标准库包-->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

    <!--beanutils工具类-->
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.8.0</version>
    </dependency>
  </dependencies>
</project>

2. 连接池配置文件:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myee_2104
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000

3. servlet:
import com.qf.convert.MyConvert;
import com.qf.entity.User;
import com.qf.service.AdminService;
import com.qf.service.impl.AdminServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;

@WebServlet("/updateUser")
public class UpdateUserServlet extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //接收前台的所有提交的参数


            Map<String, String[]> map = request.getParameterMap();
            //封装User对象
            User user = new User() ;
			//String birthday = request.getParameter("birthday");


        //日期处理:Beanutils的日期转换器
            //ConvertUtils:自带的转换工具类
            /*
            *   public static void register(Converter converter, Class clazz) {
            * //参数1:转换器:MyConvert
            * 参数2:转换的最终类型:Date类型
            * */
              ConvertUtils.register(new MyConvert(), Date.class); ;


            //提供apache工具:beanutils工具库
            try {
                BeanUtils.populate(user,map);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

            System.out.println(user);
            //调用service
              AdminService adminService = new AdminServiceImpl() ;
              adminService.update(user);

              //请求转发到
            request.getRequestDispatcher("/ulist").forward(request,response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }
}

4. 自定义类实现接口Convert接口(BeanUtils)
  重写convert方法
     日期转换

import org.apache.commons.beanutils.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyConvert implements Converter {
    @Override
    public Object convert(Class clazz, Object source) {
        //将String的日期文本转换成Date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
        try {
            Date date = sdf.parse((String) source);
            return date ;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

5. service:
import com.qf.entity.User;
import java.util.List;

/* 针对管理员操作业务接口层
 */
public interface AdminService {

    //定义功能
    //根据用户名查询用户
    boolean isLogin(String username, String password) ;

    /**
     * 查询用户列表
     * @return
     */
    List<User>   findUserList() ;

    /**
     * 通过用户id获取用户
     * @param uid
     * @return
     */
    User getUser(String uid) ;

    /**
     * 更新用户
     * @param user
     */
    void update(User user) ;
}

接口子实现类
import com.qf.dao.AdminDao;
import com.qf.dao.impl.AdminDaoImpl;
import com.qf.entity.AdminUser;
import com.qf.entity.User;
import com.qf.service.AdminService;

import java.util.List;

/* 针对管理员用户业务接口实现层
 */
public class AdminServiceImpl implements AdminService {
    @Override
    public boolean isLogin(String username,String password) {

            //调用dao层:完成数据的查询
            AdminDao ad = new AdminDaoImpl() ;

            AdminUser adminUser = ad.selectUserByName(username);
            //逻辑判断
            //获取查询到的用户的密码
            if(adminUser.getAdminPassword().equals(password)){
                    //一致
                return true ;
            }
            return false ;
    }

    /**
     * 查询用户列表
     * @return
     */
    @Override
    public List<User> findUserList() {
        //调用AdminDao
        AdminDao ad = new AdminDaoImpl() ;
        List<User> list = ad.selectAllUser();
        //可以加入逻辑:防止NullPointerException
        if(list!=null){
            return list ;
        }
        return null ;
    }

    /**
     * 通过用户id获取用户
     * @param uid 用户的uid
     * @return  返回需要查询的用户
     */
    @Override
    public User getUser(String uid) {
        //创建Dao层对象
        AdminDao adminDao = new AdminDaoImpl() ;
        User user = adminDao.selectUserByUid(uid);
        if(user!=null){
            return user ;
        }
        return null;
    }

    //更新用户
    @Override
    public void update(User user) {

        //调用Dao
        AdminDao adminDao = new AdminDaoImpl() ;
        adminDao.updateCostmUser(user) ;
    }
}

6. import com.qf.entity.AdminUser;
   import com.qf.entity.User;
	
   import java.util.List;

/* 针对管理员操作的数据库访问接口层
 */
public interface AdminDao {

    //根据用户名查询用户
    AdminUser selectUserByName(String username) ;

    /*
    * 查询用户列表
    * */
    List<User> selectAllUser() ;

    //查询用户
    User selectUserByUid(String uid);

    //更新用户
    int updateCostmUser(User user);
}

 import com.qf.dao.AdminDao;
 import com.qf.entity.AdminUser;
 import com.qf.entity.User;
 import com.qf.utils.MyJdbcUtils;
 import org.apache.commons.dbutils.QueryRunner;
 import org.apache.commons.dbutils.handlers.BeanHandler;
 import org.apache.commons.dbutils.handlers.BeanListHandler;

import java.sql.SQLException;
import java.util.List;


/* 针对管理用户的数据库访问接口实现层
 */
public class AdminDaoImpl implements AdminDao {

    /**
     * 根据用户名查询用户
     * @param username
     * @return
     */
    @Override
    public AdminUser selectUserByName(String username){
        //common-dbutils工具类
        //创建QueryRunner对象
        try {
            QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
            //准备sql
            String sql = "select * from admin_user  where  adminName=  ? " ;

            //执行查询
            AdminUser adminUser = qr.query(sql, new BeanHandler<AdminUser>(AdminUser.class), username);
            System.out.println(adminUser);

            return adminUser;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null ;
    }

    /**
     * 查询用户列表
     * @return
     */
    @Override
    public List<User> selectAllUser() {
        //创建QueryRunner
        try {
            QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
            //准备sql
            String sql = "select * from user" ; //开发中*(不要出现,全表字段)
            List<User> list = qr.query(sql, new BeanListHandler<User>(User.class));
            return list ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //根据uid查询用户
    @Override
    public User selectUserByUid(String uid) {

        try {
            QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
            String sql = "select * from user where uid = ?" ;
            User user = qr.query(sql, new BeanHandler<User>(User.class), uid);
            return user ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //更新用户
    @Override
    public int updateCostmUser(User user) {
        QueryRunner qr = new QueryRunner(MyJdbcUtils.getDataSource()) ;
        String sql = "update user set username = ?,password = ?, name = ? ,sex=?,state=? where uid = ? " ;
        try {
            int count = qr.update(sql, user.getUsername(), user.getPassword(), user.getName(), user.getSex(), user.getState(), user.getUid());
            System.out.println(count);
            return count ;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0 ;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

igfff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值