SpringMVC(四)数据绑定-1

SpringMVC(三)URL请求到Action的映射规则我们介绍了请求是如何映射到一个action上的,下一步当然是如何获取到请求中的数据,这就引出了本篇所要讲的内容—数据绑定。

首先看一下都有哪些绑定数据的注解:

[email protected],绑定单个请求数据,可以是URL中的数据,表单提交的数据或上传的文件;

[email protected],绑定URL模板变量值;

[email protected],绑定Cookie数据;

[email protected],绑定请求头数据;

[email protected],绑定数据到Model;

[email protected],绑定数据到Session;

[email protected],用来处理Content-Type不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

[email protected],绑定“multipart/data”数据,并可以根据数据类型进项对象转换;

下面我们来看如何使用:

[email protected]:

为了验证文件绑定我们需要先做以下工作:

a.把commons-fileupload-1.3.1.jar和commons-io-2.4.jar两个jar包添加到我们项目。

b.配置我们项目中的springservlet-config.xml文件使之支持文件上传,内容如下:

<!-- 支持上传文件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为1MB -->
    <property name="maxUploadSize">
        <value>1048576</value>
    </property>
    <property name="defaultEncoding">
        <value>UTF-8</value>
    </property>
</bean>

其中maxUploadSize用于限制上传文件的最大大小,也可以不做设置,这样就代表上传文件的大小木有限制。defaultEncoding用于设置上传文件的编码格式,用于解决上传的文件中文名乱码问题。

下面就看具体如何使用:

添加一个DataBindController,里面有2个paramBind的action分别对应get和post请求:

package com.demo.web.controllers;

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value = "/databind")
public class DataBindController {

    @RequestMapping(value="/parambind", method = {RequestMethod.GET})
    public ModelAndView paramBind(){

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("parambind");
        return modelAndView;
    }

    @RequestMapping(value="/parambind", method = {RequestMethod.POST})
    public ModelAndView paramBind(HttpServletRequest request, @RequestParam("urlParam") String urlParam, @RequestParam("formParam") String formParam, @RequestParam("formFile") MultipartFile formFile){

        //如果不用注解自动绑定,我们还可以像下面一样手动获取数据
         String urlParam1 = ServletRequestUtils.getStringParameter(request, "urlParam", null);
        String formParam1 = ServletRequestUtils.getStringParameter(request, "formParam", null);
        MultipartFile formFile1 = ((MultipartHttpServletRequest) request).getFile("formFile"); 

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("urlParam", urlParam);
        modelAndView.addObject("formParam", formParam);
        modelAndView.addObject("formFileName", formFile.getOriginalFilename());  

        modelAndView.addObject("urlParam1", urlParam1);
        modelAndView.addObject("formParam1", formParam1);
        modelAndView.addObject("formFileName1", formFile1.getOriginalFilename());
        modelAndView.setViewName("parambindresult");
        return modelAndView;
    }

}

在views文件夹中添加parambind.jsp和parambindresult.jsp两个视图,内容分别如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="parambind?urlParam=AAA" method="post" enctype="multipart/form-data">
        <input type="text" name="formParam" /><br/>
        <input type="file" name="formFile" /><br/>
        <input type="submit" value="Submit" />
    </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    自动绑定数据:<br/><br/>
    ${urlParam}<br/>
    ${formParam}<br/>
    ${formFileName}<br/><br/><br/><br/>
    手动获取数据:<br/><br/>
    ${urlParam1}<br/>
    ${formParam1}<br/>
    ${formFileName1}<br/>
</body>
</html>

运行项目,输入内容,选择上传文件:

提交查看结果:

可以看到绑定的数据已经获取到了。

上面我们演示了如何把数据绑定到单个变量,但在实际应用中我们通常需要获取的是model对象,别担心,我们不需要把数据绑定到一个个变量然后在对model赋值,只需要把model加入相应的action参数(这里不需要指定绑定数据的注解)Spring MVC会自动进行数据转换并绑定到model对象上,一切就是这么简单。测试如下:

添加一个AccountModel类作为测试的model:

package com.demo.web.models;

public class AccountModel {

    private String username;
    private String password;

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

    public String getUsername(){
        return this.username;
    }
    public String getPassword(){
        return this.password;
    }
}

在DataBindController里面添加2个modelAutoBind的action分别对应get和post请求:

@RequestMapping(value="/modelautobind", method = {RequestMethod.GET})
public String modelAutoBind(HttpServletRequest request, Model model){

    model.addAttribute("accountmodel", new AccountModel());
    return "modelautobind";
}

@RequestMapping(value="/modelautobind", method = {RequestMethod.POST})
public String modelAutoBind(HttpServletRequest request, Model model, AccountModel accountModel){

    model.addAttribute("accountmodel", accountModel);
    return "modelautobindresult";
}

在views文件夹中添加modelautobind.jsp和modelautobindresult.jsp 2个视图用于提交数据和展示提交的数据:

modelautobind.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form:form modelAttribute="accountmodel" method="post">
        用户名:<form:input path="username"/><br/>
        密 码:<form:password path="password"/><br/>
        <input type="submit" value="Submit" />
    </form:form>
</body>
</html>

modelautobindresult.jsp :

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    用户名:${accountmodel.username}<br/>
    密 码:${accountmodel.password}
</body>
</html>

