4

URL を介してアクセスされるサーブレットがあり、その URL にはいくつかの要求パラメーターが含まれています。ここで、ユーザーを (サーブレットから) 別のページにリダイレクトする必要がありますが、要求から取得した要求パラメーターも追加する必要があります。これは私がやっていることです

    StringBuffer sb=new StringBuffer("/test.jsp");
    sb.append( "?" );
    Enumeration en = request.getParameterNames();
    while( en.hasMoreElements() ){
        String paramName = (String) en.nextElement();
        sb.append( paramName );
        sb.append( "=" );
        sb.append(request.getParameter( paramName ));
        sb.append("&");
    }
           String constructedURLWithParams=sb.toString();

しかし問題は、構築された URL の末尾に「&」が追加されることです。文字列操作を再度実行して、末尾の「&」を削除したくありません。これを行うためのより良い方法を提案してもらえますか?

4

3 に答える 3

6

これは一般的なシナリオです。いくつかの解決策を説明するために、少し単純化します。


オプション #1 - StringBuffer の長さを変更して最後の文字を削除します。

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    sb.append(en.nextElement());
    sb.append(",");
}
if (sb.length() > 0) {
    sb.setLength(sb.length() - 1);
}
System.err.println(sb.toString());

オプション #2 - バッファが空でない場合はセパレータを追加します

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    if (sb.length() > 0) {
        sb.append(",");
    }
    sb.append(en.nextElement());
}
System.err.println(sb.toString());

オプション #3 - 要素がさらにある場合は区切り記号を追加します ...

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    sb.append(en.nextElement());
    if (en.hasMoreElements()) {
        sb.append(",");
    }
}
System.err.println(sb.toString());

オプション #4 - これがループを初めて回らない場合は、区切り記号を追加します ...

StringBuffer sb = new StringBuffer();
Enumeration en = ...
boolean first = true;
while (en.hasMoreElements())
    if (first) {
        first = false;
    } else {
        sb.append(",");
    }
    sb.append(en.nextElement());
}
System.err.println(sb.toString());

どちらが最適かは、実行している内容の正確な詳細と、パフォーマンスがどれほど重要かによって異なります。


最後に、一般的な URL とクエリ文字列を組み立てる際には、もう少し注意する必要があることに注意してください。たとえば、パラメーターの名前と値で (URL 仕様に従って) 「予約されていない」文字を適切にエスケープする必要があります。不注意であると、Web サイトに XSS 攻撃を挿入するためのベクトルができてしまう可能性があります。

于 2011-07-08T09:26:54.677 に答える
4

ある種のコレクションから String を簡単に作成する方法についてのこの質問を参照してください

paramNameまた、コードにはバグがあります。 とリクエスト パラメータの両方に&および その他の不正な文字が含まれている可能性があるため、値をエスケープする必要があります。そのために使用URLEncoder.encode(value, "UTF-8")します。

于 2011-07-08T09:23:13.243 に答える
3

追加するだけ"?" + request.getQueryString()です (パラメーターが URL で渡される場合 - クエリ文字列にはすべての get パラメーターが含まれます)。

そうでない場合、あなたのアプローチは問題ないようです。ただ持っている

if (en.hasMoreElements()) sb.append("&");
于 2011-07-08T09:23:31.120 に答える