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

标签: SSH 博客 框架
1588人阅读 评论(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


查看评论

SSH的Dao层封装

一、先来看代码1.准备好所需要的Jar包 antlr-2.7.6.jar aopalliance-1.0.jar c3p0-0.9.1.2.jar commons-collect...
  • ChinaBowen
  • ChinaBowen
  • 2016-09-13 20:17:21
  • 3927

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

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

SSH dao层通用接口

  • 2017年01月05日 10:47
  • 4KB
  • 下载

JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

首先这是现在最基本的分层方式,结合了SSH架构。modle层就是对应的数据库表的实体类。Dao层是使用了Hibernate连接数据库、操作数据库(增删改查)。Service层:引用对应的Dao数据库操...
  • limuzi13
  • limuzi13
  • 2015-04-10 00:47:42
  • 53873

框架学习(1)——service层,dao层和service实现类进行数据库操作

浅谈对java框架设计中service层、dao层和service实现类作用的理解以及好处
  • qq_34825926
  • qq_34825926
  • 2017-04-05 20:48:11
  • 1731

关于ssh框架的service和dao的注入问题

项目用到的ssh框架,对此不太熟悉,struts2比较生疏,接触新项目的时候遇到了许多基础的问题还不知道如何解决,记录下以后备用。 一个myTest的增删改差,action文件写在user包下面了,...
  • sinat_28849851
  • sinat_28849851
  • 2017-03-14 10:46:55
  • 1713

完成SSH项目 -- 实现dao层

现在web02项目有了controller 和 service 但还没有dao层,接下来我们就整合dao层 1:配置数据源 ---  使用c3p0数据源 ...
  • LQW_java_home
  • LQW_java_home
  • 2017-04-08 09:34:29
  • 1013

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

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

poisson方程组矩阵

列出公式,然后离散化。最后对每个像素都满足公式,所以能得到稀疏矩阵A。 矩阵A为弱对角占优矩阵。比如若其中对角线为4,则该行其它元素有4个-1,其它均为0。 由于有边界条件,边界值已知,所以对于公...
  • liuxingwan
  • liuxingwan
  • 2015-10-20 18:27:58
  • 604

ElasticSearch学习19_搜索引擎-倒排索引基础知识

搜索引擎的索引 1.单词——文档矩阵        单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图3-1展示了其含义。图3-1的每列代表一个文档,每行代...
  • wang_zhenwei
  • wang_zhenwei
  • 2016-10-16 18:27:39
  • 3359
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 1029
    排名: 4万+
    最新评论