首页 文章 精选 留言 我的

精选列表

搜索[监督学习],共10005篇文章
优秀的个人博客,低调大师

JDBC学习:事务

什么是事务 数据库中一些操作的集合是一个独立的单元,事务就是构成单一逻辑工作单位的集合。 为什么需要事务 事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。比如:银行转帐业务,账户A给账户B转帐100元,需要账户A余额减100元,账户B余额加100元,两个需要同时发生。完成这种操作需要保证要么全部成功,要么全部失败。 什么是回滚 未能成功完成的事务成为中止事务,对中止事务造成的变更需要进行撤销处理,称为事务回滚。 事务的特性(ACID 原则) 原子性(atomicity):对事务中的全部操作是不可分割的,要么全部完成,要么都不执行。 一致性(consistency):事务执行之前和执行之后,数据库都必须处于一致性状态。 隔离性(isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 持久性(durability):对于任意已提交的事务,系统必须保证该对数据库的改变不丢失,即使数据库出现故障。 Java JDBC 事务机制比如有个业务:当我们修改一个信息后再去查询这个信息。这是一个简单的业务,实现起来也非常容易,但是当这个业务放在多线程高并发的平台下,问题自然就出现了。比如当执行了一个修改后,在查询之前有一个线程也执行了修改语句,这时再执行查询,看到的信息就有可能和我们修改的不同。为了解决这一问题,就引入了引入JDBC事务机制。 如何操作 把事务操作设置为不自动提交,通过手动提交就能实现事务的处理。 搭建实验环境实验,在当前数据库中创建一个测试表: CREATE TABLE tb ( id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '编号', name VARCHAR(20) NOT NULL COMMENT '姓名', sex VARCHAR(4) NOT NULL COMMENT '性别', phone VARCHAR(11) NOT NULL COMMENT '手机号码' ); 插入几条测试数据: INSERT INTO tb (name, sex, phone) VALUES ("张三", "男", "139****2234"), ("李四", "女", "130****3239"), ("王二", "男", "136****1234"), ("小王", "女", "137****1735"), ("赵云", "男", "131****1255"), ("关羽", "男", "139****1930"); 实验代码 相关延伸 事务并发处理可能引起的问题 脏读(dirty read):一个事务读取了另一个事务尚未提交的数据。 不可重复读(non-repeatable read):一个事务的操作导致另一个事务前后两次读取到不同的数据。 幻读(phantom read):一个事务的操作导致另一个事务前后两次查询到的结果数据量不同。 举例: 事务A、B并发执行,当A事务update后,B事务select读取到A尚未提交的数据,此时A事务rollback,则B读取到的数据是无效的“脏”数据。 当B事务select读取数据后,A事务update操作更改B事务select到的数据,此时B事务再次读取该数据,发现前后两次的数据不一样。 当B事务select读取数据后,A事务insert或delete了一条满足A事务的select条件的记录,此时B事务再次select,发现查询到前不存在的数据(“幻影”),或者前面的某个记录不见了。 JDBC的事务支持 JDBC对事务的支持体现在三个方面: 1.自动提交模式(Auto-commit mode) Connection提供了一个auto-commit的属性来指定事务何时结束。 a.当auto-commit为true时,当每个独立的SQL操作执行完毕,事务立即自动提交,也就是说每个SQL操作都是一个事务的。auto-commit默认为true。 一个独立SQL操作什么时候什么执行完毕呢?JDBC规范这样规定 对数据操作语言(DML如insert,update,delete)和数据定义语言(DDL如create,drop),语句一执行完就视为执行完毕。 对select语句,当与它关联的ResultSet对象关闭时,视为执行完毕。对存储过程或者其他返回多个结果的语句,当与它关联的所有ResultSet对象全部关闭,所有update count(update,delete等语句操作影响的行数)和output parameter(存储过程的输出参数)都已经获取之后,视为执行完毕。 b.当auto-commit为false时,每个事务都必须显式调用commit方法进行提交,或者显式调用commit方法进行回滚。 2.事务隔离级别(Transaction Isolation Levels) JDBC提供了5种不同的事务隔离级别。在Connection中进行了定义。 TRANSACTION_NONE:JDBC不支持事务 TRANSACTION_READ_UNCOMMITTED:允许脏读、不可重复读和幻读 TRANSACTION_READ_COMMITTED:禁止脏读,但允许不可重复读和幻读 TRANSACTION_REPEATABLE_READ:禁止脏读和不可重复读,单可以幻读 TRANSACTION_SERIALIZABLE:禁止脏读、不可重复读和幻读 3.保存点(SavePoint) JDBC定义了SavePoint接口,提供在一个更细粒度的事务控制机制。当设置了一个保存点后,可以rollback到该保存点处的状态,而不是rollback整个事务。 连接对象获取和关闭的时机 现状: 连接对象的获取和销毁比较浪费时间 一个事务中多个操作,若每个操作都生成一个连接对象,多用户同时连接数据库时,访问效率会非常的低。 需求: 一个事务中的多个操作应该用同一个连接对象控制,不然无法实现提交和回滚。一个事务开始时获得连接对象,一个事务结束时关闭连接。 解决: 将连接对象的申请交给专门的连接管理类 事务申请连接对象时,通过连接管理类申请,而不再通过DriverManager申请 一个事务一定是由一个线程完成的,使用线程局部变量获得同一个连接对象 接口DataSource 该工厂用于提供到此 DataSource 对象所表示的物理数据源的连接。 作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法。 DataSource接口由驱动程序供应商实现。共有三种类型的实现: 基本实现:生成标准的 Connection 对象 连接池实现:生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。 分布式事务实现:生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。 方法: getConnection():尝试建立与此 DataSource 对象所表示的数据源的连接。 getConnection(String username, String password):尝试建立与此 DataSource 对象所表示的数据源的连接。 实例:先在src目录下新建配置文件config.properties: driver=com.mysql.jdbc.Driver url=jdbc\:mysql\://127.0.0.1\:3306/empmgs?useUnicode\=true&characterEncoding\=utf-8 username=root password=root 实例代码: import java.io.FileInputStream; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class demo4 { static Properties prop = new Properties(); static DataSource ds = null; static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); private static Connection conn = null; private static Statement sm = null; /** * 静态初始化块加载注册驱动 */ static { try { prop.load(new FileInputStream("src/config.properties")); ds = BasicDataSourceFactory.createDataSource(prop); } catch (Exception e) { e.printStackTrace(); } } static public Connection getConnection(){ try { //先看线程局部变量 conn = threadLocal.get(); if(conn == null){//线程局部变量中没有保存连接对象 conn = ds.getConnection(); threadLocal.set(conn);//设置连接对象到线程局部变量 } } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void main(String[] args) { try{ conn = getConnection (); sm = conn.createStatement(); // 关闭自动提交 conn.setAutoCommit(false); sm.executeUpdate("UPDATE tb SET name = '老王' WHERE id = 3 "); sm.executeUpdate("INSERT INTO tb (name, sex, phone) VALUES ('美丽','女','132****5555')"); conn.commit(); System.out.println("运行结束"); } catch (Exception e) { try { conn.rollback(); } catch (Exception ex) { e.printStackTrace(); } } finally { if (sm != null) { try { sm.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); conn = null; } catch (SQLException e) { e.printStackTrace(); } } } } }

优秀的个人博客,低调大师

Java学习:反射

反射 使用反射可以直接获取class字节码文件中的类型、属性、方法。 演示代码: 新建一个名为User的类作为反射的操作对象 public class User { private int id; private String name; private String password; public User() { } /** * @return the id */ public int getId() { return id; } /** * @return the name */ public String getName() { return name; } /** * @return the password */ public String getPassword() { return password; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @param password the password to set */ public void setPassword(String password) { this.password = password; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + "]"; } } 演示 类 获取类 Object u = new User(); Class class1 = u.getClass(); 获取类名 class1.getName() 获取类访问权限 int modifier = class1.getModifiers(); boolean flag = Modifier.isPublic(modifier); System.out.println("是public?: "+flag); 属性 获取类所有属性访问权限私有的也可以获取到 Field[] arr = class1.getDeclaredFields(); for (Field field:arr) { System.out.println ("类中的属性:" + field); } 获取类所有属性的值私有属性默认无法获取,但是可以通过不检查访问权限来直接获取。 // 获取所有属性的值 for (Field field:arr) { // 不检查访问权限 field.setAccessible(true); // 获取u对象中field的值 Object o = field.get(u); System.out.println("类中的属性值:" +o); } 指定属性名获取属性 Field f = class1.getDeclaredField("name"); f.setAccessible(true); f.set(u, "张三"); Object o = f.get(u); System.out.println("name: " + o); 方法 获取所有方法(包含从父类继承的方法) Method[] allMethods = class1.getMethods(); System.out.println("类的所有方法:"); for (Method method:allMethods) { System.out.println(method); } 获取类自己的方法 Method[] onlyMethods = class1.getDeclaredMethods(); for (Method method:onlyMethods) { System.out.println(method); } 调用无参带返回值方法 Method method2 = class1.getDeclaredMethod("getName"); String str = (String)(method2.invoke(u)); System.out.println ("返回值:"+ str); 调用有参无返回值方法 Method method = class1.getDeclaredMethod("setName", String.class); method.invoke(u, "李四"); 完整演示代码: import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, InvocationTargetException { Object u = new User(); // 获取到User的类 Class class1 = u.getClass(); System.out.println("类名:"+class1.getName()); // 获取类访问权限 int modifier = class1.getModifiers(); boolean flag = Modifier.isPublic(modifier); System.out.println("是public?: "+flag); // 获取所有属性 Field[] arr = class1.getDeclaredFields(); for (Field field:arr) { System.out.println ("类中的属性:" + field); } // 获取所有属性的值 for (Field field:arr) { // 不检查访问权限 field.setAccessible(true); // 获取u对象中field的值 Object o = field.get(u); System.out.println("类中的属性值:" +o); } // 指定字段名称获取属性 Field f = class1.getDeclaredField("name"); f.setAccessible(true); f.set(u, "张三"); Object o = f.get(u); System.out.println("name: " + o); // 获取所有方法 (包含继承方法) Method[] allMethods = class1.getMethods(); System.out.println("类的所有方法:"); for (Method method:allMethods) { System.out.println(method); } // 获取当前类的自己的方法 Method[] onlyMethods = class1.getDeclaredMethods(); for (Method method:onlyMethods) { System.out.println(method); } // 调用有参方法 Method method = class1.getDeclaredMethod("setName", String.class); method.invoke(u, "李四"); // 调用无参有返回值方法 Method method2 = class1.getDeclaredMethod("getName"); String str = (String)(method2.invoke(u)); System.out.println ("返回值:"+ str); } }

优秀的个人博客,低调大师

JavaScript学习(十)

目录 练习: String对象的方法 1.查找字符串 (1)charAt()方法 (2)indexOf()方法 (3)lastIndexOf()方法 2.截取字符串 (1)silce()方法 (2)substr()方法 (3)substring()方法 3.连接和拆分 (1)concat()方法 (2)split()方法 4.格式化字符串 练习: 在text文档中输入英文小写字母,点击按钮之后把文本框中的小写字母变成大写。 <head> <meta charset="utf-8"> <title>对象</title> <script type="text/javascript" language="JavaScript"> function c(){ var t=document.getElementById("text1"); t.value=t.value.toUpperCase(); } </script> </head> <body> <input type="text" id="text1"/> <button onclick="c()" type="button">big button</button> </body> String对象的方法 1.查找字符串 (1)charAt()方法 charAt()方法可以返回字符串中指定位置的字符。 语法:stringObject.charAt(index) stringObject:string对象名或字符变量名。 index:必选参数。表示字符串中某个位置的数字,即字符在字符串中的下标。 例子:var str="你好 JavaScript"; alert(str.charAt(1)); (2)indexOf()方法 indexOf()方法可以返回某个子字符串在字符串中首次出现的位置。 语法:stringobject.indexOf(substring.startindex) substring:必选参数。要在字符串中查找的子字符串 startindex:可选参数。用于指定在字符串中开始查找位置,取值范围是0—stringobject.length-1. 例子: <script type="text/javascript" language="JavaScript"> var str="四十四,四是四"; var position=0; var num=-1; var index=0; while(position!=-1){ position=str.indexOf("四",index); num+=1; index=position+1; } document.write("定义的字符串:"+str+"<br />"); document.write("字符串中有"+num+"个四"); </script> (3)lastIndexOf()方法 lastIndexOf()方法可以返回某个字符串在字符串中最后出现的位置。 语法:stringobject.lastIndexOf(substring.startindex) 2.截取字符串 (1)silce()方法 silce()方法可以提取字符串的片段,并在新的字符串中返回被提取部分。 语法:stringobject.silce(startindex,endindex) 例子: var str="你好 JavaScript"; console.log(str.slice(0,7)); (2)substr()方法 substr()方法可以从字符串指定位置提取指定长度的字符串。 语法:stringobject.substr(startindex,length) startindex:必选参数。指定要提取的字符串的位置。该参数可以是负数,如果是负数,则从该字符串的尾部开始算起。 length:可选参数。用于指定提取的字符串的长度。 例子:字符串截取 var str="你好 JavaScript"; document.write(str.substr(0,4)); (3)substring()方法 substring方法用于提取字符串中两个指定的索引号之间的字符。 语法:stringobject.substring(startindex,endindex) 3.连接和拆分 (1)concat()方法 concat()方法用于连接两个或多个字符串。 语法:stringobject.concat(string1,string2...) stringobject:string对象名或字符变量名 string:必选参数。将被连接的字符串,可以是一个,或者多个。 例子: var str1="affa"; var str2="dgaf0"; document.write(str1.concat(str2)); (2)split()方法 split()方法用于把一个字符串分割成字符串数组。 语法:stringobject.split(separator,limit) separator:必选参数。指定的分割符。该参数可以是字符串,也可以是正则表达式。如果把空字符串("")作为分割符,那么字符串的每个字符都会被分割。 limit:可选参数。该参数可指定返回数组的最大长度。如果设置了该参数,返回的数组元素个数都不会多于这个参数。 例子:在文本框中输入数字,生成这个位数的随机字符串。 <script type="text/javascript" language="JavaScript"> function ran(digit){ if(isNaN(digit)){ alert("请输入数字"); }else{ var source="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G"; arrstr=source.split(","); /*分割方法:以逗号为分割符*/ var result=""; var index=0; for(i=0;i<digit;i++){ index=parseInt(Math.random()*arrstr.length); result=arrstr[index]+result; } alert(result); } } </script> <form name="form"> <input type="text" name="digit" /> <input type="button" value="生成" onclick="ran(form.digit.value)"/> </form> 4.格式化字符串 anchor() : 创建HTML锚 big() : 使用大号字体显示字符串 small() : 使用小号字体显示字符串 fontsize() : 使用指定的字体大小显示字符串 bold() : 使用粗体的字体显示字符串 italics() : 使用斜体显示字符串 link() : 将字符串显示为超链接 strike() : 使用删除线来显示字符串 blink() : 显示闪动字符串,此方法并不支持IE浏览器 fixed() : 以打字机文本显示字符串,相当于在字符串两端增加<tt>标记 fontcolor() : 使用指定的颜色来显示字符串 sub() : 把字符串显示为下标 sup() : 把字符串显示为上标

优秀的个人博客,低调大师

JavaScript学习(九)

对象访问语句 for...in循环语句 for...in循环语句和for循环语句十分相似,for...in语句用来遍历对象的每一个属性。每次都将属性名作为字符串保存在变量里。 语法:for(variable in object){ ...statement } variable是一个变量名,声明一个变量的var语句、数组的一个元素或者对象的一个属性; object是一个对象名,或者是计算结果为对象的表达式; statement通常是一个原始语句或者语句块,由它构成循环的主体。 例子1: <script type="text/javascript" language="JavaScript"> var objectes={uesr:"afa", age:"21", QQ:"15625462", email:"54849@123.com", pwd:"4as4fa4f"}; for(var example in objectes){ document.write("属性:"+example+"="+objectes[example]+"<br />") } </script> 例子2: var objectes=document; var object0=""; for(var example in objectes){ object0=example+"="+objectes[example]; document.write(object0+"<br />") } with语句 with语句被用于在访问一个对象的属性或方法时避免重复使用指定对象引用。 语法:with(object){ statements } object:指定在statement块中没有引用的情况下使用那个对象引用。 在一个连续的程序代码中,如果多次使用某个对象的多个属性或方法,那么只要在with关键字后的括号()中写出该对象的名称,就可以在随后的大括号{ }中的程序语句中直接引用该对象的属性名或方法名。 JavaScript中的数组 创建array对象 可以用静态array对象创建一个数组对象,已记录不同类型的数据。 语法:arrayObj=new Array() arrayObj=new Array([size]) arrayObj=new Array([element0[,element1[,...[elementN]]]]) arrayObj:必选项。要赋值为Array对象的变量名 size:可选项。设置数组的大小。由于数组的下标是从零开始,创建元素的下标为0-size-1. elementN:可选项。存入数组的元素。使用该语法时必须有一个以上的元素。 例子: <script type="text/javascript" language="JavaScript"> arrayobj=new Array(1,2,3,"a","b"); console.log(arrayobj); </script> Array对象的输入/输出 1.array对象的输入 向array对象中输入数组元素有三种方法。 (1)在定义array对象时直接输入数组元素 arrayobj=new Array("a","b","c") (2)利用array对象的元素下标向其输入数组元素 arrayobj=new Array(7) arrayobj[3]="a"; arrayobj[4]="b"; (3)利用for语句向array对象中输入数组元素 var n=7; arrayobj=new Array(); for(var i=0;i<n;i++){ arrayobj[i]=i } 2.array对象的输出 将array对象的元素值输出有三种方法 (1)用下标获取指定元素值 arrayobj=new Array("a","b","c") var s=arrayobj[1]; (2)用for语句获取数组中的元素值 arrayobj=new Array("a","b","c") for(var i=0;i<arrayobj.length;i++){ str=str+arrayobj[i].toString(); } document.write(str); (3)用数组对象名输出所有元素值 Array对象的方法 数组的添加和删除 数组的添加和删除可以使用concat()、shift()、pop()、push()、unshift()方法实现。 1.concat()方法 concat()方法用于将其他数组连接到当前数组的尾端 语法:arrayobject.concat(arrayX,arrayX,arrayX,...,arrayX) arrayobject:必选项。数组名称。 arrayX:必选项。该参数可以是具体的值,也可以是数组对象。 例子:var arr=new Array(1,2,3,4,5,6,7,8); document.write(arr.concat(9,10)); 2.shift()方法 shift()方法用于把数组中的第一个元素从数组中删除,并返回删除元素的值。 语法:arrayobject.shift() arrayobject:必选项。数组名称。 返回值:在数组中删除的第一个元素的值。 例子: var arr=new Array(1,2,3,4,5,6,7,8); var del=arr.shift(); console.log("删除的元素是:"+del+"删除后的数组为:"+arr); 3.pop()方法 pop()方法用于删除返回数组中的最后一个元素。 语法:arrayobject.pop() 返回值:array对象的最后一个元素。 var arr=new Array(1,2,3,4,5,6,7,8); var del=arr.pop(); console.log("删除的元素是:"+del+"删除后的数组为:"+arr); 4.push()方法 push()方法向数组的末尾添加一个或多个元素,并返回添加后的数组长度。 语法:arrayobject.push(newelement1,newelement2,...newelementN,) 返回值:把指定的值添加到数组后的新长度。 5.unshift()方法 unshift()方法向数组的开头添加一个或多个元素。 语法:arrayobject.unshift(newelement1,newelement2,...newelementN,) 设置数组的排列顺序 1.reverse()方法 reverse()方法用于颠倒数组中元素的顺序。 语法:arrayobject.reverse() 例子: var arr=new Array(1,2,3,4,5,6,7,8); console.log(arr); arr.reverse(); console.log("删除后的数组为:"+arr); 2.sort()方法 sort()方法用于对数组的元素进行排序。 语法:arrayobject.sort(sortby) sortby:可选项。规定排序的顺序,必须是函数。 例子: var arr=new Array(5,4,2,3,1,6,7,8); console.log(arr); arr.sort(); console.log("删除后的数组为:"+arr); 获取数组中的某段数组元素 获取数组中的某段数组元素主要用slice()方法实现。 slice()方法可从已有的数组中返回选定的元素。 语法:arrayobject.slice(start,end) start:必选项。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说-1指最后一个元素,-2指倒数第二个元素。 end:可选项。规定从何处结束选取。 返回值:返回截取后的数组元素,该方法返回的数据中不包括end索引所对应的数据。 var arr=new Array(5,4,2,3,1,6,7,8); console.log("从数组第3个元素开始选择:"+arr.slice(3)); console.log("从数组第2个元素到5个元素开始选择:"+arr.slice(2,5));

优秀的个人博客,低调大师

JavaScript学习(八)

目录 对象分类: 1.内建对象: 2.宿主对象: 3.自定义对象: javascript内部对象 FileSystemObject对象 动态创建FileSystemObject对象 FileSystemObject对象的方法 In 运算符 JS数据类型 对象字面量 函数: 对象分类: 1.内建对象: 由ES标准中定义的对象,在任何ES中都可以使用 ----比如:math,string,number,Boolean 2.宿主对象: 由JS的运行环境提供的对象,目前来讲主要指浏览器提供的对象 比如:BOM,DOM 3.自定义对象: 由开发人员自己创建的对象 javascript内部对象 对象属于复合的数据类型。 FileSystemObject对象 在javascript中实现文件操作功能,主要是依靠FileSystemObject对象。该对象用来创建、删除和获得有关信息,还可以用来操作驱动器、文件夹和文件的方法和属性。 动态创建FileSystemObject对象 要想对文件进行相应的操作,首先需要对FileSystemObject对象进行实例化,也就是动态创建FileSystemObject对象。 语法:fso =new ActiveXObject("Scripting.FileSystemObject"); fso =new ActiveXObject("Scripting.FileSystemObject");只能在IE上使用 参数说明:fso:是FileSystemObject对象的一个实例。 FileSystemObject对象的方法 (1)GetAbsolutePathName()方法 GetAbsolutePathName()方法根据提供的路径返回完整的路径。如果路径提供了从指定驱动器的根开始的完整的引用,那么它就是完整的。如果路径指定的是映射驱动器的根文件夹,那么完整的路径只能由一个路径分隔符“\”结束。 语法:object.GetAbsolutePathName(pathspec) object:必选项。FileSystemObject对象的名称 pathspec:必选项。要变成完整路径的路径说明。该参数的相应设置如下表 (2)GetBaseName()方法 GetBaseName() 方法将以字符串的形式返回指定路径中最后成分中的基本名称,不包含文件扩展名。 语法:object.GetBaseName(path) object:必选项。FileSystemObject对象的名称 path:必选项。返回其最后成分中的基本名称的指定路径。当路径与path参数不匹配时,GetBaseName()方法将返回长度为0的空字符串。 (3)GetDriveName()方法 GetDriveName()方法根据指定路径返回包含驱动器名称的字符串。 语法:object.GetDriveName(path) (4)GetDrive()方法 GetDrive()方法用于返回指定路径中驱动器的Drive对象。 语法:object.GetDrive(drivespec); drivespec:必选项。该参数可以是驱动器号(c)、带冒号的驱动器号(c:)、带冒号和路径分隔符的驱动器号(c:\),或者任意网络共享的说明(\\computer2\share1). (5)GetExtensionName()方法 GetExtensionName()方法用于返回指定路径中最后成分扩展名的字符串。 语法:object.GetExtensionName(path) (6)GetFileName()方法 GetFileName()方法返回指定路径的最后成分,但指定的路径不能只是驱动器说明,也可以是共享路径。 语法:object.GetFileName(pathspec) pathspec:必选项。指定文件的路径(绝对或相对路径) (7)GetParentFolderName()方法 GetParentFolderName()方法根据指定路径中的最后成分返回其父文件夹名称的字符串。 语法:object.GetParentFolderName(path) path;必选项。文件名所在的完整路径 (8)GetTempName()方法 GetTempName()方法返回一个随机产生的临时文件或文件夹名,有助于执行那些需要临时文件或文件夹的操作 语法:object.GetTempName(); In 运算符 通过该运算符可以检测一个对象中是否含有指定的属性。 var k=new Object(); k.name="s"; k.test=true; alert("s" in k); var k=new Object(); k.name="s"; k.test=true; alert("test" in k); JS数据类型 JS中的变量都是保存到栈内存当中的,基本数据类型的值直接在栈内存中存储。 值与值之间是独立存在的,修改一个变量不会影响其他变量 对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象的引用,当通过一个变量修改属性时,另一个也会受到影响。 对象字面量 可以使用对象字面量来创建一个对象:var obj={} 等价于var obj=new object(); 使用对象字面量,可以直接指定对象中的属性。 语法:{属性名:属性值,属性名:属性值...} 例子:var obj={name:"asfas",sex="男"} 对象字面量的属性名可以加引号也可以不加,属性名和属性值是一组一组的名值对结构。名和值之间使用:连接 函数: 函数也是一个对象。 函数中可以封装某一些功能(代码),在需要时执行这些功能(代码) 创建一个函数对象: var fun=new Function() 可以将要封装的代码以字符串形式传递给要封装的函数 封装到函数中的代码不会立即执行。 语法:function 函数名(){ }

优秀的个人博客,低调大师

JavaScript学习(五)

目录 条件判断语句: if语句: if...else语句 switch语句 while语句 do...while语句 for循环语句 跳转语句: continue语句 break语句 条件判断语句: if语句: if条件判断语句是最基本、最常用的流程控制语句,可以根据条件表达式的值执行相应的处理。 简单的if语句的语法格式如下: if(expression){ statement 1 } expression:必选项,用于指定条件表达式,可以使用逻辑运算符。 statement 1:用于指定要执行的语句序列。当expression的值为true时,执行该语句序列,简单if语句的执行流程如下图。 if...else语句 if...else语句是if语句的标准形式,在if语句简单形式的基础之上增加一个else从句,当expression的值是false时则执行else从句中的内容。 if...else语句格式如下: if(expression){ statement 1 } else{ statement2 } 在if语句的标准形式中,首先对expression的值进行判断,如果它的值是true,则执行statement1语句块的内容,否则执行statement2语句块中的内容。 switch语句 switch语句是典型的多路分支语句,其作用与嵌套使用if语句基本相同,但switch语句比if语句更具有可读性,而且switch语句允许在找不到一个匹配条件的情况下执行默认的一组语句。 switch语句语法格式如下: switch(expression){ case judgement 1; statement 1; break; case judgement 2; statement 2; break; case judgement n; statement n; break;.... } expression:任意的表达式或变量。 judgement:任意的常数表达式。当expression的值与某个judgement的值相等时,就执行此case后的statement语句。 break:用于结束switch语句,从而使javascript只执行匹配的分支。 while语句 while(expression){ statement } expression:一个包含比较运算符的条件表达式,用来指定循环条件。 statement:用来指定循环体,在循环条件的结果为true时,重复执行。 do...while语句 do{ statement }while(expression); statement:用来指定循环体,循环开始时首先被执行一次,然后在循环条件的结果为true时,重复执行。 expression:一个包含比较运算符的条件表达式,用来指定循环条件。 for循环语句 for(initialize;test;increment){ statement } initialize:初始化语句,用来对循环变量进行初始化赋值。 test:循环条件,一个包含比较运算符的表达式,用来限定循环变量的边限。如果循环变量超过了该边限,则停止该循环语句的执行。 increment:用来指定循环变量的步幅。 statement:用来指定循环体,在循环条件的结果为true时,重复执行。 跳转语句: continue语句 continue语句和break语句类似,不同之处在于,break语句退出循环,而continue语句用于中止本次循环,并开始下一次循环。其语法格式如下: continue; continue语句只能应用在while,for,do...while语句中。 break语句 break语句用于退出包含在最内层的循环或者退出一个switch语句。break语句语法格式如下: break; break语句通常用于for,while,do...while或switch语句中。

优秀的个人博客,低调大师

JavaScript学习(六)

目录 函数 函数的定义 函数的调用 函数的简单调用 在事件响应中调用函数 通过超链接定义函数 函数参数的使用 使用函数的返回值 嵌套函数 递归函数 javascript中的内置函数 (1)parseInt()函数: (2)parseFloat()函数 (3)isNaN()函数 (4)isFinite()函数 (5)encodeURI()函数 (6)decodeURI()函数 Function()构造函数与函数直接量 函数 函数的定义 在javascript中,函数是由关键字function 、函数名加一组参数以及置于大括号中需要执行的一段代码定义的。基本语法如下: function functionName(【parameter 1、parameter 2...】){ statement; [return expression;] } functionName:必选项。用于指定函数名。在同一个页面中,函数名必须是唯一的,并且区分大小写。 parameter:可选性。用于指定参数列表。当使用多个参数时,参数间使用逗号进行分隔。一个函数最多可以有255个参数。 statement:必选项。是函数体,用于实现函数功能的语句。 expression:可选项。用于返回函数值。expression为任意表达式变量或常量。 函数的调用 函数的简单调用 函数的定义语句通常会放在HTML文件的<head>段中,而函数的调用语句通常被放在<body>段中,如果在函数定义前调用函数,执行将会出错。函数的定义及调用语法如下: <html> <head> <script type="text/javascript"> function functionName(parameters){ some statement; } //定义函数 </script> </head> <body> functionName(parameter);//调用函数 </body> </html> functionName:函数名称 parameter:参数名称 在事件响应中调用函数 当用户单击某个按钮或选择某个复选框时都将触发事件,通过编写程序对事件做出反应的行为称为响应事件,在javascript语言中,将函数与事件相关联就完成了响应事件的过程。如当用户单击某个按钮时执行相应的函数。 <html> <head> <meta charset="utf-8"> <title>JS基本语法</title> <script type="text/javascript"> function test(){ //定义函数 alert("test"); } </script> </head> <body> <form action="" method="post" name="form1"> <input type="button" value="提交" onclick="test();"> //在按钮事件触发时调用自定义函数 </form> </body> </html> 通过超链接定义函数 函数除了可以在响应事件中被调用外,还可以在超链接中被调用。在<a>标记中的<href>标记中使用"javascript:关键字"超链接来调用函数,当用户单击该超链接时,相关函数将被执行。下面的代码实现了通过超链接接调用函数。 <html> <head> <meta charset="utf-8"> <title>JS基本语法</title> <script type="text/javascript"> function test(){ //定义函数 alert("test"); } </script> </head> <body> <a href="javascript:test()">test</a> <!--在超链接中调用自定义函数--> </body> </html> 函数参数的使用 function 自定义函数名(形参1,形参2...){ 函数体 } 定义函数时,在函数名后面的圆括号内可以指定一个或多个参数(参数之间用“,”分隔)。指定参数的作用在于,当调用函数时,可以为被调用函数传递一个或多个值。 在定义函数时指定的参数被称为形式参数,而把调用函数时实际传递的值称为实际参数。 使用函数的返回值 有时需要在函数中返回一个数值供在其他函数中使用,为了能够返回给变量一个值,可以在函数中添加return语句,将需要返回的值赋予变量,最后将此变量返回。 <script type="text/javascript"> function functionName(parameters){ //定义函数 var results=somestaments; return results; } </script> results:函数中的局部变量 return:函数中返回变量的关键字。(返回值在函数调用中不是必须的) 嵌套函数 所谓的嵌套函数就是在函数内部再定义一个函数,这样定义的优点在于可以使内部函数轻松获得外部函数的参数以及函数的全局变量等。 语法: <script type="text/javascript"> function functionName(parameter1,parameter2){ //定义函数 function innerFunction(){ somestatements; } } </script> functionName:外部函数名称 innerFunction:内部函数名称 递归函数 所谓递归函数就是函数在自身的函数体内调用自身,使用递归函数时一定要当心,处理不当将会使程序进入死循环,递归函数只能在特定的情况下使用,如处理阶乘问题。 语法: <script type="text/javascript"> function functionName(parameter1){ //定义函数 function functionName(parameter2){ } } </script> javascript中的内置函数 在使用javascript语言时,除了可以自定义函数之外,还可以使用javascript的内置函数,这些内置函数是由javascript语言自身提供的。 (1)parseInt()函数: 主要将首位为数字的字符串转换成数字,如果字符串不是以数字开头,那么将返回NaN. 语法:parseInt(StringNum,[n]) StringNum:需要转换成整型的字符串。 n:提供在2-36之间的数字表示所保存数字的进制数。这个参数在函数中不是必需的。 (2)parseFloat()函数 parseFloat()函数主要将首位为数字的字符串转换成浮点型数字,如果字符串不是以数字开头,那么将返回NaN. 语法:parseFloat(StringNum) StringNum:需要转换成浮点型的字符串。 (3)isNaN()函数 语法:isNaN(Num) Num:需要验证的数字。 (4)isFinite()函数 isFinite()函数主要用于检验某个表达式是否为无穷大。 语法:isFinite(Num) Num:需要验证的数字。 (5)encodeURI()函数 encodeURI()函数主要用于返回一个URI字符串编码后的结果。 语法:encodeURI(url) url:需要转换为网络资源地址的字符串。 (6)decodeURI()函数 decodeURI()函数主要用于将已编码为URI的字符串解码成最初的字符串并返回。 decodeURI(url) url:需要解码的网络资源地址。 Function()构造函数与函数直接量 除了使用基本的function语句定义函数之外,还可以使用另外两种方式来定义,即使用Function()构造函数和函数直接量定义。 构造函数Function()允许在运行时动态创建和编译javascript代码,而函数直接量却是程序结构的一个静态部分,就像函数语句一样。 每次调用构造函数Function()都会解析函数体,并且创建一个新的函数对象。 Function()创建的函数使用的不是静态作用域,相反的,该函数总是被当作顶级函数来编译。 function maskingKeyboard(){ if(event.keyCode==8){ //判断是否为Backspace键 event.keyCode=0; event.returnValue=false; aler("当前设置不允许使用Backspace键"); } if(event.keyCode==13){ //判断是否为Enter键 event.keyCode=0; event.returnValue=false; aler("当前设置不允许使用Enter键"); } if(event.keyCode==116){ //判断是否为F5键 event.keyCode=0; event.returnValue=false; aler("当前设置不允许使用F5刷新键"); } //判断是否为Alt+方向键←或方向键→ if((event.altKey)||((window.event.keyCode==37)||(window.event.keyCode==39)){ event.returnValue=false; aler("当前设置不允许使用Alt+方向键一或方向键→"); } if(event.ctrlKey)&&(eventkeyCode==78){ //判断是否为Ctrl+N快捷键 event.returnValue=false; alert("当前设置不允许使用Ctrl+N新建IE窗口") } if(event.shiftKey)&&(event.keyCode==121){ //判断是否为Ctrl+N快捷键 event.returnValue=false; alert("当前设置不允许使用Shift+F10"); } } function rightKey(){ if(event.button==2){ event.returnValue=false; alert("禁止使用鼠标右键! "); } } document.onmousedown=rightKey(); document.onkeydown=maskingKeyboard();

优秀的个人博客,低调大师

JavaScript学习(练习)

练习:用户登录界面 代码: <script type="text/javascript"> function check(){ var name=form1.user.value; //获取用户添加的用户名信息 var pwd=form1.pwd.value; //获取用户添加的密码信息 if((name=="")||(name=null)){ //判断用户名是否为空 alert("请输入用户名!"); form1.user.focus(); //用户名文本框获取焦点 return; }else if((pwd=="")||(pwd=null)){//判断密码是否为空 alert("请输入密码!"); form1.pwd.focus(); //密码文本框获取焦点 return; }else{ form1.submit(); //提交表单 } } </script> <body> <form name="form1" method="post" action=""> <table border="1" cellspacing="0" cellpadding="0" bordercolor="#FFFFFF" bordercolordark="#CCCCCC" bordercolorlight="#FFFFFF"> <tr> <td height="30" colspan="2" bgcolor="antiquewhite">用户登录</td> </tr> <tr> <td width="59" height="30">用户名:</td> <td width="162"><input name="user" type="text" class="user"></td> </tr> <tr> <td height="30">密 码</td> <td><input name="pwd" type="text" class="pwd"></td> </tr> <tr> <td height="30" colspan="2" align="center"> <input name="button" type="button" class="btn_grey" value="登录" onclick="check()"> &nbsp; <input name="Submit2" type="reset" class="btn_grey" value="重置"> </td> </tr> </table> </form> </body> 练习:星期获取系统 <script type="text/javascript"> var now=new Date(); var day=now.getDay(); var week; switch(day){ case 1: week="星期一"; break; case 2: week="星期二"; break; case 3: week="星期三"; break; case 4: week="星期四"; break; case 5: week="星期五"; break; case 6: week="星期六"; break; case 7: week="星期七"; break; } document.write("今天是"+week); </script>

优秀的个人博客,低调大师

JavaScript学习(四)

一元运算符:只需要一个操作数。 + 正号:正号不会对我们的数值产生任何影响 - 负号:负号可以对数值进行负号取反 正负号都可以将数值类型转换成number,原理和number()函数一样。 自增和自减: 自增:可以使变量在自身的基础上+1 运算符:++ 自增分为2种,a++和++a 对于原变量来说是没有区别的,都会使原变量的值+1 不同的是a++和++a的值不同:a++的值等于自增前的值,++a的值等于自增后的值 自减:可以使变量在自身的基础上-1 运算符:-- 逻辑运算符: !非 :可以用来对一个值进行非运算----------为任意数值进行两次非运算,可以转化为布尔值 &&与 :可以对符号两边的值进行与运算并返回结果---两个值中只要有一个为false就返回false ||或 :可以对符号两边的值进行或运算并返回结果---两个值中只要有一个为true就返回true 赋值运算符: =等于:可以将右侧数值赋值给左侧的变量 +=:a=a+5可以转变为a += 5 -=:a=a-5等价于a -= 5 *=:a=a*5等价于a *= 5 /=:a=a/5等价于a /= 5 %=:a=a%5等价于a %= 5 关系运算符: 通过关系运算符可以比较两个值之间的关系。 如果关系成立将会返回true,如果关系不成立将会返回false。 >大于号 <小于号 >=大于等于 <=小于等于 非数值比较时会将其转化为数值再进行比较 任何值和NaN做任何比较都返回false。 如果符号两侧的值都是字符串,它不会将其转换成数字进行比较,会分别比较字符串中字符的Unicode编码大小。 比较字符编码时是一个一个进行比较的,如果两位一样则比较下一位。 Unicode编码: 输出编码:console.log(" \u四位编码 "); 在网页中输入Unicode编码:&#编码,这里的编码需要转化为10进制的 相等运算符: 运算符:== 用来比较两个值是否相等,如果相等返回true,不相等返回false 当使用==来比较时,如果值的类型不同,则会自动进行转化成相同类型,然后再比较。 undefined衍生自null,两者做==判断将会返回true。 条件运算符(三元运算符): 语法:条件表达式?语句1:语句2 执行流程:首先对条件表达式进行求值,如果返回true,则执行语句1;如果返回false,则执行语句2

优秀的个人博客,低调大师

JavaScript学习(三)

强制类型转换(将一个数据类型强制转换为另一个数据类型) 在JS中如果需要写16进制的数字,需要以0x开头。8进制数字,需要以0开头。2进制数字需要用0b开头 string类型强转 方式一:调用被转换类型的toString()方法。 ----被转换类型.toString() 该方法不会影响到原变量,它会将转换的结果返回。 但是null和undefined不能调用toString方法。 方式二:调用string()函数。 -----直接写string(); 将被转换数据作为参数传递给函数,可以转换null和undefined。 number类型强转 方式三:调用Number函数。 字符串转数值如果是纯数字将直接转换,如果非数字内容则转换为NaN,空字符串将转换为0。 布尔值转数值:false-->0 true-->1 空值转数值:null-->0 未定义转数值:NaN 方式四:调用parseInt() 把一个字符串转换成一个整数。 parseFloat()把字符串转换成一个浮点数。 parseInt()可以将字符串中有效的整数内容取出来。 如果对非string使用,会将其先转换为string。 Boolean类型强转 方式五:调用Boolean()函数。 数字转换为Boolean,除了0和NaN是false,其余都是true。 字符串转换为Boolean,除了空串,其余都是true。 null和undefined都会转换为false。 运算符(操作符) 通过操作符可以对一个值或者多个值进行运算。 算数运算符:+ - * / % 当对非number类型的值进行运算时,将会把值转换成number进行运算。 如果对两个字符串进行加法运算,会把两个字符串拼接成一个字符串并返回。 任何值和字符串进行加法操作,都会把值转换成字符串之后进行拼串操作。 任何值进行减法,乘法,除法操作,都可以转换成number。 %取模运算,除法取余运算。

优秀的个人博客,低调大师

JavaScript学习(二)

一、javascript基本代码 /**/ 多行注释 //单行注释 要养成一个良好的写注释习惯,也可以通过注释来对代码进行简单的测试。 1.JS中严格区分大小写 2.JS中每一条语句以分号结尾。 ---如果不写分号,浏览器会自动添加,但是会消耗一些系统资源。有些时候浏览器会加错分号。 3.JS中会自动忽略多个空格和换行,所以可以利用空格和换行对代码进行格式化 字面量:都是一些不可改变的值,可以直接使用,一般不会直接使用字面量。 比如:1、2、3、4、5 变量:变量可以用来保存字面量,而且变量的值可以任意改变。变量更方便我们使用,通过变量描述字面量,所以在开发中都是使用变量。 声明变量:在JS中,使用var关键字来声明变量。 /*声明变量:使用var关键字 */ var a=3; console.log(a); 标识符:在JS中所有可以由我们自主命名的都可以称为是标识符。例如:变量名、函数名、属性名 命名一个标识符规则:1.标识符中可以含有字母、数字、下划线、$,不能使用数字开头 2.标识符不能是ES中的关键字或保留字 比如:var var=3; 3.标识符一般使用驼峰命名法:首字母小写,每个单词开头大写,其余字母小写 helloWorld 数据类型:指的是字面量的类型,一共有6种数据类型。 1.String 字符串 2.number 数值 3.Boolean 布尔值 4.null 空值 5.undefined 未定义 6.object 对象 其中String、number、Boolean、null、undefined属于基本数据类型,object属于引用数据类型。 String字符串:在JS中字符串需要用引号引起来,单引号双引号效果一样,引号不能嵌套。 var str="ok"; 在字符串中可以使用 \ 来作为转义字符,当表示一些特殊符号时,可以使用 \ 进行转义。var str="你说:\" 今天天气不错 \"" \"可以表示一个" \'可以表示一个' \n换行 \t制表符 两个字符串相乘将会返回一个NaN:表示一个特殊的数值,not a number Number:在JS中所有数值都是number类型,包括整数和浮点数 var a=123 //number var b="123" //string JS中可以使用number.MAX_VALUE表示数值最大值。如果表示的数值超过最大值,则会返回一个infinity表示正无穷。 可以使用一个运算符来检查变量类型:typeof 变量 Boolean布尔值:布尔值只有两个true 和 false,进行逻辑判断 Null空值:null类型的值只有一个null,使用typeof来检查一个null值将会返回object。 undefined(未定义):undefined的值也只有自己,当声明一个变量但不给值赋值时。

优秀的个人博客,低调大师

JavaScript学习(一)

一、使用软件Hbuilder。 二、javascript(java编程语言,script脚本:java的脚本语言) 诞生于1995年,出现时主要用于处理网页中的前端验证。----所谓前端验证,就是指检查用户输入内容是否符合一定的规则。比如:用户名称的长度、密码的长度、邮箱的格式等。 javascript的标准是SCMAscript 一个完整的javascript由三个部分组成:ECMAscript(标准)、DOM(文档对象模型)、BOM(浏览器对象模型) 特点:1.解释型语言 ---不需要编译,可以直接运行 2.类似于C和java的语法结构 3.动态语言 4.基于原型的面向对象 <!--js代码需要编写到script的标签中--> <script type="text/javascript"> </script> 三、javascript语句警告框、页面body、控制台输出 /*控制浏览器弹出一个警告框*/ alert("这是第一行JavaScript代码") /*让计算机在页面中输出一个内容*/ document.write("的司法解释的凯撒缴纳罚款"); /*向控制台输出一个内容*/ console.log("在控制台位置"); 四、JS代码编写位置 <!--可以将JS代码编写到标签的onclick属性中 当我们点击按钮时,js代码才会执行 --> <button onclick="alert('为什么点击');">点击一下</button> <!--可以将JS代码写在超链接的href属性中,当点击超链接时也会执行JS代码--> <a href="javascript:alert('超链接点击')">555</a> 可以在JS文件夹中新建一个javascript。 <!--可以将javascript代码编写到外部JS文件夹中,通过script标签引入--> <!--script标签一旦引入外部代码,就不能再编写了--> <script type="text/javascript" src="js/script.js"> </script>

优秀的个人博客,低调大师

node知识学习

一、什么是node? node是js的运行环境,可以让js脱离前端单独运行 二、node的特点 1、单线程 无论是多少事情,都是一个线程去完成 单线程的优点:没有了多线程创建线程和销毁线程的开销,调度多线程也是需要消耗资源的。多线程,有多少事情就有多少线程去完成。 单线程的特点:无法利用多核cup,一旦陈谷被恶意的行为挂起,那么整个程序崩溃。 2、非堵塞I/O,在i/o进行的时候,线程不等待。阻塞I/O: 在i/o进行的时候,线程等待。 I:input O:output 读取文件、连接数据库读取数据库、操作光盘驱动器等等都叫做I/O。它们比较起内存和cpu的运行速度来说,是特别慢的。也就是说如果线程让硬盘读取一个比较大的文件。并且等待读取完毕并交给内存之后再去做别的事情。那么也就是说线程在等待读取(I/O)完成 3 事件驱动 事件驱动与非阻塞I/O是连着的一个事情。非阻塞I/O确实可以让线程在I/O进行的时候去做其它的事情,但是有个问题。线程去做了其它的事情,万一这个时候I/O完成了呢?怎么知道I/O什么时候完成?I/O完成的时候会触发一个事件,这个事件驱动着线程回来继续做下面的事情。 三、模块 3.1 内置核心模块 ——http http模块是用来搭建服务器的。 IncomingMessage : request OutgoingMessage : response METHODS : 这是一个数组里面装着所有的http请求方式 STATUS_CODES :是一个对象,对象的每个key都是一个状态码,对象的value是该状态码的含义 Server :是一个方法,用于将其它的服务转化成http服务 createServer : 是一个方法,用于创建服务 3.2 文件系统——file system Fs模块是用来操作文件的。所有的相关操作都是fs的方法。 创建文件并追加内容 3.3 url模块 Parse方法:将一个url路径,转成一个对象,对象有各种属性对应的就是不同的部分。 http://www.icketang.com/html/shouye/index.html?username=wanglaowu&password=123#123 上面的url字符串经过url模块的parse方法处理完会转变成以下对象 { Protocol:http, Host:www.icketang.com, Hostname:www.icketang.com, Port:null, Pathname:html/shouye/index.html, Search:?username=wanglaowu&password=123, Query: username=wanglaowu&password=123, Hash:#123, Href:http://www.icketang.com/html/shouye/index.html?username=wanglaowu&password=123#123 } parse方法还有第二个参数,是一个布尔值。默认为false。 如果为true,那么将会把返回的对象中的query选项转为一个对象。 url.format(urlObj) format这个方法是将传入的url对象编程一个url字符串并返回参数:urlObj指一个url对象 url解析get方法 Url模块是专门处理前端提交过来的请求地址的。 如何处理get请求: 1判断请求的方式 处理 如何处理post请求: 1判断请求的方式 if(req.method===”post”){ //code... } 2给req绑定data事件 if(req.method===”post”){ var str=“”; req.on(“data”,function(data_chunk){ //这个事件是post每发送一次数据,就会触发一次,回调函数中的参数是data_chunk表示的是这一次所 传递的数据。 str += data_chunk; }) req.on(“end”,function(){ //这个事件是post发送数据完毕之后才最终触发一次。所以说先触发1次或者多次data事件,再触发1次end事件。后续代码要写在end事件中 }) } 3.4 文件上传 formidable 3.5 express Express是第三方模块,用来快速开发一个服务器。 express中间件 Express内置的唯一中间件就是静态资源中间件。 req是前端传递过来的请求。 Req.query表示的是get请求携带的数据 包含在路由每个查询字符串参数的属性的对象。如果没有查询字符串,它是空的对象,{}。 Req.params表示的是从pathname上获得的数据 包含映射到指定的路线“参数”属性的对象。例如,如果你有路线/user/:name,那么“名”属性可作为req.params.name。这个对象默认{}。 Req.body 表示的是post请求携带的数据 (必须得先应用中间件:body-parser); 包含请求主体提交的键值对。默认情况下它是undefined。除非你使用了body-parser 例如:app.use(body_parser.urlencoded({extended:false})); Body-parser中间件: Ejs模板 Express允许我们像使用php那样(或者说是underscore的模板)使用ejs模板。 Ejs模板必须是一个文件,文件的拓展名是ejs => index.ejs 内部的内容还是大体上是html只不过有一部分是<%=variable%>组成的。当渲染的时候,会从字典中与variable进行匹配。并替换。 Ejs模板不需要引入app.js主程序文件。但是必须要在express中声明,而且还要放到node_modules中,这样express就能够找到ejs模块了: app.set(“view engine”,”ejs”); App.set表示要设置什么东西,第一个参数就是要设置的内容。第二个参数是对第一个参数更详细的说明. 声明完了之后,就可以在某个路由的响应中使用res.render()进行渲染ejs模板了。 条件:第一个参数是要渲染的模板文件。(该文件必须要存在与主程序同级目录下的views文件夹中) 第二个参数是渲染该模板文件的字典。 4.自定义模块 在NodeJs中,每一个js文件天生就是一个模块。 每个模块都能够向外暴露一些东西。 核心模块暴露的内容是十分重要的,比如:http模块负责搭建服务器。Fs模块负责操作文件等 自定义模块,随便定义。 模块化开发有什么好处呢? 每个模块只负责提供功能。不会将变量注册到全局作用域下。 我们自己定义了一个js文件。可以通过require函数将它引入到其它的js文件中。 方法是: var app = require(“./app.js”); 此时,必须在同级目录下有app.js这个文件 另一个方法是:将app.js放在同级目录下的node_modules文件夹中(或者上级、上上级、一直到根目录) 此时可以这么写了: var app = require(“app.js”); 此时的查找顺序是只会查找node_modules。 向外暴露有三种方式:

优秀的个人博客,低调大师

Android学习目录

Theme风格 Android 沉浸式风格(为毛叫沉浸式这么唬人) Build编译 Android 多渠道打包(同一个工程不同包名,不同服务器地址等) Application Android 权限管理(原生、EasyPermissions、RxPermissions) Activity Activity 传递ArrayList<bean>数据及其他基本运用Android 跳转系统设置+返回键 Service Content Provider BroadCast Receiver View控件 Android 好用的下拉控件SpinnerTextView使用实例Android Button的英文字是大写的? 设备 Android 设备+APP+号码信息Android 设备屏幕信息(dip,sp,px的转换及其运用) Media多媒体 1、Camera 2、Video 3、Radio 硬件通信 1、USB通信、USB转串口通信 Android USB转串口通信 2、BlueTooth蓝牙通信 3、SerialPort串口通信 4、WIFI通信 5、RFID通信(NFC) 6、扫码枪 Android 扫码枪监听封装 网络通信 httpclient,httpurlconnection,afinal,okhttp,retrofit,volley socket,webservice WebService WebService 基础知识点和用Postman调试Retrofit 用Soap协议访问WebService 详解Android XStream 解析xml数据变成bean,支持CDATA 数据解析 json,xml Android xml数据的读取和写入(sax,pull,dom,xstream,jsoup)

优秀的个人博客,低调大师

Spring学习路径

一.Spring框架简介 Spring作为一个优秀的开源企业级框架有着以下特点 开源框架 简化企业级应用开发的流程 Spring是一个JavaSE/EE的一站式框架 优点在于 方便解耦 AOP的编程支持 声明式事务的支持 可以引入jUnit4,方便程序测试 对优秀开源框架的支持,方便集成 降低JavaEE API的使用难度 Spring开发框架中最重要的两个特性是 IOC控制反转 AOP面向切片 IOC的优点可以从以下的开发演变中体现出来 二.Spring Beans管理 XML方式管理 注解方式管理

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册