运行测试:

用户名 输入AAA 密码 输入BBB,提交:

可以看到结果显示正确,说明自动绑定成功。

注:

1.关于@RequestParam的参数,这是一个@RequestParam的完整写法@RequestParam(value="username", required=true, defaultValue="AAA")。

value表示要绑定请求中参数的名字;

required表示请求中是否必须有这个参数,默认为true这是如果请求中没有要绑定的参数则返回404;

defaultValue表示如果请求中指定的参数值为空时的默认值;

要绑定的参数如果是值类型必须要有值否则抛异常,如果是引用类型则默认为null(Boolean除外,默认为false);

2.在刚才添加的2个action中可以看到返回类型和以前的不一样了由ModelAndView变成了String,这是由于Spring MVC 提供Model、ModelMap、Map让我们可以直接添加渲染视图需要的模型数据,在返回时直接指定对应视图名称就可以了。同时Map是继承于ModelMap的,而Model和ModelMap是继承于ExtendedModelMap的。

3.在刚才添加的视图modelautobind.jsp中可以看到<form:form、<form:input 等标签,这是Spring
MVC提供的表单标签,借助于这些标签我们可以很方便的把模型数据绑定到表单上面(当然你也可以选择继续使用原生的HTML表单标签),要使用Spring MVC只要在视图中添加引用 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>即可,关于Spring
MVC表单标签的具体内容会在以后的文章中作介绍。

时间: 2024-10-14 04:48:05

SpringMVC(四)数据绑定-1的相关文章

SpringMVC之数据绑定

SpringMVC之数据绑定 #数据绑定:Spring MVC会根据客户端请求参数的不同,将请求信息以一定的方式转换并绑定 到控制器类中的方法参数上. #说明:这里的"以一定的方式"应该指的是什么?过段时间买个比较厚的书看看. #原理概括:Spring MVC将ServletRequest对象传递给DataBinder(数据绑定组件),将控制 器的入参传给DataBinder(数据绑定组件),DataBinder(数据绑定组件)调用 ConversionService组件进行数据类型转

springmvc(四) springmvc的数据校验的实现

so easy~ --WH 一.什么是数据校验? 这个比较好理解,就是用来验证客户输入的数据是否合法,比如客户登录时,用户名不能为空,或者不能超出指定长度等要求,这就叫做数据校验. 数据校验分为客户端校验和服务端校验 客户端校验:js校验 服务端校验:springmvc使用validation校验,struts2使用validation校验.都有自己的一套校验规则. 二.springmvc的validation校验 Springmvc本身没有校验功能,它使用hibernate的校验框架,hibe

SpringMVC(四):转发、重定向和Flash属性

1.转发和重定向的区别 一句话概括:重定向是客户端行为,转发是服务器行为. 1.请求次数: 重定向:重定向行为是做了两次请求,及产生了两个request对象,重定向会导致request对象信息丢失. 请求转发:转发做了一次请求, 浏览器的地址栏一直是第一次请求的地址.转发是服务器内部request/response控制权的移交. 2.请求资源地址: 重定向:web组件可以将请求重定向到任意一个url,而不仅仅是同一个应用. 重定向的源组件与目标组件不共用同一个HttpServletRequest

SpringMVC(四):什么是ServletInvocableHandlerMethod

一.概述SpringMVC 处理请求的过程 1. DispatchServlet protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception 相关代码 // Determine handler adapter for the current request. HandlerAdapter ha = getHandlerAdapter(mappedHandl

SpringMVC(四)---文件上传与下载

一,文件上传 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作 如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver 1,文件配置及导包 对springmvc-servlet.xml进行文件配置 1 <!--文件上传配置--> 2 <bean id="multipartResolver&qu

SpringMVC四种响应传值的方式

1.返回值为void类型 使用方法的参数requesr和response进行数据分享和页面跳转 @RequestMapping("/test1") public void test1(HttpServletRequest request, HttpServletResponse response) throws Exception{ //通过request和response控制页面和共享数据 request.setAttribute("msg","你好,太

SpringMvc 数据绑定400错误

今天请求一个SpringMvc 的时候,客户端总是报出: The request sent by the client was syntactically incorrect 网上都是说的是bean的名字和表单的名字不一样,但是我检查了N多遍之后,还是有报这个异常,就想到了SpringMvc 自动装配的问题. 然后看日志说是""转为int类型的时候不可以为空: 应该就是数据绑定的问题了,经过一番研究,springMvc的数据绑定有几种方式: 1,controller 独享 2,全局共享

【SSH系列】深入浅出SpringMvc+入门Demo

Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC和Struts.Struts2非常类似.Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler.通过可配置的handler mappings.view resolution.locale以及theme resolution来处理请求并且

springMVC能做什么,做j2ee时候要考虑什么

转载: http://jinnianshilongnian.iteye.com/category/231099 [置顶] 跟我学SpringMVC目录汇总贴.PDF下载.源码下载 博客分类: 跟开涛学SpringMVC 电子书下载链接 请登录后下载   在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 2012-12-22 08:05 浏览 188903 评论(91) 收藏 分类:企业架构 源代码下载——第七章 注解式控制器

spring整合springmvc

一.新建一个web项目 CTRL+N新建一个web项目 下一步 下一步.下一步 自动生成web.xml文件,我叫它入口文件 完成 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------