Struts2 crud功能实现+高级查询+分页查询

简介: 后台功能的实现:1.创建员工表:t_employee2.根据表结构创建实体类:Employee3.定义DAO接口:IEmployeeDAO4.定义DAO的实现类:EmployeeDAOImpl(暂不实现, 测试先行)5.

后台功能的实现:

1.创建员工表:t_employee
2.根据表结构创建实体类:Employee
3.定义DAO接口:IEmployeeDAO
4.定义DAO的实现类:EmployeeDAOImpl(暂不实现, 测试先行)
5.定义对应的测试类:EmployeeDAOTest(编写对每个dao方法的测试代码)
6:使用druid连接池抽取JdbcUtil和db.properties文件.
7:编写通用的DAO操作模板JdbcTemplate.
8:编写通用的结果集处理器:BeanHander/BeanListHandler.

前台功能的实现:

01.集成Struts2框架
02.编写EmployeeAction代码和JSP代码
03.网页基本的CRUD测试通过
04.完成高级查询操作(前台)
05.完成分页查询操作(前台)

高级查询+分页查询

1.查询对象的封装(EmployeeQueryObject,QueryObject)
该对象是用户提交的数据的封装,将高级查询和分页数据都封装到该对象中,方便数据的传递
在该对象中提供sql条件字符串的拼接,和sql参数的存放
2.分页结果对象的封装(PageResult)
该对象是对页面中需要显示数据的封装(结果集数据和分页条相关的数据)
3.高级查询+分页查询方法设计
思考用户需要什么数据(返回值的类型)和用户应该要提供什么数据(方法的参数列表的定义)

项目结构划分

img_d85cf8a291432b8d1d7bf95511619432.png

DAO暂时不进行叙述了我们把重点放在Struts2上

我们想对下面表格使用struts2进行CRUD+高级查询+分页查询

img_ece16ad70559b4ea24f13b8c66187ec6.png

先把struts2引入项目中

<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 首先我们创建一个Action类

    public class EmployeeAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private IEmployeeDAO dao = new EmployeeDAOImp();
    @Setter@Getter
    private Employee e;
    @Setter@Getter
    private EmployeeQueryObject qo =new EmployeeQueryObject();
     @Override
     public String execute() throws Exception {
     PageResult result = dao.pageQuery(qo);
     ActionContext.getContext().put("result", result);
    //跳转逻辑视图
     return "list";
     }
     //执行用户的删除操作
     public String delete(){
     dao.delete(e.getId());
     return SUCCESS;
     }
     //编辑页面的跳转操作
     public String input(){
     if(e!=null){
         e=dao.get(e.getId());
     }
     return "input";
     }
    //执行保存更新操作
     public String saveOrUpdate(){
     if(e.getId()!=null){
         dao.update(e);
     }else{
         dao.save(e);
     }
     return SUCCESS;
     }
     }
    

domain模型

img_5558b77ddf7944fa18965621659c8ed5.png

struts.xml

<struts>
<!--开发者模式 -->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.ui.theme" value="simple" />
<package name="empPkg" extends="struts-default" namespace="/">
    <action name="emp_*" class="com.jd.pss.web.action.EmployeeAction"
        method="{1}">
        <result name="list" type="dispatcher">
            /WEB-INF/views/employee/list.jsp
        </result>
        <result name="success" type="redirectAction">
            emp
        </result>
        <result name="input">
            /WEB-INF/views/employee/input.jsp
        </result>
    </action>
</package>
</struts>

list.jsp

<s:form class="form-inline" role="form">
            <s:hidden name="qo.currentPage" id="currentPage"></s:hidden>
            <div class="form-group">
                <label class="sr-only" for="exampleInputEmail2"></label>
                <s:textfield name="qo.username" class="form-control"
                    id="exampleInputEmail2" placeholder="姓名" />
            </div>
            <div class="form-group">
                <label class="sr-only" for="exampleInputEmail2"></label>
                <s:textfield name="qo.email" class="form-control"
                    id="exampleInputEmail2" placeholder="邮箱" />
            </div>

input.jsp

