在我看来,模板是静态类型的这一事实实际上是一件好事:你可以保证调用你的模板如果编译就不会失败。

但是,它确实在调用站点上添加了一些样板。但是你可以减少它(不会失去静态类型优势)。

在Scala中,我看到了两种实现它的方法:通过动作组合或使用隐式参数。在Java中,我建议使用Http.Context.args映射存储有用的值并从模板中检索它们,而不必显式传递为模板参数。

使用隐式参数

将menus参数放在main.scala.html模板参数的末尾,并将其标记为“隐式”:@(title: String)(content: Html)(implicit menus: Seq[Menu])

@title

@for(menu@menu.name

}

@content

现在,如果您有调用此主模板的模板,则可以menus通过mainScala编译器将参数隐式传递给模板,如果它在这些模板中也被声明为隐式参数:@()(implicit menus: Seq[Menu])

@main("SubPage") {

...

}

但是,如果您希望从控制器中隐式传递它,则需要将其作为隐式值提供,可在调用模板的范围内使用。例如,您可以在控制器中声明以下方法:implicit val menu: Seq[Menu] = Menu.findAll

然后在您的操作中,您将能够编写以下内容:def index = Action {

Ok(views.html.index())}def index2 = Action {

Ok(views.html.index2())}

您可以在此博客文章和此代码示例中找到有关此方法的更多信息。

更新:这里也写了一篇很好的博客文章,展示了这种模式。

使用动作组合

实际上,将RequestHeader值传递给模板通常很有用(参见例如此示例)。这不会为控制器代码添加太多样板,因为您可以轻松编写接收隐式请求值的操作:def index = Action { implicit request =>

Ok(views.html.index()) // The `request` value is implicitly passed by the compiler}

因此,由于模板通常至少会接收此隐式参数,因此您可以将其替换为包含例如菜单的更丰富的值。您可以使用Play 2 的动作组合机制来实现。

要做到这一点,你必须定义你的Context类,包装一个基础请求:case class Context(menus: Seq[Menu], request: Request[AnyContent])

extends WrappedRequest(request)

然后,您可以定义以下ActionWithMenu方法:def ActionWithMenu(f: Context => Result) = {

Action { request =>

f(Context(Menu.findAll, request))

}}

哪个可以这样使用:def index = ActionWithMenu { implicit context =>

Ok(views.html.index())}

您可以将上下文作为模板中的隐式参数。例如main.scala.html:@(title: String)(content: Html)(implicit context: Context)

@title

@for(menu @menu.name

}

@content

使用操作组合允许您将模板所需的所有隐式值聚合到单个值中,但另一方面,您可能会失去一些灵活性......

使用Http.Context(Java)

由于Java没有Scala的implicits机制或类似机制,如果您想避免显式传递模板参数,可能的方法是将它们存储在Http.Context仅在请求期间存在的对象中。该对象包含args类型的值Map。

因此,您可以从编写拦截器开始,如文档中所述:public class Menus extends Action.Simple {

public Result call(Http.Context ctx) throws Throwable {

ctx.args.put("menus", Menu.find.all());

return delegate.call(ctx);

}

public static List

return (List

}}

静态方法只是从当前上下文中检索菜单的简写。然后注释您的控制器与Menus动作拦截器混合:@With(Menus.class)public class Application extends Controller {

// …}

最后,menus从模板中检索值,如下所示:@(title: String)(content: Html)

@title

@for(menu @menu.name

}

@content

java中play方法的两个参数_如何避免在play2中到处传递参数?相关推荐

  1. java抽象类中的方法都是抽象方法吗_抽象方法必须在抽象类中吗

    抽象方法必须在抽象类中吗2020-07-01 15:01:18文/叶丹 1.抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法.2.Final类中的属性和方法都必须被final修饰符修饰.3. ...

  2. js中toFixed方法的两个坑

    js中toFixed方法的两个坑 toFixed返回结果是string,后续使用它计算会错误 toFixed返回结果可能出现负零-0.00 toFixed返回结果是string,后续使用它计算会错误 ...

  3. java中什么方法用来清空流_这个真的写的很细,JavaIO中的常用处理流,看完只有10%的人还不懂了...

    JavaIO中的常用处理流 在前面,我们了解了有关JavaIO流基础的使用,其中对于IO流来说最基础的四大基类就是InputStream.OutputStream.Reader.Writer.而我们对 ...

  4. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  5. python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法

    一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...

  6. python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱

    这篇文章主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数.默认参数.可变参数和关键字参数来讲,要的朋友可以参考下 C++里函数可以设置缺省参数,Java不可以,只能 ...

  7. python 超参数_完整介绍用于Python中自动超参数调剂的贝叶斯优化

    完整介绍用于Python中自动超参数调剂的贝叶斯优化-1.jpg (109.5 KB, 下载次数: 0) 2018-7-4 23:45 上传 调剂机器学习超参数是一项繁琐但至关重要的任务,因为算法的性 ...

  8. php ci 参数,CI如何写一个控制器,并传递参数正常解析访问?

    控制器 控制器是你整个应用的核心,因为它们决定了 HTTP 请求将被如何处理. 什么是控制器? 简而言之,一个控制器就是一个类文件,是以一种能够和 URI 关联在一起的方式来命名的. 考虑下面的 UR ...

  9. mysql 5.6参数_初识 MySQL 5.6 新功能、参数

    摘要: MySQL5.6 针对 MySQL5.5 各个方面又提升了很多,特别在性能和一些新参数上面,现在看看大致提升了哪些方面(后续不定时更新). 一:性能.功能上的提升. ① 在线DDL即 onli ...

最新文章

  1. C++_模板特化(specialization),模板偏特化(局部特化)(partial specialization)
  2. 后盾网lavarel视频项目---图片上传
  3. opencv 其他形态学变换
  4. linux下测试磁盘的读写IO速度
  5. 转adb Shell root 权限
  6. mysql数据库导入导出
  7. linux下日志晒选打包,Linux 文件日志筛选操作
  8. mybatis常用jdbcType数据类型
  9. linux的网卡部分
  10. 【Kafka】测试Kafka整合Flume
  11. SAP 中 Webservice的发布和调用过程。
  12. Design Patterns(二十四):Visite Pattern--VB代码
  13. 提取win11最新等线字体1.18制作的magisk模块,有常规,加粗,和细体三个字重。
  14. 怎么用python编写个apk_python写apk
  15. LDC——Locally Decodable Code
  16. 第一周学习前端html的知识总结与感悟
  17. 鼠标变成方块而不是竖线
  18. 《R语言数据挖掘》读书笔记:三、分类
  19. uniapp h5、app引用外部在线js
  20. 能去百度、滴滴、阿里的算法工程师到底有多牛?听说个个都是人才,说话又好听...

热门文章

  1. Android自定义Button样式(自定义样式不生效怎么办)
  2. 互联网公司时尚穿搭指南
  3. 基于php的学生考勤管理系统
  4. 0基础用动画学Python,在闲余时间月赚2k-10k
  5. Cloudstack平台实战
  6. NB-IOT PSM 、IDLE、TAU、eDRX 概念解析
  7. PHP RabbitMQ的心跳问题
  8. 卧龙图说白酒:你认识白酒吗?值得一看的白酒知识
  9. 为什么我的Windows 10家庭版具有远程桌面和BitLocker?
  10. [入门]树(treeview)控件制作导航的做法(三)