定义

定义和图就免了,直接上代码。

多数网上关于观察者模式的文章的代码都是类似这样的:

// 观察者接口
interface Observer {
    public void update();
}

// 被观察者接口
interface Subject {
    public void attach(Observer observer);
    public void detach(Observer observer);
    public void notify();
}

// 观察者实现
class ConcreteObserver implements Observer {
    @Override
    public void update() {
		...
    }
}

//被观察者实现
class ConcreteSubject implements Subject {
    List<Observer> observers = new ArrayList<Observer>();

    @Override
    void attach(Observer observer) {
		observers.add(observer);
    }

    @Override
    void detach(Observer observer) {
		observers.remove(observer);
    }

    @Override
    void notify() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

客户端代码:

// 创建被观察者
ConcreteSubject subject1 = new ConcreteSubject();
ConcreteSubject subject2 = new ConcreteSubject();
ConcreteSubject subject3 = new ConcreteSubject();
// 创建观察者
Observer observer1 = new ConcreteObserver();
Observer observer2 = new ConcreteObserver();

// 进行观察
subject1.attach(observer1);
subject2.attach(observer1);
subject1.attach(observer2);
subject3.attach(observer2);

// 被观察者行为改变,发出通知
subject1.doSomething();
subject1.notify();
subject2.doSomething();
subject2.notify();
subject3.doSomething();
subject3.notify();

问题1

观察者模式的关键要素有那些?或如何识别/使用观察者模式?

直接指出关键要素有点困难,那就先看看哪些不是必须的吧。

  1. Subject接口是必需的吗?删除它,然后在运行客户端代码。仍然可以。
  2. 必须使用聚合的Observer吗,这要看业务了。
  3. actachdetach方法也不是必需的,完全可以使用getset,或则使用 Ioc 注入等。 只要能向被观察者注册/反注册就可以了。
  4. 观察者的实现也可以移动到业务/客户端代码中。

最后剩下的代码是这样的:

// 观察者接口
interface Observer {
    public void update();
}

// 被观察者实现
class ConcreteSubject {
    @Override
    void notify() {
        observer.update();
    }
}

观察者模式关键要素:

  1. 定义所有观察者的契约(即接口);
  2. 被观察者通知观察者进行处理,也可以说回调观察者的接口函数。

问题2

在提出问题2前,先在简化代码中增加另外的观察者接口,如下:

interface Observer1 {
    public void preUpdate();
}

interface Observer2 {
    public void updating();
}

interface Observer3 {
    public void updated();
}

class ConcreteSubject {
    @Override
    void notify() {
		...
        observer.preUpdate();
		...
        observer.updating();
		...
        observer.updated();
		...
    }
}

如果做过JavaSwing开发的,是不是觉得很像事件监听器。

问题3

将代码变形一下:

interface Observer {
    public void update();
}

class ConcreteSubject {
    @Override
    void notify() {
        Observer observer = new Observer() {
            @Override
            void update() {
				...
            }
        }
        observer.update()
    }
}

如果做过javascript开发的,是不是觉得很像回调函数。

问题4

函数式编程中的观察者模式。

还是先上代码:

def notify(do):
    do()

def update():
    print("function")

notify(update)
// TODO

最后的问题

到底观察者模式长啥样?

// TODO

模式不应死记硬背,而要灵活运用。不能为了模式而模式。

模式的背后是面向对象。

面向对象为的是松耦合,降低各个对象/模块间的依赖。

参考

Read More

Info

JavaMail 是 Java 语言封装了邮件协议包括 POP、SMTP以及IMAP 的接口,是属于 J2EE 的一部分。 通过使用 JavaMail API 可以完成邮件系统中的各种功能,例如收发邮件、邮件服务器开发等等。

相关 jar 包的介绍与关系

