-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。ただし、コントローラーの logger ステートメント (上記) はサーバー ログに出力されます。したがって、コードが 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

AJAX を使用しているため、ページの履歴が変更されたり、別の URL (オレンジ) が読み込まれたりすることはありません。動作にこのような 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 開発者にとってリダイレクトとは、従来のフォーム POST 送信では非常に一般的な HTTP 301 を意味しますが、上記のことはまったくありません。

于 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 に答える