首页 文章 精选 留言 我的

精选列表

搜索[知识管理],共10000篇文章
优秀的个人博客,低调大师

DevOps知识点——3C知多少

CI / CD是任何DevOps操作的两大基石,这是一种开发软件的方式,旨在生产快速而强大的软件,随时以可持续的方式发布更新。 当例行更改代码时,开发周期会更加频繁、更有意义且更快速。通过此过程,我们可以确保只有已知良好的代码才能成为软件产品的一部分。 Continuous Integration,Continuous Delivery,Continuous Deployment,即持续集成、持续交付和持续部署构成DevOps的3C。在这篇文章中,将从以下几个方面阐述:传统集成、持续集成及过程、持续交付、持续部署、3C优势。 传统集成 传统集成时,团队没有任何类型的中央构建服务器。源代码可以存储在中央源代码存储库中,但是开发人员不必定期提交更改。在计划发布之前,开发人员可能会手动集成更改,这会导致许多问题,例如由于许多开发人员同时集成而带来的最后一刻的冲突,或者由于集成而导致的组件故障。 传统集成的某些缺点如下:开发人员不经常集成代码,导致最后一刻的隐患;反馈回路慢;由于需要修复许多组件而无法轻松解决问题;难以按时交付产品;高成本。为了克服这些问题,CI和CD应运而生,它们从技术角度和业务角度都具有许多优点。 持续集成Continuous Integration 持续集成是一种开发实践,要求开发人员每天多次将代码集成到共享存储库中,以避免代码冲突。 然后,每个签入均由自动构建进行验证,从而使团队可以及早发现问题。这使团队可以花更少的时间进行回溯,而将更多的时间用于构建新功能。 这里的概念是在一个项目上有多个开发人员,以将资源库的主分支保持为最新形式的源代码,因此每个开发人员都可以签出或者从最新的代码中提取,以避免发生冲突。 集成过程 开发人员在自己特定的分支中开发其功能,然后将其新分支推送到协作存储库中。 运行自动化的单元测试和集成测试,并将错误和其他代码质量问题通知团队。一旦自动测试通过,开发人员就会创建拉取请求。开发人员和审阅者可以直接对开发人员提交给主分支的更改发表评论。 完成评审过程并将新代码合并到主分支后,功能开发和错误修复周期将从集成的主分支继续运行。这在团队内(特别是每个人都在处理许多小任务的大型团队)通常会在一天内发生多次,这意味着每个人都在同一个通用代码库上工作。这样就大大减少了代码的差异以及功能开发人员彼此之间不同步而引起的相关问题。 持续交付Continuous Delivery 持续交付是一个更改代码会自动生成、自动测试并为发布到生产环境中做好准备的过程,软件可以在任何时候发布到生产环境中。 持续集成的代码提交将进一步进行性能和功能测试,直到批准发布为止。要有效执行持续交付,需要强大的持续集成。如果正确实施,开发人员将始终拥有已通过标准化测试过程的可部署的构建工件。 这个过程在开发人员提交代码时开始,在登台环境中完成测试后结束,以便代码可以部署到生产环境中。如果在自动测试过程中出现任何错误或Bug,CI工具将自动通过任意一种通知(如电子邮件或短信)告知开发人员。 持续交付通常涉及一个类似于生产的暂存区域,在将更改发布到生产之前,需要手动接受这些更改。 发布到生产环境的决策更多地是业务决策,而不是技术决策。 持续部署Continuous Deployment 持续部署与持续交付非常相似。二者唯一区别是,在持续部署中,所有通过自动化测试阶段的代码提交都将自动发布到生产环境中。 持续部署不需要在登台环境中进行任何手动测试,因为自动化测试将在发行版的所有阶段中执行。 这两种CD都依赖于实时基础设施配置和应用程序监视工具,用以在部署之前发现由于缺乏人工验证而在测试反馈循环中没有被找出的问题。 3C的优势 1、缓解风险 许多开发人员面临这样的问题:应用程序在本地环境可运行,但是在面对更高级可用性时无法运行。这是因为在本地环境和投入生产的地方可能存在很多不同之处。一些质量保证任务如浏览器测试,可以降低将Bug一直传播到活动站点的风险。 2、加快上市时间 持续集成、持续部署和持续交付的应用可以让团队更快地发现故障并快速修复,从而提高软件发布率,加快交付速度。 3、更改可追溯 所有团队成员必须使用相同的源存储库来维护其代码。很明显,可以看到代码库被进行了哪些更改以及由谁进行了更改。 4、提高代码覆盖率 CI服务器检查每一次构建的测试覆盖率。无论你在何处提交未经测试类的新代码,服务器都会显示错误,因为没有足够的代码覆盖率,因此开发人员将致力于增加低层级可用性的覆盖率,以便在部署到更高级的可用性时不会出现与代码覆盖率有关的问题。 5、质量:从优秀到卓越 CI有助于测试人员将项目总时间的50%用于运行集成的标称测试、查找Bug和其他细微问题。这使得测试团队能够更深入地研究问题,测试更多的场景,并产生更好的总体质量和结果。 6、更少的积压工作 将CI/CD纳入团队的开发过程中可以减少积压工作中非关键缺陷的数量。这些小缺陷会在生产前被检测出来,并在发布给最终用户之前被修复。 7、用户满意度 随着部署在连续的周期中运行,这将使团队能够跟踪项目并实时提供反馈,并在必要时修复团队中的缺点。通过一致的评审,新产品的开发将更加精细,并将更加符合终端用户的期望。 8、减少团队成员之间的摩擦 确保跨多个位置的多个开发人员工作的代码始终集成到一个公共存储库中。这避免了由于大量和冲突的代码提交而导致的混乱。 结论 在当今瞬息万变的竞争环境中,开发商正努力将他们的产品快速投放市场,如果没有一套简洁而合适的流程,几乎不可能发布高质量的代码。因而,转向持续集成和持续部署将极大地改变软件开发过程。它将简化整个过程,从而帮助团队提供更稳定、更安全、更优质的产品。 参考文献:Krishnagayathri Gopinath .Continuous Integration And Delivery [OL].(2020-04-27)https://dzone.com/articles/continuous-integration-and-delivery

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

