SpringMVC支持多对象Form Data绑定

SpringMVC支持多对象Form Data绑定:

对应的bean:

package com.netpf.test.bean;
public class Dept { private int id; private String name; private String leader; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLeader() { return leader; } public void setLeader(String leader) { this.leader = leader; } }




public class Role {

private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

public class User {

private int id;
private String username;
private String password;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}

  


import org.springframework.core.MethodParameter;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;

import javax.servlet.ServletRequest;

public class FormModelAttributeMethodProcessor extends ServletModelAttributeMethodProcessor {

     public FormModelAttributeMethodProcessor() {
         super(false);
     }

     public FormModelAttributeMethodProcessor(boolean annotationNotRequired) {
         super(annotationNotRequired);
     }

     @Override
     public boolean supportsParameter(MethodParameter parameter) {
         if (parameter.hasParameterAnnotation(FormModel.class)) {
                 return true;
             } else {
                 return false;
             }
     }

     @Override
     protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) {
                 ServletRequest servletRequest = request.getNativeRequest(ServletRequest.class);
                 ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder;
                 servletBinder.setFieldDefaultPrefix(servletBinder.getObjectName() + ".");
                 servletBinder.bind(servletRequest);
             }

}


package com.netpf.test;

import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FormModel {

String value() default "";

}

package com.netpf.test.Controller;

import com.netpf.common.APIResponse;
import com.netpf.test.FormModel;
import com.netpf.test.bean.Dept;
import com.netpf.test.bean.Role;
import com.netpf.test.bean.User;

import java.util.List;

public class TestController {


public APIResponse test(@FormModel("user")User user, @FormModel("dept")Dept dept, @FormModel("role") List<Role> roles){
return APIResponse.success();
}
}

 对应Servlet xml如下:

<?xml version="1.0" encoding="utf-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
  xmlns:mvc="http://www.springframework.org/schema/mvc" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="
  	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
  	http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <mvc:default-servlet-handler/>
	
	<!-- 扫描自定义多实体对象处理类 -->
	<mvc:annotation-driven>
		<mvc:argument-resolvers>
			<bean class="com.netpf.test.FormModelAttributeMethodProcessor"/>
		</mvc:argument-resolvers>
	</mvc:annotation-driven>
	
	

	<aop:aspectj-autoproxy proxy-target-class="true"/>
	
	<context:component-scan base-package="com.**.controller" />
	
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" />

	<!-- 处理使用@responseBody注解返回json数据至前台 -->
	<!-- start -->
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<util:list id="beanList">
				<ref bean="mappingJacksonHttpMessageConverter"/>
			</util:list>
		</property>
	</bean>
	<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/html;charset=UTF-8</value>
			</list>
		</property>
	</bean>
	<!-- end -->

    <!--基于validate的载入配置-->
    <mvc:annotation-driven validator="validator"/>

	

    <!--    <bean id="accountValidator" class="dao.AccountValidator"></bean> -->

    <bean id= "validator"
          class= "org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name= "providerClass"  value= "org.hibernate.validator.HibernateValidator"/>
        <!-- 假设不加默认到 使用classpath下的 ValidationMessages.properties -->
        <property name= "validationMessageSource" ref= "messageSource"/>
    </bean>

    <bean id= "messageSource"
          class= "org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name= "basename" value= "classpath:message"/>
        <property name= "fileEncodings" value= "utf-8"/>
        <property name= "cacheSeconds" value= "120"/>
    </bean>
	<!--<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">-->
        <!--<property name="basename" value="/WEB-INF/message_info" />-->
        <!--<property name="defaultEncoding" value="UTF-8"/>-->
        <!--<property name="cacheSeconds" value="60"/>-->
    <!--</bean>-->

	<!-- 开启spring的@valid验证 -->
	<mvc:annotation-driven/>

	<mvc:interceptors>  
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" >
        	<property name="paramName" value="sys_language"/>
        </bean>  
    </mvc:interceptors>
	<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
		<property name="cookieName" value="sys_language"/>
		<property name="cookieMaxAge" value="3600"/>
		<property name="defaultLocale" value="zh_CN"/> 
	</bean>


    <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/" />
        <property name="configLocation" value="classpath:velocity.properties"/>
    </bean>
	<bean class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver" 
		p:viewClass="com.velocity.VelocityLayoutToolboxView"
		p:order="0"
		p:prefix=""
		p:suffix=".vm"
		p:cache="false"
		p:layoutUrl="/WEB-INF/default_layout.vm"
		p:contentType="text/html;charset=UTF-8"
		p:exposeSpringMacroHelpers="true"
		p:exposeRequestAttributes="true"
		p:allowRequestOverride="true"
		p:allowSessionOverride="true"
		p:requestContextAttribute="rc"
		p:toolboxConfigLocation="/WEB-INF/conf/velocity-tools.xml"
		p:dateToolAttribute="date" />
</beans> 

  

原文地址:https://www.cnblogs.com/trey/p/4763096.html