- 查看防火墙状态: firewall-cmd --state
- service firewall start|stop|restart
- 端口管理:
1 | firewall-cmd --permanent --add-port=8080-8085/tcp |
- 启用防火墙设置:firewall-cmd reload
- firewall-cmd --permanent --list-ports
- firewall-cmd --permanent --list-services
1 | firewall-cmd --permanent --add-port=8080-8085/tcp |
[toc]
Java8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口
1 | Predicate<T>——接收T对象并返回boolean |
参考:http://note.youdao.com/noteshare?id=3bc7675e64b86f5e9b75534c0e436694
1 | objectName::instanceMethod |
构造器引用语法如下:ClassName::new,把lambda表达式的参数当成ClassName构造器的参数 。例如BigDecimal::new等同于x->new BigDecimal(x)
stream就是JAVA8提供给我们的对于元素集合统一、快速、并行操作的一种方式。
它能充分运用多核的优势,以及配合lambda表达式、链式结构对集合等进行许多有用的操作
1 | List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6); |
http://kotlinlang.org/
https://try.kotlinlang.org/#/Examples/Hello, world!/Simplest version/Simplest version.kt
Kotlin作者Andrey
Kotlin是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源
Kotlin是一种运行在Java虚拟机、Android、浏览器上的静态语言
Kotlin可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。
Android官方语言;100%兼容Java;Kotlin-js前端开发;Kotlin-jvm服务端开发;Kotlin-native本地执行程序;Kotlin是一门全栈语言
千里之行,始于Hello World
Kotlin不存在拆箱装箱问题;Kotlin不可隐式转换类型
var tmp:[类型]=[变量值]
Boolean类型
Number数据类型:Byte,Short,Int,Long,Float,Double
Char数据类型:Char
String数据类型:String 字符串a==b 比较内容;a===b比较应用 字符串模版$args1 args1+args2,引号中引用变量 ,多行
var a:String …
a1
a2
…
Kotlin中 Any 等于 Java中 Object,是顶级类
空类型:任意类型都有可空和不可空两种状态,?表示可为空,!!表示强制认定nullable不可为空
fun main(args:Array
var name:String = getName() ?: return
println(name)
var tmp:String? = "Hello Kotlin"
println(tmp)
println(tmp!!.length)
}
fun getName():String?{
return null
}
智能类型转换
Java方式的:var sub:Subclass = parent as Subclass //类似于Java方式,转换异常则会抛异常
安全类型转换:var sub:Subclass? = parent as? Subclass //如果转换失败,则返回null,不抛异常
if(parent is Subclass)
import com.test as test
区间Range:一个数学上的概念,表示范围;是ClosedRange的子类,IntRange最常用;i in 0…1024 判断i是否在区间内
var range:IntRange = 0…1024 //[0,1024]
var range:IntRange = 0 until 1024 //[0,1024) == [0,1023]
className::java.class.name
className::java.class.simpleName
数组: val array:Array<> = arrayOf(…)
为了避免不必要的拆箱和装箱,基本类型的数组是定制的
val arrayOfInt:IntArray = intArrayOf(1,2,4)
val arrayOfChar:CharArray = charArrayOf(‘H’,‘e’,‘y’)
val arrayOfString: Array
val arrayOfOther:Array
常量:val,常量因为赋值了,编译器可以推导出来类型,所以类型可以不用写,变量:var
External Tools
Tools->Kotlin->Show Kotlin Bytecode
函数:Kotlin中没有申明返回值的默认返回值是Unit
kotlinc安装,使用和javac一样
变量函数
var int2Long = fun(x:Int):Long{
return x.toLong()
}
int2Long(123)
fun sum(arg1:Int,arg2:Int) = arg1+arg2
Lambda表达式调用使用()或者invoke(),如:sum(1,2) 或 sum.invoke(1,2)
Lambda表达式–匿名函数
var = {arg1:Int,arg2:Int -> arg1+arg2}
arrayOfString.forEach { println(it) } //如果字面函数只有一个参数,可以省略该参数声明,并用“it”代替
arrayOfString.forEach(::println)
Lambda表达式中的return
https://www.jianshu.com/p/92cd94cba709?utm_source=oschina-app
public inline fun
for (element in this) action(element)
}
indexes.forEach {
if (it > 5) {
return@forEach
}
println(it)
}
indexes.forEach label@ {
if (it > 5) {
return @label
}
println(it)
}
函数参数调用时最后一个Lambda可以移出去
函数参数只有一个Lambda,调用时小括号可以省略
Lambda有一个参数,可默认为it
入参、返回值与形参一致的函数可以用函数引用的方式作为实参传入
类成员方法和成员变量
class B
class A{
var b=0;
lateinit var c:String
val d:B by lazy{
B()
}
}
属性初始化
中缀表达式:只有一个参数,且用infix修饰的函数
class Book {infix fun on(placeString:String){…}}
Book() on “My Desk” //使用方式
分支表达式:
val mode=if(args.isNotEmpty() && args[0] ==1){
0
}else{
1
}
异常捕捉
try …catch …finally中的执行完之后,再返回结果,可通过var获取返回值
具名参数:sum(arg1=2,arg0=3) //参数就可以不按照顺序传递了
变长参数:如main方法中的args
fun test(vararg args:String){}
默认参数:给出参数默认值
导出可执行程序
kotlin应用场景:
kotlin-android
1 | 1. JSP文件中的元素可分为5类: |
https://www.imooc.com/video/16358
https://www.imooc.com/learn/1058
https://www.imooc.com/video/16783
SpringBoot2.0: 编程语言Java 8+,Kotlin,底层框架:SpringFramework 5.0.X,支持Web Flux
Web Flux
SpringBoot优势:
1 | <parent> |
1 | spring-boot-starter-web 模块,包括了Tomcat和Spring MVC的依赖 |
1 | spring-boot-starter-test 测试模块,包括JUnit、Hamcrest、Mockito |
com.student.id=6228
com.student.name=lily
com.student.desc=${name} id is ${random.int}
1 | * 定义属性对应类需要添加@Component注解,让spring在启动的时候扫描到该类,并添加到spring容器中 |
@Component
public class Student {
@Value("com.student.id")privateintid;@Value("{com.student.name}")
private String name;
@Value("${com.student.desc}")
private String desc;
}
1 | 2. 使用@ConfigurationProperties(prefix="") 设置前缀,属性上不需要添加注解 |
@Component
@ConfigurationProperties(prefix = “com.student”)
public class Student {
private int id;
private String name;
private String desc;
}
1 | 使用: |
@Autowired
private Student student;
1 | ## 属性配置优先级 |
application-dev.properties //开发环境的配置文件
application-test.properties //测试环境的配置文件
application-prod.properties //生产环境的配置文件
1 | 在application.properties/在application.yml中设置spring.profiles.active的值为{profile}(dev/test/prod)来启用不同的配置属性 |
//优先级由高到低
classpath:/META-INF/resources
classpath:/resources
classpath:/static
classpath:/public
1 | 可以通过修改spring.mvc.static-path-pattern来修改默认的映射,例如我改成/test/**,那运行的时候访问http://lcoalhost:8080/test/index.html |
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//将所有/static/** 访问都映射到classpath:/static/ 目录下
registry.addResourceHandler("/static/**").addResourceLocations(“classpath:/static/”);
}
}
1 |
|
1 | * Jpa 是利用 Hibernate 生成各种自动化的 sql,如果只是简单的增删改查,基本上不用手写了,Spring 内部已经帮大家封装实现了 |
1 |
|
dependency>
1 | * spring-boot-configuration-processor:spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,则需要依赖他,这样就可以在你的配置类开头加上@PropertySource("classpath:your.properties"),其余用法与加载yml的配置一样 |
@ConfigurationProperties(prefix = “spring.person”)
@Data
public class PersonProperties {
private String name;
private int age;
}
1 | 3. 核心服务类,如PersonService.java: |
public class PersonService {
private PersonProperties properties;
public PersonService() {}
public PersonService(PersonProperties properties) {
this.properties = properties;
}
public void sayHello(){
System.out.println("大家好,我叫: " + properties.getName() + “, 今年” + properties.getAge() + “岁”);
}
}
1 | 4. 自动配置类:一般每个starter都至少会有一个自动配置类,一般命名规则使用XxxAutoConfiguration,如:PersonServiceAutoConfiguration |
@Configuration
@EnableConfigurationProperties(PersonProperties.class)
@ConditionalOnClass(PersonService.class)
@ConditionalOnProperty(prefix = “spring.person”, value = “enabled”, matchIfMissing = true)
public class PersonServiceAutoConfiguration {
@Autowired
private PersonProperties properties;
@Bean
@ConditionalOnMissingBean(PersonService.class) // 当容器中没有指定Bean的情况下,自动配置PersonService类
public PersonService personService(){
PersonService personService = new PersonService(properties);
return personService;
}
}
1 | 所用注解说明: |
@ConditionalOnClass:当类路径classpath下有指定的类的情况下进行自动配置
@ConditionalOnMissingBean:当容器(Spring Context)中没有指定Bean的情况下进行自动配置
@ConditionalOnProperty(prefix = “example.service”, value = “enabled”, matchIfMissing = true),当配置文件中example.service.enabled=true时进行自动配置,如果没有设置此值就默认使用matchIfMissing对应的值
@ConditionalOnMissingBean,当Spring Context中不存在该Bean时。
@ConditionalOnBean:当容器(Spring Context)中有指定的Bean的条件下
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
@ConditionalOnWebApplication:当前项目是Web项目的条件下
@ConditionalOnResource:类路径下是否有指定的资源
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
@ConfigurationProperties: 主要用来把properties配置文件转化为对应的XxxProperties来使用的,并不会把该类放入到IOC容器中,想放入容器可通过@Component来标注或@EnableConfigurationProperties(XxxProperties.class)
@EnableConfigurationProperties(XxxProperties.class) 注解的作用是@ConfigurationProperties注解生效
1 | 5. src/main/resources/META-INF/spring.factories |
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.my.PersonServiceAutoConfiguration
1 | 6. 打包mvn clean install,生成starter的jar包 |
spring.person.name=jack
spring.person.age=28
1 | * 调用 |
@Autowired
private PersonService personService;
@Test
public void testHelloWorld() {
personService.sayHello();
}
# 其他SpringBoot学习资料
* http://www.ityouknow.com/springboot/2015/12/30/springboot-collect.html
拦截器功能:
重写WebMvcConfigurerAdapter中的addInterceptors方法把自定义的拦截器类添加进来即可简单的判断是否登录的使用
注解:
@SpringBootApplication是Sprnig Boot项目的核心注解,主要目的是开启自动配置
@RestController 这个注解相当于同时添加@Controller和@ResponseBody注解,用这个注解的类里面的方法都以json格式输出
@Component:让spring在启动的时候扫描到该类,并添加到spring容器中
@Bean:任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id
@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中
@Configuration:任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类
@ComponentScan:
* 自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中
* 可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描
* 所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages
@EnableAutoConfiguration:借助@Import的支持,收集和注册特定场景相关的bean定义
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器
[toc]
NW.js (原名 node-webkit)是一个基于 Chromium 和 node.js 的应用运行时,通过它可以用 HTML 和 JavaScript 编写原生应用程序。它还允许您从 DOM 调用 Node.js 的模块 ,实现了一个用所有 Web 技术来写原生应用程序的新的开发模式。
在package.json文件中设置
1 | title : 字符串,设置默认 title。 |
1 | { |
1 | NW.js app : 可以是当前项目目录,但要包含package.json文件. 或者是一个.nw的文件 |
https://www.jetbrains.com/help/webstorm/2017.1/run-debug-configuration-node-webkit.html
https://github.com/nwjs/nw.js/wiki/how-to-package-and-distribute-your-apps
问题:4中制作的文件太大
有些情况下,代码还是不能直接暴露给用户的;我们可以使用V8 Snapshot 的方式来达到代码加密保护的目的
具体的方式是:
前面介绍项目接口就提到 /app/v0.0.1/ 就是放置V0.0.1的所有代码的位置;
那么如果要更新到V0.0.2,那我们新建一个文件夹 /app/V0.0.2,然后把V0.0.2的代码都放到这个文件下,然后把/package.json替换成新版本的package.json;这样重启客户端之后,然会读取v0.0.2的代码了。具体的更新代码就不写了,可以把新版本的代码打包成zip包,然后客户端下载好,解压就行。
通常情况下,不会遇到需要更新nw.js 本身的情况,因为当选定一个版本的NW.js后,就认定它了,除非遇到了什么无法解决的BUG
ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,于2015年6月正式发布,也称ECMAScript 2015。
1 | 参考资料 |
ECMA是标准,js是实现
[toc]
目前ES5、ES6支持还可以,凑合;ES5、ES6逐渐沦为后台语言
在浏览器中使用需要用到编译工具,babel/traceur(由google出的编译器,把ES6语法编译成ES5)
1 | <script src="traceur.js"></script> |
1 | //test.js |
node test.js
定义后则不能修改
==反单引号==:==``==,内容模版,==${变量名}填充模版==
数组赋值为引用赋值,复制以前用for循环🔥 Array.from()函数,现在使用==超引用’…’==, var arr2 = […arr1]; 在函数中通过 …args 接收多个参数
以前是for或for in,现在:for of,支持数组、json、map
1 | //i表示数组或者json的值,for in中i是下标,for of中表示key+value,实质是jsonObj.entrys(),类似的还有jsonObj.keys()、jsonObj.values() |
get()\set()\delete()
注意事项
1 | function foo() { |
更多:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions
1 | //以前 |
1 | //以前面向对象 |
1 | //ES6面向对象 |
继承
1 | //以前 子类.prototype = new 父类(); |
当前使用模块化必须引入traceur和bootstrap,type必须写成module
1 | //定义 |
本身为一个对象,用来传递异步操作的数据
整体是链式操作
1 | pending(等待、处理中) ---> Resolve(完成) |
使用
1 | var p1 = new Promise(function(resolve,reject){ |
包含方法如下:
1 | 所有方法都支持链式编程 |
Generator:生成器,是一个函数,可以遍历
1 | //普通函数 |
for (let v of show()){
document.write(v);
}
1 |
|
myFunction(…iterableObj);
1 | 2. 用于数组字面量 |
[…iterableObj, 4, 5, 6]
ECMA-262文档下载:https://chetaofeng.github.io/pub-images/Ecma-262.pdf
[toc]
是 Ant Design 的 React 实现,开发和服务于企业级后台产品
dva 是一个基于 React 和 Redux 的轻量应用框架,概念来自 elm,支持 side effects、热替换、动态加载、react-native、SSR 等,已在生产环境广泛应用。
1 | npm install dva-cli -g |
在浏览器里打开 http://localhost:8000 ,你会看到 dva 的欢迎界面
使用 babel-plugin-import
1 | // .babelrc or babel-loader option |
然后只需从 antd 引入模块即可,无需单独引入样式。等同于下面手动引入的方式。
// babel-plugin-import 会帮助你加载 JS 和 CSS
import { DatePicker } from ‘antd’;
create-react-app 是业界最优秀的 React 应用开发工具之一
使用create-react-app只是创建出了react应用的基本架构,类似于dva-cli创建的架构,antd还是需要自己添加