完善注册新用户功能

本文介绍了一个用户注册功能的具体实现过程,包括对用户输入的数据进行验证、处理注册过程中遇到的异常情况,以及如何解决多数据库环境下的关键字冲突问题。

 在搭建环境的过程中,User的操作,只是一个测试,做为论坛的一个功能,还是远远不够的,按照上面的设计,要给User类添加相应的属性.

 

同时,为user类增加业务逻辑.对User 各个属性的校验,我把它设计到Service当中.主要是考虑:如果用领域对象的思路考虑,这些校验是领域对像的组成,它们保证各属性值的合法.虽然Struts有提供通过校验文件对输入的值进行判断,但我认为还是不要把业务逻辑放到控制层吧,因此,我在Action中调用了UserServiceBean的校验方法,返回一个错误列表.

 

在最先的设计中,在UserServiceBean.save()方法中使用校验,如果属性不合法则抛异常,后面考虑到如果Action调用一次save再校验一次造成不必要的重复,save()方法就不再执行校验了.

 

在完善注册功能的过程中,发现jar包仍然存在版本的问题,认真对了一下,把相同的jar包的低版本删除了,就可以解决.主要也是提示NoSuchMethod错误.

 

今天的测试中,出现,当注册过程提示"用户名已存在"等信息后,写一个新用户名后却没有任何改变.查了很久,最后试了一个在Action上加@Scope("prototype")注解,OK!这个注解是sping的,表示,每次调用getBean()创建一个新的实例.虽然知道这个注解,但一直想不通为什么单例模式下,第二次提交根本无效,也就是根本没有执行execute()方法.总之,目前要使第二次提交有效,一定要设Scope.

 

另外,user的表名最好指定为user_XXX,因为在sqlserver中user是关键字不能用做表名,但如果用"[user]"在MySql中会报错,因此,还是用通用的名称,方便在不同数据库中使用.

 

对于UserService,把DAO独立出来,其他方法(如校验)写在Service里也许更合理些,这样可以方便使用不同的DAO,暂时没这么做.

 

附一下原码:

User.java

package bbs.domain.bean;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

 

@Entity
@Table(name="user_table")
public class User  implements Serializable{

 /**
  *
  */
 private static final long serialVersionUID = -8764161543446505211L;
 private int id;
 private String userId;
 private String nickName;
 private String userName;
 private String password;
 private String sex;
 private byte level=0; //层次,管理员还是普通用户
 private String email;
 private String qq;
 private String ip;
 private Date regTime;
 private Date LastTime;
 
 @Id
 @GeneratedValue(generator="native")
 @GenericGenerator(strategy="native", name="native")//name="native"是指前一句指定的自定义的主键生成方法名称
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 @Column(name="user_id" ,length=16,unique=true, nullable=false)
 public String getUserId() {
  return userId;
 }
 public void setUserId(String userId) {
  this.userId = userId;
 }
 @Column(name="nikename",length=50,nullable=false)
 public String getNickName() {
  return nickName;
 }
 public void setNickName(String nickName) {
  this.nickName = nickName;
 }
 @Column(name="username",length=50)
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 @Column(length=32,nullable=false)
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 @Column(length=50)
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 @Column(length=20)
 public String getQq() {
  return qq;
 }
 public void setQq(String qq) {
  this.qq = qq;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 @Column(length=2)
 public String getSex() {
  return sex;
 }
 public void setLevel(byte level) {
  this.level = level;
 }
 @Column
 public byte getLevel() {
  return level;
 }
 public void setIp(String ip) {
  this.ip = ip;
 }
 @Column(length=15)
 public String getIp() {
  return ip;
 }
 public void setRegTime(Date regTime) {
  this.regTime = regTime;
 }
 @Column
 public Date getRegTime() {
  return regTime;
 }
 
 public void setLastTime(Date lastTime) {
  LastTime = lastTime;
 }
 @Column
 public Date getLastTime() {
  return LastTime;
 }

 
}

 

UserServiceBean.java

package bbs.domain.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import bbs.domain.bean.User;
import bbs.domain.service.UserService;
import bbs.exception.BbsError;

@Service("userService")
@Transactional
public class UserServiceBean implements UserService {