  • activation.jar包 : 是JavaMail依赖的基础,所有实现Java Mail API接口的都需要此包(Java6已包含)。
  • javax.mail-api.jar包 : Java Mail API接口包,只定义了接口,没有实现。
  • javax.mail.jar包 : JavaMail官网提供的实现Java Mail API接口的包。
  • mail.jar包 : 同javax.mail.jar包(版本较javax.mail.jar包低)。
  • commons-email.jar包 : 对JavaMail中发送邮件进行再封装(不含收取邮件),使用更简单,依赖于mail.jar包。
  • 其他 : JavaMail官网中还提供了其他邮件协议的实现,如:GIMAP等。

Install

Maven

相关邮件协议介绍

Usage

// TODO

参考

Read More

Info

Install

Fedora/CentOS

针对 Fedora 和 CentOS 7 之前的版本。 如果安装了docker(此docker非本文所指的docker) ,需要先卸载:

sudo yum -y remove docker

安装docker

# 本文所指的 docker 的安装包为 docker-io
sudo yum -y install docker-io
# CentOS7 安装包已改名为 docker
sudo yum -y install docker

启动docker进程(需要先启动才能进行相关操作)

# Fedora
sudo systemctl start docker
# CentOS
sudo service docker start

设置开机自启

# Fedora
sudo systemctl enable docker
# CentOS
sudo chkconfig docker on

用户授权

sudo usermod -a -G docker <username>

Ubuntu

Windows

常用命令

直接输入docker返回所有的可用命令。 或则使用man查找帮助。

docker run

选项:

  • -t
  • -i
  • -d : 让 Docker 容器在后台以守护态(Daemonized)形式运行。
  • -p : 指定容器端口绑定到主机端口,可以使用多次配置多个端口。
  • -P : 随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
  • –name : 命名容器
  • –link : 将父/子容器连接起来。在容器之间打开一个安全连接隧道而不需要暴露任何端口。
  • -v : 给容器内添加一个数据卷/挂载本地目录,可以使用多次配置多个数据卷。
  • –volumes-from : 挂载其他容器上的数据卷,可以使用多次配置多个。

docker images

docker start

doker stop

docker ps

docker port

docker logs

docker commit

docker tag

docker top

docker build

docker attach

进入容器进行操作

docker import/export

docker save/load

Dockerfile

docker-registry(私有仓库)


参考

Read More

Info

Logstash 是一个应用程序日志、事件的传输、处理、管理和搜索的平台。 你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计。

Logstash 现在是 ElasticSearch 家族成员之一。 Logstash 本身提供了强大的存储、查询和分析日志的功能(实际是嵌入了 ElasticSearch 和 Kibana)。但当配 ElasticSearch(后端数据存储) 和 Kibana(前端展示) 使用时,它做的就是传输日志的苦事。

下图(来至1.3.*前的官方文档)展示 Logstash、ElasticSearch 和 Kibana(Web Interface) 的关系。

这里主要使用了 redis 的 list data type,然后通过 BLPOP 来取出消息,shipper 会把消息传递到 redis 的 list 中,然后通过 indexer 从 redis 中取出消息,再导入导 ElasticSearch 中或者直接 stdout。 因此,redis 只是作为了传递者的角色,本身并不存储数据。

Logstash 本身没有分 shipper 以及 indexer 的,这两种角色只是配置不同。

Required

  • jre 7+
  • 必需指定 JAVA_HOME

Install

下载并解压

curl -O https://download.elasticsearch.org/logstash/logstash/logstash-{logstash_version}.tar.gz
tar -zxvf logstash-{logstash_version}.tar.gz

运行

cd logstash-{logstash_version}
bin/logstash -e 'input { stdin { } } output { stdout {} }'

上面例子,使用的是标准输入/输出。

或则通过配置文件启动

bin/logstash -f my.conf

其中 my.conf 文件内容为 'input { stdin { } } output { stdout {} }'

Configuring

配置文件的结构

Logstash 的配置文件一般如下:

# 这是注释
# 下面是配置内容
input {
	# 从哪里获取日志
  	...
}

filter {
	# 对获取的日志进行处理
	...
}

output {
	# 将处理后的日志输出至哪
	...
}

配置文件分3部分,每部分都可以配置一个或多个 Plugins(插件),并通过 Plugins 来完成所需功能。 其中可以没有 filter 部分,并且 filter 部分的插件是按配置时的顺序执行的。

Plugins

Logstash 提供了很多插件来完成不同的功能。 同时我们可以开发自己的插件(详见官方文档)来完成特定的功能。

常用插件:

Input Plugins

  • stdin: 从标准输入中获取日志
  • file: 从文件中获取日志
  • syslog
  • eventlog: 从window日志中获取日志
  • redis: 从redis中获取日志

filter Plugins

  • grok: 解析和结构化日志信息(从日志信息中提取有用的信息,如: Filed)。help to build patterns
  • date: 解析日期
  • drop: 丢弃特定的日志记录
  • mutate
  • clone
  • multiline: 处理多行日志

Output Plugins

