【基於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