2

ユーザーに沿って別のページに転送するac:redirectタグを含むJSPファイルがありました。

<!-- Yes, I know this loop is probably unnecessary, but I'm not fluent in jsp and have determined it is not the problem. :)  -->
<c:if test="${cmd.numberOfResults == 1}"> 
    <c:forEach items="${cmd.matches}" var="someVar">
        <c:redirect url="/loadThatResultInfo.html"/>
    </c:forEach>
</c:if>

コマンドオブジェクトの古い実装は更新する必要があります(私が入ったところ)。私がそうしている方法は、その古いオブジェクトのインスタンスを含む一般的な「検索結果」オブジェクトを作成することです(今のところ)。そのインスタンスはその汎用クラスのプロパティを介して取得するため、コードは次のようになります。

<c:if test="${cmd.genericSearchObject.numberOfResults == 1}"> 
    <c:forEach items="${cmd.genericSearchObject.matches}" var="acct">
        <jsp:forward page="/loadThatResultInfo.html"/> <!-- new try! -->
        <c:redirect url="/loadThatResultInfo.html"/>   <!-- old try... -->
        <% response.sendRedirect("/loadThatResultInfo.html"); %> <! new try! -->
    </c:forEach>
</c:if>

これらの3つの試行はすべて、ある種のIllegalStateExceptionsになります。 特に、関連する行(変更された/バインドされたクラスインスタンスではなくリダイレ​​クト)が問題を引き起こしていることを考えると、この変更によって例外が発生するのはなぜですか?

それに応じてバックエンドの変更が行われ、古い機能を満たすために、新しい包括的「汎用」クラス内のプロパティを参照しました。私が書いているもの以外のすべての関連機能が機能するので、これが機能することを私は知っています。

オンラインでの調査によると:-提出物がすでに提出された後、リダイレクト/転送できません。では、以前はどうやってそれを行うことができたのでしょうか。-すでにクリアされたバッファをフラッシュしようとすると、これが発生します。古い(最初の)実装とは対照的に、今ではそれをクリアするために何が変更されましたか?-ページのバッファのサイズを大きくする必要があります。これは私が理解していないものであり、stackoverflowコミュニティが対処することを本当に望んでいます。新しいクラスがサイズの変更を引き起こしているのを見ることができますが、これには変更を処理する必要があります。

-------別の答え!-------

何よりもまず、マークされた回答で説明されているように、常にコードに状況を設定します。しかし...あなたが立ち往生していてそれをしたくない場合は、ここに簡単な修正があります:javascript!

<script type="text/javascript">
    location='./yourPageToGoTo.html'
</script>
4

1 に答える 1

3

JSPは応答の一部です。コントローラではなくJSPで応答先を変更しようとしています。これをJSPの途中で行うと、HTTP応答ヘッダーがすでに送信されている可能性があるため(応答はコミットされた状態になります) 、手遅れになります。これはノーリターンのポイントであり、応答を変更するための違法な状態です。それでは手遅れです。試行すると、servletcontainerがをスローしIllegalStateException: response already committedます。

これを修正するには、このピースコードをJSPファイルの一番上に配置し、その時点で応答がまだコミットされていないことを祈る必要があります(これは通常、応答に約2KBのデータを書き込んだ後に発生します。 servletcontainer config)。ただし、JSPはまだジョブにとって間違った場所です。応答をJSPに転送するに、コントローラーでこれを行う必要があります(または、モデル内からコントローラーにジョブを実行するように指示する場合は、 MVCフレームワーク)。

于 2010-12-06T11:35:56.220 に答える