У меня есть приложение на основе Spring MVC, и я хочу добавить функциональность, в которой некоторые из моих контроллеров возвратят один и тот же вид в зависимости от значения параметра.
@RequestMapping("/someView")
public String returnView(Model model, HttpServletRequest request, String param){
if(param.equals("condition")){
return "commonView";
}
// do stuff
return "methodSpecificView";
}
Есть ли способ, в котором первое условие if может быть настроено в xml? Поскольку подобная функциональность должна реализовываться во многих контроллерах, и я не хочу писать шаблонный код, конфигурация xml может упростить задачу.
Кроме того, если первый возможен, можно ли его расширить, чтобы исключить параметр param
из сигнатуры метода сопоставления запросов и поместить его в xml тоже?
Весной 3.2, которая представляет собой аннотацию на основе приведенного ниже фрагмента кода, даст вам представление о вашей проблеме:
@RequestMapping("formSubmit.htm")
public String onformSubmit(@ModelAttribute("TestBean") TestBean testBean,BindingResult result, ModelMap model, HttpServletRequest request) {
String _result = null;
if (!result.hasErrors()) {
_result = performAction(request, dataStoreBean);//Method to perform action based on parameters recieved
}
if(testBean.getCondition()){
_result = "commonView";
}else{
_result = "methodSpecificView";
}
return _result;
}
TestBean//Class to hold all the required setters and getters
Объяснение: по мере того, как запрос из вашего представления приходит к этому методу, ссылка ModelAttribute будет содержать все значения из представления, если условие получено из представления, чем вы можете напрямую получить его из атрибута модели и вернуть соответствующее представление. Если ваше условие получено после применения определенной логики, вы можете установить условие в testBean и снова получить его для возврата соответствующего представления.
Вы можете использовать @RequestMapping:
@RequestMapping(value = {"/someView", "/anotherView", ...}, params = "name=condition")
public String returnCommonView(){
return "commonView";
}
Вы должны подумать об этом, используя AOP - Around
что-то вроде ниже.
@Around("@annotation(RequestMapping)") // modify the condition to include / exclude specific methods
public Object aroundAdvice(ProceedingJoinPoint joinpoint) throws Throwable {
Object args[] = joinpoint.getArgs();
String param = args[2]; // change the index as per convenience
if(param.equals("condition")){
return "commonView";
} else {
return joinpoint.proceed(); // this will execute the annotated method
}
}