关闭

【基于SSH框架的个人博客系统04】DAO层,Service层与Action层

标签: SSH博客框架
1265人阅读 评论(0) 收藏 举报
分类:

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


1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

三大框架整合ssh(二)------DAO层 源码

一、最高层的DAO接口(ICommonDao.java) public interface ICommonDao { public void save(T t); } 二、最高层的DAO接口的实...
  • zl544434558
  • zl544434558
  • 2013-10-18 15:30
  • 2863

SSH开源自动生成代码工具,可自动生成action、service、form、dao、model、vo、sqlmap.xml、.hbm.xml、test等

本人只是将最流行的代码生成工具rapid和自动建网站工具jeecms整合,形成了一套属于自己的从代码生成到建站自动化完成。该系统支持ssh,ssi,springmvc等十多种结构代码,可以自动,act...
  • zl19861225
  • zl19861225
  • 2013-03-01 16:09
  • 2740

ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-dao与service层等组件整合

ssm(springmvc4+spring4+mybatis3)整合实战-个人博客系统-dao与service层等组件整合     这一篇博客,我把mybatis逆向工程生成的dao与service...
  • u013871100
  • u013871100
  • 2017-06-17 23:11
  • 755

【基于SSH框架的个人博客系统03】bean层-javabean的建立以及映射文件的创建

分析完项目之后,开始进入代码的编写阶段。 我们知道一个系统最主要的底层部分便是对数据库的增删改查,在java中,这种对数据库的操作基本上都是将数据库表与一个javabean对应起来,这种技术叫做对象关...
  • Hemk340200600
  • Hemk340200600
  • 2017-05-08 23:10
  • 814

JAVA SSH开发架构中Action层,Service层,modle层,Dao层的功能区分

首先这是现在最基本的分层方式,结合了SSH架构。modle层就是对应的数据库表的实体类。Dao层是使用了Hibernate连接数据库、操作数据库(增删改查)。Service层:引用对应的Dao数据库操...
  • cai7095576
  • cai7095576
  • 2014-09-11 21:11
  • 5825

java web ssh 整合封装Action Service Dao 层

java web ssh 整合封装Action Service Dao
  • ITGGGG
  • ITGGGG
  • 2016-11-28 12:30
  • 436

SSH框架构造之二---------------DAO,service中间层构造

中间层构造的目的是将hibernate数据操作封装,并且形成基于spring的服务注入。 (1)DAO层 接口: package com.my.dao; import java.uti...
  • yangtang_newton
  • yangtang_newton
  • 2012-01-10 08:55
  • 524

简单解释SSH框架中Action、Service、Dao、struts、Spring之间的关系

首先,先看下ssh框架的目录结构: 这个是简单的SSH框架,由于之前学习过经典三层框架,现在结合着三层框架来理解下SSH框架中的各个层之间的关系: 一、Action       看一下这个...
  • hanxintong9
  • hanxintong9
  • 2015-12-14 18:48
  • 5648

SSH 框架学习之初识Java中的Action、Dao、Service、Model—————————–学到就要查,自己动手动脑!!!

SSH 框架学习之初识Java中的Action、Dao、Service、Model—————————–学到就要查,自己动手动脑!!!    基础知识目前不够,有感性认识即可 首先这是现在最基本的...
  • wjlgdut
  • wjlgdut
  • 2017-06-05 16:52
  • 272

在ssh框架中service,action,jsp,formbeam,dao的调用顺序

jsp发起请求。 actionform封装请求参数。 action接受请求,并接受封装好的actionfrom action调用service。 service经过业务逻辑处理之后随后调用DA...
  • lizibing06
  • lizibing06
  • 2014-04-01 00:42
  • 1010
    个人资料
    • 访问:25580次
    • 积分:911
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:0篇
    • 译文:0篇
    • 评论:24条
    最新评论