请求参数的绑定

请求参数的绑定

  1. 绑定的机制

     	我们都知道,表单中请求参数都是基于 key=value 的。
     	SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
     	例如:
     		<a href="account/findAccount?accountId=10">查询账户</a>
     		中请求参数是:
     			accountId=10
     		/**
     		* 查询账户
     		* @return
     		*/
     		@RequestMapping("/findAccount")
     		public String findAccount(Integer accountId) {
     			System.out.println("查询了账户。。。。"+accountId);
     		return "success"; }
    
     	注意:
     		1. 表单提交的数据都是k=v格式的 username=haha&password=123
     		2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
     		3. 要求:提交表单的name和参数的名称是相同的
    
  2. 支持的数据类型:

     	基本类型参数:
     		包括基本类型和 String 类型
     	POJO 类型参数:
     		包括实体类,以及关联的实体类
     	数组和集合类型参数:
     		包括 List 结构和 Map 结构的集合(包括数组)
    
     	SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
    
     	注意:
     		如果是基本类型或者 String 类型:
     			要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
     		如果是 POJO 类型,或者它的关联对象:
     			要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
     			1. 提交表单的name和JavaBean中的属性名称需要一致
     			2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
    
     			把数据封装Account类中
     		    <form action="param/saveAccount" method="post">
     		        姓名:<input type="text" name="username" /><br/>
     		        密码:<input type="text" name="password" /><br/>
     		        金额:<input type="text" name="money" /><br/>
     		        用户姓名:<input type="text" name="user.uname" /><br/>
     		        用户年龄:<input type="text" name="user.age" /><br/>
     		        <input type="submit" value="提交" />
     		    </form>
    
     		    /**
     		     * 请求参数绑定把数据封装到JavaBean的类中
     		     * @return
     		     */
     		    @RequestMapping("/saveAccount")
     		    public String saveAccount(Account account){
     		        System.out.println("执行了...");
     		        System.out.println(account);
     		        return "success";
     		    }
    
     		如果是集合类型
     			要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同
    
     			给 set 集合中赋值
     				private Set<User> set = new HashSet<>();
     				public Person() {
     					set.add(new User());
     					//set.add(new User());
     				}	
     			给 List 集合中的元素赋值,使用下标。
     				private List<User> uList;
     			给 Map 集合中的元素赋值,使用键值对。
     				private Map<String, User> map;
    
     			<%--把数据封装Account类中,类中存在list和map的集合
     		    <form action="param/saveAccount" method="post">
     		        姓名:<input type="text" name="username" /><br/>
     		        密码:<input type="text" name="password" /><br/>
     		        金额:<input type="text" name="money" /><br/>
    
     		        用户姓名:<input type="text" name="list[0].uname" /><br/>
     		        用户年龄:<input type="text" name="list[0].age" /><br/>
    
     		        用户姓名:<input type="text" name="map['one'].uname" /><br/>
     		        用户年龄:<input type="text" name="map['one'].age" /><br/>
    
     		        编号:<input name="set[0].uid" type="text"><br> 
     				姓名:<input name="set[0].uname" type="text"><br> 
    
     		        <input type="submit" value="提交" />
     		    </form>
    
  3. 自定义类型转换器

     	1. 使用场景:
     		<!-- 特殊情况之:类型转换问题 --> 
     		<a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a>
    
     		控制器代码:
     		/**
     		* 删除账户
     		* @return
     		*/
     		@RequestMapping("/deleteAccount")
     		public String deleteAccount(Date date) {
     			System.out.println("删除了账户。。。。"+date);
     			return "success"; 
     		}
     	2. 第一种,使用步骤
     		第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。
     		public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型
     			/**
     			* 实现类型转换的方法
     			*/
     			@Nullable
     			T convert(S source);
     		}
    
     		public class StringToDateConverter implements Converter<String, Date> {
     			/**
     		     * String source    传入进来字符串
     		     * @param source
     		     * @return
     		     */
     		    public Date convert(String source) {
     		        // 判断
     		        if(source == null){
     		            throw new RuntimeException("请您传入数据");
     		        }
     		        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    
     		        try {
     		            // 把字符串转换日期
     		            return df.parse(source);
     		        } catch (Exception e) {
     		            throw new RuntimeException("数据类型转换出现错误");
     		        }
     		    }
     		}
    
     		第二步:在 spring 配置文件中配置类型转换器。
     			spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。
     			在spingmvc.xml
     			<!--配置自定义类型转换器-->
     		    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
     		        <property name="converters">
     		            <set>
     		                <bean class="com.demos.utils.StringToDateConverter"/>
     		            </set>
     		        </property>
     		    </bean>
    
     		    <!-- 开启SpringMVC框架注解的支持 -->
     		    <mvc:annotation-driven conversion-service="conversionService"/>
     	3. 第二种,在属性上加注解
     		@DateTimeFormat(pattern="yyyy-MM-dd")
     		private Date date;
     4. 在控制器中使用原生的ServletAPI对象
     	SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
     		HttpServletRequest 
     		HttpServletResponse
     		HttpSession
     		java.security.Principal
     		Locale
     		InputStream 
     		OutputStream 
     		Reader 
     		Writer
    
     	jsp 代码:
     		<!-- 原始 ServletAPI 作为控制器参数 --> 
     		<a href="account/testServletAPI">测试访问 ServletAPI</a>
     	控制器中的代码
     		/**
     	     * 原生的API
     	     * @return
     	     */
     	    @RequestMapping("/testServlet")
     	    public String testServlet(HttpServletRequest request, HttpServletResponse response){
     	        System.out.println("执行了...");
     	        System.out.println(request);
    
     	        HttpSession session = request.getSession();
     	        System.out.println(session);
    
     	        ServletContext servletContext = session.getServletContext();
     	        System.out.println(servletContext);
    
     	        System.out.println(response);
     	        return "success";
     	    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值