Struts2的CRUD操作
Struts之CRUD
1何为CRUD:CRUD代表的是一个框架的Create(增),Read(读取),update(更新),Delete(删除)
2怎么做呢??
其实Struts2的CRUD与现实的方法一样,只是在属性的设置和获取上更方便了,因为了值栈吖,有了OGNL对象表达式,所以Struts2的CRUD显为更加方便
废话不多说了,下面就来个分析吧!!(与数据库连接部分就用data来代替)
Create------>增:添加数据,保存数据到数据库
肯定就是获得一个保存的对象吧,但是提交的Action类和对象类不是同一个OGNL匹配的不是我这个Action类,那我怎么获得提交的对象呢?惯性思想肯定是从值栈里拿吧,但是这样做好麻烦吖,从值栈拿出来,还要一个一个的赋值,或者是在Action类里写相同属性的Set方法(),麻烦吖,所以Struts2又提供了更简便的方法是实现ModelDriven的接口----------该接口就是用来把所需的对象压入栈顶
正式流程:
1表单提交数据
2在Action类中实现ModelDriven接口 ,并实现getModel()方法,并把自己所需的对象压入栈顶,也就是return回去那个对象
3在getModel方法的作用就是把对象压入值栈的栈顶
4然后paparmeterInterceptor拦截器(默认会调用此拦截器的,),该拦截器就是把请求里的参数与值栈对象的一一匹配,这样我们的对象就从栈顶里拿下来了,然后根据相应的办法放入数据库
代码如下:
表单提交数据:
<s:form action="emp-save">
<s:textfield name="firstName" label="FirstName"></s:textfield>
<s:textfield name="lastName" label="LastName"></s:textfield>
<s:textfield name="email" label="Email"></s:textfield>
<s:submit></s:submit>
</s:form>
Action类处理请求:
public class EmployeeAction implements ModelDriven<Employee> {
private Employee employee;
public String save(){
dao.save(employee);
return "success";
}
public Employee getModel() {
this.employee=new employee()
return employee;
}
}
data类----模拟的数据库
public class Dao {
private static Map<Integer, Employee> emps = new LinkedHashMap<Integer, Employee>();
static{//模拟数据库
emps.put(1001, new Employee(1001, "AA", "aa", "aa@atguigu.com"));
emps.put(1002, new Employee(1002, "BB", "bb", "bb@atguigu.com"));
emps.put(1003, new Employee(1003, "CC", "cc", "cc@atguigu.com"));
emps.put(1004, new Employee(1004, "DD", "dd", "dd@atguigu.com"));
emps.put(1005, new Employee(1005, "EE", "ee", "ee@atguigu.com"));
}
/*
*用来遍历的
*
*/
public List<Employee> getEmployees(){
return new ArrayList<Employee>(emps.values());
}
/*
*用来删除
*
*/
public void delete(Integer empId){
emps.remove(empId);
}
/*
*用来保存
*
*/
public void save(Employee emp){
long time = System.currentTimeMillis();//用来产生ID的
emp.setEmployeeId((int)time);
/*
*根据ID获取数据的
*
*/
public Employee get(Integer empId){
return emps.get(empId);
}
流程分析:
form表单提交,发送请求道Action类的save方法,大家都知道Action请求的走的流程吧,Action在执行save方法后会不断的回调各种拦截器,其中就有一个modelDriven吧,这个拦截器的作用就是把自己所需的对象压入栈顶,因为压入栈顶后paparmeterInterceptor拦截器(默认会调用此拦截器的,),该拦截器就是把请求里的参数与值栈对象的一一匹配,这样我们的对象的属性就被一一匹配了吧,就从栈顶里拿下来了,然后根据dao的save方法放入数据库吧,整个流程就是这样
form提交---->Action类的Action方法------>因为实现了ModelDriven接口(下一遍我会把这个源代码分析上来)----->所以会调用getModel()方法,这个方法作用就是把我们所需的对象压入栈顶-->paparmeterInterceptor拦截器进行匹配------>表单提交的数据被匹配到我们的对象中,那我们就可以根据相应的方法放入数据库吖
Struts2的CRUD操作的更多相关文章
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Struts2的crud
struts2的crud引出的问题: 1.当Action里面有其他类的实例引用属性时,当要用请求参数为该对象的属性赋值时,如何将其压入栈顶. 2.当有的操作(list)不需要创建该属性的实例对象时,或 ...
- HibernateTemplate实现CRUD操作
---------------------siwuxie095 HibernateTemplate 实现 CRUD 操作 1.在 SSH 框架中使用 HibernateTemplate 模板类实现 C ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
- 【翻译】MongoDB指南/CRUD操作(一)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
- ASP.NET Core Web API Cassandra CRUD 操作
在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...
- MongoDB的CRUD操作
1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...
随机推荐
- Atitit. 委托的本质 c#.net java php的比较
Atitit.class 与type的区别,抽象的级别 class, delegate,interface委托的本质 1. 委托是粒度更细的接口 1 2. 委托模式 1 3. Java中的委托 1 4 ...
- xUtils工具实现下载功能
private String download_url="http://192.168.2.8:80/DownZip/*****.zip";//下载的路径 public Stri ...
- 禁止Chrome浏览器自动升级
对于我们测试人员来说,浏览器自动升级是非常可怕的,浏览器的升级会导致出现各种bug,比如我们常用的Selenium,如果Chrome浏览器自动升级就会导致脚本出错,无法打开浏览器等等情况,对于这种情况 ...
- 访问子节点childNodes
访问子节点childNodes 访问选定元素节点下的所有子节点的列表,返回的值可以看作是一个数组,他具有length属性. 语法: elementNode.childNodes 注意: 如果选定的节点 ...
- input 和<fmt:formatDate>的结合使用
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <inpu ...
- C语言 · 素数判断
算法提高 素数判断 时间限制:1.0s 内存限制:512.0MB 编写一函数IsPrime,判断某个大于2的正整数是否为素数. 样例输入: 5样例输出:yes 样例输入: 9样例输 ...
- Java多线程之Lock的使用<转>
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...
- sama5d3 环境检测 gpio--yx测试
说明: yx0--pioA0 yx1--pioA2 yx2--pioA4 yx3--pioA10 yx4--pioA14 yx5--pioA16 yx6--pioA12 yx7--pioA20 ...
- 1.javascript语言精粹笔记
一.注释 /**/ // 采用这个 二.标识符 标识符被用于语句.变量.参数.属性名.运算符和标记三.数字 javascript只有一个单一的数字模型.它在内部被表示64位的浮点数. 没有分离出整形, ...
- Android多媒体系列2:利用MediaRecorder实现录音