1 存储过程
   1)用当地数据库语言,写的一段业务逻辑算法,并该算法存储在客户端
   2)使用存储过程需要用于CallableStatement接口,同时需要使如下SQL命令调用:{call add_pro(?,?,?)}
   3)对于存储过程的输出参数,需要注册:
    cstmt.registerOutParameter(3,Types.INTEGER);
   4)取得返回值时,需要按照输出参数的位置来取

编写存储过程得到CallableStatement,并调用存储过程:

CallableStatement cstmt= conn.prepareCall("{call demoSp(?, ?)}");

设置参数,注册返回值,得到输出

cstmt.registerOutParameter(2, Types.VARCHAR);

cstmt.setString(1, "abcdefg");

cstmt.execute();

System.out.println(cStmt.getString(2));

  1. package cn.itcast.web.jdbc.dao;
  2.  
  3. import java.sql.CallableStatement;
  4. import java.sql.Connection;
  5. import java.sql.ResultSet;
  6. import java.sql.Types;
  7. import cn.itcast.web.jdbc.util.JdbcUtil;
  8.  
  9. //演示JDBC操作MySQL存储过程
  10. public class Demo1 {
  11. public static void main(String[] args) {
  12. Connection conn = null;
  13. //调用存储过程专用的接口
  14. CallableStatement cstmt = null;
  15. ResultSet rs = null;
  16. //存储过程特定的语法
  17. String sql = "{call add_pro(?,?,?)}";
  18. try {
  19. conn = JdbcUtil.getMySqlConnection();
  20. cstmt = conn.prepareCall(sql);
  21. //绑三个参数(前二个是输入,后一个是输出)
  22. cstmt.setInt(1,100);
  23. cstmt.setInt(2,200);
  24. //注册一个输出参数,
  25. //其中Types.INTEGER表示SQL与JDBC之前的是映射类型
  26. cstmt.registerOutParameter(3,Types.INTEGER);
  27. //调用存储过程
  28. boolean flag = cstmt.execute();
  29. System.out.println("flag="+flag);
  30. //取得执行结果
  31. int sum = cstmt.getInt(3);
  32. System.out.println("sum="+sum);
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }finally{
  36. JdbcUtil.close(rs);
  37. JdbcUtil.close(cstmt);
  38. JdbcUtil.close(conn);
  39. }
  40. }
  41. }

2 事务的概念
  1)每种数据库都有事务的支持,但支持强度不同

2)以MySQL为例,

启动事务

start transaction;

提交事务

    commit;

回滚事务

    rollback;

3)在事务范围内回滚是允许的,但如果commit后再回滚,无效  
  4)其实每条SQL都有事务存在,只是显示还隐藏而言,默认都是隐藏事务

5)事务的操作,必须争对同一个Connection。

6)事务的操作,可以设置一个回滚点,便于回滚到最近的回滚点处。

当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:

JDBC控制事务语句

•Connection.setAutoCommit(false);

•Connection.rollback();

•Connection.commit();

设置事务回滚点

•Savepoint sp = conn.setSavepoint();

•Conn.rollback(sp);

•Conn.commit(); //回滚后必须要提交

3 事务的特性

1)原子性(A)事务是的各个操作是一个不可分割的子操作。必须将其看成一个整体,即原子操作

2)一致性(C)事务前后,由一个一致状态转移到另一个一致状态

*3)隔离性(I)事务中,每个线程操作同张表同记录时,相互分割

4)持久性(D)事务一旦生效,在没有操作该记录时情况下,永远保持不变

*4 三个缺点(违背隔离性)

   1)脏读:一个线程看到了另一个线程未提交的数据,叫脏读

2)不可重复读:一个线程多次做查询操作,多次结果都不一致,叫不可重复读

上述二项,强调的是查询,内容变,但数量不变

3)幻读/虚读:

上述一项,强调的是插入,数量变

*5 事务的隔离级别(解药)

*static int TRANSACTION_READ_COMMITTED

指示不可以发生脏读的常量;不可重复读和虚读可以发生。

*static int TRANSACTION_REPEATABLE_READ

指示不可以发生脏读和不可重复读的常量;虚读可以发生。

static int TRANSACTION_SERIALIZABLE

指示不可以发生脏读、不可重复读和虚读的常量。

不可重复读

 

read uncommitted

read committed

repeatable read

serializable

脏读  

解决

解决

解决

不可重复读    

解决

解决

幻读/虚读      

解决

