Struts2中获取请求中包含多个相同参数值会多一个空格的解决办法.
最近用struts2的时候发现一个小问题,当请求中包含多个相同的参数比如:http://localhost:8888/struts2/adduser.action?degree=1°ree=2°ree=3°ree=4
多个degree的情况,而在action中只是用的String来接收,会通过ognl转换成1, 2, 3, 4.中间会多一个空格. 我jsp中使用的是checkbox,在struts2中 会对应checkboxInterceptor拦截器来处理.当处理完后会调用ai.invoke().这个方法中会调用interceptors中的拦截器,继续往下执行下一个拦截器.看源码:
checkboxInterceptor:
ValueStack stack = ac.getValueStack(); setParameters(action, stack, parameters); } finally { ReflectionContextState.setCreatingNullObjects(contextMap, false); ReflectionContextState.setDenyMethodExecution(contextMap, false); ReflectionContextState.setReportingConversionErrors(contextMap, false); } } } return invocation.invoke(); }?
?
会调用ognl中ValueStack的setParameter方法给action中parameter设值,通过setValue方法,
最后会调用 :
OgnlRunTime中的callappropriateMethod方法
?终于找到问题的根源了.怎么来修改呢.我采取的方法是在setXXX方面中进行修改.
public void setDegree(String degree) { //1, 2, 3, 4 converte to 1,2,3,4 String result = ""; if(null != degree && !"".equals(degree)){ String [] params = degree.split(","); if(params.length > 1){ for(int i=0 ; i<params.length ; i++){ result += params[i].trim(); //通过trim()方法来处理. if( i < params.length - 1){ result += ","; } } } } this.degree = result; }?总结:其实这样转换很麻烦,最好的解决办法是在属性中使用数组或者集合来接收请求中传递的多个相同的参数值.