`
jinnianshilongnian
  • 浏览: 21419935 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2402243
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2995458
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5629905
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257006
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1592392
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248689
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5845054
Group-logo
跟我学Nginx+Lua开...
浏览量:697265
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:779626
社区版块
存档分类
最新评论

扩展SpringMVC以支持更精准的数据绑定1

阅读更多

最新版请点击查看FormModelMethodArgumentResolver.java 

 

问题描述:

springMVC 数据绑定 多个对象 如何准确绑定?

<form>

    <input name="student.name" value="Kate" />

    <input name="student.type" value="自费" />

    <input name="teacher.name" value="Gavin" />

    <input name="teacher.level" value="2" />

</form>
@RequestMapping("/school.do")

public String school(Student student, Teacher teacher) {

     return "school";

}

如果还是想刚才的jsp那些写表单,是不能封装参数的,必须把“student.”和“teacher.”去掉,但是这样封装就不能准确封装了。

 

这个问题最近老是有人问,所以写一个扩展很容易解决这个问题,springmvc和spring一样,预留的扩展点足够多。

 

我们都知道struts2默认就是这种方案,这是因为struts2采用了OGNL,并通过栈(根对象)进行操作的,而且栈中默认有action实例,所以很自然的没有这种问题。

springmvc不同,没有根对象的概念,而且本身很难来解决这个问题,因此大家在使用时最好避免这种方式或者使用类似于struts1的FormBean组合对象来解决。

 

解决方案:

扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。

 

1、请下载附件的代码,放到工程中;

2、在RequestMappingHandlerAdapter添加自定义HandlerMethodArgumentResolver Bean;

     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
        <!--线程安全的访问session-->
         <property name="synchronizeOnSession" value="true"/> 
         <property name="customArgumentResolvers">
            <list>
               <bean class="cn.javass.spring.mvc.method.annotation.RequestJsonParamMethodArgumentResolver"/>
               <bean class="cn.javass.spring.mvc.method.annotation.FormModelMethodArgumentResolver"/>
            </list>
         </property>
     </bean>  

 //customArgumentResolvers用于注入自定义的参数解析器,此处我们注了FormModelMethodArgumentResolver;FormModelMethodArgumentResolver我直接修改的org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;

 

3、使用方式

 public String user(@FormModel("student") Student student, @FormModel("teacher") Teacher teacher) 

 

4、测试控制器

package cn.javass.chapter6.web.controller.formmodel;

import java.util.Arrays;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.javass.chapter6.model.UserModel;
import cn.javass.spring.mvc.bind.annotation.FormModel;
import cn.javass.spring.mvc.util.MapWapper;


@Controller
@RequestMapping("/formmodel")  
public class FormModelController {

    //ok   http://localhost:9080/springmvc-chapter6/formmodel/user?user.username=zhang&user.password=123
    @RequestMapping("/user/{user.realname}")  
    public String user(@FormModel("user") UserModel user) {
        System.out.println(user);
        return "redirect:/success";        
    }
    
    //ok   http://localhost:9080/springmvc-chapter6/formmodel/array1?array[0]=zhang&array[1]=li
    @RequestMapping("/array1")  
    public String array1(@FormModel("array") String[] array) {
        System.out.println(Arrays.toString(array));
        return "redirect:/success";        
    }
    
    //ok   http://localhost:9080/springmvc-chapter6/formmodel/array2?array[0].username=zhang&array[0].password=123&array[1].username=li
    @RequestMapping("/array2")  
    public String array2(@FormModel("array") UserModel[] array) {
        System.out.println(Arrays.toString(array));
        return "redirect:/success";        
    }
    
    
    //ok   http://localhost:9080/springmvc-chapter6/formmodel/list1?list[0]=123&list[1]=234
    @RequestMapping("/list1")  
    public String list1(@FormModel("list") List<Integer> list) {
        System.out.println(list);
        return "redirect:/success";        
    }
    
    //ok   http://localhost:9080/springmvc-chapter6/formmodel/list2?list[0].username=zhang&list[1].username=li
    @RequestMapping("/list2")  
    public String list2(@FormModel("list") List<UserModel> list) {
        System.out.println(list);
        return "redirect:/success";        
    }
    
    //ok   http://localhost:9080/springmvc-chapter6/formmodel/map1?map['0']=123&map["1"]=234
    @RequestMapping("/map1")  
    public String map1(@FormModel("map") MapWapper<String, Integer> map) {
        System.out.println(map);
        return "redirect:/success";        
    }
  //ok   http://localhost:9080/springmvc-chapter6/formmodel/map2?map['0'].password=123&map['0'].username=123&map["1"].username=234
    @RequestMapping("/map2")  
    public String map2(@FormModel("map") MapWapper<Integer, UserModel> map) {
        System.out.println(map);
        return "redirect:/success";        
    }
}

 

具体使用可以下载之前springmvc第六章源代码http://jinnianshilongnian.iteye.com/blog/1683388 

将附件中的FormModel.rar解压放到src下进行测试。

 

 

支持的spring版本:

springmvc 3.1.x,暂不支持3.0。为什么不支持呢?springmvc 3.1 和 3.0 从架构上发生了变化,而且springmvc3.1更容易扩展。

 

支持绑定的数据:

模型、集合、数组、MapWapper(Map的一个包装器,通过getInnerMap获取真实Map)

 

 

缺点:

spring自定义的参数解析器会放在默认解析器之后,不能指定order,因此如果我们@FormModel("map") Map map,此map会变成Model(请参考http://jinnianshilongnian.iteye.com/blog/1698916 第六部分、Model Map ModelMap),希望未来的版本支持自定义顺序来解决这个问题;此处我们使用MapWapper解决,可以通过MapWapper.getInnerMap()拿到我们需要的Map

 

其他方案:

[SpringMVC]修改源码使之能够更加智能的自动装配request请求参数.(不建议修改源代码解决)

@rainsoft 也给出了类似的方案, http://www.iteye.com/topic/1124433#2357830

 

如果你使用的是mvc:annotation-driven,请这样配置

 <mvc:annotation-driven>
     <mvc:argument-resolvers>
            <bean class="com.sishuok.es.common.web.bind.method.annotation.FormModelMethodArgumentResolver"/>
        </mvc:argument-resolvers>
 </mvc:annotation-driven>

  

 

 

欢迎大家反馈问题,我会及时修正。

 

 

下一个扩展: 绑定请求参数(JSON字符串,如 deptIds=[{"deptId":4,"isPrimary":true}] ) 到 模型对象。

 

 

17
2
分享到:
评论
53 楼 王新春 2016-11-08  
希望未来的版本支持自定义顺序来解决这个问题

这个顺序可以通过间接的方式更改


@Component
public class RequestMappingHandlerAdapterWrapper {

    @Resource
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    @Resource
    private List<HandlerMethodArgumentResolver> customArgumentResolvers;
   
    @Resource
    private List<HandlerMethodReturnValueHandler> customReturnValueResolvers;

    //@Resource
    private ConfigurableWebBindingInitializer configurableWebBindingInitializer;

    @PostConstruct
    public void init() {
        // 请注意,此种方式只支持spring3(鉴于公司目前都是使用spring3,选择此实现),spring4中getArgumentResolvers返回值为List
        List<HandlerMethodArgumentResolver> existingArgumentResolverList = requestMappingHandlerAdapter
                .getArgumentResolvers().getResolvers();
        requestMappingHandlerAdapter.setArgumentResolvers(customArgumentResolvers);
        requestMappingHandlerAdapter.getArgumentResolvers().addResolvers(existingArgumentResolverList);

        requestMappingHandlerAdapter.setWebBindingInitializer(configurableWebBindingInitializer);
       
       
        List<HandlerMethodReturnValueHandler> returnValueHandlers =  requestMappingHandlerAdapter.getReturnValueHandlers().getHandlers();
    
        requestMappingHandlerAdapter.setReturnValueHandlers(customReturnValueResolvers);
       
        requestMappingHandlerAdapter.getReturnValueHandlers().addHandlers(returnValueHandlers);
    }

}
52 楼 mikeghgh 2015-12-25  
使用   <input name="student.name" value="Kate" /> 
  这种是可以绑的呀?难道是版本差异吗,我用的是3.2.9.RELEASE,
   $(input).attr("value",$("#val"+goodsInfo[i]).attr("value"));
   $(input).attr("name","goodOrderFormList["+i+"].goodId");
   form.append(input);

   这样提交,form是顺利绑定的呀,为何student.name、teacher.name就不可以了呢
   
51 楼 w3504080 2015-12-02  
你们试过自定义注解Resolver注入实体类后进行后端校验么?hibernate后端校验注入Errors
50 楼 andycooler 2015-11-30  
基于@FormModel的注解的参数解析器对数组和List的解析存在以下bug。

对于url  http://localhost:9080/springmvc-chapter6/formmodel/list2?list[0].username=zhang&list[0].password=1&list[1].username=li&list[1].password    绑定后的list集合大小为4

仔细看了FormModeMethodArgumentResolver中对于请求参数绑定的函数 bindRequestParameters(
            ModelAndViewContainer mavContainer,
            WebDataBinderFactory binderFactory,
            WebDataBinder binder,
            NativeWebRequest request,
            MethodParameter parameter),
对于前缀的识别太过简单了 

String prefixName = getPrefixName((String) key);

并没有过滤重复识别的前缀,这样导致没遇到一个"[..]."类型的前缀就往集合中添加一个对象。
49 楼 wangbo_boco 2015-11-18  
FormModelMethodArgumentResolver.java 目前最新版  80c0d25  on 7 Jan 2014
在jquey ajax方式下,data输入复合型的json对象,如{aaa:{bbb:10,xxx:{yyy:99}},fff:{f1:1}} ,后台接口上用@FormModel("aaa"),@FormModel("fff")接收(业务关系,隐藏实际字段名),按FormModelMethodArgumentResolver 448 parameterName.substring(modelPrefixNameLength) 的方式无法解析,大侠是否可以继续补充完整这部分逻辑?
48 楼 csdwz 2015-10-21  
我有个解决方案。将那些对象全部集合到一个新的对象的属性中.如
class A{
   对象B b,
   对象C c,
}

页面表单中就可以b.name,c.name这种方式提交了。
47 楼 qq421153173 2015-09-17  
大侠,给个完成的例子吧。 我弄了一天了  还是不行, getUriTemplateVariables   base的这个方法没有提供啊。
46 楼 iqeq00 2015-03-27  
blademainer 写道
你好,请问一下BindingResult支持吗?如果我按照平时用的话会报错:
@RequestMapping(value = "/test")
    public void binderTest(@Valid @FormModel("user")User user, BindingResult bindingResult)
错误:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public void com.kingray.web.UserController.binderTest(com.xiongyingqi.hibernate.domain.User,org.springframework.validation.BindingResult)



开涛,我也出现这个问题了,单独使用是对的,一起使用就错了
45 楼 blademainer 2014-11-14  
你好,请问一下BindingResult支持吗?如果我按照平时用的话会报错:
@RequestMapping(value = "/test")
    public void binderTest(@Valid @FormModel("user")User user, BindingResult bindingResult)
错误:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public void com.kingray.web.UserController.binderTest(com.xiongyingqi.hibernate.domain.User,org.springframework.validation.BindingResult)
44 楼 edison87915 2014-09-23  
请问,对于包含复杂类型对象的对象, spring 不能用"."来表示层级关系进行值的自动绑定吗?
我觉得 spring 应该可以吧
看这篇:http://www.iteye.com/topic/973918

这样的话,如果要在提交一个表单的过程中,给两个平级(不是父子关系)的对象分别绑定自己的表单数据,可以把这两个对象封装到一个对象中,这样就可以使用 "." 来分层级绑定、或精准绑定了?
43 楼 lping2 2014-07-15  
有个问题:
tmainVo[0].prePolicy=1&tmainVo[1].prePolicy=2 可以装载到  @FormModel("tmainVo") List<PrpTmainVo> tmainVoList;
但是一般多行编辑的时候,序号0,1,不会赋值上去,能不能将tmainVo.prePolicy=1&tmainVo.prePolicy=2 也能自动装载为List
42 楼 LinApex 2014-06-26  
为什么不使用拦截器解决问题.
41 楼 DS_Mars 2014-04-30  
DS_Mars 写道
此问题还可以如此解决 侵入性更小
首先 自定义注解ExtModelAttribute
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

	String value() default "";

}


然后利用方法
void org.springframework.web.bind.WebDataBinder.setFieldDefaultPrefix(String fieldDefaultPrefix)
在对应自定义注解ExtModelAttribute的处理器ExtServletModelAttributeMethodProcessor.bindRequestParameters(WebDataBinder binder, NativeWebRequest request)
改变默认前缀
不过到3.2.8 还是有点小问题 前缀后面要加一个字符 比如“.”
以下是自定义注解对应处理器ExtServletModelAttributeMethodProcessor
import javax.servlet.ServletRequest;

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

public class ExtServletModelAttributeMethodProcessor extends ServletModelAttributeMethodProcessor
 {
	public ExtServletModelAttributeMethodProcessor(){
		super(false); 
	}

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

        @Override
	public boolean supportsParameter(MethodParameter parameter) {
		if (parameter.hasParameterAnnotation(ExtModelAttribute.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);;
	}


加入自定义注解ExtModelAttribute 的处理器ExtServletModelAttributeMethodProcessor
    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="ExtServletModelAttributeMethodProcessor"/>
        </mvc:argument-resolvers>
    </mvc:annotation-driven>


控制器中使用
        @RequestMapping(value="/test")
	public String ftl(@ExtModelAttribute("testVo")TestVo testVo){
		System.out.println(testVo.getValue());
		return "test";
	}


页面使用
        <form action="" method="post">
        Date Inpout<Input id="value" name="testVo.value" value="${testVo.value}" />
            <input type="submit" value="submit">
        </form>





DS_Mars 写道
此问题还可以如此解决 侵入性更小
首先 自定义注解ExtModelAttribute
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

	String value() default "";

}


然后利用方法
void org.springframework.web.bind.WebDataBinder.setFieldDefaultPrefix(String fieldDefaultPrefix)
在对应自定义注解ExtModelAttribute的处理器ExtServletModelAttributeMethodProcessor.bindRequestParameters(WebDataBinder binder, NativeWebRequest request)
改变默认前缀
不过到3.2.8 还是有点小问题 前缀后面要加一个字符 比如“.”
以下是自定义注解对应处理器ExtServletModelAttributeMethodProcessor
import javax.servlet.ServletRequest;

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

public class ExtServletModelAttributeMethodProcessor extends ServletModelAttributeMethodProcessor
 {
	public ExtServletModelAttributeMethodProcessor(){
		super(false); 
	}

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

        @Override
	public boolean supportsParameter(MethodParameter parameter) {
		if (parameter.hasParameterAnnotation(ExtModelAttribute.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);;
	}


加入自定义注解ExtModelAttribute 的处理器ExtServletModelAttributeMethodProcessor
    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="ExtServletModelAttributeMethodProcessor"/>
        </mvc:argument-resolvers>
    </mvc:annotation-driven>


控制器中使用
        @RequestMapping(value="/test")
	public String ftl(@ExtModelAttribute("testVo")TestVo testVo){
		System.out.println(testVo.getValue());
		return "test";
	}


页面使用
        <form action="" method="post">
        Date Inpout<Input id="value" name="testVo.value" value="${testVo.value}" />
            <input type="submit" value="submit">
        </form>





代码还是有问题 这里获取servletBinder.setFieldDefaultPrefix(servletBinder.getObjectName()+".");是默认的没加注解的name 靠!ModelFacory 搞死了 只支持 ModelAttribute
ServletModelAttributeMethodProcessor
ModelAttributeMethodProcessor 里的 final 方法限制了扩展,只能复制到新类里面了

40 楼 DS_Mars 2014-04-30  
此问题还可以如此解决 侵入性更小
首先 自定义注解ExtModelAttribute
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

	String value() default "";

}


然后利用方法
void org.springframework.web.bind.WebDataBinder.setFieldDefaultPrefix(String fieldDefaultPrefix)
在对应自定义注解ExtModelAttribute的处理器ExtServletModelAttributeMethodProcessor.bindRequestParameters(WebDataBinder binder, NativeWebRequest request)
改变默认前缀
不过到3.2.8 还是有点小问题 前缀后面要加一个字符 比如“.”
以下是自定义注解对应处理器ExtServletModelAttributeMethodProcessor
import javax.servlet.ServletRequest;

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

public class ExtServletModelAttributeMethodProcessor extends ServletModelAttributeMethodProcessor
 {
	public ExtServletModelAttributeMethodProcessor(){
		super(false); 
	}

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

        @Override
	public boolean supportsParameter(MethodParameter parameter) {
		if (parameter.hasParameterAnnotation(ExtModelAttribute.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);;
	}


加入自定义注解ExtModelAttribute 的处理器ExtServletModelAttributeMethodProcessor
    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="ExtServletModelAttributeMethodProcessor"/>
        </mvc:argument-resolvers>
    </mvc:annotation-driven>


控制器中使用
        @RequestMapping(value="/test")
	public String ftl(@ExtModelAttribute("testVo")TestVo testVo){
		System.out.println(testVo.getValue());
		return "test";
	}


页面使用
        <form action="" method="post">
        Date Inpout<Input id="value" name="testVo.value" value="${testVo.value}" />
            <input type="submit" value="submit">
        </form>




39 楼 jinnianshilongnian 2014-03-12  
lanxia39 写道
看了你写的,但是你引用的是spring test包,就不想用了

1、你可以把它抽出来;2、你可以自己实现
38 楼 lanxia39 2014-03-12  
看了你写的,但是你引用的是spring test包,就不想用了
37 楼 yuezixin 2014-01-15  
LZ,你这么牛B,你家里人知道吗
36 楼 jinnianshilongnian 2013-11-21  
俗人 写道
这个也不支持spring3.2啊

支持的  你可以到github下载最新版本
35 楼 俗人 2013-11-21  
这个也不支持spring3.2啊
34 楼 fncj 2013-09-04  
好东西   

相关推荐

    spring杂谈 作者zhang KaiTao

    1.22 扩展SpringMVC以支持更精准的数据绑定1 1.23 扩展SpringMVC以支持绑定JSON格式的请求参数 1.24 扩展SpringMVC以支持绑定JSON格式的请求参数 1.25 在应用层通过spring特性解决数据库读写分离 1.26 context:...

    SpringMVC大威天龙.docx

    SpringMVC是Spring提供的一个强大而灵活的Web框架 借助于注解 SpringMVC提供了几乎是POJO的开发模式 使得控制器的...4. 功能强大的数据验证 格式化 绑定机制 5. 约定大于配置的契约式编程支持 基于注解的零配置支持等等

    Web框架编程-SpringMVC框架编程

    Spring MVC(Model-View-Controller)是一个基于Java的MVC...7. 数据绑定(Data Binding) 8. 校验器(Validator) 这些资源描述了Spring MVC框架中不同组件的职责和作用,协同工作以构建可靠和可扩展的Web应用程序。

    spring mvc 3.2 参考文档

    Spring的数据绑定是高度灵活的: 例如,它把类型不匹配当做验证错误,这样就可以算作应用程序错误,而不是系统错误。因此你不需要简单的重复拷贝您的业务对象的属性,表单对象中的非类型化的字符串只是处理无效的...

    Spring MVC 员工管理系统

    和众多其它Web框架一样,它基于MVC设计理念,此外,由于它采用了松散耦合可插拔组件结构,具有比其它MVC框架更多的扩展性和灵活性。 Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是...

    (第十一天)初识SpringMVC SSM框架的学习与应用-Java EE企业级应用开发学习记录

    请求处理流程: 我们将详细解释Spring MVC中的请求处理流程,包括请求映射、参数绑定、数据验证和响应生成。这有助于您理解整个请求生命周期。 配置与注解: 我们将演示如何配置Spring MVC,包括XML配置和注解驱动...

    Java毕业设计-基于ssm框架开发的校园美食交流系统+vue-毕业论文(附源代码).rar

    Vue的响应式数据绑定机制,使得前端界面能够实时响应后端数据的变化,提升了用户体验。同时,Vue的路由管理功能也帮助我们实现了页面的灵活跳转与权限控制。 该系统不仅具有基本的美食分享与点评功能,还提供了个性...

    Thymeleaf中文参考手册_3.0.5版

    Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP .1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的...

    thymeleaf_3.0.5_中文参考手册

    简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 ... Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

    thymeleaf_中文参考手册

    简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 ...3.Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

    基于SSM的王道考研购物网站.zip

    此外,还支持全文检索功能,帮助用户更精确地查找商品。购物车与结算:用户可以将心仪的商品加入购物车,实时查看购物车内的商品数量和总价。在确认无误后,用户可以选择支付方式完成结算。订单管理:用户可以查看...

    基于SSM+vue人事管理信息系统+jsp(源码+部署说明+演示视频+源码介绍).zip

    前端使用Vue.js框架,实现了响应式布局和动态数据绑定,提高了用户界面的交互性和易用性。 后端采用SSM框架,实现了业务逻辑和数据访问的分离,提高了代码的可读性和可维护性。 数据库使用MySQL,提供了可靠的数据...

    Java毕业设计-基于ssm框架开发的医院住院管理系统+vue-毕业论文(附源代码).rar

    前端部分采用了Vue.js框架,Vue以其轻量级、响应式的数据绑定和组件化的开发方式,为前端开发者带来了高效的开发体验。通过Vue,系统实现了友好的用户界面和流畅的用户交互,为用户提供了良好的使用体验。 该毕业...

    Java毕业设计-基于ssm框架开发的的健身房管理系统的设计与实现+vue-毕业论文(附源代码).rar

    Vue的响应式数据绑定和虚拟DOM技术,保证了界面的流畅性和实时性,为用户提供了极佳的交互体验。 该系统涵盖了会员管理、课程管理、预约管理、财务管理等多个模块,每个模块都经过精心设计,实现了健身房日常运营所...

    Java毕业设计-基于ssm框架开发的网上花店设计+vue-毕业论文(附源代码).rar

    同时,Vue.js的双向数据绑定机制也大大简化了前端与后端的数据交互过程。 除了实现基本的购物流程外,该项目还加入了一些创新性的功能,如个性化推荐、智能搜索等,以提升用户的购物体验。这些功能的实现,既体现了...

    Java毕业设计-基于ssm框架开发的毕业论文管理系统+vue-毕业论文(附源代码).rar

    Vue.js以其响应式的数据绑定与组件化的开发方式,使得前端页面开发更加灵活与高效。同时,Vue.js还提供了丰富的生态与插件,能够满足各种复杂的业务需求。 该系统实现了用户管理、论文上传、论文审核、论文评分等...

    基于ssm+vue会员管理系统+(源码+部署说明+演示视频+源码介绍).zip

    前端代码主要使用Vue.js编写,通过组件化的方式构建用户界面,实现响应式布局和动态数据绑定。后端代码则使用SSM框架,通过Spring实现依赖注入,SpringMVC处理请求分发,MyBatis负责数据库操作。 部署说明:虽然不...

    MRCMS内容管理系统-其他

    国际化支持,自定义各个国家语言在模板中做数据绑定。 添加了页面静态化支持,我们可以将动态生成页面,持久化降低计算时间,从而提高网站性能。 更新了文章编辑器,提供 HTML、text/markdown 编辑功能。 构建项目:...

Global site tag (gtag.js) - Google Analytics