【问题标题】:JQuery Ajax request to Grails Controller Not working对 Grails 控制器的 JQuery Ajax 请求不起作用
【发布时间】:2026-01-13 15:05:03
【问题描述】:

在下面的“简单”Ajax 登录示例中,我使用 JQuery 将表单参数提交到 Grail 的控制器。但是,实际 URL 与 ajax 调用中配置的控制器 URL 不匹配。

HTML:

<div id="loginForm">
        <div id="ajaxLoginError">
        </div>
        <form name="ajaxLoginForm" action="ajaxLogin" id="ajaxLoginForm">
            <span class="pic"></span>
            <span class="close"></span>
            <input type="text" name="username" class="text focus" default="Username"
                value="${user?.username}" />
            <input type="password" name="password" class="text focus"
                default="Password" value="${user?.password}" />
            <button type="submit" name="login" id="ajaxLoginBtn">
                <span class="button"><span>Login</span> </span>
            </button>
            <label> <input type="checkbox" class="check" name="remember" />Remember
                me</label>
            <a href="#">Forgot username or password?</a>
        </form>
    </div>

Javascript:

$('#ajaxLoginBtn').click(function() {
    $('#ajaxLoginError').fadeOut();
    $.ajax({
        url: "${createLink(controller: 'user', action: 'ajaxLogin')}",
        type: 'GET',
        data: queryString,
        dataType: 'json',
        success: function(data) {
            if (data.isAuthenticated) {
                // Display user bar
                $('#loginUserBar').slideDown();
            }else {
                $('#ajaxLoginError').html(data.errorMsg).fadeOut();
            }
        }
    });
});

另外,任何人都可以验证我的控制器逻辑。我认为这是解析 JSON 响应的正确方法?

服务器:

def ajaxLogin = {
    boolean isExists = false
    String errorMsg = ""
    def foundUser = User.findByEmailAndPassword(params.username, params.password) 
    if (foundUser) {
        isExists = true
    }else {
        errorMsg = "Login unsuccessful! Either the username, or password entered is incorrect."
    }
    render(content: 'text/json',
        loginResponse(isAuthenticated: isExists, errorMsg: errorMsg));
}

同样,我需要做些什么来明确强制 Grails 使用 JQuery 作为主要的 javascript 插件吗?

【问题讨论】:

    标签: jquery ajax grails


    【解决方案1】:

    有很多不同的问题... :-)

    1) 我需要做些什么来明确强制 Grails 使用 JQuery 作为主要的 javascript 插件吗?

    如果尚未安装 jquery 插件,请安装它。你也可以放一个

    <g:setProvider library="jquery"/>
    

    在 GSP 的开头(或在您的布局中)明确地将 JQuery 设置为提供者

    2) 这是解析 JSON 响应的正确方法吗?

        log.info("Receive send request");
        def contentType = request.getHeader('Content-Type')
        log.trace("receive with ContentType: " + contentType)
        if (contentType && contentType.contains('application/json')) {            
            def results = request.JSON
            log.info("results received : ${results}")
        }
    

    您可以添加if (request.xhr){} 来测试ajax 调用

    3) 任何人都可以验证我的控制器逻辑。

    逻辑本身没什么好说的,你检查一个现有的登录名/密码

    4) 实际 URL 与 ajax 调用中配置的控制器 URL 不匹配。

    仅凭您告诉我们的内容很难回答。 jQuery 的 ajax 调用看起来不错,但我们对您的queryString 的内容一无所知。我通常使用$("#myForm").serialize() 向控制器发送表单 我不明白你关于 URL 的问题......

    【讨论】:

    • 您好 Grooveek,感谢您的回复。至于 URL 问题...使用 grails 链接方法应该创建给定的 URL:/myapp/user/ajaxLogin。但是,当 Ajax 调用触发时,实际 URL 解析为:/myapp/ajaxLogin。我不完全确定为什么 Grails 会在路径中省略控制器名称。欢迎任何想法或建议。
    • 另外,对于queryString变量,本质上是$('#ajaxLoginForm').serialize()赋值的结果。我忘记在代码 sn-p 中包含分配。道歉:-o
    • loginResponse(isAuthenticated: isExists, errorMsg: errorMsg) 什么是变量 loginResponse DO 或用于?
    最近更新 更多