1

ここにこのURLがあるとしましょう

<s:url action ="profile" var ="profile_url">
  <s:param name = "id">${user.userId}</s:param>
</s:url>
<s:a href = "%{profile_url}">My Profile</s:a>

パラメータIDにはint値のみが含まれます。つまり、私のActionクラスの内部です。

public class ViewProfileAction extends ActionSupport{

    public String execute(){
       //someServiceLayer.getUser(id);
       return "success";
    }

    public int getId() {
       return id;
    }

    public void setId(int id) {
       this.id = id;
    }

    private int id;
}

ユーザーがリンクをクリックする限り、すべてがうまくいくように見えるので、ユーザーがリンクをクリックすると、URLは次のようになります。

localhost:8090/HelloStruts2/profile?id=1

しかし、ユーザーがURLを直接操作した場合はどうなるでしょうか。彼はブラウザに文字または文字を手動で入力しましたか?このような

localhost:8090/HelloStruts2/profile?id=b

ユーザーがそれを行った場合、例外が発生するか、エラーが発生すると確信しています。

私の質問では、URLパラメータをどのように検証しますか?または、ユーザーがそのようなことをした場合(パラメーターに文字または負の数を入力した場合)、ユーザーidを別のページにリダイレクトします。

4

2 に答える 2

2

としてパラメータフィールドがありますが、URLのintように設定しています。Stringこの種のエラーを排除するには、インターセプターの前(または問題ではない後)にparamsインターセプターを配置して、その値をチェックする必要があります。たとえば、validationインターセプターを配置します。

@Action(value = "youraction", results = {
  @Result(location = "/path/to/page.jsp"),
}, interceptorRefs = {@InterceptorRef("validation"), @InterceptorRef("basicStack")})

validate()次に、アクションにメソッドを実装する必要があります

public void validate() {}

最後に、間違った結果と良い結果を処理するメソッドを追加して、OGNLが文句を言わないようにします。

public void setId(String id) {
    try {
      this.id = Integer.parseInt(id);
    } catch (NumberFormatException nfe){}
} 

これで、例外はなくなり、タイプのパラメーターがStringセッターでチェックされます。

あなたの質問に:あなたのパラメータが正しく解析されなかった場合、あなた0execute()メソッドにの値を持っているでしょう。したがって、返す結果を決定します。インターセプターの後に配置されたインターセプターが解析を実行するか、その後にインターセプターが解析を実行し、JSPに表示するか、検証の直後にリダイレクトするvalidate()かどうかをメソッドで確認することもできます。validationparamsGenericValidator.isIntsetFieldError()

于 2013-01-18T16:54:37.393 に答える
1

XWorkConverterを使用するParametersInterceptorは、タイプの例外を発生させます

ognl.MethodFailedException:java.lang.NoSuchMethodException setId(java.lang.String);

Setterなぜなら、(リフレクションを通じて) aStringではなくaを検索するからintです。

このエラーにより、InterceptorStackの途中で呼び出しが停止し、結果とともに返送さinputれます。これは、リクエストの入力エラーのデフォルトの結果です。

inputで宣言された結果がない場合はstruts.xml、タイプの例外が発生します

アクションyour.package.your.Actionおよび結果入力に対して結果が定義されていません

持っている場合は、で宣言された結果struts.xml (同じJSP、別のJSP、またはアクション)にリダイレクトされます。

これを処理するには、JSPのタグを介してフィールドエラーを出力<s:fielderror />し、最終的にはフィールドをjavascriptで赤の境界線で色付けします(URLパラメーターであるため、この場合はそうではありません)。

この種のものを適切に検証するために(Struts2に失敗してエラーを発生させる代わりに)、XML Validationアクションの同じパッケージで次の名前のXMLファイルを宣言するを使用できます。YourActionName-validation.xml

あなたの場合、RequiredValidatorIntValidatorを使用する必要があります

(負の値を防ぐために、のparam0として指定します)minInt Validator

于 2013-01-18T13:54:19.980 に答える