[英]Composing Action in Play Java
我知道在Stackoverflow中我们有相同类型的问题,但是据我所知,这些都是用Scala编写的。 在官方文档中 ,您可以了解如何编写 Action。 其实我不清楚,但是
public class VerboseAction extends play.mvc.Action.Simple {
public CompletionStage<Result> call(Http.Context ctx) {
Logger.info("Calling action for {}", ctx);
return delegate.call(ctx);
}
上面的代码与下面的代码相同吗?
@With(VerboseAction.class)
public Result verboseIndex() {
return ok("It works!"); }
他们写道,我们必须委托给包装好的Action,但是在上面的代码中,哪个Action被调用了? delegate.call(ctx)
是什么意思? 我知道玩的是行动的一个实例Action
,但返回值实际上是CompletionStage<Result>
,没有Action
。
所以,我很困惑。 也许我有一点误会,所以有人可以指出吗?
谢谢。
Action
是提供Result
的工作单元(最后)。 您的第一个代码块构造一个Action
,它将执行log语句,然后返回对delegate
的调用,该delegate
将是要执行的下一个Action
单元(另一个注释或控制器方法),并通过上下文传递该delegate
一直以来
你的问题的最后一部分的误解是调用的返回类型是不是下一个Action
来承担。 这是所有Action
的(最终) Result
。
我将尝试逐个问题地回答:
上面的代码与下面的代码相同吗?
不,它实际上是用“ with”注释组成这两个动作。
但是在上面的代码中,哪个动作被调用?
动作是处理对收到的请求的响应的过程。 每当收到对此方法的请求时(此请求将映射到路由文件中的方法),将调用此操作。
他们写道,我们必须委托给包装好的Action,委托.call(ctx)是什么意思?
代表是:
/**
* The wrapped action.
*/
"public Action<?> delegate;"
呼叫是:
/**
* Executes this action with the given HTTP context and returns the result.
*/
"public abstract Promise<Result> call(Context ctx) throws Throwable"
在动作课上。 因此,委托.call意味着将参数包装在动作中并返回结果。
我知道Play的Action是Action的一个实例,但是返回值实际上是CompletionStage,而不是Action。
CompletionStage实际上是:“公共接口CompletionStage”,其文档对此进行了描述:
可能异步计算的阶段,当另一个CompletionStage完成时,该阶段执行操作或计算值。 一个阶段在其计算终止时完成,但是这又可能触发其他相关阶段。 此接口中定义的功能仅采用几种基本形式,这些形式扩展为一大套方法,以捕获各种使用样式:
阶段执行的计算可以表示为Function,Consumer或Runnable(分别使用名称包括apply , accept或run的方法 ),具体取决于它是否需要参数和/或产生结果。 例如,{@ code stage.thenApply(x-> square(x))。thenAccept(x-> System.out.print(x))。thenRun(()-> System.out.println())}。 附加形式( compose )应用阶段本身的功能,而不是其结果。
这个
“一个可能异步计算的阶段,当另一个CompletionStage完成时,该阶段执行一个动作或计算一个值。”
和
“由阶段执行的计算可以表示为功能,使用者或可运行”
清除执行某些计算的是函数,使用者或Runnable。 您实际上是在编写动作并返回
return ok("It works!");
不是CompletionStage。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.