Java虚拟机知识点-class文件

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙。当遇到需要占用8位字节以上的数据项时,会按照高位在前的方式分割成若干个8位字节进行存储。 ClassFile 结构说明magic:魔数。唯一作用是确定这个文件是否为一个能被虚拟机所接收的class文件。固定值:0xCAFEBABE。minor_version:class文件的副版本号。major_version:class文件的主版本号。constant_pool_count:常量池计数器。constant_pool[constant_pool_count]:常量池。包含字符串常量、类或接口名、字段名和其他常量。常量池每一项都具备相同特征,即第一个字节作为类型标记,用来确定该项格式。access_flags:访问标志。用于表示某个类或接口的访问权限及属性。this_class:当前的类索引。super_class:父类索引。interfaces_count:接口计数器。当前类或接口的直接超的接口数量。interfaces[interfaces_count]:接口表。fields_count:字段计数器。当前class文件的字段成员个数。fields[fields_count]:字段表。methods_count:方法计数器。方法的个数。methods[methods_count]:方法表。attributes_count:属性计数器。属性个数。attributes[attributes_count]:属性表。一个例子对下面的类进行编译生成 Test2.class 。 public class Test2 { public static int i = 1; public static void main() { System.out.println(i); } }通过十六进制查看工具打开 Test2.class 。 根据 ClassFile 结构说明,前面4个字节是魔数oxcafebabe。接下来是次版本号和主版本号ox0000和ox0034,十进制为0和52,52表示JDK1.8,所以JDK版本是1.8.0。 还可以使用Java自带的反编译工具来解析字节码文件。命令 javap -v Test2.class 。 Classfile /E:/CODE/JVM/Test2.class Last modified 2019-7-19; size 219 bytes MD5 checksum 841c66674d71005bc6a97fe6c3b0fb1d Compiled from "Test2.java"public class Test2 minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool: #1 = Methodref #4.#13 // java/lang/Object."":()V #2 = Fieldref #3.#14 // Test2.i:I #3 = Class #15 // Test2 #4 = Class #16 // java/lang/Object #5 = Utf8 i #6 = Utf8 I #7 = Utf8 #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 SourceFile #12 = Utf8 Test2.java #13 = NameAndType #7:#8 // "":()V #14 = NameAndType #5:#6 // i:I #15 = Utf8 Test2 #16 = Utf8 java/lang/Object{ public int i; descriptor: I flags: ACC_PUBLIC public Test2(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_1 6: putfield #2 // Field i:I 9: return LineNumberTable: line 1: 0 line 2: 4 }SourceFile: "Test2.java"Java虚拟机限制每个类或接口的常量池最多65535个。类或接口中可声明的字段数最多65535个。类或接口中可声明的方法数最多65535个。类或接口的直接父类接口最多65535个。方法调用时创建的栈帧,其局部变量表中的最大局部变量数位65535个。方法帧中操作数栈的最大深度为65535。方法的参数最多255个。字段和方法名称、字段和方法描述符以及其他常量字符串值的最大长度为65535个字符。数组的维度最大为255维。喜欢这篇文章的可以给笔者点个赞同,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

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

