Spring-MVCコントローラーは“ previous”にリダイレクトしますページ?

StackOverflow https://stackoverflow.com/questions/804581

  •  03-07-2019
  •  | 
  •  

質問

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

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

これを行う方法は次のとおりです(これは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;
}

私の答えは、サム・ブロドキンスに似ています(私もお勧めします)。しかし、「Referer」が値が利用できない場合があります。この関数を作成してコントローラーで使用する

/**
* 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
}

はい、新しいウィンドウのフォームに対するジェイコブのアイデアは良い選択肢だと思います。 または非表示のdivで。道場のダイアログのように。 http://dojocampus.org/explorer/#Dijit_Dialog_Basic

もう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でそれを把握し、そのようなリダイレクトを行うこともできます。

インターセプターを使用してユーザーに最後に提示された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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top