【问题标题】:Cannot call Play Framework static method from view无法从视图中调用 Play Framework 静态方法
【发布时间】:2026-01-10 00:55:02
【问题描述】:

我有服务器,我应该在按下按钮时发出请求,我也必须调用这个方法,当它工作时我应该解析 json,但我没有看到控制器方法,只有 main 方法可用

如何调用

 <input type="submit" onclick="@routes.Login.resp()" value="LOGIN" >

因为它不起作用无法解析符号

GET     /login                           controllers.Login.main()

我的控制器:

package controllers;

import play.libs.F;
import play.libs.WS;
import play.mvc.Controller;
import play.mvc.Result;


public class Login extends Controller {



    public static Result main() {
        return ok(views.html.login.render());
    }

    public static F.Promise<Result> resp() {
        String feedUrl="http://validate.jsontest.com/?json=%7B%22key%22:%22value%22%7D";
        final F.Promise<Result> resultPromise = WS.url(feedUrl).get().flatMap(
                new F.Function<WS.Response, F.Promise<Result>>() {
                    public F.Promise<Result> apply(WS.Response response) {
                        return WS.url(response.asJson().findPath("empty").asText()).get().map(
                                new F.Function<WS.Response, Result>() {
                                    public Result apply(WS.Response response) {
                                        return ok("size" + response.asJson().findPath("count").asInt());
                                    }
                                }
                        );
                    }
                }
        );
        return resultPromise;
    }
}

查看:

<!--
Author: W3layouts
Author URL: http://w3layouts.com
License: Creative Commons Attribution 3.0 Unported
License URL: http://creativecommons.org/licenses/by/3.0/
-->
<!DOCTYPE html>
<html>
    <head>
        <title>LOGIN</title>
        <meta charset="utf-8">
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/stylelogin.css")">

        <meta name="viewport" content="width=device-width, initial-scale=1">
        <script type="application/x-javascript"> addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false); function hideURLbar(){ window.scrollTo(0,1); } </script>
            <!--webfonts-->
        <link href='http://fonts.googleapis.com/css?family=Open+Sans:600italic,400,300,600,700' rel='stylesheet' type='text/css'>
            <!--//webfonts-->
    </head>
    <body>
            <!-----start-main---->
        <div class="main">
            <div class="login-form">
                <h1>Member Login</h1>
                <div class="head">
                    <img src="@routes.Assets.at("images/user.png")" alt=""/>

                </div>
                <form>
                    <input type="text" class="text" value="USERNAME" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'USERNAME';}" >
                    <input type="password" value="Password" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Password';}">
                    <div class="submit">
                        <input type="submit" onclick="@routes.Login.main()" value="LOGIN" >
                    </div>

                </form>
            </div>
                <!--//End-login-form-->
                <!-----start-copyright---->

                <!-----//end-copyright---->
        </div>
            <!-----//end-main---->

    </body>
</html>

我不确定我是否也正确解析了 json,如何进行正确的 GET、POST 请求并解析它

【问题讨论】:

    标签: java json playframework playframework-2.2


    【解决方案1】:

    据我所知,使用 onclick 属性时,您总是在 JavaScript 中调用函数。如果你想指定一个 URL,你需要把它放到你的表单标签中,并带有一个动作属性,比如&lt;form action="@routes.Login.main()"&gt;

    HTML 表单标签的默认设置是发送GET。如果您想发送 POST,您必须通过额外的 method="post" 指定它,例如 &lt;form action="@routes.Login.main()" method="post"&gt;。但是你也必须改变你的路由:POST /login controllers.Login.main()。如果您想发布登录数据,我强烈建议您使用 POST,因为 GET 您的数据(包括密码)会出现在 URL 的查询字符串中。

    另外,您的@routes.Login.main() 方法只返回登录视图return ok(views.html.login.render());。相反,它应该评估您发送的表单数据。

    【讨论】: