1

概要

私たちの Web アプリケーションでは、ユーザーがページの読み込みよりも「速く」クリックすると、ブラウザーはユーザーに最初のリクエストを表示するようです (いくつかのエラー メッセージによると)。私はそれが2番目の要求であることを期待していたでしょう.

その他の背景情報

Struts1 Web アプリケーションがあります。ユーザー セッションでは、ユーザー インタラクションの現在のコンテキストを配置します。

request.getSession().setAttribute("context", <something>);

たとえば、アプリはマスター レコードのリストを表示し、コンテキストにはユーザーに関する情報が保持されます。ユーザーがマスター レコードをクリックすると、そのレコードに関する情報がユーザー セッション オブジェクトに保存されます。JSP では、コンテキスト オブジェクトをローカル変数に割り当てることがよくあります。これは、特定のタイプ (MasterRecordDTOまたは などUserDTO)にキャストする必要があります。

<% MasterRecordDTO dto = (MasterRecordDTO) request.getSession().getAttribute("context"); %>

その後、ユーザーはそのマスター レコードの詳細ビューにドリルダウンできます。のような sth を示すブレッドクラムがありlist > master > detailます。これらは、ユーザーがブレッドクラムを使用してナビゲートできるようにするためのリンクです。

その状況で、ユーザーが最初に「マスター」をクリックし、すぐに「リスト」をクリックすると、ClassCastException が発生します。

"UserDTO cannot be cast to MasterRecordDTO" 

これは、MasterRecord-JSPdtoが最初のリクエストで変数を割り当てたときに、2 番目のリクエストですでにcontextセッション属性がUserDTOオブジェクトに設定されていることを意味します。

質問

ブラウザが最初のリクエストを「放棄」し、2 番目のリクエストの結果をユーザーに表示すると予想していました (この例では、マスター レコードのリスト)。誰か私にこれを説明できますか?

アップデート

ブレッドクラム リンクは別の HTML フレームにあります。Internet Explorer 7 でこの問題が発生しました。Firefox 11 で試してみましたが、どうやら 2 回目のクリックでも送信されません。

4

1 に答える 1

0

一般的な並行プログラミングの状況だと思います。

ブラウザは2つのリクエストを同時にサーバーに送信し、サーバーは2つのスレッドを使用して2つのリクエストを処理します。

  1. リクエスト/スレッド 1 セッション属性contextをに設定MasterRecordDTO
  2. request/thread 2 に変更しましたUserDTO(これが問題の原因です)
  3. request/thread 1 を実行し続けると、ClassCastException発生する原因になります。
  4. request/thread 2 が引き続き実行されると、クライアントへの成功応答が生成されます。(ただし、ブラウザには表示されません)

ブラウザーの動作はアプリケーションによって制御されず、応答 1 の結果が表示されるだけです (応答 2 の場合もあります。現在のほとんどのブラウザーはマルチスレッド設計であるため、これは同時発生の状況でもあります)。

要求スコープを使用contextしてそのような情報を保存し、期待される結果を得るようにしてください。

于 2012-06-07T08:45:09.050 に答える