1. 程式人生 > >【基於SSH框架的個人部落格系統04】DAO層,Service層與Action層

【基於SSH框架的個人部落格系統04】DAO層,Service層與Action層

DAO層-資料的增刪改查

J2EE開發人員使用資料訪問物件(DAO)設計模式把底層的資料訪問邏輯和高層的商務邏輯分開.實現DAO模式能夠更加專注於編寫資料訪問程式碼。DAO層的每個類都依賴於SessionFactory,SessionFactory介面負責初始化Hibernate。它充當資料儲存源的代理,並負責建立Session物件。這裡用到了工廠模式。同理我們需要在applicationContext.xml中注入sessionFactory

我們來看一下UserDao.java

public class UserDao {
       privateSessionFactory sessionFactory;
   public void setSessionFactory(SessionFactory sessionFactory) { 
       this.sessionFactory = sessionFactory; 
   }   
   protected Session getSession() {  
        returnsessionFactory.getCurrentSession(); 
    }
       publicvoid saveUser(User user) {
              getSession().save(user);
       }
       publicUser loadUser(Integer id) {
              return(User)getSession().get(User.class, id);
       }
       publicvoid updateUser(User user) {
              getSession().update(user);
       }
       publicList allUser() {
              Stringhql="from User";
              returngetSession().createQuery(hql).list();
       } 
       PublicUser loadByAccount(String account){
              Stringhql="from User u where u.account=:account";
              Queryquery=getSession().createQuery(hql);
              query.setParameter("account",account);
              ListuserList=query.list();
              if(userList.size()<1){
                     returnnull;
              }
              Useruser=(User)userList.get(0);
              returnuser;
       }
}

HQL語句

這裡我們簡單學習一下HQL語句,詳細的可以去百度搜一下“hql語法與詳細解釋”

HQL語句是Hibernate專用的語句,在上面UserDao中,我們可以看到幾條HQL語句,比如String hql="from User";會讀取所有的user,那我們想加上一些條件的話,可以是”from User u whereu.userId=5”,這樣會讀取到userid為5的User。那如果我們想通過傳入引數來得到對應的user的資訊的話,可以這樣子:

String hql="from User u whereu.account=:account";

Query query=getSession().createQuery(hql);

query.setParameter("account",account);

有點類似JDBC的PreparedStatement,先搭好語句的框架,再將具體的值set進去。那如果要排序呢?很簡單,只要在最後面加上order by XXX(asc/desc 升序/降序)即可。

from Comment comment wherecomment.blogId=:blogId order by comment.date asc

知道這些,我們就可以寫出很多的功能了,其他的要用到的時候再瞭解即可。

這裡我採用的是對每一個JavaBean都有一個對應的DAO,也可以弄個BaseDAO, 其他DAO繼承這個BaseDAO,根據主鍵來進行添刪改查 ,適用於通用的操作。至於具體業務操作的,就寫在特定的DAO裡面。

編寫完Dao,我們的業務邏輯就可以開始使用這個Dao類來操作資料庫了。

Service層-處理業務邏輯

Service層,也就是業務邏輯層,主要是對一些業務邏輯進行處理後返回結果給控制器。

一個Service層一般可以依賴1到n個Dao層的類,用以形成它自身的業務邏輯。

以使用者資訊的業務邏輯為例

public class UserInfoServiceImpl extendsBaseServiceImpl<UserInfo> implements UserInfoService{
       privateUserInfoDao userInfoDao;
       publicvoid setUserInfoDao(UserInfoDao userInfoDao) {
              this.userInfoDao= userInfoDao;
       }
       publicUserInfoDao getUserInfoDao() {
              returnuserInfoDao;
       }
       @Override
       publicvoid saveUserInfo(Integer userId,String userName, Boolean sex, DateuserBirthday, String userJob, String post,String userIntroduction, Integer userPlace,String userImage) {
              UserInfouserInfo=new UserInfo();
              userInfo.setUserId(userId);
              userInfo.setSex(sex);
              userInfo.setUserBirthday(userBirthday);
              if(userImage==null)userImage=Constant.DEFAULT_IMAGE_URL;//預設頭像
              userInfo.setUserImage(userImage);
              userInfo.setUserIntroduction(userIntroduction);
              userInfo.setUserJob(userJob);
              userInfo.setUserName(userName);
              userInfo.setPost(post);
              userInfo.setUserPlace(userPlace);
              userInfoDao.saveUserInfo(userInfo);
       }
       publicvoid updateDetail(Integer userId,String userName,Boolean sex,DateuserBirthday,String userJob, String post,String userIntroduction,IntegeruserPlace){
              UserInfouserInfo=userInfoDao.loadUserInfoByUserId(userId);
              if(userName!=null&&userName!="")userInfo.setUserName(userName);
              if(sex!=null)userInfo.setSex(sex);
              if(userBirthday!=null)userInfo.setUserBirthday(userBirthday);
              if(userJob!=null&&userJob!="")userInfo.setUserJob(userJob);
if(userIntroduction!=null&&userIntroduction!="")userInfo.setUserIntroduction(userIntroduction);
              userInfo.setUserPlace(userPlace);
              if(post!=null&post!="")userInfo.setPost(post);
       if(userInfo.getUserImage()==null)userInfo.setUserImage(Constant.DEFAULT_IMAGE_URL);
              userInfoDao.updateUserInto(userInfo);
             
       }
       @Override
       publicvoid updateUserImage(Integer userId, String userImageURL) {
              userInfoDao.updateImageURL(userId,userImageURL);
       }
       @Override
       publicString loadUserNameById(Integer userId) {
              UserInfouserInfo=userInfoDao.loadUserInfoByUserId(userId);
              returnuserInfo.getUserName();
       }
       publicUserInfo getUserInfoByUserId(Integer userId){
              returnuserInfoDao.loadUserInfoByUserId(userId);
       }
       publicInteger getUserIdRandomly(Integer userId){
              List<UserInfo>userInfoList=userInfoDao.allOtherUserInfo(userId);
              intsize=userInfoList.size();
              if(size!=0){
                     intx=(int)(Math.random()*size);
                     intid=userInfoList.get(x).getUserId();
                     returnid;
              }
              return0;
       }
}

