31

ポニーのプロパティを編集するためのフォームがあり、私の Web アプリケーションには、ポニーを編集するために選択できる場所が複数あるとします。たとえば、ポニーのリストでは、各ポニーの横に「編集」リンクがある場合があり、ユーザーがポニーを表示している場合、そのビューにも「編集」リンクがある場合があります。

ユーザーがポニーを編集した後に「送信」をクリックすると、「編集」リンクをクリックしたときのページにユーザーを戻したいと思います。

ユーザーを最初の場所にリダイレクトするようにコントローラーを作成するにはどうすればよいですか? 確かに、コントローラーにパラメーターを渡すことでこれを行うことができますが、それは少しばかげているように思えます。私はこれについてすべて間違っていると考えていますか、それとも私がしなければならないことはほとんどありますか?

4

7 に答える 7

58

これを行う方法は次のとおりです (これは RESTful Spring 3 MVC 構文ですが、古い Spring コントローラーでも機能することに注意してください)。

@RequestMapping(value = "/rate", method = RequestMethod.POST)
public String rateHandler(HttpServletRequest request) {
    //your controller code
    String referer = request.getHeader("Referer");
    return "redirect:"+ referer;
}
于 2009-10-06T13:44:32.660 に答える
7

もちろん、1 つのオプションは編集フォームを新しいウィンドウで開くことです。そのため、ユーザーはそれを閉じるだけで元の場所に戻ることができます。

現在のアプリケーションには、複雑なことをしなければならない場所がいくつかあります。その後、ユーザーをフォームに渡し、開始点に戻します。そのような場合、私は開始点をセッションに保存してから渡します。それはおそらくあなたがしていることに対してやり過ぎです。

その他のオプション: 1) 「Referer」ヘッダーを保存して使用できますが、信頼できない場合があります。すべてのブラウザーがそのヘッダーを設定するわけではありません。2) フォーム送信後に " " を呼び出す確認ページに JavaScript を含めることができますhistory.go(-2)

于 2009-05-05T20:02:46.287 に答える
3

私の答えは Sam Brodkins のものに似ています (私もそれをお勧めします)。しかし、「リファラー」値が利用できない可能性があることを考慮して、この関数をコントローラーで使用するようにしました

/**
* Returns the viewName to return for coming back to the sender url
*
* @param request Instance of {@link HttpServletRequest} or use an injected instance
* @return Optional with the view name. Recomended to use an alternativa url with
* {@link Optional#orElse(java.lang.Object)}
*/
protected Optional<String> getPreviousPageByRequest(HttpServletRequest request)
{
   return Optional.ofNullable(request.getHeader("Referer")).map(requestUrl -> "redirect:" + requestUrl);
}

したがって、コントローラーの呼び出し元関数では、次のようなものを返す必要があります。

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
String testRedirection(HttpServletRequest request)
{
      //Logic....
      //Returns to the sender url
      return getPreviousPageByRequest(request).orElse("/"); //else go to home page
}
于 2015-08-24T15:21:32.090 に答える
1

もう1つのオプションは、URLを設計して、実行中のコンテキストを明らかにし、慣例により、操作の開始場所を「知る」ことができるようにすることです。

たとえば、次のような URL を持つことができます。

site/section1/pony/edit
site/section1/pony/delete

site/somewhere/else/entirely/pony/edit
site/somewhere/else/entirely/pony/delete

これらの URL の両方で、ポニーの編集と削除が可能です。両方の最初に戻るには、2 つのフォルダーを「上」に移動するだけです。これは、現在の URL を調べて 2 つのフォルダーを上に移動する JavaScript 関数を介して行うことができます。または、サーバー側 2 でそれを把握し、そのようなリダイレクトを行うこともできます。

于 2012-06-15T15:22:31.007 に答える
1

インターセプターを使用して、ユーザーに最後に提示された ModelAndView (またはビューのみ) を追跡することもできます。この例では、最後のモデルとビューのみを追跡しますが、リストを使用してより多くのレベルに戻ることができます。

package com.sample;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LastModelAndViewInterceptor extends HandlerInterceptorAdapter {

    public static final String LAST_MODEL_VIEW_ATTRIBUTE = LastModelAndViewInterceptor.class.getName() + ".lastModelAndView";

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        request.getSession(true).setAttribute(LAST_MODEL_VIEW_ATTRIBUTE, modelAndView);
        super.postHandle(request, response, handler, modelAndView);
    }

}

Spring XML 構成の場合:

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="com.sample.LastModelAndViewInterceptor"/>
    </property>
</bean>

次に、次のコードを使用して、コントローラーでそのビューに戻ります。

ModelAndView mv = (ModelAndView)request.getSession().getAttribute(LastModelAndViewInterceptor.LAST_MODEL_VIEW_ATTRIBUTE);
return mv;
于 2013-08-03T10:10:14.273 に答える
1

はい、新しいウィンドウのフォームに関するジェイコブのアイデアは良い選択肢かもしれません。または非表示のdivで。道場の対話のように。http://dojocampus.org/explorer/#Dijit_Dialog_Basic

于 2009-06-05T15:35:58.117 に答える