栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Spring-MVC中,视图中的属性名称必须始终与模型中的属性名称匹配?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Spring-MVC中,视图中的属性名称必须始终与模型中的属性名称匹配?

在@InitBinder带注释的方法中使用@RequestParam注释,然后手动设置所需的值。

UserController

    @InitBinder(value="user")    public void bind(WebDataBinder dataBinder, WebRequest webRequest, @RequestParam(value="pass", required=false) String password) {        User user = (User) dataBinder.getTarget();        user.setPassword(password);    }

有没有一种方法可以使用注释来处理差异,或者我必须始终匹配名称?

AFAIK在Spring MVC中没有现成的注释可以解决您的问题;您需要自定义设置来处理这种情况。

WebModelAttribute

@Target({ElementType.METHOD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@documentedpublic @interface WebModelAttribute {String modelAttributeName();    WebParameterMapping[] parameterMappings();}

WebParameterMapping

@Target({ElementType.METHOD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@documentedpublic @interface WebParameterMapping {    String webProperty();    String beanProperty();}

UserController

@Controllerpublic class UserController extends AbstractController {    @Override    @InitBinder(value="user")    @WebModelAttribute(modelAttributeName="user", parameterMappings={@WebParameterMapping(webProperty="pass", beanProperty="password")})    protected void bindWebParameters(WebDataBinder dataBinder, WebRequest webRequest, WebParameterResolver mappingResolver) {        super.bindWebParameters(dataBinder, webRequest, mappingResolver);    }

抽象控制器

public class AbstractController {    protected void bindWebParameters(WebDataBinder dataBinder, WebRequest webRequest, WebParameterResolver mappingResolver) {        if(mappingResolver != null && dataBinder.getTarget() != null && dataBinder.getObjectName().equals(mappingResolver.getModelAttributeName())) { String[] allowedFields = mappingResolver.getAllowedFields(dataBinder.getAllowedFields()); String[] disallowedFields = mappingResolver.getDisallowedFields(dataBinder.getDisallowedFields()); dataBinder.setAllowedFields(allowedFields); dataBinder.setDisallowedFields(disallowedFields); dataBinder.bind(mappingResolver.getPropertyValues(dataBinder, webRequest));        }    }}

WebParameterResolver

public class WebParameterResolver {    private String modelAttributeName;    private WebParameterMapping[] parameterMappings;    public WebParameterResolver(String modelAttributeName, WebParameterMapping[] parameterMappings) {        this.modelAttributeName = modelAttributeName;        this.parameterMappings = parameterMappings;    }    public String getModelAttributeName() {        return modelAttributeName;    }    public String[] getDisallowedFields(String[] existingDisallowedFields) {        List<String> disallowedFields = new ArrayList<String>();        for (WebParameterMapping parameterMapping : parameterMappings) { disallowedFields.add(parameterMapping.webProperty());        }        if (existingDisallowedFields != null) { for (String disallowedField : existingDisallowedFields) {     disallowedFields.add(disallowedField); }        }        return disallowedFields.toArray(new String[disallowedFields.size()]);    }    public String[] getAllowedFields(String[] existingAllowedFields) {        List<String> allowedFields = new ArrayList<String>();        for (WebParameterMapping parameterMapping : parameterMappings) { allowedFields.add(parameterMapping.beanProperty());        }        if (existingAllowedFields != null) { for (String allowedField : existingAllowedFields) {     allowedFields.add(allowedField); }        }        return allowedFields.toArray(new String[allowedFields.size()]);    }    public MutablePropertyValues getPropertyValues(WebDataBinder dataBinder, WebRequest webRequest) {        MutablePropertyValues propertyValues = new MutablePropertyValues();        for (WebParameterMapping parameterMapping : parameterMappings) { String[] values = webRequest.getParameterValues(parameterMapping.webProperty()); if (values == null || values.length == 0) {     // do nothing } else if (values.length == 1) {     propertyValues.add(parameterMapping.beanProperty(), values[0]); } else {     propertyValues.add(parameterMapping.beanProperty(), values); }        }        dataBinder.bind(propertyValues);        return propertyValues;    }}

CustomArgumentResolver

public class CustomArgumentResolver implements WebArgumentResolver {    @Override    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {        if(methodParameter.getParameterType().equals(WebParameterResolver.class)) { WebModelAttribute webModelAttribute = methodParameter.getMethod().getAnnotation(WebModelAttribute.class); if(webModelAttribute == null) {     throw new RuntimeException("method must have WebModelAttribute"); } return new WebParameterResolver(webModelAttribute.modelAttributeName(), webModelAttribute.parameterMappings());        }        return UNRESOLVED;    }}

beans.xml

    <bean id="handlerAdapter" >    <property name="customArgumentResolvers" ref="timetracking.annotations.CustomArgumentResolver"/>    </bean><bean name="timetracking.annotations.CustomArgumentResolver"         />

您还可以

public static voidbindWebParameters(...)
在一些帮助程序类中使用方法。因此您不必每次都扩展AbstractController。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/615815.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号