 public static final int RIGHT = 0;
 public static final int EMPTY = 1;
 public static final int IllegalCharacters = 2;
 public static final int TOOLONG = 4;
 public static final int EXIST = 8;

 @Resource
 private SessionFactory sessionFactory;

 /*
  * (non-Javadoc)
  *
  * @see bbs.domain.service.impl.UserService#save(bbs.domain.bean.User)
  */
 public void save(User user) {
  sessionFactory.getCurrentSession().persist(user);
 }

 public void update(User user) {
  sessionFactory.getCurrentSession().merge(user);
 }

 public User getUser(Integer id) {
  return (User) sessionFactory.getCurrentSession().get(User.class, id);
 }

 public void delete(Integer id) {
  // 也可以用get方法获得User对象,但load效率更高
  sessionFactory.getCurrentSession().delete(
    sessionFactory.getCurrentSession().load(User.class, id));
 }

 @SuppressWarnings("unchecked")
 public List<User> getUsers() {
  return sessionFactory.getCurrentSession().createQuery("from User")
    .list();

 }

 public void setSessionFactory(SessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
 }

 public SessionFactory getSessionFactory() {
  return sessionFactory;
 }

 public User findByUserId(String userId) {
  Query q = sessionFactory.getCurrentSession().createQuery(
    "from User as o where o.userId=:userId");
  q.setString("userId", userId);
  return (User) q.uniqueResult();

 }

 public List<BbsError> validate(User user) {

  List<BbsError> errors = new ArrayList<BbsError>();

  BbsError error = validateUserId(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);
  error = validatePassword(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);

  error = validateNickName(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);
  error = validateUserName(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);
  error = validateEmail(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);
  error = validateSex(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);
  error = validateQq(user);
  if (error.getMsgId() != RIGHT)
   errors.add(error);
  return errors;

 }

 public BbsError validateUserId(User user) {

  BbsError error = new BbsError("User.userId", "", RIGHT);

  if (user.getUserId().isEmpty()) {
   error.setMsgId(EMPTY);
   error.setMsg("用户ID不能为空!");
  } else {
   Pattern pattern = Pattern.compile("[a-zA-Z0-9//-_]+");
   if (!pattern.matcher(user.getUserId()).matches()) {
    error.setMsg("用户ID只能使用数字、字母和横线!");
    error.setMsgId(IllegalCharacters);
   }
   if (user.getUserId().length() > 16) {
    error.setMsg(error.getMsg() + "用户ID不能超过16位!");
    error.setMsgId(error.getMsgId() | TOOLONG);
   }

  }
  if (error.getMsgId() == RIGHT) {
   if (this.findByUserId(user.getUserId()) != null) {
    error.setMsgId(EXIST);
    error.setMsg("用户ID已存在!");
   }
  }
  return error;
 }

 public BbsError validatePassword(User user) {

  BbsError error = new BbsError("User.password", "", RIGHT);
  if (user.getPassword().isEmpty()) {
   error.setMsgId(EMPTY);
   error.setMsg("密码不能为空!");
  } else {
   Pattern pattern = Pattern.compile("[a-zA-Z0-9]+");
   if (!pattern.matcher(user.getPassword()).matches()) {
    error.setMsg("密码只能使用数字和字母!");
    error.setMsgId(IllegalCharacters);
   }
   if (user.getPassword().length() > 32) {
    error.setMsg(error.getMsg() + "密码不能超过32位!");
    error.setMsgId(error.getMsgId() | TOOLONG);
   }

  }
  return error;
 }

