2011-07-08 17 views
4

URLを介してアクセスするサーブレットがあり、その中にリクエストパラメータがいくつかあります。これで、ユーザーを別のページ(サーブレットから)にリダイレクトする必要がありますが、リクエストから取得したリクエストパラメータも追加する必要があります。 構築されたURLの終わりに向かって追加されます「&」があり、私はリクエストパラメータをJavaで構築する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(); 

をやっているこれは、しかし、問題はあります。私はもう一度ストリング操作を行い、末尾の "&"を削除したくありません。これを行うより良い方法をお勧めしますか?

答えて

3

単に"?" + request.getQueryString()を追加します。ちょうど持っている

if (en.hasMoreElements()) sb.append("&"); 
4

簡単にコレクションのいくつかの種類から文字列を構築するためにどのようにこの質問を参照してください:What's the most elegant way to concatenate a list of values with delimiter in Java?

また、あなたのコードにバグがあります:あなたは、両方のparamName以降の値をエスケープする必要があるとリクエストパラメータは&を含み、その他の違法ことができます文字。それにはURLEncoder.encode(value, "UTF-8")を使用してください。そうでない場合は、あなたのアプローチは罰金だ

を - (クエリ文字列は、すべてのGETパラメータが含まれているパラメータがURLに渡された場合)

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()); 

ある場合、セパレータ0

オプション#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仕様に従って)「予約されていない」文字以外の文字を適切にエスケープする必要があります。あなたが不注意な場合、あなたのウェブサイトへのXSS攻撃の注入のためのベクトルに終わるかもしれません。

+0

これはどのように、私はこれらのちょっとした問題を通常修正します – chedine

関連する問題