假设我在这里有这个网址
<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类中。
int
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),我会将其重定向到另一页。
id
您有一个参数字段,int但已String在URL 中将其设置为。为了消除这种错误,您需要在拦截器之前(或之后)放置一些拦截params器以检查该值。例如,您放置了validation拦截器。
String
params
validation
@Action(value = "youraction", results = { @Result(location = "/path/to/page.jsp"), }, interceptorRefs = {@InterceptorRef("validation"), @InterceptorRef("basicStack")})
那么你需要validate()在动作中实现工具
validate()
public void validate() {}
最后补充一点,将处理错误的方法 也 很好的效果,所以OGNL不会抱怨
public void setId(String id) { try { this.id = Integer.parseInt(id); } catch (NumberFormatException nfe){} }
仅此而已,您也不再例外,并且String在设置器中检查了类型参数。
问题:如果参数解析不正确,则0该execute()方法中的值将为。因此,您决定要返回什么结果。您还可以检查validate()方法中的值(如果validation放置在params拦截器之后)或GenericValidator.isInt在拦截器之后进行解析,setFieldError()然后在JSP中显示它或在验证后立即重定向。
0
execute()
GenericValidator.isInt
setFieldError()