2

>= コンパレータを使用するこの JSP EL 式があります。私の開発環境では、期待どおりの結果が得られました。つまり、2 >= 188 は false です。ただし、私のステージング サーバーと運用サーバーでは、明らかに 2 >= 188 が true です。

コードは次のとおりです。

</ul>
<p>curPage: ${param.curPage}<br/>
totalPages: ${param.totalPages}<br/>
totalPages - curPage: ${param.totalPages - param.curPage}<br/>
curPage gt totalPages: ${param.curPage >= param.totalPages}<br/>
<p>

私の開発環境では、次のような出力が得られます。

curPage: 2
totalPages: 68
totalPages - curPage: 66
curPage gt totalPages: false

ステージング時:

curPage: 2
totalPages: 181
totalPages - curPage: 179
curPage gt totalPages: true

私の開発環境は Tomcat 7.0.29 を実行しており、ステージングは​​ 7.0.30 を実行しています。コードベースは同じです。

上記のコードは、ファイル「pagination.jsp」(.tag である必要があることはわかっています) にあり、次のような別の jsp に含まれています。

<jsp:include page="/widgets/pagination.jsp">
    <jsp:param name="totalPages" value="${actionBean.jbp.totalPages}" />
    <jsp:param name="baseUrl" value="${baseUrl}" />
    <jsp:param name="curPage" value="${not empty param.page?param.page:0}" />
</jsp:include>

「jbp.totalPages」は次のように定義されています。

private final int totalPages;

「param.page」は明らかにページパラメータです。

ここで、パラメーターと int の間で型変換の問題が発生する可能性があると思いますが、それが 1 つのマシンで機能し、他のマシンでは機能しない理由を説明していません。

また、JSP EL は自動型変換を行っていると思いました。

任意の考えをいただければ幸いです。

4

2 に答える 2

4

これらのパラメーターはString代わりに評価されますNumber(基本的にそれがHttpServletRequest#getParameter()返されるため)。の文字列値は、"2"で始まるどの文字列値よりも辞書的に「大きい」です"1"

として解析する必要がありますNumberこれにはJSTL を使用できます<fmt:parseNumber>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<fmt:parseNumber var="curPage" value="${param.curPage}" integerOnly="true" />
<fmt:parseNumber var="totalPages" value="${param.totalPages}" integerOnly="true" />
... 
<p>
  curPage: ${curPage}<br/>
  totalPages: ${totalPages}<br/>
  totalPages - curPage: ${totalPages - curPage}<br/>
  curPage gt totalPages: ${curPage >= totalPages}<br/>
</p>

開発環境と実稼働環境の違いに関しては、これはおそらく悪いテストの結果です (同じテスト データを使用していないか、同じテスト コードを使用していない可能性さえあります)。つまり、前述のバージョン間で Tomcat の EL 実装で変更されたようなものはありません。比較のハンドの 1 つが本当にaNumberで、もう 1 つが aStringである場合にのみ、EL は to を強要StringLongます。これはおそらく、実際のコードで起こっていることです。

于 2012-12-18T19:04:43.850 に答える
3

2 >= 188比較される項目が数値の場合は false です。

2 >= 188比較される項目が文字列の場合は true です。

2 つの展開で何かが異なります。

jstl.jar と standard.jar のバージョンと、おそらくtomcat/libディレクトリ内のすべての jar を調べてください。コードは同じかもしれませんが依存ライブラリには他の違いがありますか? なんとなく種類が違います。JSP の違いが型の推論に影響を与える可能性は低いですが、可能性の範囲を超えているわけではありません。

編集

これは、質問が両方のコード例で 188 (実際には 181) を使用したときに回答されました。その後、例の1 つで69 に変更されました。今、それはすべて理にかなっています。

于 2012-12-18T19:01:45.990 に答える