Introspection: Who am I? where am I? What am I going to do?
post @ 2019-10-21

Kubernetes是一个软件系统, 允许部署和管理容器化的应用。使用该系统,用户不需要关心如何维护实体集群关系,也不用徒手部署应用,不必烦恼应用的运行状态,只需要按照系统说明编写描述信息,k8s会按照描述信息自动维护整个集群。对用户,k8s将维护和部署集群化应用的复杂过程隐藏起来并进行了抽象,使得开发者能够更加专注于应用的开发上。同时减轻了运维人员的工作压力

阅读此文
post @ 2019-10-13

想要写一篇介绍SockJS的文章,又不知道写什么好,发现官方github项目上这篇文章比较好,于是直接翻译过来。不长不短,正好合适。
该文章发布于2016年,某些论述可能已经过时,这里尝试加以纠正,但有谬误,还请指正。

阅读此文
post @ 2019-10-13

我是前端菜鸟,并不知道这三个是啥玩意儿,只是查查资料,让自己稍微了解一些。顺便说,这篇文章都是从别的地方抄来的。

阅读此文
post @ 2019-09-25

akka这个技术一致都在听人弹起,只知道它与后端有关,是一个牛B的框架,别的么。。。并不知道。那么,我觉得现在是时候了解一下了。

阅读此文

基于用户行为的理由

让用户直接说不就好了吗

本文标题是利用用户的数据行为, 是根据用户的实际动作进行演算的方法, 那为什么不利用用户语言进行演算呢? 最大的原因就是用户也说不清楚自己到底喜欢什么, 而用户的实际行为往往能够暴露其真实想法, 有些想法用户自己可能都还没有意识到.

阅读此文
post @ 2019-09-08

什么是推荐系统

推荐系统让用户能够发现对自己有价值的信息,另一方面,能够让信息展现在对它感兴趣的用户面前。实现消费者和生产者的双赢。

阅读此文
post @ 2019-09-08

Observable

ReactiveX中, 应用的是观察者模式, 一个观察者订阅一个被观察者. 然后该观察者根据被观察者释放的任何信息进行反应. 这样能够使得并发称为可能, 观察者不必阻塞等待被观察者的响应内容, 而是创建一个哨兵, 并随时准备在未来的任何时候响应被观察者释放出的内容

阅读此文
post @ 2019-09-07

这是一篇半翻译半笔记式的文章,如果你之前对Common FileUpload了解不多,本文可以快速了解如何使用方法,如果你有时间,推荐你看官方文档

阅读此文

自从入职新公司,在印象中应该是一直没有打开过自己的CSDN主页,甚至完全忘记了自己还有一个博客这件事。
今天偶然间看到一篇博文,说的是搭建一个自己的博客。想着自己也一直有着这样的想法,于是回来看了看。并想着:我得重新开始写博客

阅读此文
post @ 2018-10-15

Http全称?

超文本传输协议:Hypertext Transfer protocol
阅读此文
post @ 2018-09-09

基础

指定view-state的view属性的几种方式

  • 按照默认名称在相对路径下查找view
阅读此文
post @ 2018-09-08
  1. 文章中内容并没有全部验证,仅作为参考
  2. 上下文一起看,才能明白其中的意思

Web Flow中EL表达式作用

web-flow使用EL表达式访问flow的model和调用方法。在web-flow中EL表达式主要有如下四种用途

阅读此文
post @ 2018-09-08

action-state

简单使用

该状态只执行操作,然后根据操作的结果转移到其他state。可以有多个操作,他们依次执行

1
2
3
4
5
6
<!-- more -->
<action-state id="moreAnswersNeeded">
<evaluate expression="interview.moreAnswersNeeded()" />
<transition on="yes" to="answerQuestions" />
<transition on="no" to="finish" />
</action-state>

输出

在action-state中调用普通java对象的方法,这些方法返回的只是一般的值,但是transition标签需要Event来触发,因此web-flow会将这个普通返回值转换为Event对象,具体转换情况如下:

