request 获取请求的正文

今天和大家探讨一下request是怎样获取请求正文的。

先看下申请请求的前端。

<html>
  <head>
    <title>login </title>
  </head>
  <body>
		<form action="/day08_69_requestresponse/RequestDemo3" method="post">
    		用户名:<input type="text" name="username" /><br/>
    		密码:<input type="password" name="password" /><br/>
    		确认密码:<input type="password" name="password" /><br/>
    		性别:<input type="radio" name="sex" value="1" checked>男
    		<input type="radio" name="sex" value="0">女
    		<br/>
    		<input type="submit" value="注册" />
		</form>
  </body>
</html>


一开始我们可以先这样简单的获取一下web前端传来请求正文(包括字段 username,password,sex)。此时不包括确认密码。

//获取请求的正文,根据名称获取值  正文的体现形式是:key=value	 和请求的方式没有关系(get和post方式都可以取到)	没有使用确认密码
	private void test1(HttpServletRequest request)throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		System.out.println(username+","+password+","+sex);
	}
然后我们加上确认密码,那么就出现了一个问题,password的字段有两个,一个是密码框,一个是确认密码框。所以我们把password看成一个数组。可以这样写。

//获取请求的正文,根据名称获取值。							使用了确认密码
	private void test2(HttpServletRequest request)throws ServletException, IOException {
		String username = request.getParameter("username");
		String[] password = request.getParameterValues("password");
		String sex = request.getParameter("sex");
		System.out.println(username+","+Arrays.asList(password)+","+sex);
	}
这样解决了问题,但是我们每次通过已知字段去获取值如果字段较少是可以,但是如果很多就非常麻烦了。于是我们可以用枚举首先获取到所有正文中的字段。然后通过这些字段再去找值。

private void test3(HttpServletRequest request)throws ServletException, IOException {
		Enumeration<String> names = request.getParameterNames();
		//遍历名称的枚举
		while(names.hasMoreElements()){
			String name = names.nextElement();
			String value = request.getParameter(name);
			System.out.println(name+","+value);
		}
	}
可是我们获取了这些数据最终要传到数据操作层去操作的,如果字段很多,我们获取出来后需要一个一个的传参,那么就显得很麻烦,因此我们考虑用一个user对象来封装下,就是我们所说的实体,这样就可以传一个实体解决问题了。(此时我们先不加入确认密码。)

//获取请求的正文,封装到User对象中					没有使用确认密码			油漆工方法,不建议使用
	private void test4(HttpServletRequest request)throws ServletException, IOException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		//定义一个User对象
		User user = new User();
		System.out.println("封装前:"+user.toString());
		user.setUsername(username);
		user.setPassword(password);
		user.setSex(sex);
		System.out.println("封装后:"+user.toString());
	}
这样虽然传参的时候通过传递实体简化了传参过程,可是这样也是有问题的,因为看上面的代码我们知道我们需要获取一个值设置一个值,现在是三个字段,如果字段过多这样就显得很麻烦,因此这个也叫油漆工方法,其实我一开始写项目的时候就是用的这个方法。所以为了解决一个个设置参数给user很麻烦的问题,我们可以用java中的 反射和内省这样写。(此时我们也先不考虑确认密码)

//使用反射和内省封装javabean 要求:必须命名规范。表单中name属性的值和javabean中属性对应			没有使用确认密码	
	private void test5(HttpServletRequest request)throws ServletException, IOException {
		Enumeration<String> names = request.getParameterNames();
		User user = new User();
		System.out.println("封装前:"+user.toString());
		//遍历名称的枚举
		while(names.hasMoreElements()){
			String name = names.nextElement();
			String value = request.getParameter(name);
			try{
				//获取一个属性描述器,指定的javabean的属性描述器
				PropertyDescriptor pd = new PropertyDescriptor(name, User.class);
				//获取写的方法
				Method method = pd.getWriteMethod();
				//执行method方法
				method.invoke(user, value);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		System.out.println("封装后:"+user.toString());
	}
现在看起来就很符合我们的需求了,既不用一个个取值,也不用一个个设置值。但是问题来了,如果我们加上确认密码呢,那么这样就没法使用了,因为password需要有两个值。而其他的一个就可以。要解决这个问题,我们先看下下面的代码,使用Map集合泛型使用<String,String[]>的形式来解决这个问题。

//获取请求的正文。使用map的形式。 map的key是表单输入域名称,value是值的数组			使用确认密码
	private void test6(HttpServletRequest request)throws ServletException, IOException {
		Map<String,String[]> map = request.getParameterMap();
		//使用增强for遍历map
		for(Map.Entry<String, String[]> me : map.entrySet()){
			String name = me.getKey();
			String[] values = me.getValue();
			System.out.println(name+","+Arrays.asList(values));
		}
	}
这样就解决了这个问题,然后在加上我们原来的反射和内省就变得完美了。

//使用反射和内省封装请求的正文到Users的javabean中							使用确认密码
	private void test7(HttpServletRequest request)throws ServletException, IOException {
		Map<String,String[]> map = request.getParameterMap();
		Users user = new Users();
		System.out.println("封装前:"+user.toString());
		//使用增强for遍历map
		for(Map.Entry<String, String[]> me : map.entrySet()){
			String name = me.getKey();
			String[] values = me.getValue();
			try{
				//获取Users的属性描述器
				PropertyDescriptor pd = new PropertyDescriptor(name, Users.class);
				//获取属性的写方法
				Method method = pd.getWriteMethod();
				//执行方法
				if(values.length>1){
					method.invoke(user, new Object[]{values});
				}else{
					method.invoke(user, values);
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		System.out.println("封装后:"+user.toString());
	}
最后在和大家分享一个更加简单的方法,那就是使用apache的第三方资源包,beanutils实现请求正文的封装,其实就是封装了test7 中的内容,而阿帕奇给我们封装好了,直接使用就行。但是要注意的是,使用这种方法必须命名和login中的字段完全相同,才可以使用,这就是我们所说的约定优于编码。

//使用apache的第三方资源包,beanutils实现请求正文的封装						使用确认密码
	private void test8(HttpServletRequest request)throws ServletException, IOException {
		Users user = new Users();
		System.out.println("封装前:"+user.toString());
		try{
			BeanUtils.populate(user, request.getParameterMap());
		}catch(Exception e){
			e.printStackTrace();
		}
		System.out.println("封装后:"+user.toString());
	}

如果哪里不对希望大家提出来。谢谢大家了。敬请斧正。








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值