2

2ページあるSpringMVC3アプリケーションがあります。1ページのユーザーがデータを選択し、それがコントローラーとbuildsupページ2に送信されます。次に、ページ2がその値を取得した後、データベースアクションに最初のページの値を使用します。

私がこれまでに試したこと:

私は見ましたModelAttribute

最初は、最初のコントローラーのポストです。

@RequestMapping(value = "/firstPage")
public ModelAndView firstPageSubmit(String valuePage1, String valuePage2) {
     return new ModelAndView("secondPage", "readonlySettings", new ReadonlySettings( valuePage1, valuePage2 );
} 

そして、私は春がこのオブジェクトを保存し、再び私にそれを与えることを望んでいました:

@RequestMapping(value = "/secondPage")
public ModelAndView secondPage(@ModelAttribute("readonlySettings") ReadonlySettings settings, String valuePage2) {
     //Store stuff in the database
     doa.save(settings.getValuePage1(), settings.getValuePage2(), valuePage2);
} 

しかし、サイコロはありません..すべての値は空です。

ReadonlySettingsところで:私はjsp自体のオブジェクトには何もしませんでした。したがって、私はこのソリューションが好きではないので、隠しフィールドなどはありません。人々は隠されたフィールドを変えることができます、そしてそれは私が本当に避けたいものです。

誰かがこれを処理する方法を知っていますか?

4

1 に答える 1

2

@SessionAttributesを使用して、サーバー側でユーザーのWebセッションに関連付けられたオブジェクトを保持するようにSpringに指示できます。

@Controller
@SessionAttributes("readonlySettings")
public class MyController {

@RequestMapping(value = "/firstPage")
public ModelAndView firstPageSubmit(String valuePage1, String valuePage2, ModelMap map) {
    map.addAttribute("readonlySettings", new ReadonlySettings( valuePage1, valuePage2 );
    return new ModelAndView("secondPage");
} 

@RequestMapping(value = "/secondPage")
public ModelAndView secondPage(ModelMap map, SessionStatus status, String valuePage2, ) {
    ReadonlySettings settings = map.getAttribute("readonlySettings");
    doa.save(settings.getValuePage1(), settings.getValuePage2(), valuePage2);
    status.setComplete();
} 

明らかにこれはかなり原始的です。操作のコンテキストによっては、誰かがリンクを介して2番目のページを直接ロードし、セッションにオブジェクトがない場合の処理​​を追加する必要がある場合があります。また、誰かが2番目のステップを完了しなかった場合、セッションがクリーンアップされるまで、オブジェクトはそこにぶら下がったままになります。(文字列が2つしかない場合は許容できる場合があります。)実際のユースケースがこれよりも大幅に複雑な場合は、再発明するのではなく、Webフローのようなものを検討することをお勧めします。

于 2012-11-26T16:52:57.487 に答える