总结:

    项目中,对于select操作不需要事务,对于其它操作(update/delete/insert)操作需要事务。

  1. package cn.itcast.web.jdbc.dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.Savepoint;
  7. import cn.itcast.web.jdbc.util.JdbcUtil;
  8.  
  9. //JDBC显示操作事务的API
  10. public class Demo2 {
  11. public static void main(String[] args) {
  12. Connection conn = null;
  13. PreparedStatement pstmt = null;
  14. ResultSet rs = null;
  15. String sqlA = "update account set salary=salary-1000 where name='aaa'";
  16. String sqlB = "update account set salary=salary+1000 where name='bbb'";
  17. String sqlC = "insert into account(name,salary) values('ccc',3000)";
  18. Savepoint sp = null;
  19. try {
  20. conn = JdbcUtil.getMySqlConnection();
  21. //设置事务显示手工提交
  22. conn.setAutoCommit(false);
  23. //NO1
  24. pstmt = conn.prepareStatement(sqlA);
  25. pstmt.executeUpdate();
  26. //NO2
  27. pstmt = conn.prepareStatement(sqlB);
  28. pstmt.executeUpdate();
  29. //设置一个回滚点
  30. sp = conn.setSavepoint();
  31. Integer.parseInt("abc");
  32. //NO3
  33. pstmt = conn.prepareStatement(sqlC);
  34. pstmt.executeUpdate();
  35. //设置事务手工提交
  36. conn.commit();
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. try {
  40. //事务回滚,默认情况下,回滚到事务开始之前的状态
  41. conn.rollback(sp);
  42. conn.commit();
  43. } catch (Exception e1) {
  44. }
  45. }finally{
  46. JdbcUtil.close(rs);
  47. JdbcUtil.close(pstmt);
  48. JdbcUtil.close(conn);
  49. }
  50. }
  51. }
  1. package cn.itcast.web.jdbc.dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import cn.itcast.web.jdbc.util.JdbcUtil;
  8.  
  9. //JDBC设置事务的隔离级别
  10. public class Demo3 {
  11. //我(serializable)先执行
  12. public static void main(String[] args) {
  13. Connection conn = null;
  14. PreparedStatement pstmt = null;
  15. ResultSet rs = null;
  16. String sql = "select * from account";
  17. try {
  18. conn = JdbcUtil.getMySqlConnection();
  19. //设置事务的隔离级别
  20. conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
  21. conn.setAutoCommit(false);
  22. pstmt = conn.prepareStatement(sql);
  23. rs = pstmt.executeQuery();
  24. //休息
  25. Thread.sleep(20*1000);
  26. conn.commit();
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. try {
  30. conn.rollback();
  31. conn.commit();
  32. } catch (Exception e1) {
  33. }
  34. }finally{
  35. JdbcUtil.close(rs);
  36. JdbcUtil.close(pstmt);
  37. JdbcUtil.close(conn);
  38. }
  39. }
  40. }

*6 转帐案例
   1)参见图<<转帐各类的交互图示>>

2)项目中,事务可能在dao层,也可能在service层,不论在哪一层,都必须确保使用的都是同一个connection

   3)为了确保在Service和Dao层中用到的Connection一致,你可以使用如下方案解决:

a)将Service中的Connection传入Dao中

设计缺点:

Service和Dao代码过分藕合

在Service中引用了非业务逻辑操作

b)将JdbcUtil类中的Connection作成单例/态

c)使用ThreadLocale<Connection>将每个线程和自已的Connection绑定在一起,每个线程修改自已的Connection,

          不会影响其它线程的Connection

