利用SSH框架實現用戶登錄功能

利用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框架實現用戶登錄功能


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章