表单赋值的问题
当请求request中携带了用户提交的数据时,需要将这些数据封装到JavaBean中,像之前写法需要一一赋值,倘若request携带了非常多的表单数据,此时的赋值操作就显得比较繁琐了,那有没有好的解决方法呢?这里可以使用apache的commons-beanutils搞定这个问题。
使用commons-beanutils解决表单赋值的问题。
首先需要下载两个jar包分别是:
commons-beanutils.jar:http://pan.baidu.com/s/1slzAndb
commons-logging.jar: http://pan.baidu.com/s/1eSNDiQA
下载完成后将其拷贝到项目的lib目录下。
修改RegistServlet中赋值操作如下:
//获取用户提交的表单数据,并封装到User中
User u = new User();
//使用commons-beanutils将表单数据封装到User对象中
try {
//因为User对象中的brithday是Date类型,所以先注册一个日期转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
//将表单数据封装到User对象中
BeanUtils.populate(u, request.getParameterMap());
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
修改LoginServlet中赋值操作如下:
//获取用户提交的表单数据
User user = new User();
try {
BeanUtils.populate(user, request.getParameterMap());
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
上面的BeanUtils.populate(user, request.getParameterMap())方法会遍历request.getParameterMap()的key,key与user中的属性一致的话,会将该属性赋值,所以要使用该方法的前提就是表单中的name值和JavaBean中的属性值名称要一致。
用户名不能重复的问题
在实际应用当中,用户名是不能重复的,即要保证用户名在数据库中的唯一性,要解决这个问题,需要在用户注册时先根据填写的用户名去数据库中查询,如果查询出结果的话,就说明该用户名已经被注册了。
主要代码如下,修改RegistServlet
//使用apache commons-beanutil解决赋值操作
try {
//因为User中的birthday是Date类型,所以需要先注册一个日期转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
//User类中的属性名需要跟jsp表单中的name保持一致
BeanUtils.populate(u, request.getParameterMap());
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
//调用业务逻辑
UserService us = new UserServiceImpl();
try {
//判断用户名是否重复
User result = us.findUserByName(u);
//如果不等于null则说明用户名重复
if(result != null){
request.setAttribute("msg", "用户名重复");
request.getRequestDispatcher("/regist.jsp").forward(request, response);
}else{
//用户名不重复时,执行添加操作
us.addUser(u);
//分发转向
response.getWriter().write("注册成功!1秒后跳转到主页");
response.setHeader("refresh", "1;url=/login.jsp");
}
} catch (Exception e) {
e.printStackTrace();
}