Android进阶知识:事件分发与滑动冲突(一)

1、前言 Android学习一段时间,需求做多了必然会遇到滑动冲突问题,比如在一个ScrollView中要嵌套一个地图View,这时候触摸移动地图或者放大缩小地图就会变得不太准确甚至没有反应,这就是遇到了滑动冲突,ScrollView中上下滑动与地图的触摸手势发生冲突。想要解决滑动冲突就不得不提到Android的事件分发机制,只有吃透了事件分发,才能对滑动冲突的解决得心应手。 2、事件分发机制相关方法 Android事件分发机制主要相关方法有以下三个: 事件分发:public boolean dispatchTouchEvent(MotionEvent ev) 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev) 事件响应:public boolean onTouchEvent(M

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

Android进阶知识:事件分发与滑动冲突(二)

接着看代码块3,在这段很长的代码里,首先一个if中判断了该事件是否满足没有被拦截和被取消,之后第二个if判断了事件类型是否为DOWN,满足了没有被拦截和取消的DOWN事件,接下来ViewGroup才会循环其子View找到点击事件在其内部并且能够接受该事件的子View,再通过调用dispatchTransformedTouchEvent方法将事件分发给该子View处理,返回true说明子View成功消费事件,于是调用addTouchTarget方法,方法中通过TouchTarget.obtain方法获得一个包含这View的TouchTarget节点并将其添加到链表头,并将已经分发的标记设置为true。 接下来看代码块4: // Dispatch to touch targets.//走到这里说明在循环遍历所有子View后没有找到接受该

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

App推广运营必备知识:App渠道统计

一、App渠道统计对于App推广运营的重要性(理解App渠道统计重要性的老司机,请直接移步到第二部分) App服务的竞争重点已经由功能竞争转向市场和运营的竞争,而App的推广与运营离不开App渠道统计的支持。 当前App功能的开发似乎已经不存在太多的技术门槛,比如:抖音和今日头条,能开发出这两款App的公司很多,但字节跳动之所以能取得超乎先行者的巨大成功,就是源于其强大的App推广和运营能力。 优秀的App推广和运营,需要优秀的App渠道统计进行渠道评估和分析。 就App的渠道推广而言,没有专业、优秀的方法对渠道推广效果进行精确统计,不知道各个渠道投入带来的真实用户激活量,App推广就会陷入形同“盲人骑瞎马,夜半临深池”的境地。 所以说,App推广和运营人员,必须熟知App渠道统计的各种工具方法,并据此对App渠道推广的效果做出准确的分析和

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

Python 知识点: 列表推导式(list comprehension)

Python里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension ,有人把它翻译成“列表推导式”,也有人翻译成“列表解析式”。名字听上去很难理解,但是看它的语法就很清晰了。虽然名字叫做 list comprehension,但是这个语法同样适用于dict、set等这一系列可迭代(iterable)数据结构。 语法规范:out_list = [out_express for out_express in input_list if out_express_condition] 其中的 if 条件判断根据需要可有可无。 下面看一个具体的例子,生成一个包含10以内的偶数的list: In [1]: evens = [i for i in range(10) if i % 2 == 0] In [2]: evens Out[2]: [0, 2, 4, 6, 8] 由for循环升级到列表推导式:在没有了解list comprehension之前,上面那个生成偶数list的通常做法是用for循环: evens = [] for i in range(10): if i % 2 == 0: evens.append(i) 很明显,for循环占用了4行代码,而 list comprehension 只用了1行代码。 文章开始说到推导式的语法规范时,我们讲了if表达式是可有可无的,这也符合我们编程遇到的实际情况。比如,要生成一个10以内的整数的平方的列表: squares = [i**2 for i in range(10)] 复杂的嵌套循环我们先来看一个例子,把一个矩阵(以列表为元素的列表)展平为一个列表。首先,我们用for循环来实现一下: matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ] flattened = [] for row in matrix: for i in row: flattened.append(i) 接着我们用列表推导式实现该功能: flattened = [i for row in matrix for i in row] 还是一行代码就搞定,但一行里面有两个for,看起来很乱,两个for,哪个在前哪个在后呢?只要记住他们的顺序和不用推导式的原始for循环是一致的即可。 推导式的可读性一行代码搞定几行代码的事情,看上去很简洁,但是读起来很费劲,尤其是当条件语句很长的时候,把这一行代码变得很长,超过了代码规范规定的长度(一般是80个字符),也使得理解代码变得困难。 面对一行长长的代码该如何下口读,如何理解呢?别着急,好在Python允许在中括号、花括号之间断行: 列表推导式的断行: 断行前: evens = [i for i in range(10) if i % 2 == 0] 断行后: evens = [ i for i in range(10) if i % 2 == 0 ] 带嵌套循环的推导式的断行: 断行前: flattened = [i for row in matrix for i in row]断行后: flattened = [ i for row in matrix for i in row ] 字典(dict)和集合(set)的推导式:前面我们也提到过,推导式不仅仅适用于列表,它同样使用于字典dict和集合set。 把一个字典的key和value互换: changed = {value: key for key, value in input_dict.items()} 用``` 一个列表的所有单词的首字母生成一个集合: chars = {w[0] for w in words_list}通` 过以上讲解就可以轻松掌握Python的列表推导式(list comprehension)了,简而言之,就是把普通的多行for循环压缩成一行代码,这种压缩语法适用于列表、字典、集合等可迭代数据结构(iterables)。 有关Python技术文章优先发布在我的个人博客:猿人学公众号:猿人学Pyhton

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

