Java Play框架创建登录导航栏-在scala模板中插入动态html
我正在使用Java中的Play框架,用OAuth和Bootstrap创建简单的网站。我的目标是让导航栏显示身份验证后登录的用户-所以我需要动态创建导航栏的html代码。许多人会立即建议使用scala模板参数来创建动态内容: navigation.scala.html 然后将navigation.scala.html更改为:Java Play框架创建登录导航栏-在scala模板中插入动态html,java,html,dynamic,playframework,navigation,Java,Html,Dynamic,Playframework,Navigation,我正在使用Java中的Play框架,用OAuth和Bootstrap创建简单的网站。我的目标是让导航栏显示身份验证后登录的用户-所以我需要动态创建导航栏的html代码。许多人会立即建议使用scala模板参数来创建动态内容: navigation.scala.html 然后将navigation.scala.html更改为: @() 以“@routes.UsernameController.getLoggedInUsername()身份登录 但这也不能很好地工作,因为控制器是静态的,例如,当
@()
- 以“@routes.UsernameController.getLoggedInUsername()身份登录
但这也不能很好地工作,因为控制器是静态的,例如,当涉及工厂类的依赖项注入(在我的例子中使用pac4j for OAuth)时,您不能使用静态方法(我知道有静态注入解决方案,但不推荐使用)。我希望scala模板中有一些方法可以生成html,这样我就可以使用它将其注入navigation.scala.html(方法可以访问会话和所有属性,这样我就可以获得当前用户的信息)您可以使用Deadbolt来处理这个问题,使用
@subjectPresent
和/或@subjectPresentOr
模板约束。前者仅允许在用户登录时呈现,后者在没有用户登录时呈现替代内容,例如
@import be.objectify.deadbolt.java.views.html.{subjectPresent, subjectPresentOr}
@subjectPresent() {
This content will be present if handler#getSubject results in a Some
}
@subjectPresentOr() {
This content will be present if handler#getSubject results in a Some
} {
fallback content
}
请查看以了解更多详细信息
但是,如果您需要在模板中显示用户详细信息,那么您确实应该将该信息传递到模板中
使用登录名为:“@routes.UsernameController.getLoggedInUsername()”的
是一种不干净的方法,很可能是线程安全的。Twirl模板是类型安全的,参数化是有原因的 是的,我需要用户详细信息,所以您建议使用模板参数?但这种方式不仅需要用参数(user:user)扩展每个模板,还需要扩展每个控制器,每个控制器都需要为每个视图渲染获取用户详细信息,这是巨大的冗余,违反了单一责任原则。
@(loggedInUser: String)(content: Html)
<!DOCTYPE html>
<html lang="en">
<body>
@navigation(loggedInUser)
@content
</body>
</html>
public class UsernameController extends Controller {
public static String getLoggedInUsername() {
return ctx().session().get("username");
}
}
@()
<div class="navbar">
<div class="containter">
<ul class="nav navbar-nav navbar-left">
<li>Logged in as: "@routes.UsernameController.getLoggedInUsername()"</li>
</ul>
</div>
</div>
@import be.objectify.deadbolt.java.views.html.{subjectPresent, subjectPresentOr}
@subjectPresent() {
This content will be present if handler#getSubject results in a Some
}
@subjectPresentOr() {
This content will be present if handler#getSubject results in a Some
} {
fallback content
}