  • stdout: 将日志输出至标准输出
  • elasticsearch: 将日志输出至elasticsearch
  • file: 将日志输出至文件
  • redis: 将日志输出至redis

Codec Plugins

  • plain
  • json
  • rubydebug
  • multiline: 多行处理

其中 Codec Plugins 用于如何展示数据的,它是可以在 Input Plugins 和 Output Plugins 中使用。

Filed(属性)

Logstash 将日志记录解析成多个 Filed 。 可以通过 Plugins 定义 Filed。 可以在配置文件中通过[filedname][top-level field][nested field]方式引用 Filed 。

Conditionals(条件语句)

The conditional syntax is:

if EXPRESSION {
  ...
} else if EXPRESSION {
  ...
} else {
  ...
}

You can use the following comparison operators:

  • equality: ==, !=, <, >, <=, >=
  • regexp: =~, !~
  • inclusion: in, not in

The supported boolean operators are:

  • and, or, nand, xor

The supported unary operators are:

  • !

参考

Read More

Ioc

//TODO

context:annotation-config

//TODO

web mvc

请求处理流程

DispatcherServlet –> HandlerMapping –> DispatcherServlet –> HandlerAdapter –> Handler(Controller) –> HandlerAdapter(ModelAndView) –> DispatcherServlet(ModelAndView) –> ViewResolver –> DispatcherServlet –> View

  • HandlerMapping 接口的实现类: SimpleUrlHandlerMapping,DefaultAnnotationHandlerMapping;
  • HandlerAdapter 接口的实现类: AnnotationMethodHandlerAdapter;
  • Controller 接口: 添加了 @Controller 注解的类就可以担任控制器的职责;
  • ViewResolver 接口的实现类: UrlBaseViewResolver,InternalResourceViewResolver(加入了JSTL的支持);
  • View 接口: JstlView;
  • 其他相关接口/类: HandlerInterceptor(拦截器),LocalResolver(本地化解析),ThemeResolver(主题解析),MultipartResolver(文件上传解析),HandlerExceptionResolver(异常处理,实现类:SimpleMappingExceptionResolver),ModelAndView,RequestToViewNameTranslator,FlashMapManager;

DispatcherServlet

前置控制器,是一个Servlet,配置在web.xml文中。 主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

  1. 文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
  2. 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
  3. 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
  4. 通过ViewResolver解析逻辑视图名到具体视图实现;
  5. 本地化解析;
  6. 渲染具体的视图等;
  7. 如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

DispatcherServlet中各个接口的默认Bean实现信息配置在org.springframework.web.servlet包中的DispatcherServlet.properties文件里。

配置

web.xml 中声明 DispatcherServlet

<servlet>
	<servlet-name>chapter2</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>chapter2</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。

DispatcherServlet也可以配置自己的初始化参数,覆盖默认配置:

contextClass: 实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。 如果这个参数没有指定, 默认使用XmlWebApplicationContext。

contextConfigLocation: 传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。 这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。

namespace: WebApplicationContext命名空间。默认值是[server-name]-servlet。

因此我们可以添加初始化参数,如下:

<servlet>
	<servlet-name>springServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring-mvc.xml
			/WEB-INF/spring-service.xml
			/WEB-INF/spring-data.xml
			/WEB-INF/spring-security.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>springServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

web.xml 中配置上下文载入器(旧版Servlet2.3容器使用ContextLoaderListener)

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
	  classpath:spring-common-config.xml,
	  classpath:spring-budget-config.xml
  </param-value>
</context-param>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

如上配置是Spring集成Web环境的通用配置;一般用于加载除Web层的Bean(如DAO、Service等),以便于与其他任何Web框架集成。 contextConfigLocation:表示用于加载Bean的配置文件; contextClass:表示用于加载Bean的ApplicationContext实现类,默认WebApplicationContext。

控制器

2.5之后 spring 默认推荐使用注解,而不再使用”接口继承”去实现控制器.

相关注解