4)在分层结构中,关闭Connection会推迟到Service层,但一定要关闭Connection对象

  1. <%@ page language="java" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4. <body>
  5. <form action="/day14/TransferServlet" method="post">
  6. <table border="1" align="center">
  7. <caption>转帐</caption>
  8. <tr>
  9. <th>转出帐号</th>
  10. <td><input type="text" name="sid"/></td>
  11. </tr>
  12. <tr>
  13. <th>转入帐号</th>
  14. <td><input type="text" name="tid"/></td>
  15. </tr>
  16. <tr>
  17. <th>金额</th>
  18. <td><input type="text" name="money"/></td>
  19. </tr>
  20. <tr>
  21. <td colspan="2" align="center">
  22. <input type="submit" value="转帐"/>
  23. </td>
  24. </tr>
  25. </table>
  26. </form>
  27. </body>
  28. </html>
  1. package cn.itcast.web.jdbc.domain;
  2.  
  3. //帐户
  4. public class Account {
  5. private int id;//帐号
  6. private String name;//用户名
  7. private float salary;//薪水
  8. public Account(){}
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public float getSalary() {
  22. return salary;
  23. }
  24. public void setSalary(float salary) {
  25. this.salary = salary;
  26. }
  27. }
  1. package cn.itcast.web.jdbc.dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import cn.itcast.web.jdbc.domain.Account;
  8. import cn.itcast.web.jdbc.util.JdbcUtil;
  9.  
  10. public class TransferDao {
  11. //根据ID号查询帐户
  12. public Account findAccountById(int id) throws SQLException{
  13. Account account = null;
  14. Connection conn = null;
  15. PreparedStatement pstmt = null;
  16. ResultSet rs = null;
  17. String sql = "select * from account where id = ?";
  18. try {
  19. conn = JdbcUtil.getMySqlConnection();
  20. pstmt = conn.prepareStatement(sql);
  21. pstmt.setInt(1,id);
  22. rs = pstmt.executeQuery();
  23. if(rs.next()){
  24. account = new Account();
  25. account.setId(id);
  26. account.setName(rs.getString("name"));
  27. account.setSalary(rs.getFloat("salary"));
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }finally{
  32. JdbcUtil.close(rs);
  33. JdbcUtil.close(pstmt);
  34. //JdbcUtil.close(conn);
  35. }
  36. return account;
  37. }
  38. //根据ID号更新帐户
  39. public void updateAccountById(Account newAccount) throws SQLException{
  40. Connection conn = null;
  41. PreparedStatement pstmt = null;
  42. ResultSet rs = null;
  43. String sql = "update account set salary = ? where id = ?";
  44. try {
  45. conn = JdbcUtil.getMySqlConnection();//conn=123
  46. pstmt = conn.prepareStatement(sql);
  47. pstmt.setFloat(1,newAccount.getSalary());
  48. pstmt.setInt(2,newAccount.getId());
  49. pstmt.executeUpdate();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }finally{
  53. JdbcUtil.close(rs);
  54. JdbcUtil.close(pstmt);
  55. //JdbcUtil.close(conn);
  56. }
  57. }
  58. }
  1. package cn.itcast.web.jdbc.service;
  2.  
  3. import cn.itcast.web.jdbc.dao.TransferDao;
  4. import cn.itcast.web.jdbc.domain.Account;
  5. import cn.itcast.web.jdbc.exception.NoAccountException;
  6. import cn.itcast.web.jdbc.exception.NoMoneyException;
  7. import cn.itcast.web.jdbc.util.JdbcUtil;
  8.  
  9. public class TransferService {
  10. //转帐
  11. public void transfer(int sid,int tid,float money) throws Exception{
  12. //NO1:判段转入和转出帐号是否存在
  13. TransferDao transferDao = new TransferDao();
  14. Account sAccount = transferDao.findAccountById(sid);
  15. Account tAccount = transferDao.findAccountById(tid);
  16. if(sAccount!=null && tAccount!=null){
  17. //NO2:判段转出帐号是否有足够的余额
  18. if(sAccount.getSalary()-money >= 0){
  19. //进行转帐操作
  20. sAccount.setSalary(sAccount.getSalary() - money);
  21. tAccount.setSalary(tAccount.getSalary() + money);
  22. try {
  23. //事务开始
  24. JdbcUtil.begin();//conn=123
  25. transferDao.updateAccountById(sAccount);
  26. //int i = 10/0;
  27. transferDao.updateAccountById(tAccount);
  28. //事务提交
  29. JdbcUtil.commit();
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. try {
  33. //事务回滚
  34. JdbcUtil.rollback();
  35. //事务提交
  36. JdbcUtil.commit();
  37. } catch (Exception e1) {
  38. }
  39. throw e;
  40. }finally{
  41. //关闭Connection对象
  42. JdbcUtil.closeConnection();
  43. }
  44. }
  45. }
  46. }
  47. //取款
  48. public void withdraw(int sid, float money)throws Exception{
  49. TransferDao transferDao = new TransferDao();
  50. Account sAccount = transferDao.findAccountById(sid);
  51. if(sAccount!=null){
  52. if(sAccount.getSalary()-money >= 0){
  53. sAccount.setSalary(sAccount.getSalary() - money);
  54. try {
  55. transferDao.updateAccountById(sAccount);
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }finally{
  59. JdbcUtil.closeConnection();
  60. }
  61. }else{
  62. throw new NoMoneyException();
  63. }
  64. }else{
  65. throw new NoAccountException();
  66. }
  67. }
  68. }
  1. package cn.itcast.web.jdbc.web;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import cn.itcast.web.jdbc.exception.NoAccountException;
  9. import cn.itcast.web.jdbc.exception.NoMoneyException;
  10. import cn.itcast.web.jdbc.service.TransferService;
  11.  
  12. public class TransferServlet extends HttpServlet {
  13. private void withdraw(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  14. try {
  15. int sid = Integer.parseInt(request.getParameter("sid"));
  16. float money = Float.parseFloat(request.getParameter("money"));
  17. TransferService transferService = new TransferService();
  18. transferService.withdraw(sid,money);
  19. request.setAttribute("message","交易成功,请取款");
  20. }catch(NoMoneyException e){
  21. e.printStackTrace();
  22. request.setAttribute("message","帐号余额不足,不能交易");
  23. }catch(NoAccountException e){
  24. e.printStackTrace();
  25. request.setAttribute("message","帐号输入错误,请重试");
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. request.setAttribute("message","交易失败,请重试");
  29. }
  30. request.getRequestDispatcher("/message.jsp").forward(request,response);
  31. }
  32. public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  33. String method = request.getParameter("method");
  34. if(method!=null && method.equals("withdraw")){
  35. this.withdraw(request,response);
  36. return;
  37. }
  38. try {
  39. int sid = Integer.parseInt(request.getParameter("sid"));
  40. int tid = Integer.parseInt(request.getParameter("tid"));
  41. float money = Float.parseFloat(request.getParameter("money"));
  42. TransferService transferService = new TransferService();
  43. transferService.transfer(sid,tid,money);
  44. //转帐成功
  45. request.setAttribute("message","转帐成功");
  46. } catch (Exception e) {
  47. //转帐失败
  48. request.setAttribute("message","转帐成功");
  49. }
  50. request.getRequestDispatcher("/message.jsp").forward(request,response);
  51. }
  52. }

