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;
}

只要用户点击链接,一切似乎都很顺利,所以如果用户点击链接,网址将是这样的

localhost:8090/HelloStruts2/profile?id=1

但是如果用户直接操作 URL 会怎样?他在浏览器中手动输入了一个字母或字符?像这样

localhost:8090/HelloStruts2/profile?id=b

如果用户这样做,我相信会有异常或会发生错误。

我的问题是如何验证 URL 参数?或者如果用户做了这样的事情(在参数中输入字母或负数id),我会将他重定向到另一个页面。

4

2 回答 2

2

您有一个参数字段,int但您已将其设置为StringURL。为了消除这种错误,您需要在拦截器之前(或之后)放置一些拦截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在 setter 中检查了类型参数。

对于您的问题:如果您的参数未正确解析,您将0execute()方法中获得价值。因此,您决定返回什么结果。您还可以检查validate()方法中的值,如果放置在拦截validation器之后的params拦截器进行解析或GenericValidator.isInt在此之后将其setFieldError()显示在 JSP 中或在验证后立即重定向。

于 2013-01-18T16:54:37.393 回答
1

使用XWorkConverter的ParametersInterceptor会引发 Exception 类型

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

因为它会(通过反射)在 a 中搜索Settera String,而不是 a int

此错误将在 InterceptorStack 中间停止调用,并将其与input结果一起发回,这是请求中输入错误的默认结果。

如果您没有input在您的 中声明结果struts.xml,您将得到一个 Exception 类型

没有为操作 your.package.your.Action 和结果输入定义结果

如果你有它,那么你将被重定向回在你的struts.xml (同一个 JSP、另一个 JSP 或一个动作)中声明的结果。

您可以通过在 JSP 中通过<s:fielderror />标记输出字段错误来处理此问题,并最终使用 javascript 用红色边框为字段着色(在您的情况下不是,因为它们是 URL 参数)。

要正确验证此类内容(而不是要求 Struts2 失败并为您引发错误),您可以使用XML Validation,在 Action 的同一包中声明一个 XML 文件,其名称为YourActionName-validation.xml

在您的情况下,您应该使用Required ValidatorInt Validator

(并在您的 , 中指定0min参数Int Validator,以防止出现负值)

于 2013-01-18T13:54:19.980 回答