ssh开发之登录实现

一、本节说明

好久没写博客了,登录功能是任何一个应用都必不可少的功能,这次先介绍一下登录的实现。

二、准备工作

假设你已配置好ssh开发所需的环境,如果没有,请参考我的另一篇博文:SSH整合开发之配置文件

三、基础组件

我们必须先把基础设施做好才能开始写视图层页面,需要的组件有两种:DAO组件和业务逻辑组件。除了组件还需要持久化类用来映射用户表
Java EE提倡面向接口编程,以下都遵循这个思想。

1.DAO组件

它首先需要有个基类的DAO接口定义一些通用的方法,然后还要有一个基类的DAO组件实现这个接口的方法。
用户有操作,那么需要定义一个用户DAO接口继承自基类DAO接口,还要有一个用户的DAO组件继承自基类的DAO组件并且实现了用户DAO接口。


基类DAO接口
package com.easychat.dao;

import java.io.Serializable;
import java.util.List;

public interface BaseDao<T> {

    /**
     * 获取实体
     * @param entityClazz
     * @param id
     * @return
     */
    T get(Class<T> entityClazz,Serializable id);

    /**
     * 保存实体
     * @param entity
     * @return
     */
    Serializable save(T entity);

    /**
     * 更新实体
     * @param entity
     */
    void update(T entity);

    /**
     * 删除实体
     * @param entityClazz
     * @param id
     */
    void delete(Class<T> entityClazz,Serializable id);

    /**
     * 搜索
     * @param entityClazz
     * @return
     */
    List<T> findAll(Class<T> entityClazz);

    long findCount(Class<T> entityClazz);

    /**
     * 根据hql查询
     * @param hql
     * @return
     */
    public List<T> find(String hql);

    public List<T> find(String hql,Object... params);

    /**
     * 分页查询
     * @param hql
     * @param pageNo
     * @param pageSize
     * @return
     */
    public List<T> findByPage(String hql,int pageNo,int pageSize);

    public List<T> findByPage(String hql,int pageNo,int pageSize,Object...params);
}

用户DAO接口代码如下:
package com.easychat.dao;

import com.easychat.entity.User;

public interface UserDao extends BaseDao<User>{

}

基类DAO组件代码如下:
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<T> 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<T> entityClazz, Serializable id) {
        getSessionFactory().getCurrentSession().createQuery("delete "+entityClazz.getSimpleName()+" en where en.id=?0")
        .setParameter("0",id)
        .executeUpdate();
    }

    @Override
    public List<T> findAll(Class<T> entityClazz) {
        return find("select en from "+entityClazz.getSimpleName()+" en");
    }

    @Override
    public long findCount(Class<T> entityClazz) {
        // TODO Auto-generated method stub
        return 0;
    }

    /**
     * 根据hql语句查找
     * @param hql
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<T> find(String hql){
        return getSessionFactory().getCurrentSession().createQuery(hql).list();
    }

    /**
     * 根据带占位符的hql语句查找
     * @param hql
     * @param params
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<T> find(String hql,Object... params){
        Query query=getSessionFactory().getCurrentSession().createQuery(hql);
        for(int i=0;i<params.length;i++){
            query.setParameter(i,params[i]);
        }
        return query.list();
    }

    /**
     * 分页查询
     * @param hql
     * @param pageNo 查询第几页
     * @param pageSize 每页多少条记录
     * @return
     */
    @SuppressWarnings("unchecked")
    public List<T> 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<T> findByPage(String hql,int pageNo,int pageSize,Object...params){
        Query query=getSessionFactory().getCurrentSession().createQuery(hql);
        for(int i=0;i<params.length;i++){
            query.setParameter(i,params[i]);
        }

        return query.setFirstResult((pageNo-1)*pageSize)
                .setMaxResults(pageSize)
                .list();
    }
}

用户DAO组件代码如下:
import com.easychat.dao.UserDao;
import com.easychat.entity.User;

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{

}

2.持久化类

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();
    }
}

持久化类配置
持久化类还需要配置,配置问题见下文。


3.业务逻辑组件

每个业务逻辑组件都应该有一个接口,这里定义三个方法。
业务逻辑接口代码如下:

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<User> list=userDao.find("select u from User u  where u.tel=? and u.password=?",tel,password);
        return list.size()==0?null:list.get(0);
    }

}

5.控制器实现
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;
    }
}

6.配置

基本的组件都实现了,现在剩下的就是配置了。数据源等配置就不再说了,这里只说罗列持久化类这一块,如果不会配置,请查阅SSH整合开发之配置文件中的appicationContext.xml文件。
罗列持久化类:

<list>
        <!-- 罗列持久化类 -->
        <value>com.easychat.entity.User</value>
</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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值