總結網上的方法,自己實驗了一下,目標函數如下:
@RequestMapping(value="/dispatch",produces = "text/html; charset=UTF-8")
@ResponseBody
@ControllerPointcut(str= "OKOK")public String dispatch(@RequestParam("messageA") String messageA,
@RequestParam("messageB") String messageB,
@RequestParam("messageC") String messageC)throws Exception{return "alert('"+messageA+messageB+messageC+"');";
}
增強方法:
@Pointcut("@annotation(com.annotation.ControllerPointcut)")private voidcontroller(){}
@Around("controller()")publicObject test(ProceedingJoinPoint pjp) throws Throwable{
Object[] args=pjp.getArgs();for(Object obj : args){
System.out.println("arguments:"+obj);
}
Object args0= args[0];
Object args2= args[2];
args[0] =args2;
args[2] =args0;
Object retVal=pjp.proceed(args);returnretVal;
}
頁面ajax:
$.ajax({
url:"test/dispatch.do",
type:"post",
dataType:"html",
data:{messageA:"This", messageB:"Is", messageC:"Message"},
success:function(result){
$("#container-top").append(result);
}
});
結果:
頁面:
MessageIsThis
Eclipse控制台:
arguments: This
arguments: Is
arguments: Message
總結:
1.ProceedingJoinPoint對象取到的args[]內的 參數順序 就是 目標函數聲明時的參數順序,可以逐一對應
2.直接通過 args[‘index’] = ... 方式來修改,再通過 Object retVal = pjp.proceed(args); return retVal;即可改變並傳入參數;
3.如果對象方法的參數中包括 HttpServletRequest request, 那么直接調用其getParameterMap().put(...)方法改變Parameter會報錯“parameterMap is locked”,而其set相關的方法又只有setAttribute,即設置用於多個controller方法跳轉的attribute,就算設置成某parameter相同的名字,也無法覆蓋,畢竟是不一樣的對象。所以,通過截獲request本身來改變參數的方法行不通。
4.另外還有在聲明@annotation時,加入args(..) 這樣的方法可以直接截獲目標函數的參數,但,暫時不知道,如何只通過這個方法修改參數並傳回目標函數。。。。