Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Play框架创建登录导航栏-在scala模板中插入动态html_Java_Html_Dynamic_Playframework_Navigation - Fatal编程技术网

Java Play框架创建登录导航栏-在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()身份登录 但这也不能很好地工作,因为控制器是静态的,例如,当

我正在使用Java中的Play框架,用OAuth和Bootstrap创建简单的网站。我的目标是让导航栏显示身份验证后登录的用户-所以我需要动态创建导航栏的html代码。许多人会立即建议使用scala模板参数来创建动态内容:

navigation.scala.html

然后将navigation.scala.html更改为:

@()
  • 以“@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
    }