在通過userInfoDao獲取資料庫中的資料後,可以對資料進行處理,寫回到資料庫中,或者是返回相應的結果。這個沒什麼好講的。

Action控制層

連線前後端的一層。前端所傳送的請求,都會被Struts框架攔截,根據它自身的struts配置檔案,轉發到對應的action類中。

Action的處理流程可以分為以下步驟:

①   獲取引數

②   呼叫相對應的業務邏輯層的方法進行處理,得到結果

③   根據結果返回不同的頁面,或者返回相對應的json資料。

Action類的寫法如下:

public class UserAction extendsActionSupport{
       privateUserService userService;
       privateUserInfoService userInfoService;
       privateMap<String, Object> jsonMap=null;
       publicvoid setJsonMap(Map<String, Object> jsonMap) {
              this.jsonMap= jsonMap;
       }
       publicMap<String, Object> getJsonMap() {
              returnjsonMap;
       }
       publicvoid setUserService(UserService userService){
              this.userService=userService;
       }
       publicUserService getUserService(){
              returnuserService;
       }
       publicvoid setUserInfoService(UserInfoService userInfoService) {
              this.userInfoService= userInfoService;
       }
       publicUserInfoService getUserInfoService() {
              returnuserInfoService;
       }     
       publicString login() throws Exception{
              HttpServletRequestrequest = ServletActionContext.getRequest();
              HttpSessionsession = request.getSession();
              Stringaccount = request.getParameter("account"); 
       String password = request.getParameter("password");
       System.out.println("login"+account+" "+password);
              if(userService.loginCheck(account,password)==true){
                     IntegeruserId=userService.loadUserId(account);
                     session.setAttribute("userId",userId);
                     UserInfouserInfo=userInfoService.getUserInfoByUserId(userId);
                     userInfo.setUserRecentLoginTime(newDate());
                     userInfoService.update(userInfo);
                     returnConstant.SUCCESS;
              }else{
                     returnConstant.FAIL;
              }
       }
       publicString passwordCheck(){
              HttpServletRequestrequest = ServletActionContext.getRequest();
              jsonMap=newHashMap<String, Object>();
              Stringpassword=request.getParameter("password");
              Stringaccount=request.getParameter("account");
              System.out.println(account+""+password);
              Booleanmatch=userService.loginCheck(account,password);
              jsonMap.put("valid",match);
              return"jsonMap";
       }
}

獲取引數:

通過HttpServletRequest request =ServletActionContext.getRequest();以及 HttpSessionsession = request.getSession();

我們可以得到serlvet中學習過的request,session等物件,通過這幾個物件,我們可以獲取請求傳過來的值,或者是設定相應作用域的值。例如

Stringpassword=request.getParameter("password");

Stringaccount=request.getParameter("account");

session.setAttribute("userId",userId);//在整個會話期間的userId,表明登入者為該使用者

配置返回頁面:

在struts.xml中,可以在<action></action>配置對應的頁面,比如

<resultname="success">/main.jsp</result>

<result name=”fail”>/fail.jsp</result>

當我們對應的action返回“success”時,則會跳轉到main.jsp中。

當我們對應的action返回”fail”時,則會跳轉到fail.jsp中。

當然,前後端的互動遠不止這樣,除此之外,前後端的資料互動可以利用json來進行互動。JSON(JavaScript Object Notation, JS物件標記)是一種輕量級的資料交換格式。它有以下特徵

·  物件表示為鍵值對

·  資料由逗號分隔

·  花括號儲存物件

·  方括號儲存陣列

一個簡單的json如下var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字串,本質是一個字串。關於JSON資料的互動我們之後會進行講解。

----------------------------------------------------------------------------

本專案下載地址:

github:https://github.com/SCAUMankind/SSHBlogSystem