0

私はSpring MVCとJSPの開発に慣れていないので、私が愚かなことをしていると優しく言ってください:P そう言った、質問:

私はSpring MVCを少し勉強し、うまく機能するコードを手に入れました。今、明らかにばかげた問題に行き詰まっています。JSP に渡したオブジェクトをコントローラに戻すことができないようです。私がする必要があるのは、ユーザーが2つのテキストボックスに入力し、ボタンをクリックすると、システムがデータベースにクエリを実行し、ユーザーが検索した要素を見つけ、見つかった要素を配列「capitolospesas」に追加して再レンダリングすることです配列内のすべてのオブジェクトを含む jsp (前のもの + 追加したもの)。

私が作成したサイクルは、コントローラー ---> jsp ---> コントローラー ---> jsp です。マッピング「newProposte」は空白の値でページ newEditProposte.jsp を初期化し、jsp は表示する値を正しく取得し、ユーザーは必要なものを編集/入力し、送信ボタンをクリックします。コントロールはメソッド「selectCapitoloSpesaFromProposte」に渡され、そこでシステムはクエリを実行して結果を配列「capitolospesas」に追加しますが、新しいオブジェクトを追加すると常に空になるため、ページには最後に見つかった要素のみが表示されます。

@RequestMapping("/newProposte")
public ModelAndView newProposte()
{
    System.out.println("ProposteController.newProposte()");
    ModelAndView mav = new ModelAndView();

    mav.addObject("proposte", new ProposteWeb());
    mav.addObject("newFlag", true);
    mav.addObject("capitolospesas", new HashSet<Capitolospesa>());

    mav.setViewName("proposte/newEditProposte.jsp");

    return mav;
}

@RequestMapping("/selectCapitoloSpesaFromProposte")
public ModelAndView selectCapitoloSpesaFromProposte(@ModelAttribute ProposteWeb proposte, @ModelAttribute HashSet<Capitolospesa> capitolospesas)
{
    ModelAndView mav = new ModelAndView();

    mav.addObject("proposte", proposte);
    mav.addObject("newFlag", true);        
    capitolospesas.add(capitolospesaDAO.findCapitolospesaByCapitoloSpesaCapitoloAndCapitoloSpesaArticolo(proposte.getCapitoloSpesaCapitoloProposte(), proposte.getCapitoloSpesaArticoloProposte()));
    mav.addObject("capitolospesas", capitolospesas);

    mav.setViewName("proposte/newEditProposte.jsp");

    return mav;
}

jsp:

<script language="Javascript">       
function selectCapitoloSpesa()
{
    alert("selectCapitoloSpesaFromProposte");
    document.getElementById("tabProposteForm").action = "${pageContext.request.contextPath}/selectCapitoloSpesaFromProposte";
    submitForm();
    return true;
}
function submitForm()
{
    alert("submit");
    document.getElementById("tabProposteForm").submit();
    return true;
}
</script>
....
....
the form
....
....
the foreach iterating on the array "capitolospesas" showing it in a table
....
....
<input type="button" value="selectCapitoloSpesaFromProposte"    name=selectCapitoloSpesaFromProposte    onclick="return selectCapitoloSpesa();">

クリックしたボタン(さまざまなボタンがあります)に応じて、フォームの動作を変える必要があるため、このように投稿しました。

パラメータをjspページに渡すには、パラメータをModelAndViewオブジェクトに追加する必要があるというさまざまなチュートリアルを読みましたが、これを正しく行いました。jsp では、渡したすべてのオブジェクト (この場合は "newFlag"、"capitolospesas"、"proposte") にアクセスできます。私が理解していないのは、それらのオブジェクトがjspから戻ってきたときにどのようにそれらのオブジェクトを取得できるかということです? これまでは、ページ上にある唯一のエンティティを保存、編集、または削除するために必要な唯一のパラメーターの前に @ModelAttribute アノテーションを使用していましたが、ページから複数のオブジェクトを取得する必要があります。上に貼り付けたコードで、@ModelAttribute アノテーションを複数回使用しようとしましたが、成功しませんでした。オブジェクト「proposte」にはユーザーが入力したものが正しく入力されていますが、コードをデバッグして、メソッドが「

誰か提案があれば、投稿してください。

4

2 に答える 2

3

JSP がクライアントに送信される (つまり、HTML にレンダリングされる) 場合、保持される唯一のデータは、結果の HTML ドキュメントにあるデータです。Java オブジェクトは存在せず、フォーム送信としてサーバーに返すことができるテキストのみです。そのため、JSP は Java オブジェクトにアクセスできますが、Web ページを生成すると、それは忘れられます。覚えておいてください: Web ページは単なるテキスト ドキュメントであり、Web ブラウザとサーバーの間でやり取りされるのはテキストだけです。Java オブジェクトは渡されません。

Java オブジェクト (フォームの送信時に修正可能) を保存するには、それを別の場所に保存する必要があります。具体的には、セッション オブジェクトを使用して、オブジェクトを直接格納するか、オブジェクトへの他のポインターを格納します (たとえば、データベース エントリを参照するために使用できるログイン名や、読み取るファイル名など)。

通常のサーブレットでセッション値を使用するには、次のようにします。

HttpSession session = request.getSession(true);
session.setAttribute( "keyForObject", myObject );

オブジェクトを格納します。. . それから

HttpSession session = request.getSession(true);
myObject = (ObjectType)session.getAttribute( "keyForObject" );

それを取得します。

Spring RequestMapping では、セッション オブジェクトを取得するために HttpSession パラメーターを追加するだけです。

@RequestMapping
public void myMethod(... HttpSession session)
于 2011-09-20T14:10:42.287 に答える
1

セッション変数またはデータベース (または他の永続ストア) のいずれかで、オブジェクトをコントローラーに保存する必要があります。ModelAndViewオブジェクトからそれを取り戻す方法はありません。そのオブジェクトは JSP に送信され、その後ガベージ コレクションされました。あなたは新しいリクエストにいます。どこかに保存しない限り、以前のリクエストからモデル オブジェクトにアクセスする方法はありません。

于 2011-09-20T13:49:58.787 に答える