利用SSH框架实现用户登录功能

来源:互联网 发布:端口号 传输层 编辑:程序博客网 时间:2024/05/22 07:02

利用SSH框架实现用户登录功能

    由于是登录功能,要用到表单,所以相应的就要用到actionform,写一个类,继承于ActionForm类,由于已经有一个pojo对象了,所以不用再写eneity对象。直接在里面实例化一个pojo对象User,并提供set()与get()方法。代码如下:

 private User user=new User();

 public User getUser() {
  return user;
 }

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

 

在dao层要进行数据库的交互,进行相关的查询,代码:

public List<User> checkLoginUser(User user) throws DAOException {
List<User> userList=null;
try{
String hql ="from User as user where user.userName=? and user.userPwd=?";
userList=getHibernateTemplate().find(hql, new String[]{user.getUserName(),user.getUserPwd()});
}catch(RuntimeException ex){
logger.error("find by property name failed", ex);
throw new DAOException();
}
    return userList;
}

这里对将传入的对象作为查询条件,将查询到的结果作为一个List集合返回到service层进行数据的加工。其中getHibernateTemplate().find()方法有多种重载方式,这里用的是getHibernateTemplate().find(HQLString,Object[]),这里第一个参数是HQL语句,可以有占位符,第二个参数是一个数组,用来设置语句中占位符的值。

service层代码:

public boolean checkLoginUserInfo(User user) throws ServiceException {
List<User> userList = managerUserDao.checkLoginUser(user);
for(int i=0;i<userList.size();i++){
User userLogin = userList.get(i);
if(userLogin!=null && !userLogin.getUserName().equals("")){
    return true;
}
}
    return false;
}

    程序进行处理的是action,所以写一个类,继承自DispatchAction类,在里面写一个checkUserLogin()方法,由于web层依赖于service层,采用的是注入的方式,所以必须提供set()方法。代码如下:

 private ManagerUserService managerUserService;

 public void setManagerUserService(ManagerUserService managerUserService) {
  this.managerUserService = managerUserService;
 }

checkUserLogin()方法代码如下:

 public ActionForward checkUserLogin(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  UserLoginForm userLoginForm = (UserLoginForm)form;
  HttpSession session = request.getSession(true);
  boolean loginOk=managerUserService.checkLoginUserInfo(userLoginForm.getUser());
  if(loginOk){
       session.setAttribute("user", userLoginForm.getUser());
       return mapping.findForward("loginsuccess");
  }else{
       return mapping.findForward("loginfailed");
  }
 }

最终返回值为Boolean类型,验证成功后将user对象放入session中,可以方便在下级页面当中显示当前登录用户。然后进行相应的转发。

struts-config.xml文件的action-mappings结点下添加如下配置:

    <action path="/userlogin" name="userLoginForm" parameter="dispatch" type="org.springframework.web.struts.DelegatingActionProxy">
     <forward name="loginsuccess" path="/manager.htm"></forward>
     <forward name="loginfailed" path="/loginerror.jsp"></forward>
    </action>

当struts拦截到userlogin请求时,将其交由DelegatingActionProxy进行处理转发,applicationContext.xml文件里添加如下配置:

 <bean name="/userlogin" class="com.xh.computerroom.web.action.UserLoginAction">
  <property name="managerUserService" ref="managerUserService"></property>
 </bean>

DelegatingActionProxy会根据配置文件里的依赖关系,最终将请求交由UserLoginAction处理。

    前台登录页面中form的action属性应该是userLogin?dispatch=checkUserLogin,这里dispatch的值要和UserLoginAction验证登录的方法名相一致。用户名和密码表单的name值应当是UserLoginForm中User对象的相应属性。要不然ActionForm不会自动进行数据的封装!

    由于在action中已经将登录时实例化的对象放到了Session当中:

 session.setAttribute("user", userLoginForm.getUser());
所以当登录成功后,就可以在转发到的页面当中通过EL表达式${user.userName}获取当前登录的用户。

    虽然说这只是一个简单的用户登录功能,但是出现的知识点很多,而且很容易出错!比如今天我就在前台的页面中写错了表单的name属性,导致在登录页面一点登录就错误,也没法下手设置断点进行调试……所以,在以后的项目中,一定要细心!利用SSH框架实现用户登录功能


0 0