1
2
3
4
5
方法返回值类型			映射出来的EventId
java.lang.String 直接以字符串的值作为id
java.lang.Boolean yes (for true), no (for false)
java.lang.Enum the Enum name
any other type success

action-state的操作

action-state可以有三种方式进行执行操作

  • 调用POJO
1
<evaluate expression="pojoAction.method(flowRequestContext)" />
1
2
3
4
5
public class PojoAction {
public String method(RequestContext context) {
...
}
}
  • 实现Action接口,直接调用该action
1
<evaluate expression="customAction" />
1
2
3
4
5
public class CustomAction implements Action {
public Event execute(RequestContext context) {
...
}
}
  • 实现MultiAction接口,可以定义多个一连串的方法
1
<evaluate expression="multiAction.actionMethod1" />
1
2
3
4
5
6
7
8
9
10
public class CustomMultiAction extends MultiAction {
public Event actionMethod1(RequestContext context) {
...
}

public Event actionMethod2(RequestContext context) {
...
}
...
}

action的异常处理

  • POJO类action的处理方式
    发生异常时,返回相应的字符串,会映射成Event,在transition中响应就可以了,和普通方法正常返回一样
  • MultiAction的处理方式
    发生异常时,返回Event对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BookingAction extends MultiAction {
public Event makeBooking(RequestContext context) {
try {
Booking booking = (Booking) context.getFlowScope().get("booking");
BookingConfirmation confirmation = bookingService.make(booking);
context.getFlowScope().put("confirmation", confirmation);
return success();
} catch (RoomNotAvailableException e) {
context.getMessageContext().addMessage(new MessageBuilder().error().
.defaultText("No room is available at this hotel").build());
return error();
}
}
}
  • 使用exception-handler属性,定义异常处理器

decision-state

decision-state是action-state的一种简单替代,在if/else情况时比较好用

1
2
3
<decision-state id="moreAnswersNeeded">
<if test="interview.moreAnswersNeeded()" then="answerQuestions" else="finish" />
</decision-state>

action相关标签

1) <on-start> flow开始时执行
2) <on-entry> state进入时执行
3) <on-exit> state退出时执行
4) <on-end> flow结束时执行
5) <on-render>view-state中使用,渲染前执行
6) <transition> 在转移前执行

命名的action

如下展示了一个action-state下多个操作执行,为每个操作命名,第二个操作成功后进行转移操作

1
2
3
4
5
6
7
8
9
<action-state id="doTwoThings">
<evaluate expression="service.thingOne()">
<attribute name="name" value="thingOne" />
</evaluate>
<evaluate expression="service.thingTwo()">
<attribute name="name" value="thingTwo" />
</evaluate>
<transition on="thingTwo.success" to="showResults" />
</action-state>

向客户端发送流信息

应用场景

客户端请求一个图片文件,此时我们需要直接操作httpresponse进行图片的响应,而不是渲染view。

解决方案

通过ExternalContext获取HttpResponse,将图片写入,然后操作ExternalContext对象记录response完成,这样web-flow就不会再渲染view,而是直接返回给浏览器

1
2
3
4
5
6
7
8
9
10
11
12
13
public class PrintBoardingPassAction extends AbstractAction {

@Override
protected Event doExecute(RequestContext context) throws Exception {
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getNativeResponse();
OutputStream os = response.getOutputStream();
// 在这里操作os,写入流数据
os.close();
context.getExternalContext().recordResponseComplete();
return success();
}

}
阅读此文
post @ 2018-09-07

基础

Web Flow将一个流程分为若干个状态(可以理解为步骤),每个流程由若干个状态组成,通过特性的方式在步骤之间进行跳转,协同完成整个流程。

阅读此文
post @ 2018-09-06

在学习每一门新语言时,第一个程序往往是Hello World。这里我们写一个非常简单的flow,使用常用标签,在深入讲解之前有一个感官上的认识

需求说明

假设有如下简单流程:要求程序启动,显式输入界面,用户输入信息后,点击提交按钮,后台查询数据库,然后显式查询结果界面,中间任何步骤出错,都重新返回输入界面,并显示错误信息。流程大体如下。

阅读此文
⬆︎TOP