我们正在从支撑杆1.3框架移动到弹簧MVC。在Struts框架中,我们使用了类型ActionForm的形式。我们将其维护在会议范围内。当我们浏览屏幕(A-> B-> C(时,我们将重置表单的某些属性。如果我们从屏幕A到B导航,我们将传递param X = 1,并且在表单的属性'x'中填充了相同的内容。但是在从b到c导航之前,我们重置x = null,因为屏幕b不会传递param x,并且我们不希望x维护从屏幕上收集的值。在支撑杆中,在填充参数之前每次自动调用复位方法。无论如何我们是否可以在Spring MVC中实现类似的实现?
protected void processPopulate(HttpServletRequest request,
HttpServletResponse response, ActionForm form, ActionMapping mapping)
throws ServletException {
if (form == null) {
return;
}
// Populate the bean properties of this ActionForm instance
if (log.isDebugEnabled()) {
log.debug(" Populating bean properties from this request");
}
form.setServlet(this.servlet);
form.reset(mapping, request);
if (mapping.getMultipartClass() != null) {
request.setAttribute(Globals.MULTIPART_KEY,
mapping.getMultipartClass());
}
RequestUtils.populate(form, mapping.getPrefix(), mapping.getSuffix(),
request);
终于,我找到了在模型中调用我自己的重置方法的选项,然后才能使用请求值填充。我扩展了ServletModeLattributeMethodProcessor和Overriden的方法BindRequestParameters,我在模型上称为RESET方法,然后在超级类中将方法路由到方法。再过来,我在RequestMappingHandlerAdapter中注册了我的实现类,为参数解析器之一。我首先收集了所有解析器,然后首先添加了我的,以避免跳过现有的解析器进行模型处理。
public class ResetArgumentResolver extends ServletModelAttributeMethodProcessor {
@Autowired
RequestMappingHandlerAdapter requestMappingHandlerAdapter;
ResetArgumentResolver(boolean annotationNotRequired) {
super(annotationNotRequired);
}
ResetArgumentResolver(){
this(false);
}
@PostConstruct
public void afterPropertiesSet() {
List<HandlerMethodArgumentResolver> argumentResolvers = requestMappingHandlerAdapter.getArgumentResolvers();
List<HandlerMethodArgumentResolver> newArgResolvers = new ArrayList<>();
newArgResolvers.add(this);
newArgResolvers.addAll(argumentResolvers);
requestMappingHandlerAdapter.setArgumentResolvers(Collections.unmodifiableList(newArgResolvers));
}
@Override
protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) {
Object attribute = binder.getTarget();
if (xxxx.class.isAssignableFrom(attribute.getClass())) {
((xxxx) attribute).reset();
}
super.bindRequestParameters(binder,request);
}
}