<s:form id="account_register" name="account_register" namespace="/"
                    action="emp_saveOrUpdate" class="form-horizontal">

                    <s:hidden name="e.id"></s:hidden>

                    <div class="form-group">
                        <label for="account_register_account_username"
                            class="col-sm-2 control-label">用户名</label>
                        <div class="col-sm-4">
                            <s:textfield name="e.username"
                                id="account_register_account_username" class="form-control"
                                placeholder="请输入用户名" />
                        </div>
                        <div class="col-sm-6"></div>
                    </div>
                    <div class="form-group">
                        <label for="account.password" class="col-sm-2 control-label">密码</label>
                        <div class="col-sm-4">
                            <s:password name="e.password" showPassword="true"
                                id="account_register_account_password" class="form-control"
                                placeholder="请输入密码" />
                        </div>

我们需要理解的是以下逻辑:

  • http://localhost:8080/emp发送请求时获取查询数据存储在值栈中,跳转到逻辑视图 在list.jsp中通过迭代获取所有数据显示到界面上

      <s:iterator value="#result.listData" var="emp">
                      <tr>
                          <td>
                              <s:property value="#emp.id" />
                          </td>
                          <td>
                              <s:property value="#emp.headImg" />
                          </td>
                          <td>
                              <s:property value="#emp.username" />
                          </td>
                          <td>
                              <s:property value="#emp.password" />
                          </td>
                          <td>
                              <s:property value="#emp.email" />
                          </td>
                          <td>
                              <s:date format="yyyy-MM-dd" name="#emp.hiredate" />
                          </td>
                          <td>
                              <s:property value="#emp.salary" />
                          </td>
                          <td>
                              <s:a namespace="/" action="emp_input">
                                  <s:param name="e.id" value="#emp.id"></s:param>
                              编辑</s:a>
                              |
                              <s:a namespace="/" action="emp_delete">
                                  <s:param name="e.id" value="#emp.id"></s:param>
                          删除</s:a>
                          </td>
                      </tr>
                  </s:iterator>
    

这就是我们需要现实的界面前提是DAO的crud正常

img_ece16ad70559b4ea24f13b8c66187ec6.png
  • 删除操作:先获取要删除的数据的id值 通过getter方法拿到对象e并且调用对象属性的setter方法将id值赋值给对象的id属性 再调用delete()方法把id传递进来调用dao的删除方法从数据库删除数据,返回SUCCESS跳转到主见面进行重新发送请求进行更新数据
img_b7104f0de22999744c835f1cec7dcbe2.png
第一步

img_a7bef80a4c2b2ed8c1242238d3166f8c.png
第二步
img_63b09c2f737011787aa4f4e26f5f9a4b.png
第三步
img_d5ea33759eb2294ffea513c87be7342e.png
第四部
img_467b05b4ae6530baa21c892c1370958c.png
第五步
img_d3a7e10fe2cc47a13ab9295eb9cdc79f.png
第六步
img_ff6188ebbb9e2620f5d53e05a58b7dd3.png
第七步
  • 添加操作:当点击注册时会调用input()方法这时id为空返回"input"进入input的罗技视图界面通过struts.xml配置文件进入input.jsp(username为例)这时通过getter方法找到e对象再调用e属性username的setter方法将表格数据赋值;此时e对象的属性就有值了,提交表单后执行saveOrUpdate()方法,此时会调用dao的save()方法把对象保存


    img_53934cbf7af8cf2fb7b3a02d1e9bb90d.png
    第一步
img_1f951aea34cb690795527b0de5ba9b86.png
第二步

到action类中找到对应的input()方法

img_08e5d7ecf6361b990b5fef8ed5cef729.png
第三步
img_321198bb50db6a64fcb18e6c0fc721fe.png
第四步

跳转到input.jsp界面

img_53731d90bf839ada3e02ec58fafc61bb.png
第五步

e.id做了那些事?这是我们必须要知道的
提交表单会操作action

img_4e72f620dba444a45c391e8c7bede2b1.png
第六步
img_e06122a5f4105b2291da97fa80664c04.png
第七步
img_5d875a9db601de0a82e1c1d992c6c617.png
第八步
img_865b477628bedb2bf31477dc82fda24f.png
第九步