  • @Controller : 用于定义controller类;
  • @RequestMapping : 请求到controller功能方法的映射规则;
  • @RequestParam : 请求参数到controller功能处理方法参数上的绑定;
  • @ModelAttribute : 请求参数到命令对象的绑定;
  • @SessionAttributes : 用于声明session级别存储的属性,放置在controller类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
  • @InitBinder : 自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
  • @CookieValue : cookie数据到controller功能处理方法参数上的绑定;
  • @RequestHeader : 请求头(header)数据到controller功能处理方法参数上的绑定;
  • @RequestBody : 请求的body体的绑定(通过HttpMessageConverter进行类型转换);
  • @ResponseBody : controller功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
  • @ResponseStatus : 定义controller功能处理方法/异常controller返回的状态码和原因;
  • @ExceptionHandler : 注解式声明异常controller;
  • @PathVariable : 将URI模板中的变量绑定到controller功能处理方法的参数上,从而支持RESTful架构风格的URI;
  • @MatrixVairable;

新的 HandlerMapping 和 HandlerAdapter

Spring 3.1 使用新的 @Contoller 和 @RequestMapping 注解支持类:处理器映射 RequestMappingHandlerMapping 和处理器适配器 RequestMappingHandlerAdapter 组合来代替 Spring2.5 开始的处理器映射 DefaultAnnotationHandlerMapping 和处理器适配器 AnnotationMethodHandlerAdapter.

相关配置

<context:component-scan>: 扫描并注入组件(@Service,@Repository,@Component)/Bean/控制器等

<mvc:annotation-driven />: 相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,是spring MVC为@Controllers分发请求所必须的。 并提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。

<mvc:interceptors/>:

<mvc:default-servlet-handler/>: 找不到的请求映射到默认的servlet

<mvc:resources />(spring3.0.4提供):

拦截器

常见应用场景

  • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
  • 权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
  • 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
  • OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

接口

HandlerInterceptor

  • preHandle 方法: 调用Controller前;
  • postHandle 方法: 渲染视图前;
  • afterCompletion 方法: 渲染视图完毕,且 preHandler 返回 true;

拦截器适配器

HandlerInterceptorAdapter

配置

  • 方式1
<mvc:interceptors>
	<bean class="com.app.mvc.MyInteceptor" />
</mvc:interceptors>
  • 方式2
<mvc:interceptors >
	<mvc:interceptor>
		<mvc:mapping path="/user/*" />
		<bean class="com.mvc.MyInteceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>
  • 方式3
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
	<property name="interceptors">
		<list>
			<ref bean="handlerInterceptor1"/>
			<ref bean="handlerInterceptor2"/>
			...
			<ref bean="handlerInterceptorn"/>
		</list>
	</property>
</bean>

异常处理

视图


Read More

1. info

项目主页:http://webmagic.io/

2. vs Scrapy

2.1. Selector

两个框架都有Selector对象,不同在于,WebMagic返回的是Selectable对象,而Scrapy返回的是SelectorList可迭代对象.

开始使用Scrapy时还不是很理解为什返回可迭代对象的,当使用WebMagic爬取表格时,发现它只能按列爬取,而不能按行爬取,当需要对行进行再处理时,WebMagic就显得很麻烦了. 而因为Scrapy返回的时可迭代对象,所以是可以按行进行处理的.

// WebMagic 只能一列一列处理
Page.getHtml.xpath("//tr/td[1]")
Page.getHtml.xpath("//tr/td[2]")

// Scrapy 能一行一行处理
trs = response.xpath("//tr")
for tr in trs:
	tr.xpath("td")
	...

WebMagic 0.5.2 已经多了个Selectable.nodes()方法,可以返回可迭代的对象了.但仍然有些错误存在.

2.2.


A. 参考

Read More

1. Info

HttpComponents 也就是以前的httpclient项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议。 不过现在的 HttpComponents 包含多个子项目,有:

  • HttpComponents Core
  • HttpComponents Client
  • HttpComponents AsyncClient
  • Commons HttpClient

以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页

