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

被折叠的 条评论
为什么被折叠?



