`

SpringMVC(五)_数据绑定方式整理

阅读更多

        前言:本文主要介绍SpringMVC控制器如何接收前台传送来的数据,包括通过SpringMVC自定义标签接收以及通过自定义接收对象接收。

本篇文章重点关注以下问题:

  • SpringMVC自带的数据绑定标签来接收数据
  • 自定义接收类型来接收数据(基本类型、自定义对象、复合对象、集合、数组等方式)
demo测试页面如下(本文只附关键代码,运行环境可见附件)
* 首先是测试SpringMVC自带的数据绑定标签:

 * 而后是测试自定义接收类型

 

1. 通过SpringMVC自带的数据绑定标签来接收数据

           首先看看控制器可以从前台发过来的请求内容:

 
          SpringMVC内置注解以下注解用于提取请求中的内容:

注解 作用
@RequestParam 绑定单个请求参数值
@PathVariable 绑定URI模板变量值
@CookieValue 绑定Cookie数据值
@RequestHeader 绑定请求头数据
@ModelValue 绑定参数到命令对象
@SessionAttributes 绑定命令对象到session
@RequestBody 绑定请求的内容区数据并能进行自动类型转换等
@RequestPart 绑定“multipart/data”数据,除了能绑定@RequestParam 能做到的请求参数外,还能绑定上传的文件等

 

 

1.1 测试@RequestParam:绑定单个请求参数值

        @RequestParam用于将请求参数区数据映射到功能处理方法的参数上,其有三个参数

  • value:参数名字,即入参的请求参数名字;
  • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值;

前台请求:

<a href="dataBinder/testRequestParam.action?username=wj&age=11">测试@RequestParam:绑定单个请求参数值(username=wj&age=11)</a><br><br>

 后台接收:

    /**
     * @RequestParam 来映射请求参数, 绑定单个请求参数值. 
     * * value          值即请求参数的参数名 
     * * required       该参数是否必须. 默认为 true
     * * defaultValue   请求参数的默认值
     */
    @RequestMapping(value = "dataBinder/testRequestParam.action")
    public String testRequestParam(
            @RequestParam(value = "username") String un,
            @RequestParam(value = "age", required = false, defaultValue = "0") int age) {
        System.out.println("【@RequestParam】username: " + un + ", age: " + age);
        return SUCCESS;
    }

 

 1.2 测试@PathVariable:绑定URI模板变量值

          @PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,其有三个参数

  • value:参数名字,即入参的请求参数名字;
  • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值;
前台请求:
<a href="dataBinder/testPathVariable/1.action">测试@PathVariable:绑定URI模板变量值{1}</a><br><br>
 后台接收:
    /**
     * @PathVariable 可以来映射 URL 中的占位符到目标方法的参数中.
     * @param id
     * @return
     */
    @RequestMapping("dataBinder/testPathVariable/{id}.action")
    public String testPathVariable(@PathVariable("id") Integer id) {
        System.out.println("【@PathVariable】id = " + id);
        return SUCCESS;
    }

 

1.3 测试@CookieValue:绑定Cookie数据值

        @CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上,其有三个参数

  • value:参数名字,即入参的请求参数名字;
  • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
  • defaultValue:默认值,表示如果请求中没有Cookie数据时的默认值;

前台代码:

<a href="dataBinder/testCookieValue.action">测试@CookieValue:绑定Cookie数据值</a><br><br>

后台代码:

    /**
     * @CookieValue: 映射一个 Cookie 值
     * * value          值即请求参数的参数名 
     * * required       该参数是否必须. 默认为 true
     * * defaultValue   请求参数的默认值
     */
    @RequestMapping("dataBinder/testCookieValue.action")
    public String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
        System.out.println("【@CookieValue】 sessionId: " + sessionId);
        return SUCCESS;
    }

 

1.4 测试@RequestHeader:绑定请求头数据

          @RequestHeader 用于将请求的头信息区数据映射到功能处理方法的参数上,其有三个参数

  • value:参数名字,即入参的请求参数名字;
  • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值;

前台代码:

<a href="dataBinder/testRequestHeader.action">测试@RequestHeader:绑定请求头数据</a><br><br>
 后台代码:
    /**
     * @RequestHeader 来映射请求头.
     */
    @RequestMapping("dataBinder/testRequestHeader.action")
    public String testRequestHeader(@RequestHeader(value = "Accept-Language") String al) {
        System.out.println("【RequestHeader】 Accept-Language = " + al);
        return SUCCESS;
    }

 

1.5 @ModelAttribute 绑定请求参数到命令对象

         @ModelAttribute具有如下三个作用

  1. 绑定请求参数到命令对象放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
  2. 暴露表单引用对象为模型数据放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象;
  3. 暴露@RequestMapping 方法返回值为模型数据放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

1.5.1 绑定请求参数到命令对象

前台代码:

<div>
	<label>参数绑定测试(测试@ModelAttribute暴露表单引用对象):</label>
	<button onclick="onclick_ModelAttribute()">提交</button>
</div>
// 测试@ModelAttribute暴露表单引用对象
function onclick_ModelAttribute() {
    $.ajax({
        url: "dataBinder/getModelAttribute.action", 
        data : {
            "username" : "username_"
        },
        type : 'post',
        dataType : "json",
        success: function(data){
            var msg = "username : " + data.user.username + "\r\n"
		            + "password : "  + data.user.password;
		   	alert(msg);
        }
    });
}
 后台代码:
    @RequestMapping("dataBinder/getModelAttribute.action")
    @ResponseBody
    public Map<String, Object> getModelAttribute(@ModelAttribute("user") UserVo user){
        /* 形参中的user与上述数据模型中的user为同一对象. */
        System.out.println("【对象数组类型】" + user);
        
        Map<String, Object> map = new HashMap<>();
        map.put("user", user);
        return map;
    }

 

1.5.2 暴露表单引用对象为模型数据

       上述三个作用中,第二个更为实用,此处给出第一个的使用demo(说到底@ModelAttribute就是将数据暴露为模型数据,供页面展示。
前台代码:
!--  
    模拟修改操作
        1. 原始数据为: 1, 熊燕子, 123456,wj@sina.com,27
        2. 密码不能被修改.
        3. 表单回显, 模拟操作直接在表单填写对应的属性值
-->
<form action="dataBinder/testModelAttribute.action" method="Post">
    <input type="hidden" name="id" value="1"/>测试@ModelAttribute:绑定参数到命令对象<br>
    username: <input type="text" name="username" value="熊燕子"/><br>
    email: <input type="text" name="email" value="wj@sina.com"/><br>
    age: <input type="text" name="age" value="27"/><br>
    <input type="submit" value="Submit"/>
</form>
 后台代码:
    /**
     * 有 @ModelAttribute 标记的方法, 会在每个目标方法执行之前被 SpringMVC 调用! 
     */
    @ModelAttribute
    public void getUser(@RequestParam(value="id",required=false) Integer id, Map<String, Object> map){
        System.out.println("【@ModelAttribute】【method】【ID】From Form");
        if(id != null){
            //模拟从数据库中获取对象
            UserVo userVo = new UserVo(1, "wj", "123456", "tom@sina.com", 12);
            System.out.println("从数据库中获取一个对象: " + userVo);
            
            map.put("userVo", userVo);
        }
    }

    @RequestMapping("dataBinder/testModelAttribute.action")
    public String testModelAttribute(UserVo userVo){
        System.out.println("【@ModelAttribute】修改: " + userVo);
        return SUCCESS;
    }
 测试结果如下,可见@ModelAttribute 标记的方法会自动暴露表单引用对象为模型数据。

 

1.5.3 暴露@RequestMapping 方法返回值为模型数据

         此方式不常用,后续文章介绍处理模型数据时会介绍,此处不展开。

 

1.6 测试@SessionAttributes:绑定命令对象到session

       有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。

前台代码:

<a href="dataBinder/testSessionAttributes.action">测试@SessionAttributes:绑定命令对象到session</a>
 后台代码:
@SessionAttributes(value={"userVo"}, types={String.class})
@RequestMapping("/views")
@Controller
public class DataBinderController {

    /**
     * @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),
     * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)
     * 
     * 注意: 该注解只能放在类的上面. 而不能修饰放方法. 
     */
    @RequestMapping("dataBinder/testSessionAttributes.action")
    public String testSessionAttributes(Map<String, Object> map){
        System.out.println("【SessionAttributes】");
        UserVo userVo = new UserVo("熊燕子", "123456", "wj@sina.com", 15);
        map.put("userVo", userVo);
        map.put("school", "南理工");
        return SUCCESS;
    }
}
 测试结果:

 

        在返回的页面上查看request域和session域,如下图所示,发现userVo和school都是既在request域也在session域中:


 

1.7 测试ServletAPI作为参数传入 

          ServletRequest/HttpServletRequest 和ServletResponse/HttpServletResponse,InputStream/OutputStream 和Reader/Writer,WebRequest/NativeWebRequest,HttpSession等都可以作为参数传入,此处仅传入部分最为样例。

前台代码:

<a href="dataBinder/testServletAPI.action">测试ServletAPI作为参数传入</a>
 后台代码:
    @RequestMapping("dataBinder/testServletAPI.action")
    public void testServletAPI(HttpServletRequest request, HttpServletResponse response, Writer out) throws IOException {
        System.out.println("【ServletAPI】以参数传入" + request + ", " + response);
        out.write("hello springmvc");
    }

 

 

2. 自定义接收类型来接收数据

          前面是以表单提交数据,这里以ajax作为提交数据的方式。

 

2.1 参数绑定测试(基本数据类型)

前台代码:

<div>
     <label>参数绑定测试(基本数据类型):</label>
     <input id="count" name="count" value="10" type="text"/>
     <button onclick="onclick_basicType()">提交</button>
</div>
// 基本类型	
function onclick_basicType() {
    $.ajax({
        url: "dataBinder/getBasicType.action", 
        data : {
            count : $("#count").val()
        },
        type : 'post',  
        dataType : "json",
        success: function(data){
        	alert(data.count);
        }
       });
}
 后台代码:
    @RequestMapping("dataBinder/getBasicType.action")
    @ResponseBody
    public Map<String, Object> getBasicType(Integer count){ // 建议以包装类型接收,可不存在
        System.out.println("【基本类型】count = " + count);
        
        Map<String, Object> map = new HashMap<>();
        map.put("count", count);
        return map;
    }

 

2.2 参数绑定测试(自定义对象类型)

前台代码:

<div>
	<label>参数绑定测试(自定义对象类型):</label>
	<input id="username_vo" value="wang" type="text"/>
	<input id="password_vo"  value="jun"  type="text"/>
	<button onclick="onclick_Vo()">提交</button>
</div>
// 自定义对象
function onclick_Vo() {
    $.ajax({
        url: "dataBinder/getVo.action", 
        data : {
            username : $("#username_vo").val(),
            password : $("#password_vo").val()
        },
        type : 'post',
        dataType : "json",
        success: function(data){
            var msg = "username : " + data.user.username + "\r\n"
                     + "password : " + data.user.password;
        	alert(msg);
        }
    });
}
 后台代码(实体类UserVo定义见附件):
    @RequestMapping("dataBinder/getVo.action")
    @ResponseBody
    public Map<String, Object> getVo(UserVo user){
        System.out.println("【自定义类型】" + user);
        
        Map<String, Object> map = new HashMap<>();
        map.put("user", user);
        return map;
    }

 

2.3 参数绑定测试(自定义复合对象类型)

前台代码:

<div>
	<label>参数绑定测试(自定义复合对象类型):</label><br>
	<input id="username_cvo" value="wang" type="text"/><br>
	<input id="password_cvo"  value="jun"  type="text"/><br>
	<input id="province_cvo"  	  value="江苏"  type="text"/><br>
	<input id="city_cvo"   value="南京"  type="text"/>
	<button onclick="onclick_CmpVo()">提交</button>
</div>
// 自定义复合对象
function onclick_CmpVo() {
    $.ajax({
        url: "dataBinder/getCmpVo.action", 
        data : {
            'username'         : $("#username_cvo").val(),
            'password'         : $("#password_cvo").val(),
            'address.province' : $("#province_cvo").val(),
            'address.city'     : $("#city_cvo").val()
        },
        type : 'post',
        dataType : "json",
        success: function(data){
            var msg = "username  : " + data.user.username    + "\r\n"
                     + "password : " + data.user.password     + "\r\n"
                     + "province : " + data.user.address.province     + "\r\n"
                     + "city     : " + data.user.address.city + "\r\n";
        	alert(msg);
        }
    });
}
 后台代码(实体类UserVo定义见附件):
    @RequestMapping("dataBinder/getCmpVo.action")
    @ResponseBody
    public Map<String, Object> getCmpVo(UserVo user){
        System.out.println("【自定义复合类型】" + user);
        
        Map<String, Object> map = new HashMap<>();
        map.put("user", user);
        return map;
    }

 

2.4 参数绑定测试(List集合对象类型)

前台代码:

<div>
	<label>参数绑定测试(List集合对象类型):</label>
	<button onclick="onclick_List()">提交</button>
</div>
// List集合对象
function onclick_List() {
    $.ajax({
        url: "dataBinder/getList.action", 
        data : {
            'users[0].username'        : "username1",
            'users[0].password'        : "password1",
            'users[0].address.province': '江苏',
            'users[0].address.city'    : '南京',
            'users[1].username'        : "username2",
            'users[1].password'        : "password2",
            'users[2].username'        : "username3",
            'users[2].password'        : "password3"
        },
        type : 'post',
        dataType : "json",
        success: function(data){
        	alert("List集合参数传递成功...");
        }
    });
}
 后台代码:
    @RequestMapping("dataBinder/getList.action")
    @ResponseBody
    public Map<String, Object> getList(UserListVo users){
        System.out.println("【List集合】" + users);
        
        Map<String, Object> map = new HashMap<>();
        map.put("users", users);
        return map;
    }
 UserListVo实体类如下:
public class UserListVo {
    private List<UserVo> users;

    public List<UserVo> getUsers() {
        return users;
    }
    public void setUsers(List<UserVo> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "UserListVo [users=" + users + "]";
    }
}

 

2.5 参数绑定测试(Map对象类型)

前台代码:

<div>
	<label>参数绑定测试(Map对象类型):</label>
	<button onclick="onclick_Map()">提交</button>
</div>
// Map对象
function onclick_Map() {
    $.ajax({
        url: "dataBinder/getMap.action", 
        data : {
            "users['a'].username"         : "username1",
            "users['a'].password"         : "password1",
            "users['a'].address.province" : "江苏",
            "users['a'].address.city"     : "南京",
            "users['b'].username"         : "username2",
            "users['b'].password"         : "password2",
            "users['c'].username"         : "username3",
            "users['c'].password"         : "password3",
        },
        type : 'post',
        dataType : "json",
        success: function(data){
        	alert("Map对象参数传递成功...");
        }
    });
}

后台代码:

    @RequestMapping("dataBinder/getMap.action")
    @ResponseBody
    public Map<String, Object> getMap(UserMapVo users){
        System.out.println("【Map类型】" + users);
        
        Map<String, Object> map = new HashMap<>();
        map.put("users", users);
        return map;
    }
 UserMapVo实体类如下:
public class UserMapVo {
    private Map<String, UserVo> users;

    public Map<String, UserVo> getUsers() {
        return users;
    }
    public void setUsers(Map<String, UserVo> users) {
        this.users = users;
    }
    
    @Override
    public String toString() {
        return "UserMapVo [users=" + users + "]";
    }
}

 

2.6 参数绑定测试(int数组类型)

前台代码:

<div>
	<label>参数绑定测试(int数组类型):</label>
	<button onclick="onclick_ArrayInt()">提交</button>
</div>
// int数组类型
function onclick_ArrayInt() {
    var intArray = [1, 3, 5, 7, 9];
    $.ajax({
        url: "dataBinder/getArrayInt.action", 
        data : {
            "intArray" : intArray
        },
        type : 'post',
        dataType : "json",
        success: function(data){
        	alert("int数组类型传递成功...");
        }
    });
}
 后台代码:
    @RequestMapping("dataBinder/getArrayInt.action")
    @ResponseBody
    public Map<String, Object> getArrayInt(@RequestParam("intArray[]") int[] intArray){
        System.out.println("【int数组】" + Arrays.toString(intArray));
        
        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        return map;
    }

 

2.7 参数绑定测试(Vo对象数组类型)

前台代码:

<div>
	<label>参数绑定测试(Vo对象数组类型):</label>
	<button onclick="onclick_ArrayVo()">提交</button>
</div>
// Vo对象数组类型
function onclick_ArrayVo() {
    $.ajax({
        url: "dataBinder/getArrayVo.action", 
        data : {
            "users[0].username"         : "username1",
            "users[0].password"         : "password1",
            "users[0].address.province" : "江苏",
            "users[0].address.address"  : "南京",
            "users[1].username"         : "username2",
            "users[1].password"         : "password2",
            "users[2].username"         : "username3",
            "users[2].password"         : "password3",
        },
        type : 'post',
        dataType : "json",
        success: function(data){
        	alert("对象数组类型传递成功...");
        }
    });
}
 后台代码:
    @RequestMapping("dataBinder/getArrayVo.action")
    @ResponseBody
    public Map<String, Object> getArrayVo(UserArrayVo users){
        System.out.println("【对象数组类型】" + users);
        
        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        return map;
    }
 UserArrayVo对象:
public class UserArrayVo {
    private UserVo[] users;

    public UserVo[] getUsers() {
        return users;
    }
    public void setUsers(UserVo[] users) {
        this.users = users;
    }
    
    @Override
    public String toString() {
        return "UserArrayVo [users=" + Arrays.toString(users) + "]";
    }
}
 

 

 

代码下载来源:http://super-wangj.iteye.com/blog/2388430

 
  • 大小: 135.5 KB
  • 大小: 48 KB
  • 大小: 55.1 KB
  • 大小: 10.8 KB
  • 大小: 14.5 KB
分享到:
评论

相关推荐

    SpringMVC 学习总结

    关于SpringMVC的基础知识点总结,SpringMVC参数绑定6种方式,使用不同的方式跳转页面,后台处理json格式的数据,SpringMVC框架简介,SpringMVC的入门案例等

    【新技术】java框架源码springmvc+mybatisJava实用源码整理learns

    4. **数据绑定与验证**:SpringMVC提供数据绑定机制,自动将请求参数映射到方法参数,同时支持数据验证,如@Validated。 5. **拦截器**:自定义Interceptor可以实现预处理和后处理功能,例如权限验证、日志记录等。...

    2021全新SpringMVC框架教程[视频课程].txt打包整理.zip

    此外,SpringMVC提供了数据绑定和验证功能。通过@Validated和JSR-303/JSR-349标准的注解(如@NotNull、@Size等),可以在服务器端对用户输入进行验证。 在实际开发中,SpringMVC常与Spring Boot结合使用,Spring ...

    SpringMvC+Mybaits

    首先,SpringMVC是基于Spring框架的MVC模型,它提供了请求分发、视图解析、数据绑定等功能。在SpringMVC中,控制器(Controller)通常是实现了`@Controller`注解的Java类,它接收HTTP请求并调用业务逻辑。模型...

    SpringMVC精品资源--记录准备春招实习过程中,学习与复习的知识(模块化整理,非面试题速成)。注:暂停更新,后.zip

    此外,SpringMVC还支持数据绑定,允许自动将请求参数绑定到Controller方法的参数上,如@RequestParam和@PathVariable。对于模型数据,@ModelAttribute注解可以将对象绑定到视图,同时也可以在Controller方法中用于...

    2021全新SpringMVC框架教程【视频课程】下载整理.zip

    9. **Conversion and Formatting**:SpringMVC提供了强大的数据绑定和格式化机制,使得模型数据能自动转换为合适的类型。 在学习这个课程时,你将接触到以下关键知识点: - **Spring Boot集成SpringMVC**:Spring ...

    【新技术】java框架源码springmvc+mybatis源码整理

    模型绑定、数据验证、异常处理等机制使得SpringMVC在处理用户请求时更加灵活和强大。 SpringMVC的工作流程大致如下: 1. 用户发起HTTP请求到达DispatcherServlet。 2. DispatcherServlet通过HandlerMapping找到合适...

    Maven + SpringMVC + Mybatis【绝非原创,单纯整理】【五】

    Mybatis是一个优秀的持久层框架,它简化了SQL与Java代码的绑定,通过XML或注解方式配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。Mybatis的优势在于灵活...

    管理系统系列--一个SpringMVC4+EasyUI的后台管理系统,重新整理简洁版:后台管理系统模板.zip

    4. **数据绑定**:与后台数据源进行交互,实现表格、树等组件的数据展示。 5. **事件处理**:通过JavaScript API,可以对组件的各种操作添加事件监听和处理。 6. **Ajax支持**:方便实现异步通信,提升用户体验。 ...

    数据采集系统

    它具有灵活的配置、支持RESTful风格的URL映射、数据绑定和异常处理等特性,使Web服务的开发更加高效。 Web服务通常用于不同系统之间的数据交换,这里提到的"client"可能是指一个调用Web服务的客户端应用程序。...

    spring mvc需要用的jar完整整理

    5. **spring-expression.jar (SpEL)**:Spring 表达式语言,用于在运行时查询和操作对象图,常用于动态配置和数据绑定。 6. **spring-aop.jar**:提供 AOP 支持,可以创建切面和通知,实现如日志记录、事务管理等...

    bookcms.rar

    它提供了处理HTTP请求、路由请求到相应的控制器、数据绑定、验证等服务。在bookcms中,SpringMVC负责接收用户请求,调用业务逻辑,然后将结果返回给前端,实现数据的交互。 接着,Vue.js是一款轻量级的前端MVVM...

    spring版本整理.rar

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性...同时,对于初学者来说,这个压缩包提供了一个良好的起点,可以快速搭建SpringMVC环境,实践基础操作,如控制器定义、视图解析、模型绑定等。

    workplace.rar

    它提供了丰富的控制器、视图解析、数据绑定、本地化、国际化等功能,使得开发人员能够更专注于业务逻辑,而不是繁琐的HTTP请求处理。 3. **MyBatis与SpringMVC的整合**:整合MyBatis和SpringMVC可以实现更好的依赖...

    基于SSM的高校可视化教学分析系统源码.zip

    在本系统中,Vue.js用于构建用户界面,通过双向数据绑定实现视图与数据的实时同步,提高用户体验。开发者可以利用Vue的组件系统来组织和复用代码,提高开发效率。 系统的核心功能可能包括以下几个方面: 1. 教学...

    Spring MVC学习笔记MD.7z

    首先,`SpringMVC-Study.7z` 可能是作者整理的Spring MVC教程或项目实例,包括了如何配置、创建控制器、处理请求、注入依赖等内容。通过这些源码,你可以看到Spring MVC在实际开发中的应用,了解其工作原理。 `...

    基于推技术的实时网页聊天室

    在实时聊天室中,ExtJS可以用来构建用户界面,如聊天窗口、消息列表、输入框等,同时提供数据绑定和组件管理功能,使得界面更新更加流畅和自然。 4. **FCKeditor**:FCKeditor(现已被CKEditor取代)是一个开源的富...

    基于ssm+vue个人日常事务管理系统.zip

    此外,它还提供了响应式数据绑定、虚拟DOM、路由管理(如Vuex)等功能,极大地提高了开发效率。 6. **微信小程序** 虽然项目标签中提到了微信小程序,但具体是否包含相关实现并未明确。微信小程序是一种可以在微信...

    基于SSM的汽车配件销售管理系统(有报告) Javaee项目

    3. **MyBatis**:MyBatis是一个持久层框架,它简化了数据库操作,通过XML或注解方式将SQL语句与Java代码绑定,实现了SQL与代码的分离。在汽车配件销售管理系统中,MyBatis用于处理数据库查询、增删改等操作,提高了...

    基于ssm+vue的供电公司安全生产考试系统.zip

    Vue.js是一款轻量级的MVVM(Model-View-ViewModel)前端框架,具备组件化、虚拟DOM、响应式数据绑定等特点。在本系统中,Vue.js负责构建用户界面,提供动态交互体验,通过单文件组件(Single File Components)组织...

Global site tag (gtag.js) - Google Analytics