7 关于异常的处理
   1)关于分层结构中,处理异常的规则,参见<<关于异常的处理规则.JPG>>

2)异常在项目中,往往替代boolean值,作为成功与否的标志

*8 连接池

   1)传统方式找DriverManager要连接,数目是有限的。 
   2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行

3)项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式。

4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口

5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包

•commons-dbcp.jar:连接池的实现

•commons-pool.jar:连接池实现的依赖类

•commons-collections.jar :连接池实现的集合类

*6)C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时

     会自动在指定的目录下找xml文件,并加载默认设置

7)重构JdbcUtil类

  1. package cn.itcast.web.jdbc.datasource;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.SQLException;
  5. import cn.itcast.web.jdbc.util.JdbcUtil3;
  6.  
  7. //测试传统方式取得连接的时间和个数
  8. public class Demo1 {
  9. public static void main(String[] args) throws SQLException {
  10. long begin = System.currentTimeMillis();
  11. for(int i=1;i<=5000;i++){
  12. Connection conn = JdbcUtil3.getMySqlConnection();
  13. if(conn!=null){
  14. System.out.println(i+":取得连接");
  15. }
  16. JdbcUtil3.close(conn);
  17. }
  18. long end = System.currentTimeMillis();
  19. System.out.println("共用" + (end-begin)/1000+"秒");
  20. }
  21. }
  1. package cn.itcast.web.jdbc.datasource;
  2.  
  3. import java.io.InputStream;
  4. import java.sql.Connection;
  5. import java.util.Properties;
  6.  
  7. import javax.sql.DataSource;
  8.  
  9. import org.apache.commons.dbcp.BasicDataSourceFactory;
  10.  
  11. //测试连接池DBCP的用法
  12. public class Demo2 {
  13. public static void main(String[] args) throws Exception {
  14. long begin = System.currentTimeMillis();
  15. //加载属性文件
  16. InputStream is = Demo2.class.getClassLoader().getResourceAsStream("cn/itcast/web/jdbc/config/dbcp.properties");
  17. Properties props = new Properties();
  18. props.load(is);
  19. //创建DBCP连接池工厂
  20. BasicDataSourceFactory factory = new BasicDataSourceFactory();
  21. //创建数据源,即连接池
  22. DataSource ds = factory.createDataSource(props);
  23. for(int i=1;i<=50000;i++){
  24. //从连接池中取得一个空闲的连接对象
  25. Connection conn = ds.getConnection();
  26. if(conn!=null){
  27. System.out.println(i+":取得连接");
  28. }
  29. //将连接对象还回给连接池
  30. conn.close();
  31. }
  32. long end = System.currentTimeMillis();
  33. System.out.println("共用" + (end-begin)/1000+"秒");
  34. }
  35. }
  1. driverClassName=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://127.0.0.1:3306/mydb2
  3. username=root
  4. password=root
  1. package cn.itcast.web.jdbc.datasource;
  2.  
  3. import java.sql.Connection;
  4. import com.mchange.v2.c3p0.ComboPooledDataSource;
  5.  
  6. //测试连接池C3P0的用法
  7. public class Demo3 {
  8. public static void main(String[] args) throws Exception {
  9. long begin = System.currentTimeMillis();
  10. //创建C3P0连接池
  11. ComboPooledDataSource dataSource = new ComboPooledDataSource();
  12. for(int i=1;i<=100000;i++){
  13. Connection conn = dataSource.getConnection();
  14. if(conn!=null){
  15. System.out.println(i+":取得连接");
  16. conn.close();
  17. }
  18. }
  19. long end = System.currentTimeMillis();
  20. System.out.println("共用" + (end-begin)/1000+"秒");
  21. }
  22. }

