【问题标题】:jQuery GET and Spring MVC not redirecting properlyjQuery GET 和 Spring MVC 没有正确重定向
【发布时间】:2012-12-21 01:08:47
【问题描述】:

我有一个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>

【问题讨论】:

  • 您的项目是否包含fruits/Oranges.jsp
  • @BhavikAmbani - 是的 fruits/Oranges.jsp 是我项目中的一个 JSP 页面。
  • 请输入您的spring配置,即applicationContext.xmlsprint-servlet.xml
  • @BhavikAmbani - 我的 Spring 上下文 XML 大量 - 有没有你特别想看的 bean 定义?
  • 您是否尝试重定向到 ajax 请求中的另一个页面?我想这至少不能做到:1.停止使用ajax调用并使用正常的HTTP请求,2.在ajax success js函数中返回要重定向的页面并从那里进行重定向使用纯 JavaScript。

标签: java jquery jsp redirect spring-mvc


【解决方案1】:

该页面不会更改历史记录或加载不同的 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 历史记录)之类的内容。

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

【讨论】:

    【解决方案2】:

    对于此任务,执行重定向的最佳方法(正如 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"); });
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 2020-02-10
      • 2018-04-14
      • 2021-12-06
      • 2020-05-13
      相关资源
      最近更新 更多