当前位置: 首页 > 知识库问答 >
问题:

如何在Play Framework 2.5模板中注入应用程序

巫马正卿
2023-03-14

随着播放框架的新版本2.4/2.5,他们进一步朝着注入一切和删除服务器状态的方向前进。play。Play.application()现在不建议使用。然而,我需要在我的模板中的应用程序(例如,让所有支持的语言显示在所有页面上与play. i18n.lang.availables(play.Play.application()))。

我知道我可以:

  • 传球play。应用程序显式添加到我的所有模板

如何注入播放。我的模板中的应用程序

----更新:----

到目前为止,我尝试了以下设置:

index.scala.html:

@(title: String)
@template(title) { //here is the play.Application obviously missing, however I don't want to pass it in every template - even worse in every Controller <-- this is the core of my question
    Welcome to my page!
}

样板斯卡拉。html:

@(title: String)(content: Html)(implicit app: play.Application)
<html>
    <head>
        <title>@title</title>
    </head>
    <body>
        <p>Is live? @app.isProd</p>
        @content
    </body>
</html>

控制器功能:

public Result index() {
    return ok(views.html.index.render("home"));
}

共有3个答案

邓焱
2023-03-14

通常不鼓励注入应用程序本身,因为这会使代码测试非常麻烦。相反,想想你实际上需要什么,然后直接注入。

如果您在几乎每个模板中都需要很多东西,我的建议是创建某种上下文类,您可以将其注入控制器,然后将其传递给模板。

丁昌翰
2023-03-14

我只需要研究一下PlayFramework2.6。x、 可以根据文档将对象注入模板中:https://www.playframework.com/documentation/2.6.x/ScalaTemplatesDependencyInjection.

我实现了一个简单的示例(有点做作),并使用了scala:

test.scala.html:

@this(configuration: play.api.Configuration)
@(key: String)
config = @configuration.get[Seq[String]](key).mkString(", ")

HomeController.scala

package controllers

import javax.inject._

import play.api._
import play.api.i18n._
import play.api.mvc._

/**
 * This controller creates an `Action` to handle HTTP requests to the
 * application's home page.
 */
@Singleton
class HomeController @Inject()(cc: ControllerComponents, testView: views.html.test) (implicit configuration: Configuration) extends AbstractController(cc) with I18nSupport{

  def test() = Action  { implicit request =>
    Ok(testView("play.i18n.langs"))
  }
}

路线:

GET        /test                controllers.HomeController.test()

配置对象被注入到视图中。html。测试模板和视图本身被注入控制器。注意模板中的@this(配置:play.api.configuration)语句。Play将在模板后面生成一个类,该类带有注入配置对象的构造函数。

请注意,注入控制器的配置在此特定代码中没有任何角色。在我找到这个解决方案之前,我尝试了其他排列。。。假设您有一个由控制器调用的外部模板使用的内部模板,并且内部模板需要配置对象,那么您需要从控制器自上而下地提供配置,并添加一个隐式配置:play。应用程序编程接口。层次结构中所有模板中的Configuration参数指向需要它的模板,如下所示:@(message:String)(隐式messagesProvider:messagesProvider,Configuration:play.api.Configuration)。然后,控制器注入的配置将一直馈送到顶部模板,直到需要它的模板。

姜松
2023-03-14

你可以得到一个Play.current()的应用程序,或者像这个问题中解释的那样在控制器中注入一个应用程序。模板应该得到类型play的参数。应用程序。

应该是这样的。

模板injectappexample.scala.html:

@(app: play.Application)
.... use the app object 

控制员:

public class SomeController extends Controller {
    Provider<Application> applicationProvider;

    @Inject 
    public SomeController(Provider<Application> applicationProvider) {
        this.applicationProvider = applicationProvider;
    }

    public Result injectAppExample() {
        return ok(injectappexample.render(applicationProvider.get());
    }
}

值得重新考虑将应用程序对象发送到模板。如果您应该发送一个特定的配置属性值,请在控制器中注入配置,从配置对象中获取该值并将其发送到模板。在这种情况下,根本不需要注射应用程序。

模板:

@(value: String)
.... use the value 

控制员:

public class SomeController extends Controller {
    Configuration configuration;

    @Inject 
    public SomeController(Configuration configuration) {
        this.configuration = configuration;
    }

    public Result injectAppExample() {
        return ok(injectappexample.render(configuration.getString("SOME_PROPERTY"));
    }
}
 类似资料:
  • 问题内容: 我尝试使用angular-ui,并尝试注入$ stateProvider: html js(test / appModule.js) 堆栈跟踪 如果我删除带有注释的 $ stateProvider 和 ui.router ,那么一切都会起作用: 那么注入 $ stateProvider 的问题有解决的任何想法吗? PS 我尝试了ui示例,它可以工作,但是我无法弄清楚为什么我的不行。 问

  • 我正在迁移一个遗留服务框架,该框架使用java序列化/反射来注册服务,并将它们作为远程endpoint(javabin over http)或本地调用无缝地调用。我已经将远程调用替换为jerseyendpoint。并使用基于hk2 aop的拦截器重新构建了现有框架的部分拦截能力。当远程客户端调用endpoint时,它工作正常。现在,我需要对服务方法的本地调用执行相同的操作,并且能够使用与远程服务方

  • 问题内容: 以下是开始对话的几种可能性: 初始化后转义所有输入。 转义每个值,最好在生成SQL时转义。 第一种解决方案是次优的,因为如果要在除SQL之外的其他任何方式中使用每个值,则需要取消转义每个值,例如在网页上输出它。 第二种解决方案更有意义,但是手动转义每个值是一件痛苦的事情。 我知道已准备好的语句,但是我发现MySQLi麻烦。另外,将查询与输入分离也使我感到担忧,因为尽管正确执行订单至关重

  • 问题内容: 我正在使用polymer-jsonp执行JSONP请求,但响应有时包含html。 例如,假设post.content为,我如何以粗体显示{{post.content}} ? 问题答案: Polymer不会通过数据绑定标记未转义的HTML,因为它成为XSS攻击的漏洞。 关于在有限的情况下标记HTML或允许进行自定义过滤的讨论正在进行,但是在数据层尚未实现。 现在可以使用附加的自定义元素来

  • 模板引擎是允许开发者或设计师在创建动态网页的时候,从数据展示中分离编程逻辑的工具。换句话说,除了拥有接收 HTTP 请求的代码,从数据库查询必需的数据并且之后将其在单个文件中将其展示给用户之外,模板引擎从计算它的剩余代码中分离了数据的展示(此外,流行的框架和内容管理系统也会从查询中分离 HTTP 请求)。 服务端模板注入(SSTI)在这些引擎渲染用户输入,而不合理处理它的时候发生,类似于 XSS,

  • 我有两个类,类A和类B。A是一个用于在RCP应用程序中显示零件的类,它在应用程序模型中定义。B是一个用于检索数据的自定义类,每当数据发生更改时,它都应该通知类a更新相关UI。我在这里问了一个问题,关于如何使这两个类协调。然而,现在的问题是,由于B未在应用程序模型中定义,所以每当我调用eventBroker时,它都返回null。类B中的post()。 当我调用B类时,我尝试了以下方式: 我不知道如何