好久没写博客了,登录功能是任何一个应用都必不可少的功能,这次先介绍一下登录的实现。
假设你已配置好ssh开发所需的环境,如果没有,请参考我的另一篇博文:SSH整合开发之配置文件
我们必须先把基础设施做好才能开始写视图层页面,需要的组件有两种:DAO组件和业务逻辑组件。除了组件还需要持久化类用来映射用户表
Java EE提倡面向接口编程,以下都遵循这个思想。
它首先需要有个基类的DAO接口定义一些通用的方法,然后还要有一个基类的DAO组件实现这个接口的方法。
用户有操作,那么需要定义一个用户DAO接口继承自基类DAO接口,还要有一个用户的DAO组件继承自基类的DAO组件并且实现了用户DAO接口。
package com.easychat.dao;
import java.io.Serializable;
import java.util.List;
public interface BaseDao {
/**
* 获取实体
* @param entityClazz
* @param id
* @return
*/
T get(Class entityClazz,Serializable id);
/**
* 保存实体
* @param entity
* @return
*/
Serializable save(T entity);
/**
* 更新实体
* @param entity
*/
void update(T entity);
/**
* 删除实体
* @param entityClazz
* @param id
*/
void delete(Class entityClazz,Serializable id);
/**
* 搜索
* @param entityClazz
* @return
*/
List findAll(Class entityClazz);
long findCount(Class entityClazz);
/**
* 根据hql查询
* @param hql
* @return
*/
public List find(String hql);
public List find(String hql,Object... params);
/**
* 分页查询
* @param hql
* @param pageNo
* @param pageSize
* @return
*/
public List findByPage(String hql,int pageNo,int pageSize);
public List findByPage(String hql,int pageNo,int pageSize,Object...params);
}
package com.easychat.dao;
import com.easychat.entity.User;
public interface UserDao extends BaseDao<User>{
}
package com.easychat.daoImpl;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import com.easychat.dao.BaseDao;
public class BaseDaoImpl<T> implements BaseDao<T>{
private SessionFactory sessionFactory;
//注入
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@SuppressWarnings("unchecked")
@Override
public T get(Class entityClazz, Serializable id) {
return (T) getSessionFactory().getCurrentSession().get(entityClazz, id);
}
@Override
public Serializable save(T entity) {
return getSessionFactory().getCurrentSession().save(entity);
}
@Override
public void update(T entity) {
// TODO Auto-generated method stub
getSessionFactory().getCurrentSession().saveOrUpdate(entity);
}
@Override
public void delete(Class entityClazz, Serializable id) {
getSessionFactory().getCurrentSession().createQuery("delete "+entityClazz.getSimpleName()+" en where en.id=?0")
.setParameter("0",id)
.executeUpdate();
}
@Override
public List findAll(Class entityClazz) {
return find("select en from "+entityClazz.getSimpleName()+" en");
}
@Override
public long findCount(Class entityClazz) {
// TODO Auto-generated method stub
return 0;
}
/**
* 根据hql语句查找
* @param hql
* @return
*/
@SuppressWarnings("unchecked")
public List find(String hql){
return getSessionFactory().getCurrentSession().createQuery(hql).list();
}
/**
* 根据带占位符的hql语句查找
* @param hql
* @param params
* @return
*/
@SuppressWarnings("unchecked")
public List find(String hql,Object... params){
Query query=getSessionFactory().getCurrentSession().createQuery(hql);
for(int i=0;ireturn query.list();
}
/**
* 分页查询
* @param hql
* @param pageNo 查询第几页
* @param pageSize 每页多少条记录
* @return
*/
@SuppressWarnings("unchecked")
public List findByPage(String hql,int pageNo,int pageSize){
return getSessionFactory().getCurrentSession().createQuery(hql)
.setFirstResult((pageNo-1)*pageSize)
.setMaxResults(pageSize)
.list();
}
/**
* 根据带占位符的hql语句查询分页结果
* @param hql
* @param pageNo
* @param pageSize
* @param params
* @return
*/
@SuppressWarnings("unchecked")
public List findByPage(String hql,int pageNo,int pageSize,Object...params){
Query query=getSessionFactory().getCurrentSession().createQuery(hql);
for(int i=0;ireturn query.setFirstResult((pageNo-1)*pageSize)
.setMaxResults(pageSize)
.list();
}
}
import com.easychat.dao.UserDao;
import com.easychat.entity.User;
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
}
User类映射为数据表
package com.easychat.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 用户实体
*
* @author Administrator 刘壮飞
*
*/
@Entity
@Table(name = "user_inf")
public class User {
@Id
@Column(name = "user_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
// 手机号作用户名
@Column(name = "user_tel",unique=true)
private String tel;
// 用户密码
@Column(name = "user_password")
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(String tel, String password) {
super();
this.tel = tel;
this.password = password;
}
public User() {
super();
}
}
持久化类配置
持久化类还需要配置,配置问题见下文。
每个业务逻辑组件都应该有一个接口,这里定义三个方法。
业务逻辑接口代码如下:
package com.easychat.service;
import com.easychat.entity.User;
/**
* 用户业务接口
* @author Administrator
*
*/
public interface UserService {
/**
* 验证用户
* @param user
* @return
*/
public boolean validate(User user);
/**
* 注册
* @param user
* @return
*/
public boolean register(User user);
/**
* 根据用户名、密码查找用户
* @param tel
* @param password
* @return
*/
public User find(String tel,String password);
}
业务逻辑组件代码如下:
package com.easychat.serviceImpl;
import java.util.List;
import com.easychat.dao.UserDao;
import com.easychat.entity.User;
import com.easychat.service.UserService;
/**
* 用户业务逻辑组件
* @author Administrator
*
*/
public class UserServiceImpl implements UserService{
//用户DAO组件
private UserDao userDao;
//执行注入DAO组件
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public boolean register(User user) {
userDao.save(user);
return true;
}
@Override
public boolean validate(User user) {
return find(user.getTel(), user.getPassword())==null?false:true;
}
@Override
public User find(String tel, String password) {
List list=userDao.find("select u from User u where u.tel=? and u.password=?",tel,password);
return list.size()==0?null:list.get(0);
}
}
package com.easychat.action;
import com.easychat.entity.User;
import com.easychat.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 登录控制器
* @author Administrator 刘壮飞
*
*/
public class LoginAction extends ActionSupport{
//用户业务逻辑组件
private UserService userService;
private User user;
public void setUser(User user) {
this.user = user;
}
//必须添加getter方法,否则ognl无法将参数转换为对象
public User getUser() {
return user;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
if(userService.validate(user)){
ActionContext context=ActionContext.getContext();
context.getSession().put("tel",getUser().getTel());
context.getSession().put("password",getUser().getPassword());
return SUCCESS;
}
else return ERROR;
}
}
基本的组件都实现了,现在剩下的就是配置了。数据源等配置就不再说了,这里只说罗列持久化类这一块,如果不会配置,请查阅SSH整合开发之配置文件中的appicationContext.xml文件。
罗列持久化类:
<list>
<value>com.easychat.entity.Uservalue>
list>
Spring来控制依赖关系,注入配置这里不再细说,不懂的话请看上文的链接。
jsp只需要弄个表单将用户数据提交到loginAction就可以了,没什么技术含量,代码如下:
<s:form action="loginAction" id="form1">
<s:textfield label="用户名" name="user.tel">s:textfield>
<s:textfield label="密码" name="user.password">s:textfield>
<s:submit value="登录账号" id="submit">s:submit>
s:form>