更新数据请求转发跳转到list.jsp界面

  • 编辑操作:当点击编辑操作时会获取对象的id,通过getter方法获取对象,再通过对象属性的setter方法将表格的值赋值给对象的属性 然后调用input()方法,因为id有值.再调用dao的update()方法
img_9a3f54e803ae6a204c598bc2479ca259.png
第一步
img_77da1b14e75f7c53c21971f3403d7792.png
第二步
img_5b1b960ba76e0122ad44bc198242e2f2.png
第三步
img_e6d25bd4eccc8cd8ffc5a10b90243f98.png
第四部
img_355dd4158842f3e39a27938c6aa705c6.png
第五步
img_39b4f68e5a32957215ded97dd516f922.png
第六步

最后更新数据请求转发跳转到list.jsp界面

img_36d25b2601182cb085a6871ab183247c.png
第七步
  • 高级查询:查询请求发送时会调用getter方法拿到qo对象,再将请求的值通过setter方法赋值给qo对象的属性.封装成对象
    同时在表单中设置一个隐藏域currentPage属性,提交表单跳转到当前界面执行execute()方法, 通过dao.pageQuery(qo); 获取结果集,将结果集保存到值栈中,跳转到"list"的逻辑视图


    img_e5a47e72c73fb97d3611d65d7de22745.png
img_3bcaea74239951d41fafb2ff7a0149b6.png

查询结果

img_175be990d330d7045fff8fcf69cb5d52.png
查询结果

常见的type值(结果类型):
dispatcher: 表示从Action请求转发到页面(JSP).缺省值
redirect: 表示从Action重定向到页面(JSP).
chain: 表示从Action请求转发到另一个Action.
redirectAction: 表示从Action重定向到另一个Action.

目录
相关文章
|
16天前
|
SQL 存储 数据库
优化数据库查询性能
【8月更文挑战第23天】优化数据库查询性能
42 7
|
21天前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
|
16天前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
2天前
|
存储 关系型数据库 MySQL
如何优化数据库查询?
如何优化数据库查询?
12 1
|
23天前
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
13天前
|
SQL 缓存 监控
优化大型数据库查询的最佳实践
在处理大规模数据时,数据库查询性能的优化至关重要。本文探讨了几种优化大型数据库查询的最佳实践,包括索引策略、查询重写、数据分区和缓存机制。通过这些方法,开发人员可以显著提高查询效率,减少系统负担,提升用户体验。本文还结合实际案例,提供了具体的优化技巧和工具建议,帮助读者有效地管理和优化大型数据库系统。
|
16天前
|
SQL 存储 监控
ADBPG&Greenplum成本优化问题之通过SQL查询找到数据库中所有的复制表如何解决
ADBPG&Greenplum成本优化问题之通过SQL查询找到数据库中所有的复制表如何解决
31 1
|
23天前
|
JavaScript 前端开发 数据处理
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
这篇文章介绍了如何在Vue框架的表单中将下拉框的数据通过后端接口从数据库动态查询并加载,包括前端HTML代码、JavaScript数据处理、后端接口实现以及表单提交的完整流程。
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
|
7天前
|
SQL 数据库 Java
HQL vs SQL:谁将统治数据库查询的未来?揭秘Hibernate的神秘力量!
【8月更文挑战第31天】Hibernate查询语言(HQL)是一种面向对象的查询语言,它模仿了SQL的语法,但操作对象为持久化类及其属性,而非数据库表和列。HQL具有类型安全、易于维护等优点,支持面向对象的高级特性,内置大量函数,可灵活处理查询结果。下面通过示例对比HQL与SQL,展示HQL在实际应用中的优势。例如,HQL查询“从员工表中筛选年龄大于30岁的员工”只需简单地表示为 `FROM Employee e WHERE e.age &gt; 30`,而在SQL中则需明确指定表名和列名。此外,HQL在处理关联查询时也更为直观易懂。然而,对于某些复杂的数据库操作,SQL仍有其独特优势。
14 0
|
7天前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
下一篇
DDNS