======================================================================= Windows7 x64 跨平台开发环境安装配置 2013-6-16 ZhangLiang ======================================================================= 要求路径: 1) 所有开发包之根目录: %DEVPACK_HOME% = C:\DEVPACK 2) JDK 安装目录: %DEVPACK_HOME%\java 3) Maven 安装目录: %DEVPACK_HOME%\apache-maven-3.0.5 4) MinGW 安装目录: %DEVPACK_HOME%\MinGW 5) Android Dev Pack 安装目录: (tegra-devpack-1.0-windows-2012-05-09-12749879.exe) %DEVPACK_HOME%\NVPACK 6) Eclipse 安装目录: %DEVPACK_HOME%\juno ----------------------------------------------------------------------- JDK 6 ----------------------------------------------------------------------- 1) 下载 JDK 6: http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html jdk-6u45-windows-x64.exe 2) 解压至: %DEVPACK_HOME%\java 3) 配置环境变量 %JAVA_HOME% = %DEVPACK_HOME%\java %CLASSPATH% = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 增加 %JAVA_HOME%\bin 到 Path 环境变量 ($Path 表示 Path 原来的定义): Path=$Path;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin ----------------------------------------------------------------------- Maven 3 ----------------------------------------------------------------------- 1) 下载 Maven3.0.5: $ wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz 2) 解压: $ tar -zxf apache-maven-3.0.5-bin.tar.gz 3) 设置环境变量: 新建系统环境变量 M2_HOME M2_HOME = %DEVPACK_HOME%\apache-maven-3.0.5 增加 %M2_HOME%\bin 到 Path 环境变量: Path=$Path;%M2_HOME%\bin 4) 关闭后重新打开 cygwin, 验证: $ mvn -version Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 21:51:28+0800) Maven home: C:\DEVPACK\apache-maven-3.0.5 Java version: 1.6.0_24, vendor: Sun Microsystems Inc. Java home: C:\NVPACK\jdk1.6.0_24\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 7", version: "6.1", arch: "x86", family: "windows" ----------------------------------------------------------------------- Eclipse juno ----------------------------------------------------------------------- 1) 下载 eclipse-jee-juno-SR2-win32-x86_64.zip 2) 解压到: %DEVPACK_HOME%\java\eclipse 3) 安装 m2eclipse ----------------------------------------------------------------------- Android SDK and Tools ----------------------------------------------------------------------- 1) 下载: tegra-devpack-1.0-windows-2012-05-09-12749879.exe 2) 运行安装到: %DEVPACK_HOME%\NVPACK ----------------------------------------------------------------------- MinGW Installation ----------------------------------------------------------------------- 参考: http://blog.csdn.net/cheungmine/article/details/8918808
SQLHelper很好地体现了抽象和封装的思想,为了避免每次连接数据库时都要创建连接并实例化连接对象和得到连接对象,我用构造函数对conn进行初始化,并写了GetConn()函数,把重复的内容提取出来是重构的重要工作。
Imports System.Data.SqlClient Imports System.Configuration Public Class SQLHelper Private conn As SqlConnection Private cmd As SqlCommand Private sdr As SqlDataReader '构造函数 Sub New() 'Dim connStr As String = "Data Source=localhost;Initial Catalog=NewCharge;Persist Security Info=True;User ID=sa;Password=123456" Dim connstr As String = System.Configuration.ConfigurationManager.AppSettings("connStr") conn = New SqlClient.SqlConnection(connstr) End Sub Private Function GetConn() As SqlConnection If conn.State = ConnectionState.Closed Then conn.Open() Return conn Else Return conn End If End Function
因为在DAL层,每个类除了要进行数据库的访问,更多的是对数据库进行增删改查的操作,而每次都做重复的工作就造成代码的大量重复,实在不够专业,所以我们写完代码后往往要进行重构和优化。SQLHelper主要是用于简化重复的去写SqlConnection、SqlCommand、SqlDataReader等,它的应用就对整个DAL层进行了优化,原因在于每个类只要实例化一个sqlhelper对象就可以直接调用它了,而只需要给方法传入一些参数如SQL参数、存储过程等,极大地减少了代码量。
在SQLHelper中主要有四类,分别是
不带参数的sql增删改语句或存储过程(无返回行或值)
带参数的sql增删改语句或存储过程(无返回行或值)
不带参数的sql查询语句或存储过程,返回DataTable结果集(有返回行或值)
带参数的sql查询语句或存储过程,返回DataTable结果集(有返回行或值)
下面是我写的第一个不带参数的sql增删改语句
''' <summary> ''' 执行不带参数的sql增删改语句 ''' </summary> ''' <param name="sql">sql语句</param> ''' <returns></returns> ''' <remarks></remarks> Public Function ExecuteNonQuery(ByVal sql As String) As Boolean Dim conn = GetConn() Dim cmd As SqlCommand = New SqlCommand(sql, conn) If cmd.ExecuteNonQuery() > 0 Then conn.Close() Return True Else Return False End If End Function
事实上我们常使用的不只有sql语句,还包括存储过程。所以,sql语句变成了cmdText,而究竟是sql语句还是存储过程则要看cmdType,需要给函数增加一个参数。因此对该函数做如下重构
''' <summary> ''' 执行不带参数的sql增删改语句或存储过程 ''' </summary> ''' <param name="cmdtxt">增删改语句或存储过程</param> ''' <param name="cmdtype">命令类型文本或存储过程</param> ''' <returns>受影响的行数</returns> ''' <remarks></remarks> Public Function ExecuteNonQuery(ByVal cmdtxt As String, ByVal cmdtype As CommandType) As Integer Dim conn = GetConn() '定义并得到一个数据库连接对象 Dim cmd As SqlCommand = New SqlCommand(cmdtxt, conn) '定义一个命令对象 cmd.CommandType = cmdtype Dim res As Integer Try res = cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally If conn.State = ConnectionState.Open Then '关闭数据库连接 conn.Close() End If End Try Return res End Function
在第二个方法中我用到了异常处理Try…Catch语句,其实抛异常主要是在BLL层,这里没多大必要。
其余三个方法如下:
''' <summary> ''' 执行带参数的sql增删改语句或存储过程 ''' </summary> ''' <param name="cmdtext">增删改语句或存储过程</param> ''' <param name="cmdtype">命令类型文本或存储过程</param> ''' <param name="paras">参数数组</param> ''' <returns>受影响的行数</returns> ''' <remarks></remarks> Public Function ExecuteNonQuery(ByVal cmdtext As String, ByVal cmdtype As CommandType, ByVal paras As SqlParameter()) As Integer Dim conn = GetConn() Dim cmd As SqlCommand = New SqlCommand(cmdtext, conn) Dim res As Integer cmd.CommandType = cmdtype cmd.Parameters.AddRange(paras) Try res = cmd.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message, , "数据库操作") Finally If conn.State = ConnectionState.Open Then conn.Close() End If End Try Return res End Function ''' <summary> ''' 执行不带参数的sql查询语句或存储过程,返回DataTable结果集 ''' </summary> ''' <param name="cmdtext">sql查询语句或存储过程</param> ''' <param name="cmdtype">命令类型文本或存储过程</param> ''' <returns>返回DataTable结果集</returns> ''' <remarks></remarks> Public Function ExecuteQuery(ByVal cmdtext As String, ByVal cmdtype As CommandType) As DataTable Dim conn = GetConn() Dim cmd As SqlCommand = New SqlCommand(cmdtext, co
官网提供架构图
单看这个图呢,还木有说明,感觉有点蛋疼,作者的抽象度太高了,还好在前面已经大概分析过了执行流程
如图
- 左边是View视图,我们就理解html结构,换句话就是说用户能看到的界面,渲染页面,绑定事件,切换类名,什么脏活都揽
- 右边是ViewModel 视图模式,就是开发者通过avalon.define("xxx", function(vm){vm.firstName = "模型"})
- 既然是MVVM 那么还有个M跑哪里去了,M在MVVM定义中,M只是一个过客,被VM给再次包装,它与其他表示业务状态的东西融入VM(ViewModel)中,一个普通的JS对象,可能是后台传过来的,也可能是直接从VM中拿到 vm.firstName = "模型" 这个就是M咯,所以作者在图中就没体现出来吧
从定义ViewModel开始,扫描到vm关联的东东 形成访问器,好吧其实整个就这么简单
打开avalon源码,我们就看到这样的结构
(function(DOC) { 内部代码 })(document);
这种基本的结构虽然已经被写烂了 ,但是既然是分析就从来到位来一遍吧.
自调用匿名函数jquery为例
通过定义一个匿名函数,创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是一个JS框架必须支持的功能,jQuery被应用在成千上万的JavaScript程序中,必须确保jQuery创建的变量不能和导入他的程序所使用的变量发生冲突。
3. 匿名函数从语法上叫函数直接量,JavaScript语法需要包围匿名函数的括号,事实上自调用匿名函数有两种写法
写法1 (function() { console.info( this ); console.info( arguments ); }( window ) ); 写法2 (function() { console.info( this ); console.info( arguments ); })( window );
4.为什么要传入window呢?
通过传入window变量,使得window由全局变量变为局部变量,当在jQuery代码块中访问window时,不需要将作用域链回退到顶层作用域,这样可以更快的访问window;这还不是关键所在,更重要的是,将window作为参数传入,可以在压缩代码时进行优化,看看jquery-1.6.1.min.js:
(function(a,b){})(window); // window 被优化为 a
5.为什么要在在参数列表中增加undefined呢?
在 自调用匿名函数 的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值。
undefined = "now it's defined"; alert( undefined );
浏览器测试结果:
6.注意到源码最后的分号了吗?
分号是可选的,但省略分号并不是一个好的编程习惯;为了更好的兼容性和健壮性,请在每行代码后加上分号并养成习惯。
总体架构
按代码结构
(function(DOC) { //命名空间 avalon = function(el) { return new avalon.init(el); }; //avalon挂在工具函数 // 迷你jQuery对象的原型方法 //css操作相关的方法 //ecma262兼容补丁 //nextTick 高级定时器 //Observable 观察者模式 //Define 模型定义方法 //Parse 解析求值函数与执行作用域 //Scan 节点扫描 //Bind html自定义标签绑定处理方法 })(document);
整个结构基本如上
以后会分析具体的每个实现,源码分析尽量到行...