存储过程 务的概念 事务的特性 关于异常的处理 连接池 构JdbcUtil类的更多相关文章

  1. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析

    把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...

  2. 连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况: 连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持 ...

  3. Mybatis连接池及事务

    一:Mybatis连接池 我们在学习WEB技术的时候肯定接触过许多连接池,比如C3P0.dbcp.druid,但是我们今天说的mybatis中也有连接池技术,可是它采用的是自己内部实现了一个连接池技术 ...

  4. 【概念原理】四种SQL事务隔离级别和事务ACID特性

    摘要: SQL事务隔离级别和事务的ACID特性 事务是一组读写操作,并且具有只有所有操作都成功才算成功的特性.   事务隔离级别 SQL事务隔离级别由弱到强分别是:READ_UNCOMMITTED.R ...

  5. 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

    数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...

  6. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  7. MySQL数据库事务及其特性

    一.事务概念 事务就是一个程序执行单元,里面的操作要么都做,要么都不做. 二.事务特性 事务有四个非常重要的特性(ACID): 原子性(Atomicity):事务是不可分割的整体,所有操作要么全做,要 ...

  8. 事务、事务特性、事务隔离级别、spring事务传播特性

    事务.事务特性.事务隔离级别.spring事务传播特性   1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功, ...

  9. 什么是事务、事务特性、事务隔离级别、spring事务传播特性

    1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...

随机推荐

  1. L010-oldboy-mysql-dba-lesson10

    L010-oldboy-mysql-dba-lesson10 来自为知笔记(Wiz)

  2. Angularjs在线编辑器

    1.TextAngular: https://github.com/fraywing/textAngular textAngular是一个强大的Text-Editor/Wysiwyg 编辑器,用于An ...

  3. ng-src作用

    ... <ul class="phones"> <li ng-repeat="phone in $ctrl.phones | filter:$ctrl. ...

  4. javascript实现URL不缓存的方法

    <script> document.write("<s"+"cript type='text/javascript' src='/js/test.js? ...

  5. ComboBox Control Messages 消息

    连接到MSDN,有时间完善这个.具体说明可点击进入msdn CB_ADDSTRING 添加一个字符串组合框的列表框.如果组合框没有cbs_sort风格,字符串添加到列表的结尾.否则,该字符串插入列表, ...

  6. Javacript 客户端保存数据[ locaStorage ]

    1.通常程序员们会使用Cookie进行一些小量的数据储存在客户端浏览器,但孰不知这样会造成不必要的带宽浪费 ,可使用 js 中的 locaStorage 来替代cookie进行存储,但不支持IE8以下 ...

  7. ios播放声音中断后台音乐的问题

      今天遇到一个ios播放声音中断后台音乐的问题,在我的app中如果调用AVAudioSession 播放完声音,后台的qq音乐偶尔不能恢复,而网易云音乐一次都不能恢复播放,研究了一下AVAudioS ...

  8. SVN 提交必填备注Commit

    操作方法:在SVN的Repositories下,找到要配置的项目,在项目目录下找到hooks文件夹,在其下创建pre-commit.bat文件,把下面复制进去就可以了(无需重启,如果改动,保存bat文 ...

  9. Windows 7下载

    原版的ISO:windows 7 旗舰版:32位: ed2k://|file|cn_windows_7_ultimate_x86_dvd_x15-65907.iso|2604238848|D6F139 ...

  10. 一个 XSD 实例

    一个 XSD 实例 本节会为您演示如何编写一个 XML Schema.您还将学习到编写 schema 的不同方法. XML 文档 让我们看看这个名为 "shiporder.xml" ...