JVM知识总结-运行时区域划分

区域简介 JVM运行时区域有些随着虚拟机进程的启动而存在,有些依赖于用户线程的启动和结束而建立和销毁,大致分为以下几类:方法区,虚拟机栈,本地方法栈,堆,程序计数器,概念图如下(源于《深入理解JAVA虚拟机-JVM高级特性》): 程序计数器 当前线程所执行的字节码的行号指示器,是一块各个线程私有的内存,每个线程都有一个独立的程序计数器; 如果线程执行的是一个JAVA方法,计数器记录的是虚拟机字节码指令的地址,如果执行的是一个Native方法,计数器值为空(Undefined); 唯一一个在JVM规范中没有规定任何OOM情况的区域; 虚拟机栈 线程私有,每个线程执行时会创建一个栈桢(Stack Frame),包括局部变量表、操作数栈、动态链接、方法出口等信息,一个方法的调用过程对应着一个栈桢在虚拟机栈中的入栈和出栈操作; 局部变量表:存放了编译期可知的各种基本数据类型(byte、short、char、int、long、float、double、boolean),对象引用(reference),returnAddress类型(指向了一条字节码指令的地址),64位的long和double占用两个Slot(局部变量空间),其他占用一个,局部变量表所需空间在编译期就确定; JVM规范中这个区域有两种异常情况,如果线程请求的栈深度大于虚拟机所允许的深度--抛出StackOverflowError,如果虚拟机栈可动态扩展但扩展时申请的内存无法满足--抛出OutOfMerroyError; 本地方法栈 与虚拟机栈作用类似,区别在于本地方法栈用于执行Native方法,JVM规范并未对此区域的实现做强制规定,具体的虚拟机可自由实现,此区域也会抛出StackOverflowError和OutOfMerroyError; 堆 所有线程共享的区域,几乎所有的对象实例都在这里分配内存,之所以是几乎,是因为JIT的优化技术已经使得部分对象实例不必在堆上分配; 从内存分配的角度看,堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer),目的是为了更好回收内存或更快的分配内存; 逻辑上连续,物理上可以不连续; 当堆中没有足够的内存完成对象实例的分配,且无法再扩展,会抛出OOM; 方法区 线程共享区域,用于存储已被虚拟机加载的类信息、常量、静态变量、JIT产生的代码等数据; HotSpot将永久代(Permanent Generation)作为方法区的实现,但本质上与方法区并不等价; 不需要连续的内存,可扩展,可以选择不实现垃圾收集(GC只是hotspot在此区域实现的功能),当无法满足内存分配需求时,会抛出OOM; 运行时常量池:Class文件中的常量池--用于存放编译期生成的各种字面量和符号引用--将在类加载后进入方法区的运行时常量池,除此之外还会把翻译出来的直接引用也存入,相对于Class文件常量池的特征是动态性,运行期间也可以将新的常量放入,如String.intern(); 直接内存 此区域并不在JVM区域划分范围中,但这部分也可能会抛出OOM,NIO可以通过Native函数库直接分配堆外内存并通过DirectByteBuffer对象对这块内存进行操作,因为避免了数据在Native堆和Java堆之间的复制从而提高性能;

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