 public BbsError validateNickName(User user) {

  BbsError error = new BbsError("User.nickName", "", RIGHT);
  if (user.getNickName().isEmpty()) {
   error.setMsgId(EMPTY);
   error.setMsg("昵称不能为空!");
  } else {
   if (user.getNickName().length() > 50) {
    error.setMsg("昵称不能超过50个字符");
    error.setMsgId(TOOLONG);
   }
  }

  return error;
 }

 public BbsError validateEmail(User user) {

  BbsError error = new BbsError("User.email", "", RIGHT);
  if (!user.getEmail().isEmpty()) {
   Pattern pattern = Pattern.compile(
     "[//w//.//-]+@([//w//-]+//.)+[//w//-]+",
     Pattern.CASE_INSENSITIVE);
   if (!pattern.matcher(user.getEmail()).matches()) {
    error.setMsgId(IllegalCharacters);
    error.setMsg("Email地址输入有误!");
   }
   if (user.getEmail().length() > 50) {
    error.setMsgId(error.getMsgId() | TOOLONG);
    error.setMsg(error.getMsg() + "Email地址不能超过50个字符!");
   }
  }
  return error;
 }

 public BbsError validateUserName(User user) {

  BbsError error = new BbsError("User.userName", "", RIGHT);
  if (!user.getUserName().isEmpty()) {
   if (user.getUserName().length() > 50) {
    error.setMsg("真实姓名不能超过50个字符");
    error.setMsgId(TOOLONG);
   }
  }

  return error;
 }

 public BbsError validateSex(User user) {

  BbsError error = new BbsError("User.sex", "", RIGHT);
  if (!user.getSex().isEmpty()) {
   if (!(user.getSex().equals("男") || user.getSex().equals("女"))) {
    error.setMsg("性别只能是男或女");
    error.setMsgId(IllegalCharacters);
   }
  }

  return error;
 }

 public BbsError validateQq(User user) {

  BbsError error = new BbsError("User.qq", "", RIGHT);
  if (!user.getQq().isEmpty()) {
   Pattern pattern = Pattern.compile("[0-9]+");
   if (!pattern.matcher(user.getQq()).matches()) {
    error.setMsg("QQ只能使用数字!");
    error.setMsgId(IllegalCharacters);
   }
   if (user.getQq().length() > 20) {
    error.setMsg(error.getMsg() + "用户ID不能超过20位!");
    error.setMsgId(error.getMsgId() | TOOLONG);
   }
  }

  return error;
 }

}

Reg.java

package bbs.web.action;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import bbs.domain.bean.User;
import bbs.domain.service.UserService;
import bbs.exception.BbsError;

import com.opensymphony.xwork2.ActionSupport;

@Controller("reg")
@Scope("prototype")
public class Reg extends ActionSupport{

 /**
  *
  */
 private static final long serialVersionUID = 7749277973867267345L;
 
 private User user;
 private String password2;
 @Resource
 private UserService userService;

 public User getUser() {
  return user;
 }

 public void setUser(User user) {
  this.user = user;
 }

 public String getPassword2() {
  return password2;
 }

 public void setPassword2(String password2) {
  this.password2 = password2;
 }

 

 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  
  List<BbsError> errors = this.userService.validate(user);
  for (BbsError e:errors){
   addFieldError(e.getObjectName().substring(0,1).toLowerCase()+e.getObjectName().substring(1)
     ,e.getMsg());
  }
  if (!user.getPassword().equals(password2)){
   addFieldError("password2","两次密码输入要一致");
   
  }
  
  if (!this.getFieldErrors().isEmpty())
   return INPUT;
   
  try {
   user.setIp(ServletActionContext.getRequest().getRemoteAddr());
   user.setLastTime(new Date());
   user.setRegTime(new Date());
   userService.save(user);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   return ERROR;
  }
  return SUCCESS;
 }

 public void setUserService(UserService userService) {
  this.userService = userService;
 }

 public UserService getUserService() {
  return userService;
 }
 

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值