Spring-MVCコントローラーは“ previous”にリダイレクトしますページ?
-
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;