Struts2增删改查(自己思路理解)
1:查询所有:
DAO层:把所有的信息都放到list集合中。然后返回。
public List<Employee> getEmployees(){
return new ArrayList<Employee>(emps.values());
}
Action层:把所有的数据放到request的Map中。然后页面显示的时候。取request中的值
private Map<String, Object> request;
public void setRequest(Map<String, Object> arg0) {
this.request = arg0;
}
public String list(){
request.put("emps", dao.getEmployees());
return "list";
}
页面获取: #request.emps
<body>
<table cellpadding="10" cellspacing="0" border="1">
<thead>
<tr>
<td>ID</td>
<td>FirstName</td>
<td>LastName</td>
<td>Email</td>
<td>Edit</td>
<td>Delete</td>
</tr>
</thead> <tbody>
<s:iterator value="#request.emps">
<tr>
<td>${employeeId }</td>
<td>${firstName }</td>
<td>${lastName }</td>
<td>${email }</td>
<td><a href="emp-edit?employeeId=${employeeId }">Edit</a></td>
<td><a href="emp-delete?employeeId=${employeeId }">Delete</a></td>
</tr>
</s:iterator>
</tbody>
<a href="emp-save.jsp">添加一个</a>
</table> <s:debug></s:debug>
</body>
2:删除一个
DAO:点击删除的时候得到ID。然后作为参数传入。然后删除整个Employee对象。
public Employee delete(Integer empId){
return emps.remove(empId);
}
Action:
利用ModelDrivenInterceptor拦截器和ModelDriven 接口把值压入到栈顶
用getModel方法创建一个employee对象。然后压入到栈顶。
利用使用 PrepareInterceptor拦截器 和 Preparable 接口
执行 ParametersInterceptor 的 intercept 方法: 把请求参数的值赋给栈顶对象对应的属性. 若栈顶对象没有对应的属性, 则查询
值栈中下一个对象对应的属性....
prepare() 主要作用:为getModel()方法准备model的。
5). 存在的问题:
getModel 方法
public Employee getModel() {
if(employeeId == null)
employee = new Employee();
else
employee = dao.get(employeeId);
return employee;
}
I. 在执行删除的时候, employeeId 不为 null, 但 getModel 方法却从数据库加载了一个对象. 不该加载!
II. 指向查询全部信息时, 也 new Employee() 对象. 浪费!
6). 解决方案: 使用 PrepareInterceptor 和 Preparable 接口.
7). 关于 PrepareInterceptor
[分析后得到的结论]
若 Action 实现了 Preparable 接口, 则 Struts 将尝试执行 prepare[ActionMethodName] 方法,
若 prepare[ActionMethodName] 不存在, 则将尝试执行 prepareDo[ActionMethodName] 方法.
若都不存在, 就都不执行.
若 PrepareInterceptor 的 alwaysInvokePrepare 属性为 false,
则 Struts2 将不会调用实现了 Preparable 接口的 Action 的 prepare() 方法
public Employee getModel() {
employee=new Employee();
return employee;
}
private Integer employeeId;
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public String delete(){
dao.delete(employeeId);
return "success";
}
public void prepare() throws Exception {
System.out.println("prepare...");
}
3:添加一个:
DAO:保存一个employee对象
public void save(Employee employee){
long time=System.currentTimeMillis();
employee.setEmployeeId((int)time);
emps.put(employee.getEmployeeId(), employee);
}
Action:
public String save(){
dao.save(employee);
return "success";
}
public void prepareSave(){
employee = new Employee();
}
4:修改 得到修改的ID。然后回显本来显示的数据(利用ModelDriven把在栈顶的employee对象显示出来)。然后再重新添加一个Employee对象。
在页面上隐藏ID:
<s:hidden name="employeeId"></s:hidden>
DAO:得到一个ID。
public Employee get(Integer empId){
return emps.get(empId);
}
public void update(Employee emp){
emps.put(emp.getEmployeeId(), emp);
}
Action:
public String update(){
dao.update(employee);
return "success";
}
public void prepareUpdate(){
employee = new Employee();
}
public String edit(){
return "edit";
}
Struts2增删改查(自己思路理解)的更多相关文章
- struts2增删改查---layer---iframe层
在这里写一下struts2中的简单的增删改查 struts.xml中的配置 <?xml version="1.0" encoding="UTF-8" ?& ...
- struts2增删改查---layer---iframe层---通配符---国际化
在前一篇文章的基础上,修改一部分即可(在此只是简单介绍) struts.xml页面 在原来的基础之上 action的name="*_*" class="包名.{1}&q ...
- struts2增删改查
1.导入相关的依赖:struts.自定义标签库 配置pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...
- Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之ssh框架整合
前言 转载请标明出处:http://www.cnblogs.com/smfx1314/p/7795837.html 本项目是我写的一个练习,目的是回顾ssh框架的整合以及使用.项目介绍: ...
- yii2增删改查及AR的理解
yii2增删改查 // 返回 id 为 1 的客户 $customer = Customer::findOne(1); // 返回 id 为 1 且状态为 *active* 的客户 $customer ...
- javascript相关的增删改查以及this的理解
前两天做了一个有关表单增删改查的例子,现在贴出来.主要是想好好说一下this. 下面贴一张我要做的表格效果. 就是实现简单的一个增删改查. 1.点击增加后自动增加一行: 2.点击保存当前行会将属性改成 ...
- MySQL初步理解,简易单表增删改查
什么是数据库? 存储数据的仓库,本质是一个文件系统,封装了算法和文件之前数据的存储模式 阶段1:集合 数组 变量 缺点:数据存储在内存中,不能实现数据的持久化存储 阶段2:IO流 结合文件 .txt ...
- JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...
随机推荐
- fileupload组件之上传与下载的页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 4412 RS485
一.485硬件原理 差分对传输数据的原理 IO数据的传输→差分对 rs232传输的距离在15米以下,RS485传输距离是几十米到1000米以上 为什么485可以传输这么远 差分对的机制可以降低电磁场的 ...
- BUUCTF | 高明的黑客
这一题一开始我没有理解"www.tar.gz"的涵义,还以为有一个其他的网站叫这个,后来才突然顿悟他也有可能是一个目录!!!地址栏输入”/www.tar.gz“ 然后就可以得到源码 ...
- tomcat启动前端项目
前后端分离项目,前端使用vue,部署启动前端项目可以使用NodeJS,Nginx,Tomcat. *)使用Tomcat部署启动: 1.把vue项目build生成的dist包,放到Tomcat的weba ...
- error C2065: “SHCNE_DELETE”: 未声明的标识符
转自VC错误:http://www.vcerror.com/?p=1383 问题描述: 编译时出现: error C2065: "SHCNE_DELETE": 未声明的标识符 er ...
- JS获取url多个参数及解决中文乱码问题
function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&am ...
- Mycat+Pxc的配置
1 schema.xml配置文件 Balance属性 负载均称类型 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 1:全部的readHost与stand by writeH ...
- HTTP socket网络通信
import socket class WebServer(): def __init__(self): ''' 1.创建总的socket 2.监听 :param self: :param addr: ...
- 【Python—待解惑的问题】
疑问1: map()函数第一个参数接收函数,所以 dict.keys() 是函数?这个不是方法吗? map(dict.keys,s) s1.keys() == dict.keys(s1) 输入: Tr ...
- luoguP1082 同余方程 题解(NOIP2012)(数论)
luoguP1082 同余方程 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...