利用SSH框架實現用戶登錄功能
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屬性,導致在登錄頁面一點登錄就錯誤,也沒法下手設置斷點進行調試……所以,在以後的項目中,一定要細心!