  • 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
  • 支持自动转向
  • 支持 HTTPS 协议
  • 支持代理服务器等
  • 支持Cookie

2. 安装

使用Maven管理

<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>${httpcomponents.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpmime</artifactId>
	<version>${httpcomponents.version}</version>
</dependency>

3. 使用

3.1 基本使用

略。。。

3.2 Fluent方式

HttpClient在4.2版本开始增加了Fluent方式来使用,使代码更简洁。

URI uri = URI.create("http://www.sina.com");
Request request = Request.Post(uri).bodyForm(
		Form.form().add("username", "zhangsan")
			.add("pasword", "pwd")
			.build());
request.addHeader("User-Agent", "Ahopedog/5.0 (Linux NT 5.1; rv:5.0) Gecko/20100101 FireDog/5.0");
request.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");

参考

Read More

1. Info

项目主页:Commons-Lang :

Commons项目中用来处理Java基本对象方法的工具类包,可以简化很多平时经常要用到的写法,例如判断字符串是否为空等等。

3.0 开始jar改为Commons-lang3

2. 结构

3.0 之前共有如下8个包:

  • org.apache.commons.lang 主要是一些高度重用的Util类;
  • org.apache.commons.lang.builder 包含了一组用于产生每个Java类中都常使用到的toString()、hashCode()、equals()、compareTo()等等方法的构造器;
  • org.apache.commons.lang.enum 已不建议使用;
  • org.apache.commons.lang.enums 代替 lang.enum 包,用于处理枚举;
  • org.apache.commons.lang.exception 用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能;
  • org.apache.commons.lang.math 用于处理数字;
  • org.apache.commons.lang.mutable 于包装值型变量;
  • org.apache.commons.lang.reflect Accumulates common high-level uses of the java.lang.reflect APIs.
  • org.apache.commons.lang.text Provides classes for handling and manipulating text, partly as an extension to java.text.
  • org.apache.commons.lang.time 提供处理日期和时间的功能。

3.0 增加如下包:

3. 常用类

  • ArrayUtils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;
  • BitField – 用于操作位元,提供了一些方便而安全的方法;
  • BooleanUtils – 用于操作和转换boolean或者Boolean及相应的数组;
  • CharEncoding – 包含了Java环境支持的字符编码,提供是否支持某种编码的判断;
  • CharRange – 用于设定字符范围并做相应检查;
  • CharSet – 用于设定一组字符作为范围并做相应检查;
  • CharSetUtils – 用于操作CharSet;
  • CharUtils – 用于操作char值和Character对象;
  • ClassUtils – 用于对Java类的操作,不使用反射;
  • ObjectUtils – 用于操作Java对象,提供null安全的访问和其他一些功能;
  • RandomStringUtils – 用于生成随机的字符串;
  • SerializationUtils – 用于处理对象序列化,提供比一般Java序列化更高级的处理能力;
  • StringEscapeUtils – 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码;
  • StringUtils – 处理String的核心类,提供了相当多的功能;
  • SystemUtils – 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断;
  • Validate – 提供验证的操作,有点类似assert断言;
  • WordUtils – 用于处理单词大小写、换行等。
  • HashCodeBuilder – 用于辅助实现Object.hashCode()方法;
  • Fraction - 处理分数的类;
  • NumberUtils - 处理数值的类;
  • DateFormatUtils – 提供格式化日期和时间的功能及相关常量;
  • DateUtils – 在Calendar和Date的基础上提供更方便的访问;
  • DurationFormatUtils – 提供格式化时间跨度的功能及相关常量;
  • FastDateFormat – 为java.text.SimpleDateFormat提供一个的线程安全的替代类;
  • StopWatch – 是一个方便的计时器。

4. 类详细说明

4.1. StringUtils

  • IsEmpty/IsBlank - 检查字符串是否包含文本
  • Trim/Strip - 移除首/尾的空格(Trim移除字符编码小于等于32的字符)
  • Equals - 比较两个字符串(null-safe)
  • startsWith - check if a String starts with a prefix null-safe
  • endsWith - check if a String ends with a suffix null-safe
  • IndexOf/LastIndexOf/Contains - null-safe index-of checks
  • IndexOfAny/LastIndexOfAny/IndexOfAnyBut/LastIndexOfAnyBut - index-of any of a set of Strings
  • ContainsOnly/ContainsNone/ContainsAny - does String contains only/none/any of these characters
  • Substring/Left/Right/Mid - null-safe substring extractions
  • SubstringBefore/SubstringAfter/SubstringBetween - substring extraction relative to other strings
  • Split/Join - splits a String into an array of substrings and vice versa
  • Remove/Delete - removes part of a String
  • Replace/Overlay - Searches a String and replaces one String with another
  • Chomp/Chop - removes the last part of a String
  • AppendIfMissing - 向字符串添加后缀字符,如果后缀不存在
  • PrependIfMissing - 向字符串添加前缀字符,如果前缀不存在
  • LeftPad/RightPad/Center/Repeat - 使用指定字符串填充
  • UpperCase/LowerCase/SwapCase/Capitalize/Uncapitalize - changes the case of a String
  • CountMatches - counts the number of occurrences of one String in another
  • IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable - checks the characters in a String
  • DefaultString - protects against a null input String
  • Reverse/ReverseDelimited - reverses a String
  • Abbreviate - 使用省略号缩减字符串
  • Difference - compares Strings and reports on their differences
  • LevenshteinDistance - the number of changes needed to change one String into another

A. 参考

Read More

1. Info

Yeoman 是一种构建 javascript 项目的脚手架。

是 Google 的团队和外部贡献者团队合作开发的,他的目标是通过Grunt(一个用于开发任务自动化的命令行工具)和Bower(一个HTML、CSS、Javascript和图片等前端资源的包管理器)的包装为开发者创建一个易用的工作流。

Yeoman 主要有三部分组成:

  • yo(脚手架工具);
  • grunt(构建工具);
  • bower(包管理器)。

这三个工具是分别独立开发的,但是需要配合使用,来实现我们高效的工作流模式。

2. Require

  • Node.js v0.10.x+
  • npm v1.4.3+
  • git

3. Install Yeoman 工具集

sudo npm install --global yo bower grunt-cli

4. generator

一个 generator 能帮助构建项目目录,下载项目依赖等工作。

4.1. install a generator

sudo npm install -g generator-***

5. 通过 generator scaffold 应用

5.1. 创建一个项目文件夹

mkdir mytodo && cd mytodo

5.2. 通过 generator 建立应用的框架

yo angular

5.3. 配置

运行上面的命令后,根据提示进行应用的配置。完成后应用的大体框架便出来了。

6. Preview 应用 in the browser

Yeoman 已经包含了我们构建本地服务的所需。

6.1. 运行服务

grunt serve

服务的默认端口为:9000。 停止服务,请按 Ctrl+C。 但在我们开发应用的时候,我们不需要停止服务,然后在重启它以查看效果,grunt 会自动监控项目下文件的变化,并实时更新服务。

7. Start writing App

8. 使用 bower 安装 packages

8.1. 查询当前有哪些 packages

bower list

8.2. 搜索 packages

bower search package-name

8.3. 安装 packages

bower install --save package-name
  • --save 选项将新安装的依赖自动更新至 bower.json 文件。

安装成功后,在 bower_components 目录下将增加相应的 packages 文件夹。

bower 同时会将添加新依赖至相应 HTML 文件中。

9. 测试

9.0. 安装 Karma

npm install grunt-karma --save-dev

9.1. 运行单元测试

grunt test

9.2. 更新 Karma 配置文件

打开 karma.conf.ja 添加应用的相关依赖。

10. 构建与发布

grunt

grunt serve:dist

Read More

作用域

作用域是用来检测模型的改变和为表达式提供执行上下文的。 它是分层组织起来的,并且层级关系是紧跟着DOM的结构的。

控制器

它的主要工作内容是构造模型,并把模型和回调方法一起发送到视图。 视图可以看做是作用域在模板(HTML)上的“投影(projection)”。 而作用域是一个中间地带,它把模型整理好传递给视图,把浏览器事件传递给控制器。 控制器和模型的分离非常重要,因为:

  • 控制器是由Javascript写的。Javascript是命令式的,命令式的语言适合用来编写应用的行为。控制器不应该包含任何关于渲染代码(DOM引用或者片段)。
  • 视图模板是用HTML写的。HTML是声明是的,声明式的语言适合用来编写UI。视图不应该包含任何行为。
  • 因为控制器和视图没有直接的调用关系,所以可以使多个视图对应同一个控制器。这对“换肤(re-skinning)”、适配不同设备(比如移动设备和台式机)、测试,都非常重要。

模型

模型就是用来和模板结合生成视图的数据。模型必须在作用域中时可以被引用,这样才能被渲染生成视图。

视图

视图的生命周期由作为一个模板开始,它将和模型合并并最终渲染到浏览器的DOM中。

模型是视图变化的唯一动因。

指令

Filters

模块和注入器

每个AngularJS应用都有一个唯一的注入器。 注入器提供一个通过名字查找对象实例的方法。 它将所有对象缓存在内部,所以如果重复调用同一名称的对象,每次调用都会得到同一个实例。 如果调用的对象不存在,那么注入器就会让实例工厂(instance factory)创建一个新的实例。

一个模块就是一种配置注入器实例工厂的方式,我们也称为“提供者(provider)”。

Read More