Struts 2请求参数validation(Int和字符串)
假设我在这里有这个URL
${user.userId} My Profile
其中参数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
如果用户这样做,我确信会有exception或发生错误。
我的问题如何validationURL参数? 或者如果用户做了这样的事情(在参数id
输入了一个字母或一个负数),我会将他重定向到另一个页面。
您有一个参数字段作为int
但您已在URL中将其设置为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){} }
这就是全部,你不再有例外,并且在setter中检查String
类型的参数。
对于您的问题:如果参数未正确解析,则execute()
方法的值为0
。 所以,你决定返回什么结果。 如果在params
拦截器之后放置的validation
拦截器在setFieldError()
之后进行解析或GenericValidator.isInt
并在JSP中显示它或在validation后立即重定向,则还可以检查validate()
方法中的值。
使用XWorkConverter的 ParametersInterceptor会引发类型exception
ognl.MethodFailedException:java.lang.NoSuchMethodException setId(java.lang.String);
因为它会搜索(通过reflection)一个String
的Setter
,而不是int
。
此错误将停止InterceptorStack中间的调用,并将其与input
结果一起发回,这是请求中输入错误的默认结果。
如果你没有在struts.xml
声明input
结果,你将得到一个exception类型
没有为动作定义你的.package.your.Action和结果输入
如果您拥有它,那么您将被重定向回struts.xml
声明的结果(相同的JSP,另一个JSP或Action)。
您可以通过JSP中的
标记输出字段错误来处理此问题,并最终使用javascript对字段进行红色边框着色(不是在您的情况下,因为它们是URL参数)。
要正确validation这类内容(而不是要求Struts2失败并为您引发错误),您可以使用XML Validation
,在Action的同一个包中声明一个名为YourActionName-validation.xml
的XML文件
在您的情况下,您应该使用Required Validator和Int Validator
(并在Int Validator
指定0
作为min
param,以防止负值)