Android 开发小知识点收集(随时更新)

1、获取手机运行时最大可占用内存 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); Log.d("TAG", "Max memory is " + maxMemory + "KB"); 2、改变dialog 在不同窗口内显示不同的大小 //在dialog.show()之后调用 public static void setDialogWindowAttr(Dialog dlg,Context ctx){ Window window = dlg.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); lp.gravity = Gravity.CENTER; lp.width = LayoutParams.MATH_PARENT;//宽高可设置具体大小 lp.height = LayoutParams.MATH_PARENT; dlg.getWindow().setAttributes(lp); } 摘抄自:简书——MrRock 3、监听Activity是否显示在用户面前 @Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); } 当Activity展示咋用户面前则 hasFocus 为 true; 4、成员变量与局部变量的区别(简写:成、局) 1)、类中位置不同:成:类内 局: 方法内伙子方法上; 2)、内存中位置不同:成:栈内存 局:堆内存; 3)、生命周期不同:成:与对象共存亡 局:与方法共存亡; 4)、初始化值不同:成:有默认值 局:无默认值,必须赋值。 5、Java 获取可变的 uuid uuid 类似于时间戳 永远不可重复。 String uuid = UUID.randomUUID().toString().replaceAll("-", ""); 6、Android 获取 WiFi 的 ssid 1)、在 AndroidManifest.xml 文件内添加权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 2)、需要获取的位置添加如下代码 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); Logger.d("wifiInfo"+wifiInfo.toString()); Logger.d("SSID"+wifiInfo.getSSID()); 3)、若不是想获取当前连接,而是想获取WIFI设置中的连接 WifiManager.getConfiguredNetworks() 4)、若获取更多的信息请查看这位兄嘚的博客:Android连续获取当前所连接WiFi及周围热点列表信息的解决方案 . 7、Android 打开 WiFi 设置界面 1)、判断手机是否连接wifi if (ConnectionDetector.getConnectionType(this) != ConnectionDetector.WIFI) { //跳转wifi配置界面 goToWifSetting(); } else { //wifi已经连接 } 代码如下: Intent intent = new Intent(); if(android.os.Build.VERSION.SDK_INT >= 11){ //Honeycomb intent .setClassName("com.android.settings", "com.android.settings.Settings$WifiSettingsActivity"); }else{ //other versions intent .setClassName("com.android.settings", "com.android.settings.wifi.WifiSettings"); } startActivity(intent); 或者 if (android.os.Build.VERSION.SDK_INT > 10) { // 3.0以上打开设置界面,也可以直接用ACTION_WIRELESS_SETTINGS打开到wifi界面 startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS)); } else { startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)); } 8、Android 8.0 获取 wifi 的 ssid 之前用上面6的方法可以完美的获取wifif设备的 ssid 但是不能显示 ssid 即用户名 ConnectivityManager manager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); assert manager != null; NetworkInfo info = manager.getActiveNetworkInfo(); if (info != null && info.isConnected()) { String wifiSsid = info.getExtraInfo().substring(1, info.getExtraInfo().length() - 1).trim(); }

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

JavaScript_知识点梳理note1

