-1

我有一个start.jsp页面。在其中我定义了一个 jQuery 点击处理程序:

$(document).ready(function() {
    $("#myButton").click(function() {
        // Injected from a Spring MVC controller returning a ModelAndView with
        // modelAndView.addObject("fizz", myFizz);
        var fizz = "${fizz}";

        // Synchronous HTTP Get to invoke page redirect.
        $.get(
            "/myWidgets",
            {
                "fizz": fizz
            },
            function(data) {
                // ???
            }
        );
    });
});

然后,在控制器中监听/myWidgets

@RequestMapping(value = "/myWidgets.html", method = RequestMethod.GET)
public ModelAndView reloadAllTimeslots(@RequestParam("fizz") String fizz) {
    ModelAndView mav = new ModelAndView();

    // Should redirect the user to Oranges.jsp.
    mav.setViewName("fruits/Oranges");

    fruitDao.updateFruits(fizz);

    logger.info("This prints to my log file perfectly fine, so I know this handler gets invoked.");

    return mav;
}

但是,当我在start.jsp页面上并单击myButton时,页面永远不会重定向到Oranges.jsp. 但是,控制器(上图)中的记录器语句会打印到我的服务器日志中。所以我知道代码 99% 都在工作,我只是没有得到我想要的用户体验。有人知道为什么我没有被重定向到这里吗?

更新

我正在使用的视图解析器:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>
4

2 回答 2

3

该页面不会更改历史记录或加载不同的 URL(橙色),因为您使用的是 AJAX。事实上,大多数人都将这样的 AJAX 用于行为。

如果您希望页面重新加载,您只需使用普通的 FORM 提交,例如:

<form action="/myWidgets" method="post">
<input type="hidden" name="fizz" value="${fizz}" />
<button type="submit">Click</button>
</form>

以上不需要jQuery。

如果您想加载页面但使用 AJAX 并更改 URL,那么您应该查看 PJAX(pushstate history)之类的内容。

redirect当您指的是路由(或页面加载)时,您还应该避免使用该术语,特别是对于 HTTP 场景。对于大多数 Web 开发人员来说,重定向意味着 HTTP 301,这对于传统的表单 POST 提交来说很常见,但根本不是你在上面所做的。

于 2012-12-21T03:39:17.453 回答
0

对于此任务,执行该重定向的最佳方法(正如 Luiggi 在评论中提到的)是在 ajax 函数从服务器返回成功后通过 javascript 重定向。您永远不能仅通过 ajax 请求进行重定向。例如:

@RequestMapping(value = "/myWidgets.html", method = RequestMethod.GET)
@ResponseBody
public String reloadAllTimeslots(@RequestParam("fizz") String fizz) {
    fruitDao.updateFruits(fizz);

    logger.info("This prints to my log file perfectly fine, so I know this handler gets invoked.");

    return "success";
}

并在 HTML 文件中:

$(document).ready(function() {
    $("#myButton").click(function() {
        var fizz = "${fizz}";

        // Synchronous HTTP Get to invoke page redirect.
        $.get(
            "/myWidgets",
            {
                "fizz": fizz
            },
            function(data) {
                // ???
            }
        ).success(function() { window.location.replace("http://stackoverflow.com"); })
         .error(function() { alert("error"); })
         .complete(function() { alert("complete"); });
    });
});
于 2012-12-21T03:39:17.770 回答