### WebWork 2.2.7 + Spring + Hibernate 分页查询技术详解 #### 一、项目背景及架构 本项目采用WebWork 2.2.7框架结合Spring和Hibernate技术实现了一个基本的用户数据分页查询功能。主要目标是根据用户输入的用户名获取相应的数据,并以分页的形式展示给用户。 #### 二、系统结构分析 项目采用了经典的MVC(Model-View-Controller)设计模式,具体包括以下几个层次: 1. **Action层**:负责处理用户的请求,并调用业务逻辑层的方法。 2. **Business Object (BO) 层**:提供业务逻辑服务,通常包含各种业务接口和服务类。 3. **Data Access Object (DAO) 层**:负责数据的持久化操作,即与数据库交互。 4. **Pojo (PO) 层**:简单对象模型,用于封装数据。 #### 三、关键代码解析 ##### 1. Web 配置文件 (web.xml) ```xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>webwork</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>webwork</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` - **ContextLoaderListener**:Spring的监听器,用于初始化Spring容器。 - **FilterDispatcher**:WebWork的核心过滤器,处理所有HTTP请求。 ##### 2. DAO 层 (IPersonDAO.java & PersonDAO.java) - **IPersonDAO.java**:定义了DAO接口,包含了分页查询的方法声明。 ```java public List findPagedAllByName(int currentPage, int pageSize, String username); ``` - **PersonDAO.java**:实现了DAO接口,并提供了具体的分页查询实现。 ```java public List findPagedAllByName(int currentPage, int pageSize, String username) { log.debug("分页查找"); try { if (currentPage == 0) { currentPage = 1; } String queryString = "from Person p where p.username=" + username; Query queryObject = getSession().createQuery(queryString); queryObject.setFirstResult((currentPage - 1) * pageSize); queryObject.setMaxResults(pageSize); return queryObject.list(); } catch (RuntimeException re) { log.error("findall failed", re); throw re; } } ``` - **解析**: - `currentPage`:当前页码,默认为1。 - `pageSize`:每页显示的数据数量。 - `username`:用于查询的用户名。 - 使用Hibernate的`Query`对象设置分页参数,并执行SQL查询语句。 ##### 3. BO 层 (IPersonService.java & PersonService.java) - **IPersonService.java**:定义了业务接口,包含分页查询方法的声明。 ```java public interface IPersonService { public List findPagedAllByName(int currentPage, int pageSize, String username); } ``` - **PersonService.java**:实现了业务接口,并调用了DAO层的方法。 ```java public class PersonService implements IPersonService { public List findPagedAllByName(int currentPage, int pageSize, String username) { // 调用DAO层的方法 } } ``` - **解析**: - BO层主要负责将DAO层的操作结果组织成业务逻辑需要的格式。 #### 四、存在的问题及优化建议 - **问题**:目前的实现存在一个明显的缺陷,即在进行前后翻页时容易出现死机现象。 - **可能的原因**: - 数据库连接管理不当,导致资源泄露。 - 查询语句或分页参数设置不合理。 - **优化建议**: - 使用连接池管理数据库连接,确保连接的正确释放。 - 对查询语句进行优化,避免全表扫描。 - 在前端增加对分页参数的有效性校验,如限制页码范围。 #### 五、总结 本文详细介绍了基于WebWork 2.2.7 + Spring + Hibernate技术栈实现分页查询的具体实现方式,通过对关键代码的解析以及对现有问题的分析,希望能够帮助读者更好地理解和应用这些技术。在未来的工作中,还可以进一步探索更高效的数据查询策略和页面展示方式,以提高用户体验。
通过输入用户名获取数据并进行分页
工程包结构:
action:LoginAction.java
bo:IPersonService.java PersonService.java
dao:IPersonDAO.java PersonDAO.java
po:Person.java Person.hbm.xml
缺点:不能来回翻页,向前后翻页时,翻几页就会死机????知道原因的请告诉我,谢谢了。。。
----------------------------------------------------------------web.xml
<!--载入spring配置文件-->
<context-param>
<param-name>contextConfigLocation </param-name>
<param-value> /WEB-INF/applicationContext.xml </param-value>
</context-param>
<!-- 第一个侦听器是spring必需的,无论是否与WebWork集成,都要定义该侦听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>webwork</filter-name>
<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
</filter-mapping>
----------------------------------------------------------------IPersonDAO.java
public List findPagedAllByName(int currentPage, int pageSize,String username);//用于分页的方法.当前第几页,每页几条记录
----------------------------------------------------------------PersonDAO.java
public List findPagedAllByName(int currentPage, int pageSize,
String username) {
log.debug("分页查找");
try {
if (currentPage == 0) {
currentPage = 1;
}
String queryString = "from Person p where p.username=" + username;
Query queryObject = getSession().createQuery(queryString);
queryObject.setFirstResult((currentPage - 1) * pageSize);
queryObject.setMaxResults(pageSize);
return queryObject.list();
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
----------------------------------------------------------------IPersonService.java
public interface IPersonService {
剩余7页未读,继续阅读
- 粉丝: 54
- 资源: 61
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助