后台功能的实现:
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.高级查询+分页查询方法设计
思考用户需要什么数据(返回值的类型)和用户应该要提供什么数据(方法的参数列表的定义)
项目结构划分
DAO暂时不进行叙述了我们把重点放在Struts2上
我们想对下面表格使用struts2进行CRUD+高级查询+分页查询
先把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模型
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正常
- 删除操作:先获取要删除的数据的id值 通过getter方法拿到对象e并且调用对象属性的setter方法将id值赋值给对象的id属性 再调用delete()方法把id传递进来调用dao的删除方法从数据库删除数据,返回SUCCESS跳转到主见面进行重新发送请求进行更新数据
第二步 第三步 第四部 第五步 第六步 第七步
-
添加操作:当点击注册时会调用input()方法这时id为空返回"input"进入input的罗技视图界面通过struts.xml配置文件进入input.jsp(username为例)这时通过getter方法找到e对象再调用e属性username的setter方法将表格数据赋值;此时e对象的属性就有值了,提交表单后执行saveOrUpdate()方法,此时会调用dao的save()方法把对象保存
第一步
到action类中找到对应的input()方法
第三步 第四步跳转到input.jsp界面
第五步e.id做了那些事?这是我们必须要知道的
提交表单会操作action 第六步 第七步 第八步 第九步
更新数据请求转发跳转到list.jsp界面
- 编辑操作:当点击编辑操作时会获取对象的id,通过getter方法获取对象,再通过对象属性的setter方法将表格的值赋值给对象的属性 然后调用input()方法,因为id有值.再调用dao的update()方法
最后更新数据请求转发跳转到list.jsp界面
第七步-
高级查询:查询请求发送时会调用getter方法拿到qo对象,再将请求的值通过setter方法赋值给qo对象的属性.封装成对象
同时在表单中设置一个隐藏域currentPage属性,提交表单跳转到当前界面执行execute()方法, 通过dao.pageQuery(qo); 获取结果集,将结果集保存到值栈中,跳转到"list"的逻辑视图
查询结果
查询结果常见的type值(结果类型):
dispatcher: 表示从Action请求转发到页面(JSP).缺省值
redirect: 表示从Action重定向到页面(JSP).
chain: 表示从Action请求转发到另一个Action.
redirectAction: 表示从Action重定向到另一个Action.
网友评论