zoukankan      html  css  js  c++  java
  • hibernate+Struts2实现分页和删除功能和spring注解功能

    第一步:先导包(Struts2+spring+hibernate+MySQL)。

    第二步:编写web.xml文件。

     

    第三步:编写实体类和实体类的映射文件(News.hbm.xml)

      实体类News

     

      News.hbm.xml文件的属性值。

     

     第四步:编写Dao类的接口和实现类。

      NewsDao接口:

      

      NewsDaoImpl实现类:

    import java.util.List;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.query.Query;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    
    import news.entity.News;
    
    public class NewsDaoImpl implements NewsDao{
        
        @Autowired
        @Qualifier("mysessionFactory")
        private SessionFactory sessionFactory;
        
        //计算数据库中数据的数量
        public int getAllRowCount(String hql) {
            //首先要打开会话。
            Session session = sessionFactory.openSession();
            //打开会话的事务。
            Transaction tc = null;
            //定义一个数据库中的数据的总的数量。
            int allRows = 0;
            
            try {
                tc = session.beginTransaction();
                //调用session中  的方法查询数据库中的所有的数据信息。
                Query query = session.createQuery(hql);
                //把数据库中数据的数量放到allRows中去。
                allRows = query.getResultList().size();
                //事务的提交。
                tc.commit();
            } catch (Exception e) {
                if (tc!=null) {
                    //没有查询到数据就回滚。
                    tc.rollback();
                }
                System.out.println(e.getMessage());
            }finally {
                if (session!=null) {
                    session.close();
                    
                }
            }
            
            return allRows;
        }
        
        //使用hibernate提供的分页的功能,得到每页显示多少条数据。
        //hql表示的意思是HQL语句,offset表示的是从第几条数据开始记录,pagesize表示的是每页显示的记录数据。
        public List<News> queryByPage(String hql, int offset, int pageSize) {
            //先打开会话。
            Session session = sessionFactory.openSession();
            //也是打开会话的事务管理。
            Transaction tc = null;
            //把通过条件查询出来的数据存放到list集合里面。
            List<News> list = null;
            try {
                tc = session.beginTransaction();
                //根据条件来进行分页。setFirstResult的意思是从第几条记录开始算起。setMaxResults的意思是每页显示的数据
                Query query = session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize);
                //把通过条件查询出来的数据存放到list集合里面。
                list = query.getResultList();
                //提交事务。
                tc.commit();
            } catch (Exception e) {
                if (tc!=null) {
                    tc.rollback();
                }
            }finally {
                if (session!=null) {
                    session.close();
                    
                }
            }
            
            return list;
        }
    
        @Override
        public String deleteNews(Integer id) {
            //首先要先打开会话。
            Session session = sessionFactory.openSession();
            //根据条件来进行查询。
            Query query = session.createQuery("from News where id=:myid");
            //把ID传入进去。
            query.setParameter("myid",id);
            //把查询出来的数据存入到list集合里面去。
            List<News> delete = query.getResultList();
            //对数据进行判断,看看是否为一还是为零。
            if(delete.size()==1){
                //如果有数据的话就从集合里面取出来。
                News news = delete.get(0);
                //开启事务。
                Transaction tc = session.beginTransaction();
                //调用session中删除的方法,进行操作。
                session.delete(news);
                //提交事务。
                tc.commit();
                //关闭会话。
                session.close();
                
            }
            
            return "delete";
        }
    
    }

       第五步:编写NewsBean的类。(记录前端显示的数据信息)

     1 import java.util.List;
     2 import news.entity.News;
     3 
     4 public class NewsBean {
     5     //通过hql从数据库分页查询出来的list集合
     6     private List<News> list;
     7     //总记录数
     8     private int allRows;
     9     //总页数
    10     private int totalPage;
    11     //当前页
    12     private int currentPage;
    13     
    14     public List<News> getList() {
    15         return list;
    16     }
    17     public void setList(List<News> list) {
    18         this.list = list;
    19     }
    20     public int getAllRows() {
    21         return allRows;
    22     }
    23     public void setAllRows(int allRows) {
    24         this.allRows = allRows;
    25     }
    26     public int getTotalPage() {
    27         return totalPage;
    28     }
    29     public void setTotalPage(int totalPage) {
    30         this.totalPage = totalPage;
    31     }
    32     public int getCurrentPage() {
    33         return currentPage;
    34     }
    35     public void setCurrentPage(int currentPage) {
    36         this.currentPage = currentPage;
    37     } 
    38     
    39     //定义一个得到总页数的方法。
    40     //pageSize:每页记录数。
    41     //allRows:总数据的数量的记录。
    42     public int getTotalPages(int pageSize,int allRows){
    43         //进行计算总页数。
    44         int totalPage = (allRows%pageSize==0)?(allRows/pageSize):((allRows/pageSize)+1);
    45         //System.out.println(totalPage);
    46         return totalPage;
    47     }
    48     
    49     //定义一个获取当前开始记录的方法。
    50     public int getCurrentPageoffset(int pageSize,int currentPage){
    51         int offset = pageSize*(currentPage-1);
    52         return offset;
    53     }
    54     
    55     //得到当前页,如果当前页为0 的时候,则开始第一页,否则为当前页。
    56     public int getCurPage(int page){
    57         int currentPage = (page==0)?1:page;
    58         return currentPage;
    59     }
    60     
    61     
    62 }

       第六步:编写NewsService接口和NewsServiceImpl实现类。

      NewsService接口

         

      NewsServiceImpl实现类

     1 import java.util.List;
     2 import org.springframework.beans.factory.annotation.Autowired;
     3 import org.springframework.beans.factory.annotation.Qualifier;
     4 import news.bean.NewsBean;
     5 import news.dao.NewsDao;
     6 import news.entity.News;
     7 
     8 public class NewsServiceImpl implements NewsService{
     9     @Autowired
    10     @Qualifier("mynd")
    11     private NewsDao nd;
    12     
    13     @Autowired
    14     @Qualifier("mynb")
    15     private NewsBean nb;
    16     
    17     //pageSize为每页显示的记录数
    18     // page为当前显示的页数
    19     public NewsBean getPageBean(int pageSize, int page) {
    20         //定义HQL的语句。
    21         String hql = "from News";
    22         //总记录数。
    23         int allRows = nd.getAllRowCount(hql);
    24         //总页数。
    25         int totalPage = nb.getTotalPages(pageSize, allRows);
    26         //当前页。
    27         int currentPage = nb.getCurPage(page);
    28         //锚点(从第几条数据开始查询)
    29         int offset = nb.getCurrentPageoffset(pageSize, currentPage);
    30         //把每页显示的数据存放到集合里面去。
    31         List<News> list = nd.queryByPage(hql, offset, pageSize);
    32         
    33         //把查询到集合返回到bean的对象里面去。
    34         nb.setList(list);
    35         //把总记录数也返回到bean对象里面去。
    36         nb.setAllRows(allRows);
    37         //把总页数返回到bean对象中去。
    38         nb.setTotalPage(totalPage);
    39         //把当前页返回到bean对象中去。
    40         nb.setCurrentPage(currentPage);
    41         
    42         return nb;
    43     }
    44 
    45     @Override
    46     public String deleteSingleNews(Integer id) {
    47         String delete = nd.deleteNews(id);
    48         return delete;
    49     }
    50 
    51 }

       第七步:编写NewsAction的类。

     1 import javax.servlet.http.HttpServletRequest;
     2 import org.apache.struts2.ServletActionContext;
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.beans.factory.annotation.Qualifier;
     5 import com.opensymphony.xwork2.ActionSupport;
     6 import news.bean.NewsBean;
     7 import news.service.NewsService;
     8 
     9 public class NewsAction extends ActionSupport {
    10     
    11     @Autowired
    12     @Qualifier("myns")
    13     private NewsService ns;
    14     
    15     //定义一个ID,用于页面中删除的作用。
    16     private Integer id;
    17     
    18     public Integer getId() {
    19         return id;
    20     }
    21 
    22     public void setId(Integer id) {
    23         this.id = id;
    24     }
    25 
    26     //定义获取当前页数。
    27     private int page;
    28 
    29     public int getPage() {
    30         return page;
    31     }
    32 
    33     public void setPage(int page) {
    34         this.page = page;
    35     }
    36     
    37     public String show(){
    38         //表示每页显示的页数,page表示的是当前的页数。
    39         NewsBean bean= ns.getPageBean(2, page);
    40         
    41         HttpServletRequest request = ServletActionContext.getRequest();
    42         
    43         request.setAttribute("bean",bean);
    44         
    45         return "success";
    46     }
    47     
    48     //定义删除的方法。
    49     public String delete(){
    50         //调用删除的方法。
    51         String delete = ns.deleteSingleNews(id);
    52         return delete;
    53     }
    54     
    55     
    56 }

       第八步:编写Struts.xml文件的配置信息。

      

       第九步:编写applicationContext.xml文件的配置信息。

      数据库连接池的配置:

     1 <bean id="mysessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
     2         <property name="dataSource" ref="myDataSource"></property>
     3         <property name="hibernateProperties">
     4             <props>
     5                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
     6                 <prop key="hibernate.show_sql">true</prop>
     7                 <prop key="hibernate.format_sql">true</prop>
     8                 <prop key="hibernate.connection.autocommit">false</prop>
     9                 <prop key="hibernate.hbm2ddl.auto">update</prop>
    10             </props>
    11         </property>
    12         
    13         <property name="mappingResources">
    14             <list>
    15                 <value>news/entity/News.hbm.xml</value><!--这里是实体类的映射文件 -->
    16             </list>
    17         </property>    
    18     </bean>
    19     
    20     <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    21         <property name="driverClass" value="${jdbc.driver}" />
    22         <property name="jdbcUrl" value="${jdbc.url}" />
    23         <property name="user" value="${jdbc.user}" />
    24         <property name="password" value="${jdbc.password}" />
    25         <!-- 每300秒检查所有连接池中的空闲连接 -->
    26         <property name="idleConnectionTestPeriod" value="300"/>
    27         <!-- 最大空闲时间,900秒内未使用则连接被丢弃。若为0则永不丢弃 -->
    28         <property name="maxIdleTime" value="900"/>
    29         <!-- 最大连接数 -->
    30         <property name="maxPoolSize" value="2"/>
    31 
    32     </bean>
    33     

       引入的数据库连接池的外部文件的配置信息:

       

       第十步:编写index.jsp页面。

      

       页面代码:

     1  <h1><font color="blue">分页查询</font></h1><hr>
     2     
     3     <table border="1" align="center" bordercolor="yellow" width="50%">
     4     
     5         <tr>
     6             <th>编号</th>
     7             <th>标题</th>
     8             <th>内容</th>
     9             <th>日期</th>
    10             <th>作者</th>
    11             <th>操作</th>
    12         </tr>
    13     
    14         <s:iterator value="#request.bean.list" id="news">
    15         
    16             <tr align="center">
    17                 <td><s:property value="#news.id"/></td>
    18                 <td><s:property value="#news.title"/></td>
    19                 <td><s:property value="#news.content"/></td>
    20                 <td><s:date name="#news.begintime" format="yyyy-MM-dd"/></td>
    21                 <td><s:property value="#news.username"/></td>
    22                 <td><s:a value="NewsAction_delete?id=%{#news.id}" onclick="return confirm('你确定要删除这条记录吗?');">删除</s:a></td>
    23             </tr>
    24         
    25         </s:iterator>
    26         
    27     </table>
    28     <b></b>
    29     
    30     <center>
    31         <font size="5">32             <font color="red">
    33                 <s:property value="#request.bean.totalPage"/>
    34             </font>35         </font>
    36         &nbsp;&nbsp;
    37          <font size="5">38              <font color="red">
    39                  <s:property value="#request.bean.allRows"/>
    40              </font>条记录
    41          </font>
    42          <br><br>
    43         
    44         <font size="5">45             <font color="red">
    46                 <s:property value="#request.bean.currentPage"/>
    47             </font>48         </font>
    49         
    50         <!--进行判断是否要跳转。  -->
    51         <s:if test="#request.bean.currentPage == 1">
    52             首页&nbsp;&nbsp;&nbsp;上一页
    53         </s:if>
    54         <s:else>
    55             <a href="NewsAction_show.action">首页</a>&nbsp;&nbsp;&nbsp;
    56             <a href="NewsAction_show.action?page=<s:property value='#request.bean.currentPage - 1'/>">上一页</a>
    57         </s:else>
    58         
    59         <s:if test="#request.bean.currentPage!=#request.bean.totalPage">
    60             <a href="NewsAction_show.action?page=<s:property value='#request.bean.currentPage + 1'/>">下一页</a>
    61             <a href="NewsAction_show.action?page=<s:property value='#request.bean.totalPage'/>">尾页</a>
    62         </s:if>
    63         
    64         <s:else>
    65             下一页&nbsp;&nbsp;&nbsp;尾页
    66         </s:else>
    67         
    68     </center>
    69     <br>
    70     <center>
    71         <form action="NewsAction_show" onsubmit="return validate();">
    72             <font size="4">跳转至</font>
    73             <input type="text" size="2" value='<s:property value="#request.bean.currentPage"/>' name="page">74             <input type="submit" value="跳转">
    75         </form>
    76     
    77     </center>

       页面显示的效果:

     

     

     

  • 相关阅读:
    自定义simple_tag
    测试流程规范系列(2):测试计划
    测试流程规范系列(4):测试准入
    测试流程规范系列(3):测试用例
    测试流程规范系列(1):测试流程
    Jmeter系列(1):安装
    Jmeter系列(2):简介
    Jmeter系列(3):使用
    Jmeter系列(4):插件
    Jmeter系列(5):参数化
  • 原文地址:https://www.cnblogs.com/huanglinbin/p/5973887.html
Copyright © 2011-2022 走看看