BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,
其方法populate的作用解释如下:
完整方法:
BeanUtils.populate( Object bean, Map properties ),
这个方法会遍历map<key, value>中的key,
如果bean中有这个属性,就把这个key对应的value值赋给bean的属性。
User user = new User() //先定义一个JavaBean对象
BeanUtils.populate( user , request.getParameteMap() ) //将request中的参数映射到User Bean中的set和get方法
一、导入jar包
commons-beanutils-1.8.3.jar(版本任选)
import org.apache.commons.beanutils.BeanUtils;
二、使用(以页面传参为例)
//前端页面中的form表单action路径要传到以下servlet:
//1.得到页面输入的数据:
Map<String, String[]> map = request.getParameterMap();//多选
//2.将数据封装到user对象里
BeanUtils.populate(user, map);
//(假设我写的user对象:User user = new User();)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//map{name=aa,password=bb,birthday=1990-09-09}
//bean(name=aa,password=dd,birthday=Date)
// 接收请求的参数
request.setCharacterEncoding("UTF-8");
Map<String, String[]> map = request.getParameterMap();
// 封装数据,使用BeanUtils工具,到入jar包
Customer c = new Customer();
try{
//封装数据
BeanUtils.populate(c, map);
//调用业务层
new CustomerService().saveCustomer(c);
System.out.println("添加客户成功了...");
} catch(Exception e){
e.printStackTrace();
}
}
重要说明:
表单数据name属性里的值必须和user实体类里的变量属性一一对应,
这样你的user对象里才会存到value值。
比如页面中的name=“username”,
那么User实体类里就要写private String username;
这样你从页面传到servlet里的用户名才能存到user对象里!!
今天学习了一个获取提交表单数据的新方法request.getParameterMap。
在此之前,获取表单数据时总是用request.getParameter(“name”),
根据表单中的name值获取value值,
需要获取几项就得重复写几次getParameter,
而request.getParameterMap方法则不同,不需要参数,返回结果为Map<String,String[]>
其实,request.getParameterMap()方法也是通过前台表单中的name值进行获取的,
获取到后又进行了一次封装。
之所以返回的map中的value为字符串类型的数组,
是为了解决表单中有多个name值一样的项。
对request.getParameterMap()的返回值使用泛型时应该是Map<String,String[]>形式,因为有时像checkbox这样的组件会有一个name对应对个value的时候,所以该Map中键值对是String[]>的实现。
====================================================================
对request.getParameterMap()的返回值使用泛型时应该是Map<String,String[]>形式,
因为有时像checkbox这样的组件会有一个name对应对个value的时候,
所以该Map中键值对是< String–>String[]>的实现。
举例,在服务器端得到jsp页面提交的参数很容易,
以下是将得到的参数和值打印出来,形成的map结构:
Map(key,value[]),即:key是String型,value是String型数组。
例如:
request中的参数t1=1&t1=2&t2=3形成的map结构:
key=t1;value[0]=1,value[1]=2
key=t2;value[0]=3
如果直接用map.get(“t1”),得到的将是:Ljava.lang.String;
value之所以是数组形式,就是防止参数名有相同的情况。
遍历request.getParameterMap()里面的值:
===============================================================
request.getParameterMap()用法详解
理解
此方法返回一个Map类型值(Map(key,value[]),
即:key是String型,value是String型数组)。
该返回值存储着着前端所提交请求中的所有请求参数和请求参数值的映射关系。
这个返回值有个特别之处——只能读。
不像普通的Map类型数据一样可以修改。
这是因为服务器为了实现一定的安全规范,所作的限制。
比如WebLogic,Tomcat,Resin,JBoss等服务器均实现了此规范。
简单使用
从前端获取传递来的json数组
前端
$.post("/jsonServlet",{"type":["js","Mysql","java"],"name":"nancy","age":3});
servlet
public class jsonServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Map<String, String[]> parameterMap = request.getParameterMap();
//划重点:获取时的时候要加上[],要不然获取不到
String[] names = parameterMap.get("type[]");
System.out.println(parameterMap.get("name")[0]);
//输出:nancy
System.out.println(parameterMap.get("age")[0]);
//输出:3
String[] names = parameterMap.get("type[]");
for (int i=0;i<names.length;i++) {
System.out.println(names[i]);
}
//输出:js Mysql java
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
需要注意的是获取数组时,要用键名的数组形式来获取,如上面所展示的要用parameterMap.get(“type[]”),不要忘记加上[]。
=======================
//getParameter()函数括号中的参数是从页面中传过来的,比如 edit.jsp中userid:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="update.do" method="post">
<input type="hidden" name="userId" value="${user.id}" />
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="name" value="${user.name}"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name="password" value="${user.password}"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="提交"/>
</td>
</tr>
</table>
</form>
</body>
</html>
下面是控制层:
package com.demo.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.demo.dao.UserDao;
import com.demo.entity.User;
public class UpdateController extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String ids = req.getParameter("userId").trim();
Long id = (long) 0;
if (ids != null) {
id = Long.parseLong(ids);
}
String name = req.getParameter("name").trim();
String password = req.getParameter("password").trim();
User user = new User();
user.setId(id);
user.setName(name);
user.setPassword(password);
UserDao userDao = new UserDao();
userDao.updateUser(user);
resp.sendRedirect("list.do");
}
}
其中
String ids = req.getParameter(“userId”).trim();就是得到了页面中userid的值
备注:trim()方法是为了去掉前后空格