参考文献《JavaWeb 从入门到精通》 1.JavaScript的语法 JavaScript区分大小写 每行结尾的分号可有可无 变量是弱类型的 在定义变量时,只使用var运算符就可以将变量初始化为任意的值。 例如:(将变量name初始化为Bob,变量age初始化为20) var name = "mrsoft"; var age = 20; 使用大括号标记代码块 与Java语言相同,JavaScript也是使用一对大括号标记代码块,被封装在打括号内的语句将顺序执行。 注释 单行注释和多行注释。 2.JavaScript的关键字 3.JavaScript的数据类型 "数符布转空未定" 3.1.数值型(整型,浮点型) **整型** 729 //表示十进制的729 071 //表示八进制的71 0x9405B //表示十六进制的9405B **浮点型** 3.1415926 //采用标准方法表示 1.6E3 //采用科学记数法表示,代表1.6*10³ 3.2.字符型 单引号字符型变量以及双引号字符型变量 'a' '保护环境从我做起' "b" "系统公告:" 3.3.布尔值 布尔值即只有true跟false两个值,在JavaScript中可以用 整数0表示false; 非0的整数表示true; 3.4.转义字符 demo: 使用\r转义符: <script language="javascript" > alert("九霄天云剑,\r 浩然穷碧瑶。"); </script> 运行结果: 3.5.空值 JavaScript中有一个空值(null),用于定义空的或不存在的引用; 试图引用一个没有定义的变量,则返回一个null值。 空值不等于空字符串("")或者0; 因为空值是不存在,而空字符串("")或者0有实际的意义。 3.6.未定义值 4.运算符 4.1.赋值运算符 4.2.算术运算符 4.3.比较运算字符 4.4.逻辑运算字符 4.5.条件云算符 即三目运算符,语法格式如下: 操作数?结果1:结果2 Demo: var a=26; var b=60; var m=a>b?a:b //m的值为60 4.6.字符串运算符 字符串运算符是用于两个字符型数据之间的运算符,除了比较运算符之外,还可以是+和+=运算符。Demo: <script language="javascript"> var a="One " + "world "; a+="One Dream" alert(a); </script> 运行结果: 5.流程控制语句 5.1.if条件判断语句Demo:(用if语句验证用户登录信息) CSS文件: <!-- body{ FONT-SIZE: 9pt; margin-left:0px; SCROLLBAR-FACE-COLOR: #346633; SCROLLBAR-HIGHLIGHT-COLOR: #ffffff; SCROLLBAR-SHADOW-COLOR: #fcfcfc; COLOR: #000000; SCROLLBAR-3DLIGHT-COLOR: #ececec; SCROLLBAR-ARROW-COLOR: #ffffff; SCROLLBAR-TRACK-COLOR: #ececec; SCROLLBAR-DARKSHADOW-COLOR: #999966; BACKGROUND-COLOR: #fcfcfc } a:hover { font-size: 9pt; color: #FF6600; } a { font-size: 9pt; text-decoration: none; color: #676767; noline:expression(this.onfocus=this.blur); } td{ font-size: 9pt; color: #000000; padding-left:5px; } .btn_grey { font-family: "宋体"; font-size: 9pt;color: #333333; background-color: #eeeeee;cursor: hand;padding:1px;height:19px; border-top: 1px solid #FFFFFF;border-right:1px solid #666666; border-bottom: 1px solid #666666;border-left: 1px solid #FFFFFF; } input{ font-family: "宋体"; font-size: 9pt; color: #333333; border: 1px solid #999999; } hr{ border-style:solid; height:1px; color:#CCCCCC; } --> html文件: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <link href="style.css" rel="stylesheet"> <script language="javascript"> function check(){ if(form1.user.value==""){ //判断用户名是否为空 alert("请输入用户名!");form1.user.focus();return; }else if(form1.pwd.value==""){ //判断密码是否为空 alert("请输入密码!");form1.pwd.focus();return; }else{ form1.submit(); //提交表单 } } </script> </head> <body> <center> <form name="form1" method="post" action=""> <table width="221" border="1" cellspacing="0" cellpadding="0" bordercolor="#FFFFFF" bordercolordark="#CCCCCC" bordercolorlight="#FFFFFF"> <tr> <td height="30" colspan="2" bgcolor="#eeeeee">用户登录</td> </tr> <tr> <td width="59" height="30">用户名:</td> <td width="162"><input name="user" type="text" id="user"></td> </tr> <tr> <td height="30">密&nbsp;&nbsp;码:</td> <td><input name="pwd" type="text" id="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> </center> </body> </html> 运行结果: 5.2.switch多分支语句 Demo: <script language="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; default: week="星期日"; break; } document.write("今天是"+week); //输出中文的星期 </script> 运行结果: image.png 5.3.for循环语句5.4.while循环语句5.5.do...while循环语句5.6.break与continue语句 6.函数 基本语法如下: function functionName([parameter 1, parameter 2,...]){ statements; [return expression;] } 7.Window对象的open()方法 Demo: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script> function openWin(){ myWindow=window.open("","","width=531,height=402,top=50,left=20"); myWindow.document.write("<p>这是'我的窗口'</p>"); myWindow.focus(); } function openWin1(){ window.open("","","width=531,height=402,top=50,left=20"); } </script> </head> <body> <input type="button" value="打开窗口1" onclick="openWin()" /> <input type="button" value="打开窗口2" onclick="openWin1()" /> <input type="button" value="警告" onclick="window.alert('警告窗口');" /> <input type="button" value="打开窗口3" onclick="window.open("","","width=531,height=402,top=50,left=20");" /> </body> </html> 运行结果: image.png 注意区分四个按钮的代码表达,其中前三个按钮可以正常执行逻辑,但最后一个按钮不可 !

资源下载

更多资源
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文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册