第一步:先导包(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 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 首页 上一页 53 </s:if> 54 <s:else> 55 <a href="NewsAction_show.action">首页</a> 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 下一页 尾页 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>
页面显示的效果: