You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tapestry 5.4中jQuery Sortable排序后AJAX请求无法触发后端事件

Tapestry 5.4中jQuery Sortable排序后AJAX触发后端事件的解决方案

1. 解决服务器端URL未解析的问题

你碰到的${actionUrl}未被解析,核心原因是Tapestry只会解析**模板文件(.tml)**里的EL表达式,若JS写在外部文件里,或是模板里用引号将EL表达式包裹,就会原样输出字符串。以下是两种靠谱的解决办法:

办法一:将JS直接嵌入模板文件

把saveNewPositions函数写在.tml的<script>标签内,确保${actionUrl}能被Tapestry正确解析:

<script>
function saveNewPositions() {
    var positions = [];
    $('.updated').each(function () {
        positions.push([$(this).attr('data-index'), $(this).attr('data-position')]);
        $(this).removeClass('updated');
    });
    console.log("saveNewPositions of table update" + positions);

    $.ajax({
        url: "${actionUrl}",
        method: 'POST',
        dataType: 'text',
        data: {
            update: 1,
            positions: positions
        },
        success: function (response) {
            console.log(response);
        },
        error: function(xhr, status, error) {
            console.error("AJAX请求失败:", error);
        }
    });
}
</script>

同时保证Groovy页面里的getActionUrl()方法为公开状态(Tapestry默认识别getter方法):

public String getActionUrl() {
    return resources.createEventLink("tableUpdate").toURI()
}

办法二:用Tapestry的JavaScriptSupport传递URL到前端

如果JS放在外部文件中,推荐使用这种方式。在Groovy页面的setupRender方法里,将URL注入为前端全局变量:

@Inject
private JavaScriptSupport javaScriptSupport;

void setupRender() {
    String actionUrl = resources.createEventLink("tableUpdate").toURI()
    javaScriptSupport.addScript("window.tableUpdateUrl = '%s';", actionUrl)
}

之后在外部JS文件中直接调用该全局变量即可:

function saveNewPositions() {
    // 其他逻辑保持不变
    $.ajax({
        url: window.tableUpdateUrl,
        // 其他参数保持不变
    });
}

2. 确保后端事件方法能处理请求

Groovy页面中必须定义对应事件的处理方法,方法名需符合on[EventName]的格式,同时要能接收POST请求传递的参数:

@Inject
private ComponentResources resources;

@RequestParameter
private String[] positions;

public Object onTableUpdate() {
    // 处理positions数组,执行数据库更新逻辑
    for (String pos : positions) {
        String[] parts = pos.split(",");
        String index = parts[0];
        String position = parts[1];
        // 此处编写数据库更新代码
    }
    // 返回响应内容,示例为"更新成功"
    return "更新成功";
}

若positions是二维数组,可改用List<List<String>>类型接收,或自行解析参数。另外需注意注入ComponentResources对象,否则无法生成事件链接。

3. 额外注意事项

  • CSRF防护无需额外处理:createEventLink生成的URL已包含CSRF令牌,直接使用即可。
  • 调试请求详情:通过浏览器开发者工具的Network标签,可查看请求URL是否正确、参数是否传递成功、后端返回的状态码(如404表示URL错误,403表示权限/CSRF问题)。

内容的提问来源于stack exchange,提问作者Spark43502

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:23:35